From a6006a27908ff02b1e97ccaa7d61548df7655ef6 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 2 Jun 2026 21:14:22 +0000 Subject: [PATCH 001/138] Add parimutuel betting market Anchor example A pooled prediction market under tokens/betting-market/anchor: admins open events with multiple outcomes, bettors stake an SPL token on an outcome into a vault owned by the event PDA, and at settlement the losing pool (minus an admin basis-points fee) is split among winners pro-rata to their stake. Accounts: Config (admin/fee/mint), Event, Outcome, Bet, and a per-wallet User index. Handlers: initialize_config, create_event, add_outcome, place_bet, settle_event, claim_winnings, cancel_event, claim_refund. Includes Rust + LiteSVM tests covering the full lifecycle, payout/fee math, authorization guards, and the cancel/refund path. --- README.md | 6 + tokens/betting-market/anchor/.gitignore | 7 + tokens/betting-market/anchor/Anchor.toml | 16 + tokens/betting-market/anchor/Cargo.toml | 15 + tokens/betting-market/anchor/README.md | 108 +++ .../anchor/programs/betting-market/Cargo.toml | 35 + .../anchor/programs/betting-market/Xargo.toml | 2 + .../programs/betting-market/src/error.rs | 33 + .../src/instructions/add_outcome.rs | 63 ++ .../src/instructions/cancel_event.rs | 33 + .../src/instructions/claim_refund.rs | 73 ++ .../src/instructions/claim_winnings.rs | 87 +++ .../src/instructions/create_event.rs | 78 +++ .../src/instructions/initialize_config.rs | 45 ++ .../betting-market/src/instructions/mod.rs | 19 + .../src/instructions/place_bet.rs | 142 ++++ .../src/instructions/settle_event.rs | 113 +++ .../betting-market/src/instructions/shared.rs | 55 ++ .../anchor/programs/betting-market/src/lib.rs | 65 ++ .../programs/betting-market/src/state/bet.rs | 16 + .../betting-market/src/state/config.rs | 16 + .../betting-market/src/state/event.rs | 34 + .../programs/betting-market/src/state/mod.rs | 11 + .../betting-market/src/state/outcome.rs | 16 + .../programs/betting-market/src/state/user.rs | 19 + .../tests/test_betting_market.rs | 649 ++++++++++++++++++ 26 files changed, 1756 insertions(+) create mode 100644 tokens/betting-market/anchor/.gitignore create mode 100644 tokens/betting-market/anchor/Anchor.toml create mode 100644 tokens/betting-market/anchor/Cargo.toml create mode 100644 tokens/betting-market/anchor/README.md create mode 100644 tokens/betting-market/anchor/programs/betting-market/Cargo.toml create mode 100644 tokens/betting-market/anchor/programs/betting-market/Xargo.toml create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/error.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/instructions/add_outcome.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/instructions/cancel_event.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_refund.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/instructions/create_event.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/instructions/initialize_config.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/instructions/mod.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/instructions/place_bet.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/instructions/settle_event.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/instructions/shared.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/lib.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/state/bet.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/state/config.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/state/event.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/state/mod.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/state/outcome.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/state/user.rs create mode 100644 tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs diff --git a/README.md b/README.md index 9bbb1c7c..92bb45dd 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,12 @@ Constant product AMM (xยทy=k) โ€” create liquidity pools, deposit and withdraw l [โš“ Anchor](./tokens/token-swap/anchor) [๐Ÿ’ซ Quasar](./tokens/token-swap/quasar) +### Betting Market + +Parimutuel (pooled) prediction market โ€” an admin opens an event with multiple outcomes, bettors stake tokens on an outcome, and at settlement the losing pool (minus a protocol fee) is split among winners in proportion to their stake. + +[โš“ Anchor](./tokens/betting-market/anchor) + ### Escrow Peer-to-peer OTC trade โ€” one user deposits token A and specifies how much token B they want. A counterparty fulfills the offer and both sides receive their tokens atomically. diff --git a/tokens/betting-market/anchor/.gitignore b/tokens/betting-market/anchor/.gitignore new file mode 100644 index 00000000..2e0446b0 --- /dev/null +++ b/tokens/betting-market/anchor/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/betting-market/anchor/Anchor.toml b/tokens/betting-market/anchor/Anchor.toml new file mode 100644 index 00000000..b0f15096 --- /dev/null +++ b/tokens/betting-market/anchor/Anchor.toml @@ -0,0 +1,16 @@ +[toolchain] +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +betting_market = "7LyqAeLR3mK9dfj9LqxWzfKH61VVHzuNpkgW5Y32De74" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/betting-market/anchor/Cargo.toml b/tokens/betting-market/anchor/Cargo.toml new file mode 100644 index 00000000..14a951ce --- /dev/null +++ b/tokens/betting-market/anchor/Cargo.toml @@ -0,0 +1,15 @@ +[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/tokens/betting-market/anchor/README.md b/tokens/betting-market/anchor/README.md new file mode 100644 index 00000000..39dfdd91 --- /dev/null +++ b/tokens/betting-market/anchor/README.md @@ -0,0 +1,108 @@ +# Betting Market + +A parimutuel (pooled) betting market. An admin opens an **event**, adds the possible +**outcomes**, and bettors stake a token on the outcome they think will win. Every stake across +every outcome goes into one pool. When the admin settles the event to the winning outcome, the +losing stakes โ€” minus a protocol fee โ€” are split among the winners in proportion to their stake. + +This is the pooled model used by Solana prediction-market platforms such as Hedgehog Markets, +where odds are set by the crowd's stakes rather than by an order book or a fixed-odds bookmaker. + +## Purpose + +It solves the core problem of trustless betting: collecting stakes from many bettors, holding them +in one place no single bettor controls, and paying winners by a fixed, public formula. The pool is +a token account owned by the event's PDA, so payouts are signed by the program with the event's +seeds โ€” there is no admin key that can move bettors' stakes out of the pool. The admin's only +powers are creating events/outcomes and choosing the winning outcome (or cancelling). + +## Major Concepts + +### Accounts + +- **Config** (`seeds = [b"config"]`) โ€” one per deployment. Holds the `admin` (the only key that can + create events/outcomes, settle, and cancel), the `token_mint` every market accepts, the + `fee_recipient`, and the `fee_bps`. +- **Event** (`seeds = [b"event", event_id]`) โ€” one betting market. Tracks `total_pool`, `status` + (`Open` / `Settled` / `Cancelled`), and โ€” once settled โ€” the `winning_outcome_index`, + `winning_pool`, and `distributable_losing_pool` that the payout formula reads. The `fee_bps` is + snapshotted at creation so later Config changes can't alter a market bettors have already joined. +- **Outcome** (`seeds = [b"outcome", event, index]`) โ€” one possible result. Its `total_amount` is + the outcome's share of the pool and the denominator for pro-rata payouts when it wins. +- **Bet** (`seeds = [b"bet", outcome, bettor]`) โ€” a bettor's total stake on one outcome. Re-betting + the same outcome adds to the existing Bet, so there is exactly one per (outcome, bettor). +- **User** (`seeds = [b"user", wallet]`) โ€” a per-wallet index listing the bettor's Bet addresses, so + a client can find someone's positions without scanning every Bet on the program. The list is + capped (see `MAX_BETS_PER_USER`) to keep the account a fixed size; the Bet accounts are the + authoritative stake record. + +### The vault + +Each event owns a single vault token account โ€” the associated token account of the Event PDA for +`config.token_mint`. `place_bet` moves the stake from the bettor's token account into this vault. +`settle_event`, `claim_winnings`, and `claim_refund` move tokens back out, with the program signing +as the Event PDA (`seeds = [b"event", event_id, bump]`). + +### Payout formula + +When an event settles to a winning outcome: + +``` +losing_pool = total_pool - winning_pool +fee = losing_pool * fee_bps / 10000 // charged only on the losing side +distributable_losing = losing_pool - fee +``` + +Each winning bet then claims: + +``` +payout = stake + stake * distributable_losing / winning_pool +``` + +A winner always gets their own stake back; the fee is only ever taken from losing stakes. Integer +division floors each share, leaving at most a few base units of dust in the vault. + +**Worked example:** Outcome A pool 100, Outcome B pool 50, `fee_bps = 200` (2%). A wins. +`losing_pool = 50`, `fee = 1`, `distributable_losing = 49`. A bettor who staked 40 claims +`40 + 40 * 49 / 100 = 59`. + +### Instruction handlers + +| Handler | Who | What it does | +| --- | --- | --- | +| `initialize_config` | anyone (becomes admin) | One-time setup: sets admin, stake token, fee, fee recipient. | +| `create_event` | admin | Opens a market and creates its vault. | +| `add_outcome` | admin | Adds a possible result. Only before any bet is placed. | +| `place_bet` | bettor | Stakes tokens on one outcome; updates the pools and the user's index. | +| `settle_event` | admin | Resolves to a winning outcome, takes the fee, records the payout figures. | +| `claim_winnings` | winning bettor | Withdraws stake plus pro-rata share of the losing pool. | +| `cancel_event` | admin | Voids an unresolved market. | +| `claim_refund` | bettor | After a cancellation, reclaims the exact stake. | + +`add_outcome` is locked once betting starts, so the field of choices can't change under existing +bettors. `settle_event` rejects a winning outcome with no bets โ€” use `cancel_event` to unwind an +event that can't be resolved fairly. + +## Setup + +Install the [Solana CLI](https://docs.anza.xyz/cli/install) (provides `cargo-build-sbf`) and +[Anchor](https://www.anchor-lang.com/docs/installation). Build the program so the test binary +exists on disk: + +```sh +anchor build +``` + +## Testing + +Tests are Rust integration tests running against [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) +with [solana-kite](https://crates.io/crates/solana-kite) helpers. They cover the full lifecycle +(bet โ†’ settle โ†’ claim with exact payout and fee assertions), admin authorization, the +bet-after-settle and double-claim guards, settling an outcome with no bets, and the cancel/refund +path. + +```sh +anchor test +``` + +(`Anchor.toml` sets `test = "cargo test"`, so `cargo test` works too.) diff --git a/tokens/betting-market/anchor/programs/betting-market/Cargo.toml b/tokens/betting-market/anchor/programs/betting-market/Cargo.toml new file mode 100644 index 00000000..c5ba4119 --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "betting-market" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "betting_market" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +# init-if-needed: place_bet and the lazy User index create accounts only on first use. +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/betting-market/anchor/programs/betting-market/Xargo.toml b/tokens/betting-market/anchor/programs/betting-market/Xargo.toml new file mode 100644 index 00000000..475fb71e --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/betting-market/anchor/programs/betting-market/src/error.rs b/tokens/betting-market/anchor/programs/betting-market/src/error.rs new file mode 100644 index 00000000..fed5a42c --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/error.rs @@ -0,0 +1,33 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum BettingError { + #[msg("Fee in basis points cannot exceed 10000 (100%)")] + FeeTooHigh, + #[msg("Only the admin may perform this action")] + Unauthorized, + #[msg("The event is not open for this action")] + EventNotOpen, + #[msg("The event has not been settled")] + EventNotSettled, + #[msg("The event has not been cancelled")] + EventNotCancelled, + #[msg("The winning outcome has no bets, so the event cannot be settled to it")] + OutcomeHasNoBets, + #[msg("The winning outcome index does not match the provided outcome account")] + InvalidWinningOutcome, + #[msg("This bet did not win, so there is nothing to claim")] + NothingToClaim, + #[msg("This bet has already been claimed")] + AlreadyClaimed, + #[msg("The bet amount must be greater than zero")] + ZeroAmount, + #[msg("This bettor already holds the maximum number of distinct bets")] + TooManyBets, + #[msg("Outcomes can only be added before any bets are placed")] + BettingAlreadyStarted, + #[msg("The event description is too long")] + DescriptionTooLong, + #[msg("The outcome label is too long")] + LabelTooLong, +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/add_outcome.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/add_outcome.rs new file mode 100644 index 00000000..1eaeb47a --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/add_outcome.rs @@ -0,0 +1,63 @@ +use anchor_lang::prelude::*; + +use crate::{error::BettingError, Config, Event, EventStatus, Outcome}; + +pub const MAX_LABEL_LEN: usize = 64; + +#[derive(Accounts)] +pub struct AddOutcome<'info> { + #[account(mut)] + pub admin: Signer<'info>, + + #[account( + seeds = [b"config"], + bump = config.bump, + has_one = admin @ BettingError::Unauthorized, + )] + pub config: Account<'info, Config>, + + #[account( + mut, + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Account<'info, Event>, + + #[account( + init, + payer = admin, + space = Outcome::DISCRIMINATOR.len() + Outcome::INIT_SPACE, + seeds = [b"outcome", event.key().as_ref(), &[event.outcome_count]], + bump + )] + pub outcome: Account<'info, Outcome>, + + pub system_program: Program<'info, System>, +} + +pub fn handle_add_outcome(context: Context, label: String) -> Result<()> { + require!(label.len() <= MAX_LABEL_LEN, BettingError::LabelTooLong); + require!( + context.accounts.event.status == EventStatus::Open, + BettingError::EventNotOpen + ); + // Lock the outcome set once betting starts so the field of choices can't + // change out from under existing bettors. + require!( + context.accounts.event.total_pool == 0, + BettingError::BettingAlreadyStarted + ); + + let index = context.accounts.event.outcome_count; + context.accounts.outcome.set_inner(Outcome { + event: context.accounts.event.key(), + index, + label, + total_amount: 0, + bet_count: 0, + bump: context.bumps.outcome, + }); + + context.accounts.event.outcome_count += 1; + Ok(()) +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/cancel_event.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/cancel_event.rs new file mode 100644 index 00000000..bde8cd8b --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/cancel_event.rs @@ -0,0 +1,33 @@ +use anchor_lang::prelude::*; + +use crate::{error::BettingError, Config, Event, EventStatus}; + +// Abandon an event that can't be resolved (e.g. the real-world result is void). +// Bettors then reclaim their exact stakes via `claim_refund`; no fee is taken. +#[derive(Accounts)] +pub struct CancelEvent<'info> { + pub admin: Signer<'info>, + + #[account( + seeds = [b"config"], + bump = config.bump, + has_one = admin @ BettingError::Unauthorized, + )] + pub config: Account<'info, Config>, + + #[account( + mut, + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Account<'info, Event>, +} + +pub fn handle_cancel_event(context: Context) -> Result<()> { + require!( + context.accounts.event.status == EventStatus::Open, + BettingError::EventNotOpen + ); + context.accounts.event.status = EventStatus::Cancelled; + Ok(()) +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_refund.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_refund.rs new file mode 100644 index 00000000..2e3591cb --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_refund.rs @@ -0,0 +1,73 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; + +use crate::{error::BettingError, Bet, Event, EventStatus}; + +use super::transfer_tokens_from_vault; + +#[derive(Accounts)] +pub struct ClaimRefund<'info> { + #[account(mut)] + pub bettor: Signer<'info>, + + #[account(mint::token_program = token_program)] + pub token_mint: InterfaceAccount<'info, Mint>, + + #[account( + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Account<'info, Event>, + + #[account( + mut, + has_one = bettor, + has_one = event, + seeds = [b"bet", bet.outcome.as_ref(), bettor.key().as_ref()], + bump = bet.bump, + )] + pub bet: Account<'info, Bet>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = bettor, + associated_token::token_program = token_program, + )] + pub bettor_token_account: InterfaceAccount<'info, TokenAccount>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = event, + associated_token::token_program = token_program, + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, +} + +pub fn handle_claim_refund(context: Context) -> Result<()> { + require!( + context.accounts.event.status == EventStatus::Cancelled, + BettingError::EventNotCancelled + ); + require!(!context.accounts.bet.claimed, BettingError::AlreadyClaimed); + + let stake = context.accounts.bet.amount; + let event_id = context.accounts.event.event_id; + let event_bump = context.accounts.event.bump; + transfer_tokens_from_vault( + &context.accounts.vault, + &context.accounts.bettor_token_account, + stake, + &context.accounts.token_mint, + &context.accounts.event.to_account_info(), + &context.accounts.token_program, + event_id, + event_bump, + )?; + + context.accounts.bet.claimed = true; + Ok(()) +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs new file mode 100644 index 00000000..bc0ec379 --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs @@ -0,0 +1,87 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; + +use crate::{error::BettingError, Bet, Event, EventStatus}; + +use super::transfer_tokens_from_vault; + +#[derive(Accounts)] +pub struct ClaimWinnings<'info> { + #[account(mut)] + pub bettor: Signer<'info>, + + #[account(mint::token_program = token_program)] + pub token_mint: InterfaceAccount<'info, Mint>, + + #[account( + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Account<'info, Event>, + + #[account( + mut, + has_one = bettor, + has_one = event, + seeds = [b"bet", bet.outcome.as_ref(), bettor.key().as_ref()], + bump = bet.bump, + )] + pub bet: Account<'info, Bet>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = bettor, + associated_token::token_program = token_program, + )] + pub bettor_token_account: InterfaceAccount<'info, TokenAccount>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = event, + associated_token::token_program = token_program, + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, +} + +pub fn handle_claim_winnings(context: Context) -> Result<()> { + require!( + context.accounts.event.status == EventStatus::Settled, + BettingError::EventNotSettled + ); + require!(!context.accounts.bet.claimed, BettingError::AlreadyClaimed); + require!( + context.accounts.bet.outcome_index == context.accounts.event.winning_outcome_index, + BettingError::NothingToClaim + ); + + let stake = context.accounts.bet.amount; + let winning_pool = context.accounts.event.winning_pool; + let distributable_losing_pool = context.accounts.event.distributable_losing_pool; + + // Pro-rata share of the losing pool, on top of the returned stake. u128 + // intermediate avoids overflow; the floor leaves at most a few base units + // of dust in the vault. + let winnings_share = + (stake as u128 * distributable_losing_pool as u128 / winning_pool as u128) as u64; + let payout = stake + winnings_share; + + let event_id = context.accounts.event.event_id; + let event_bump = context.accounts.event.bump; + transfer_tokens_from_vault( + &context.accounts.vault, + &context.accounts.bettor_token_account, + payout, + &context.accounts.token_mint, + &context.accounts.event.to_account_info(), + &context.accounts.token_program, + event_id, + event_bump, + )?; + + context.accounts.bet.claimed = true; + Ok(()) +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/create_event.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/create_event.rs new file mode 100644 index 00000000..ce7ea4ce --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/create_event.rs @@ -0,0 +1,78 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::{error::BettingError, Config, Event, EventStatus}; + +pub const MAX_DESCRIPTION_LEN: usize = 200; + +#[derive(Accounts)] +#[instruction(event_id: u64)] +pub struct CreateEvent<'info> { + #[account(mut)] + pub admin: Signer<'info>, + + #[account( + mut, + seeds = [b"config"], + bump = config.bump, + has_one = admin @ BettingError::Unauthorized, + has_one = token_mint, + )] + pub config: Account<'info, Config>, + + #[account(mint::token_program = token_program)] + pub token_mint: InterfaceAccount<'info, Mint>, + + #[account( + init, + payer = admin, + space = Event::DISCRIMINATOR.len() + Event::INIT_SPACE, + seeds = [b"event", event_id.to_le_bytes().as_ref()], + bump + )] + pub event: Account<'info, Event>, + + // The single pool for the whole market: an ATA owned by the Event PDA. + #[account( + init, + payer = admin, + associated_token::mint = token_mint, + associated_token::authority = event, + associated_token::token_program = token_program + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_create_event( + context: Context, + event_id: u64, + description: String, +) -> Result<()> { + require!( + description.len() <= MAX_DESCRIPTION_LEN, + BettingError::DescriptionTooLong + ); + + context.accounts.event.set_inner(Event { + event_id, + description, + outcome_count: 0, + total_pool: 0, + status: EventStatus::Open, + fee_bps: context.accounts.config.fee_bps, + winning_outcome_index: 0, + winning_pool: 0, + distributable_losing_pool: 0, + bump: context.bumps.event, + }); + + context.accounts.config.event_count += 1; + Ok(()) +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/initialize_config.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/initialize_config.rs new file mode 100644 index 00000000..8a6eec0c --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/initialize_config.rs @@ -0,0 +1,45 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenInterface}; + +use crate::{error::BettingError, Config}; + +pub const MAX_FEE_BPS: u16 = 10_000; + +#[derive(Accounts)] +pub struct InitializeConfig<'info> { + #[account(mut)] + pub admin: Signer<'info>, + + #[account(mint::token_program = token_program)] + pub token_mint: InterfaceAccount<'info, Mint>, + + #[account( + init, + payer = admin, + space = Config::DISCRIMINATOR.len() + Config::INIT_SPACE, + seeds = [b"config"], + bump + )] + pub config: Account<'info, Config>, + + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_initialize_config( + context: Context, + fee_bps: u16, + fee_recipient: Pubkey, +) -> Result<()> { + require!(fee_bps <= MAX_FEE_BPS, BettingError::FeeTooHigh); + + context.accounts.config.set_inner(Config { + admin: context.accounts.admin.key(), + token_mint: context.accounts.token_mint.key(), + fee_recipient, + fee_bps, + event_count: 0, + bump: context.bumps.config, + }); + Ok(()) +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/mod.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/mod.rs new file mode 100644 index 00000000..46739370 --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/mod.rs @@ -0,0 +1,19 @@ +pub mod add_outcome; +pub mod cancel_event; +pub mod claim_refund; +pub mod claim_winnings; +pub mod create_event; +pub mod initialize_config; +pub mod place_bet; +pub mod settle_event; +pub mod shared; + +pub use add_outcome::*; +pub use cancel_event::*; +pub use claim_refund::*; +pub use claim_winnings::*; +pub use create_event::*; +pub use initialize_config::*; +pub use place_bet::*; +pub use settle_event::*; +pub use shared::*; diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/place_bet.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/place_bet.rs new file mode 100644 index 00000000..03a85ee2 --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/place_bet.rs @@ -0,0 +1,142 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::{ + error::BettingError, Bet, Config, Event, EventStatus, Outcome, User, MAX_BETS_PER_USER, +}; + +use super::transfer_tokens_to_vault; + +#[derive(Accounts)] +pub struct PlaceBet<'info> { + #[account(mut)] + pub bettor: Signer<'info>, + + #[account( + seeds = [b"config"], + bump = config.bump, + has_one = token_mint, + )] + pub config: Account<'info, Config>, + + #[account(mint::token_program = token_program)] + pub token_mint: Box>, + + #[account( + mut, + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Box>, + + #[account( + mut, + has_one = event, + seeds = [b"outcome", event.key().as_ref(), &[outcome.index]], + bump = outcome.bump, + )] + pub outcome: Box>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = bettor, + associated_token::token_program = token_program, + )] + pub bettor_token_account: Box>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = event, + associated_token::token_program = token_program, + )] + pub vault: Box>, + + #[account( + init_if_needed, + payer = bettor, + space = Bet::DISCRIMINATOR.len() + Bet::INIT_SPACE, + seeds = [b"bet", outcome.key().as_ref(), bettor.key().as_ref()], + bump + )] + pub bet: Box>, + + #[account( + init_if_needed, + payer = bettor, + space = User::DISCRIMINATOR.len() + User::INIT_SPACE, + seeds = [b"user", bettor.key().as_ref()], + bump + )] + pub user: Box>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_place_bet(context: Context, amount: u64) -> Result<()> { + require!(amount > 0, BettingError::ZeroAmount); + require!( + context.accounts.event.status == EventStatus::Open, + BettingError::EventNotOpen + ); + + transfer_tokens_to_vault( + &context.accounts.bettor_token_account, + &context.accounts.vault, + amount, + &context.accounts.token_mint, + &context.accounts.bettor, + &context.accounts.token_program, + )?; + + let bettor_key = context.accounts.bettor.key(); + let event_key = context.accounts.event.key(); + let outcome_key = context.accounts.outcome.key(); + let outcome_index = context.accounts.outcome.index; + let bet_key = context.accounts.bet.key(); + let bet_bump = context.bumps.bet; + let user_bump = context.bumps.user; + + let bet = &mut context.accounts.bet; + // A fresh init_if_needed Bet has amount 0; that is how we tell a first bet + // on this outcome from a top-up, and it gates the per-outcome bookkeeping. + let is_new_bet = bet.amount == 0; + if is_new_bet { + bet.bettor = bettor_key; + bet.event = event_key; + bet.outcome = outcome_key; + bet.outcome_index = outcome_index; + bet.claimed = false; + bet.bump = bet_bump; + } + bet.amount += amount; + + let outcome = &mut context.accounts.outcome; + outcome.total_amount += amount; + if is_new_bet { + outcome.bet_count += 1; + } + + context.accounts.event.total_pool += amount; + + let user = &mut context.accounts.user; + if user.authority == Pubkey::default() { + user.authority = bettor_key; + user.bump = user_bump; + } + if is_new_bet { + require!( + user.bets.len() < MAX_BETS_PER_USER, + BettingError::TooManyBets + ); + user.bets.push(bet_key); + } + + Ok(()) +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/settle_event.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/settle_event.rs new file mode 100644 index 00000000..c8f3a103 --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/settle_event.rs @@ -0,0 +1,113 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::{error::BettingError, Config, Event, EventStatus, Outcome}; + +use super::transfer_tokens_from_vault; + +const BPS_DENOMINATOR: u128 = 10_000; + +#[derive(Accounts)] +#[instruction(winning_outcome_index: u8)] +pub struct SettleEvent<'info> { + #[account(mut)] + pub admin: Signer<'info>, + + #[account( + seeds = [b"config"], + bump = config.bump, + has_one = admin @ BettingError::Unauthorized, + has_one = token_mint, + has_one = fee_recipient, + )] + pub config: Account<'info, Config>, + + #[account(mint::token_program = token_program)] + pub token_mint: InterfaceAccount<'info, Mint>, + + #[account( + mut, + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Account<'info, Event>, + + #[account( + has_one = event, + seeds = [b"outcome", event.key().as_ref(), &[winning_outcome_index]], + bump = winning_outcome.bump, + )] + pub winning_outcome: Account<'info, Outcome>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = event, + associated_token::token_program = token_program, + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + /// CHECK: validated against config.fee_recipient by the `has_one` above. + pub fee_recipient: UncheckedAccount<'info>, + + #[account( + init_if_needed, + payer = admin, + associated_token::mint = token_mint, + associated_token::authority = fee_recipient, + associated_token::token_program = token_program, + )] + pub fee_recipient_token_account: InterfaceAccount<'info, TokenAccount>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_settle_event( + context: Context, + winning_outcome_index: u8, +) -> Result<()> { + require!( + context.accounts.event.status == EventStatus::Open, + BettingError::EventNotOpen + ); + require!( + context.accounts.winning_outcome.total_amount > 0, + BettingError::OutcomeHasNoBets + ); + + let winning_pool = context.accounts.winning_outcome.total_amount; + let total_pool = context.accounts.event.total_pool; + let losing_pool = total_pool - winning_pool; + + // Winners always get their own stake back; the fee is only ever charged on + // the losing side, so a winner can never receive less than they staked. + let fee = (losing_pool as u128 * context.accounts.event.fee_bps as u128 / BPS_DENOMINATOR) as u64; + let distributable_losing_pool = losing_pool - fee; + + if fee > 0 { + let event_id = context.accounts.event.event_id; + let event_bump = context.accounts.event.bump; + transfer_tokens_from_vault( + &context.accounts.vault, + &context.accounts.fee_recipient_token_account, + fee, + &context.accounts.token_mint, + &context.accounts.event.to_account_info(), + &context.accounts.token_program, + event_id, + event_bump, + )?; + } + + let event = &mut context.accounts.event; + event.status = EventStatus::Settled; + event.winning_outcome_index = winning_outcome_index; + event.winning_pool = winning_pool; + event.distributable_losing_pool = distributable_losing_pool; + Ok(()) +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/shared.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/shared.rs new file mode 100644 index 00000000..8a666891 --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/shared.rs @@ -0,0 +1,55 @@ +use anchor_lang::prelude::*; + +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +// Move tokens from a wallet-owned account into the vault. The authority is a +// plain Signer (the bettor), so no PDA seeds are needed. +pub fn transfer_tokens_to_vault<'info>( + from: &InterfaceAccount<'info, TokenAccount>, + to: &InterfaceAccount<'info, TokenAccount>, + amount: u64, + mint: &InterfaceAccount<'info, Mint>, + authority: &Signer<'info>, + token_program: &Interface<'info, TokenInterface>, +) -> Result<()> { + let transfer_accounts = TransferChecked { + from: from.to_account_info(), + mint: mint.to_account_info(), + to: to.to_account_info(), + authority: authority.to_account_info(), + }; + let cpi_context = CpiContext::new(token_program.key(), transfer_accounts); + transfer_checked(cpi_context, amount, mint.decimals) +} + +// Move tokens out of the vault, signed by the Event PDA. The event vault's +// authority is the Event account, so the program signs with the event's seeds. +pub fn transfer_tokens_from_vault<'info>( + vault: &InterfaceAccount<'info, TokenAccount>, + to: &InterfaceAccount<'info, TokenAccount>, + amount: u64, + mint: &InterfaceAccount<'info, Mint>, + event: &AccountInfo<'info>, + token_program: &Interface<'info, TokenInterface>, + event_id: u64, + event_bump: u8, +) -> Result<()> { + let event_id_bytes = event_id.to_le_bytes(); + let seeds = &[b"event".as_ref(), event_id_bytes.as_ref(), &[event_bump]]; + let signer_seeds = [&seeds[..]]; + + let transfer_accounts = TransferChecked { + from: vault.to_account_info(), + mint: mint.to_account_info(), + to: to.to_account_info(), + authority: event.clone(), + }; + let cpi_context = CpiContext::new_with_signer( + token_program.key(), + transfer_accounts, + &signer_seeds, + ); + transfer_checked(cpi_context, amount, mint.decimals) +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/lib.rs b/tokens/betting-market/anchor/programs/betting-market/src/lib.rs new file mode 100644 index 00000000..0cf2bec0 --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/lib.rs @@ -0,0 +1,65 @@ +pub mod error; +pub mod instructions; +pub mod state; + +use anchor_lang::prelude::*; + +pub use instructions::*; +pub use state::*; + +declare_id!("7LyqAeLR3mK9dfj9LqxWzfKH61VVHzuNpkgW5Y32De74"); + +#[program] +pub mod betting_market { + use super::*; + + // One-time setup: the signer becomes the admin and fixes the stake token and + // the settlement fee (basis points) for every market in this deployment. + pub fn initialize_config( + context: Context, + fee_bps: u16, + fee_recipient: Pubkey, + ) -> Result<()> { + instructions::initialize_config::handle_initialize_config(context, fee_bps, fee_recipient) + } + + // Admin opens a new market and creates its pool vault. + pub fn create_event( + context: Context, + event_id: u64, + description: String, + ) -> Result<()> { + instructions::create_event::handle_create_event(context, event_id, description) + } + + // Admin adds a possible result. Only allowed before betting starts. + pub fn add_outcome(context: Context, label: String) -> Result<()> { + instructions::add_outcome::handle_add_outcome(context, label) + } + + // A bettor stakes tokens on one outcome. The stake joins the event's pool. + pub fn place_bet(context: Context, amount: u64) -> Result<()> { + instructions::place_bet::handle_place_bet(context, amount) + } + + // Admin resolves the market: takes the fee from the losing pool and records + // the figures winners need to claim their share. + pub fn settle_event(context: Context, winning_outcome_index: u8) -> Result<()> { + instructions::settle_event::handle_settle_event(context, winning_outcome_index) + } + + // A winner withdraws their stake plus their pro-rata share of the losing pool. + pub fn claim_winnings(context: Context) -> Result<()> { + instructions::claim_winnings::handle_claim_winnings(context) + } + + // Admin voids an unresolved market so bettors can be made whole. + pub fn cancel_event(context: Context) -> Result<()> { + instructions::cancel_event::handle_cancel_event(context) + } + + // After a cancellation, a bettor reclaims their exact stake. + pub fn claim_refund(context: Context) -> Result<()> { + instructions::claim_refund::handle_claim_refund(context) + } +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/bet.rs b/tokens/betting-market/anchor/programs/betting-market/src/state/bet.rs new file mode 100644 index 00000000..c1d0f8fb --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/state/bet.rs @@ -0,0 +1,16 @@ +use anchor_lang::prelude::*; + +// A single bettor's total stake on one outcome. Re-betting the same outcome +// adds to `amount` rather than creating a second account, so there is exactly +// one Bet per (outcome, bettor). +#[account] +#[derive(InitSpace)] +pub struct Bet { + pub bettor: Pubkey, + pub event: Pubkey, + pub outcome: Pubkey, + pub outcome_index: u8, + pub amount: u64, + pub claimed: bool, + pub bump: u8, +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/config.rs b/tokens/betting-market/anchor/programs/betting-market/src/state/config.rs new file mode 100644 index 00000000..03cbcfb1 --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/state/config.rs @@ -0,0 +1,16 @@ +use anchor_lang::prelude::*; + +// The global, single Config account. Its `admin` is the only key allowed to +// create events, add outcomes, settle, and cancel. `token_mint` fixes the one +// asset every market in this deployment accepts as a stake. +#[account] +#[derive(InitSpace)] +pub struct Config { + pub admin: Pubkey, + pub token_mint: Pubkey, + pub fee_recipient: Pubkey, + // Protocol fee, in basis points, taken from the losing pool at settlement. + pub fee_bps: u16, + pub event_count: u64, + pub bump: u8, +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/event.rs b/tokens/betting-market/anchor/programs/betting-market/src/state/event.rs new file mode 100644 index 00000000..b88e8918 --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/state/event.rs @@ -0,0 +1,34 @@ +use anchor_lang::prelude::*; + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, PartialEq, Eq, InitSpace)] +pub enum EventStatus { + // Accepting bets. + Open, + // Resolved to a winning outcome; winners may claim. + Settled, + // Abandoned; bettors may reclaim their exact stake. + Cancelled, +} + +// One betting market. All stakes across every outcome live in a single vault +// token account whose authority is this Event PDA, so the program signs payouts +// with the event's seeds. +#[account] +#[derive(InitSpace)] +pub struct Event { + pub event_id: u64, + #[max_len(200)] + pub description: String, + pub outcome_count: u8, + // Sum of every stake placed across all outcomes. + pub total_pool: u64, + pub status: EventStatus, + // Fee snapshot taken at creation, so later Config changes can't alter a + // market that bettors have already joined. + pub fee_bps: u16, + // Fields below are written at settlement and read at claim time. + pub winning_outcome_index: u8, + pub winning_pool: u64, + pub distributable_losing_pool: u64, + pub bump: u8, +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/mod.rs b/tokens/betting-market/anchor/programs/betting-market/src/state/mod.rs new file mode 100644 index 00000000..7d3f7a61 --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/state/mod.rs @@ -0,0 +1,11 @@ +pub mod bet; +pub mod config; +pub mod event; +pub mod outcome; +pub mod user; + +pub use bet::*; +pub use config::*; +pub use event::*; +pub use outcome::*; +pub use user::*; diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/outcome.rs b/tokens/betting-market/anchor/programs/betting-market/src/state/outcome.rs new file mode 100644 index 00000000..de817e54 --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/state/outcome.rs @@ -0,0 +1,16 @@ +use anchor_lang::prelude::*; + +// One possible result of an event (e.g. "Yes", "Team A wins"). `total_amount` +// is this outcome's share of the pool and is the denominator for pro-rata +// payouts when this outcome wins. +#[account] +#[derive(InitSpace)] +pub struct Outcome { + pub event: Pubkey, + pub index: u8, + #[max_len(64)] + pub label: String, + pub total_amount: u64, + pub bet_count: u64, + pub bump: u8, +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/user.rs b/tokens/betting-market/anchor/programs/betting-market/src/state/user.rs new file mode 100644 index 00000000..b8deb4f9 --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/state/user.rs @@ -0,0 +1,19 @@ +use anchor_lang::prelude::*; + +// A bettor can hold at most this many distinct bets (one per outcome they back). +// Re-betting an outcome adds to the existing Bet, so this caps the number of +// *different* outcomes a user has staked on, not the number of times they bet. +// A fixed cap keeps the account a constant size โ€” no reallocation on each bet. +pub const MAX_BETS_PER_USER: usize = 32; + +// Per-wallet index of a bettor's bets, so a client can list someone's positions +// without scanning every Bet account on the program. The authoritative stake +// state lives in the Bet accounts; this is a convenience index. +#[account] +#[derive(InitSpace)] +pub struct User { + pub authority: Pubkey, + #[max_len(MAX_BETS_PER_USER)] + pub bets: Vec, + pub bump: u8, +} diff --git a/tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs b/tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs new file mode 100644 index 00000000..5a6966af --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs @@ -0,0 +1,649 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +const DECIMALS: u8 = 6; +const FEE_BPS: u16 = 200; // 2% + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ) + .0 +} + +fn config_pda() -> Pubkey { + Pubkey::find_program_address(&[b"config"], &betting_market::id()).0 +} + +fn event_pda(event_id: u64) -> Pubkey { + Pubkey::find_program_address(&[b"event", &event_id.to_le_bytes()], &betting_market::id()).0 +} + +fn outcome_pda(event: &Pubkey, index: u8) -> Pubkey { + Pubkey::find_program_address(&[b"outcome", event.as_ref(), &[index]], &betting_market::id()).0 +} + +fn bet_pda(outcome: &Pubkey, bettor: &Pubkey) -> Pubkey { + Pubkey::find_program_address(&[b"bet", outcome.as_ref(), bettor.as_ref()], &betting_market::id()) + .0 +} + +fn user_pda(bettor: &Pubkey) -> Pubkey { + Pubkey::find_program_address(&[b"user", bettor.as_ref()], &betting_market::id()).0 +} + +struct Market { + svm: LiteSVM, + admin: Keypair, + mint: Pubkey, + fee_recipient: Keypair, + fee_recipient_ata: Pubkey, +} + +// Spin up the SVM with the program loaded, an admin wallet, the stake-token mint +// (admin is the mint authority), and a fee-recipient wallet with an ATA. +fn setup() -> Market { + let mut svm = LiteSVM::new(); + let program_bytes = include_bytes!("../../../target/deploy/betting_market.so"); + svm.add_program(betting_market::id(), program_bytes).unwrap(); + + let admin = create_wallet(&mut svm, 100_000_000_000).unwrap(); + let mint = create_token_mint(&mut svm, &admin, DECIMALS, None).unwrap(); + + let fee_recipient = create_wallet(&mut svm, 10_000_000_000).unwrap(); + let fee_recipient_ata = + create_associated_token_account(&mut svm, &fee_recipient.pubkey(), &mint, &admin).unwrap(); + + Market { + svm, + admin, + mint, + fee_recipient, + fee_recipient_ata, + } +} + +// Create a funded bettor with a token ATA holding `amount` of the stake token. +fn create_bettor(market: &mut Market, amount: u64) -> (Keypair, Pubkey) { + let bettor = create_wallet(&mut market.svm, 10_000_000_000).unwrap(); + let ata = create_associated_token_account( + &mut market.svm, + &bettor.pubkey(), + &market.mint, + &market.admin, + ) + .unwrap(); + mint_tokens_to_token_account(&mut market.svm, &market.mint, &ata, amount, &market.admin) + .unwrap(); + (bettor, ata) +} + +fn initialize_config_ix(admin: Pubkey, mint: Pubkey, fee_recipient: Pubkey) -> Instruction { + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::InitializeConfig { + fee_bps: FEE_BPS, + fee_recipient, + } + .data(), + betting_market::accounts::InitializeConfig { + admin, + token_mint: mint, + config: config_pda(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn create_event_ix(admin: Pubkey, mint: Pubkey, event_id: u64, description: &str) -> Instruction { + let event = event_pda(event_id); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::CreateEvent { + event_id, + description: description.to_string(), + } + .data(), + betting_market::accounts::CreateEvent { + admin, + config: config_pda(), + token_mint: mint, + event, + vault: derive_ata(&event, &mint), + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn add_outcome_ix(admin: Pubkey, event_id: u64, index: u8, label: &str) -> Instruction { + let event = event_pda(event_id); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::AddOutcome { + label: label.to_string(), + } + .data(), + betting_market::accounts::AddOutcome { + admin, + config: config_pda(), + event, + outcome: outcome_pda(&event, index), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn place_bet_ix( + mint: Pubkey, + bettor: &Pubkey, + bettor_ata: &Pubkey, + event_id: u64, + outcome_index: u8, + amount: u64, +) -> Instruction { + let event = event_pda(event_id); + let outcome = outcome_pda(&event, outcome_index); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::PlaceBet { amount }.data(), + betting_market::accounts::PlaceBet { + bettor: *bettor, + config: config_pda(), + token_mint: mint, + event, + outcome, + bettor_token_account: *bettor_ata, + vault: derive_ata(&event, &mint), + bet: bet_pda(&outcome, bettor), + user: user_pda(bettor), + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn settle_event_ix( + admin: Pubkey, + mint: Pubkey, + fee_recipient: Pubkey, + fee_recipient_ata: Pubkey, + event_id: u64, + winning_outcome_index: u8, +) -> Instruction { + let event = event_pda(event_id); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::SettleEvent { + winning_outcome_index, + } + .data(), + betting_market::accounts::SettleEvent { + admin, + config: config_pda(), + token_mint: mint, + event, + winning_outcome: outcome_pda(&event, winning_outcome_index), + vault: derive_ata(&event, &mint), + fee_recipient, + fee_recipient_token_account: fee_recipient_ata, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn claim_winnings_ix( + mint: Pubkey, + bettor: &Pubkey, + bettor_ata: &Pubkey, + event_id: u64, + outcome_index: u8, +) -> Instruction { + let event = event_pda(event_id); + let outcome = outcome_pda(&event, outcome_index); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::ClaimWinnings {}.data(), + betting_market::accounts::ClaimWinnings { + bettor: *bettor, + token_mint: mint, + event, + bet: bet_pda(&outcome, bettor), + bettor_token_account: *bettor_ata, + vault: derive_ata(&event, &mint), + token_program: token_program_id(), + } + .to_account_metas(None), + ) +} + +fn cancel_event_ix(admin: Pubkey, event_id: u64) -> Instruction { + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::CancelEvent {}.data(), + betting_market::accounts::CancelEvent { + admin, + config: config_pda(), + event: event_pda(event_id), + } + .to_account_metas(None), + ) +} + +fn claim_refund_ix( + mint: Pubkey, + bettor: &Pubkey, + bettor_ata: &Pubkey, + event_id: u64, + outcome_index: u8, +) -> Instruction { + let event = event_pda(event_id); + let outcome = outcome_pda(&event, outcome_index); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::ClaimRefund {}.data(), + betting_market::accounts::ClaimRefund { + bettor: *bettor, + token_mint: mint, + event, + bet: bet_pda(&outcome, bettor), + bettor_token_account: *bettor_ata, + vault: derive_ata(&event, &mint), + token_program: token_program_id(), + } + .to_account_metas(None), + ) +} + +// Decode a User account's `bets` Vec length from raw account data. +// Layout after the 8-byte discriminator: authority (32) + vec_len (4) + entries. +fn read_user_bet_count(market: &Market, bettor: &Pubkey) -> u32 { + let account = market.svm.get_account(&user_pda(bettor)).unwrap(); + let data = &account.data[8..]; + u32::from_le_bytes(data[32..36].try_into().unwrap()) +} + +fn init_config(market: &mut Market) { + let admin = market.admin.pubkey(); + let mint = market.mint; + let fee_recipient = market.fee_recipient.pubkey(); + send_transaction_from_instructions( + &mut market.svm, + vec![initialize_config_ix(admin, mint, fee_recipient)], + &[&market.admin], + &admin, + ) + .unwrap(); +} + +#[test] +fn test_full_lifecycle() { + let mut market = setup(); + let event_id: u64 = 1; + + // Stakes chosen so the pro-rata split divides evenly (no dust): + // Yes pool 400 (Alice 100 + Bob 300), No pool 200 (Carol). Yes wins. + let (alice, alice_ata) = create_bettor(&mut market, 1_000); + let (bob, bob_ata) = create_bettor(&mut market, 1_000); + let (carol, carol_ata) = create_bettor(&mut market, 1_000); + + init_config(&mut market); + + let admin = market.admin.pubkey(); + let mint = market.mint; + send_transaction_from_instructions( + &mut market.svm, + vec![ + create_event_ix(admin, mint, event_id, "Will it rain tomorrow?"), + add_outcome_ix(admin, event_id, 0, "Yes"), + add_outcome_ix(admin, event_id, 1, "No"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0, 100)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &bob.pubkey(), &bob_ata, event_id, 0, 300)], + &[&bob], + &bob.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &carol.pubkey(), &carol_ata, event_id, 1, 200)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + + // Vault holds the entire pool. + let vault = derive_ata(&event_pda(event_id), &mint); + assert_eq!(get_token_account_balance(&market.svm, &vault).unwrap(), 600); + assert_eq!(read_user_bet_count(&market, &alice.pubkey()), 1); + + // Settle to "Yes" (index 0). Losing pool 200, fee = 2% = 4, distributable = 196. + let fee_recipient = market.fee_recipient.pubkey(); + let fee_recipient_ata = market.fee_recipient_ata; + send_transaction_from_instructions( + &mut market.svm, + vec![settle_event_ix(admin, mint, fee_recipient, fee_recipient_ata, event_id, 0)], + &[&market.admin], + &admin, + ) + .unwrap(); + assert_eq!( + get_token_account_balance(&market.svm, &fee_recipient_ata).unwrap(), + 4 + ); + + // Alice: 100 + 100*196/400 = 149. Bob: 300 + 300*196/400 = 447. + send_transaction_from_instructions( + &mut market.svm, + vec![claim_winnings_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![claim_winnings_ix(mint, &bob.pubkey(), &bob_ata, event_id, 0)], + &[&bob], + &bob.pubkey(), + ) + .unwrap(); + + assert_eq!( + get_token_account_balance(&market.svm, &alice_ata).unwrap(), + 1_000 - 100 + 149 + ); + assert_eq!( + get_token_account_balance(&market.svm, &bob_ata).unwrap(), + 1_000 - 300 + 447 + ); + // Pool fully distributed: 400 stakes + 196 winnings + 4 fee = 600. + assert_eq!(get_token_account_balance(&market.svm, &vault).unwrap(), 0); + + // Carol bet the losing outcome, so she has nothing to claim. + let carol_claim = send_transaction_from_instructions( + &mut market.svm, + vec![claim_winnings_ix(mint, &carol.pubkey(), &carol_ata, event_id, 1)], + &[&carol], + &carol.pubkey(), + ); + assert!(carol_claim.is_err(), "loser must not be able to claim winnings"); +} + +#[test] +fn test_only_admin_can_create_event() { + let mut market = setup(); + init_config(&mut market); + + let mint = market.mint; + let mallory = create_wallet(&mut market.svm, 10_000_000_000).unwrap(); + let result = send_transaction_from_instructions( + &mut market.svm, + vec![create_event_ix(mallory.pubkey(), mint, 7, "Unauthorized event")], + &[&mallory], + &mallory.pubkey(), + ); + assert!(result.is_err(), "non-admin must not create an event"); +} + +#[test] +fn test_cannot_bet_after_settle() { + let mut market = setup(); + let event_id: u64 = 2; + let (alice, alice_ata) = create_bettor(&mut market, 1_000); + let (bob, bob_ata) = create_bettor(&mut market, 1_000); + + init_config(&mut market); + let admin = market.admin.pubkey(); + let mint = market.mint; + let fee_recipient = market.fee_recipient.pubkey(); + let fee_recipient_ata = market.fee_recipient_ata; + send_transaction_from_instructions( + &mut market.svm, + vec![ + create_event_ix(admin, mint, event_id, "Coin flip"), + add_outcome_ix(admin, event_id, 0, "Heads"), + add_outcome_ix(admin, event_id, 1, "Tails"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0, 100)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![settle_event_ix(admin, mint, fee_recipient, fee_recipient_ata, event_id, 0)], + &[&market.admin], + &admin, + ) + .unwrap(); + + let late_bet = send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &bob.pubkey(), &bob_ata, event_id, 1, 100)], + &[&bob], + &bob.pubkey(), + ); + assert!(late_bet.is_err(), "betting after settlement must fail"); +} + +#[test] +fn test_double_claim_fails() { + let mut market = setup(); + let event_id: u64 = 3; + let (alice, alice_ata) = create_bettor(&mut market, 1_000); + let (carol, carol_ata) = create_bettor(&mut market, 1_000); + + init_config(&mut market); + let admin = market.admin.pubkey(); + let mint = market.mint; + let fee_recipient = market.fee_recipient.pubkey(); + let fee_recipient_ata = market.fee_recipient_ata; + send_transaction_from_instructions( + &mut market.svm, + vec![ + create_event_ix(admin, mint, event_id, "Match winner"), + add_outcome_ix(admin, event_id, 0, "Home"), + add_outcome_ix(admin, event_id, 1, "Away"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0, 100)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &carol.pubkey(), &carol_ata, event_id, 1, 100)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![settle_event_ix(admin, mint, fee_recipient, fee_recipient_ata, event_id, 0)], + &[&market.admin], + &admin, + ) + .unwrap(); + + send_transaction_from_instructions( + &mut market.svm, + vec![claim_winnings_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + // A fresh blockhash so the second claim is a distinct transaction. + market.svm.expire_blockhash(); + let second = send_transaction_from_instructions( + &mut market.svm, + vec![claim_winnings_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0)], + &[&alice], + &alice.pubkey(), + ); + assert!(second.is_err(), "claiming the same bet twice must fail"); +} + +#[test] +fn test_settle_outcome_without_bets_fails() { + let mut market = setup(); + let event_id: u64 = 4; + let (alice, alice_ata) = create_bettor(&mut market, 1_000); + + init_config(&mut market); + let admin = market.admin.pubkey(); + let mint = market.mint; + let fee_recipient = market.fee_recipient.pubkey(); + let fee_recipient_ata = market.fee_recipient_ata; + send_transaction_from_instructions( + &mut market.svm, + vec![ + create_event_ix(admin, mint, event_id, "Two horse race"), + add_outcome_ix(admin, event_id, 0, "Horse A"), + add_outcome_ix(admin, event_id, 1, "Horse B"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + // Everyone bets Horse A; Horse B has no bets. + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0, 100)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + + let result = send_transaction_from_instructions( + &mut market.svm, + vec![settle_event_ix(admin, mint, fee_recipient, fee_recipient_ata, event_id, 1)], + &[&market.admin], + &admin, + ); + assert!(result.is_err(), "settling to an outcome with no bets must fail"); +} + +#[test] +fn test_cancel_and_refund() { + let mut market = setup(); + let event_id: u64 = 5; + let (alice, alice_ata) = create_bettor(&mut market, 1_000); + let (carol, carol_ata) = create_bettor(&mut market, 1_000); + + init_config(&mut market); + let admin = market.admin.pubkey(); + let mint = market.mint; + send_transaction_from_instructions( + &mut market.svm, + vec![ + create_event_ix(admin, mint, event_id, "Voided event"), + add_outcome_ix(admin, event_id, 0, "A"), + add_outcome_ix(admin, event_id, 1, "B"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0, 250)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &carol.pubkey(), &carol_ata, event_id, 1, 750)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + + send_transaction_from_instructions( + &mut market.svm, + vec![cancel_event_ix(admin, event_id)], + &[&market.admin], + &admin, + ) + .unwrap(); + + send_transaction_from_instructions( + &mut market.svm, + vec![claim_refund_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![claim_refund_ix(mint, &carol.pubkey(), &carol_ata, event_id, 1)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + + // Both bettors made whole; no fee on a cancelled event. + assert_eq!(get_token_account_balance(&market.svm, &alice_ata).unwrap(), 1_000); + assert_eq!(get_token_account_balance(&market.svm, &carol_ata).unwrap(), 1_000); + let vault = derive_ata(&event_pda(event_id), &mint); + assert_eq!(get_token_account_balance(&market.svm, &vault).unwrap(), 0); +} From 49398b56c8c581f82833439b642da36cbd69c3c0 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 2 Jun 2026 21:33:11 +0000 Subject: [PATCH 002/138] Add Kamino/Solend-style lending program example A finance/lending Anchor example implementing the core techniques of the most-used Solana lending protocols: - Per-asset reserves with a program-owned liquidity vault and a share-token mint; the share/liquidity exchange rate rises as interest accrues. - Utilization-based kinked interest-rate curve compounded through a cumulative borrow-rate index, with per-obligation scaled debt. - Per-borrower obligations: post share-token collateral, borrow against it up to a loan-to-value limit, repay, withdraw. - Oracle-priced health and close-factor-capped liquidation with a seize bonus. - Switchboard-On-Demand-shaped price feed with a set_price test writer. - Integer-only u128 math (no floats/fixed-point), rounding always in the protocol's favour; available_liquidity as source of truth defeats the empty-pool share-inflation attack. Rust + LiteSVM tests cover supply/redeem, borrow/repay, withdraw, interest accrual, liquidation, the inflation guard, stale reserve/price rejection, and rounding edges (18 tests). https://claude.ai/code/session_01RwE8f8ahP5S6SDNTsXmpj9 --- finance/lending/anchor/Anchor.toml | 19 + finance/lending/anchor/CHANGELOG.md | 17 + finance/lending/anchor/Cargo.toml | 17 + finance/lending/anchor/README.md | 126 ++++ .../anchor/programs/lending/Cargo.toml | 35 + .../anchor/programs/lending/Xargo.toml | 2 + .../anchor/programs/lending/src/constants.rs | 46 ++ .../anchor/programs/lending/src/errors.rs | 37 + .../instructions/admin/init_lending_market.rs | 32 + .../src/instructions/admin/init_reserve.rs | 78 +++ .../lending/src/instructions/admin/mod.rs | 9 + .../src/instructions/admin/set_price.rs | 55 ++ .../admin/update_reserve_config.rs | 31 + .../borrow_obligation_liquidity.rs | 120 ++++ .../deposit_obligation_collateral.rs | 75 +++ .../instructions/deposit_reserve_liquidity.rs | 100 +++ .../src/instructions/init_obligation.rs | 40 ++ .../src/instructions/liquidate_obligation.rs | 205 ++++++ .../programs/lending/src/instructions/mod.rs | 23 + .../instructions/redeem_reserve_collateral.rs | 103 +++ .../src/instructions/refresh_obligation.rs | 134 ++++ .../src/instructions/refresh_reserve.rs | 16 + .../repay_obligation_liquidity.rs | 99 +++ .../withdraw_obligation_collateral.rs | 125 ++++ .../anchor/programs/lending/src/lib.rs | 101 +++ .../anchor/programs/lending/src/math.rs | 116 ++++ .../lending/src/state/lending_market.rs | 16 + .../anchor/programs/lending/src/state/mod.rs | 9 + .../programs/lending/src/state/obligation.rs | 124 ++++ .../programs/lending/src/state/price_feed.rs | 47 ++ .../programs/lending/src/state/reserve.rs | 209 ++++++ .../programs/lending/tests/common/mod.rs | 630 ++++++++++++++++++ .../lending/tests/test_borrow_repay.rs | 121 ++++ .../lending/tests/test_deposit_redeem.rs | 61 ++ .../programs/lending/tests/test_interest.rs | 63 ++ .../lending/tests/test_liquidation.rs | 100 +++ .../programs/lending/tests/test_reserve.rs | 59 ++ .../programs/lending/tests/test_rounding.rs | 106 +++ 38 files changed, 3306 insertions(+) create mode 100644 finance/lending/anchor/Anchor.toml create mode 100644 finance/lending/anchor/CHANGELOG.md create mode 100644 finance/lending/anchor/Cargo.toml create mode 100644 finance/lending/anchor/README.md create mode 100644 finance/lending/anchor/programs/lending/Cargo.toml create mode 100644 finance/lending/anchor/programs/lending/Xargo.toml create mode 100644 finance/lending/anchor/programs/lending/src/constants.rs create mode 100644 finance/lending/anchor/programs/lending/src/errors.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/admin/mod.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/admin/set_price.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/admin/update_reserve_config.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/borrow_obligation_liquidity.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/deposit_obligation_collateral.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/deposit_reserve_liquidity.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/init_obligation.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/liquidate_obligation.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/mod.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/redeem_reserve_collateral.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/refresh_obligation.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/refresh_reserve.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/repay_obligation_liquidity.rs create mode 100644 finance/lending/anchor/programs/lending/src/instructions/withdraw_obligation_collateral.rs create mode 100644 finance/lending/anchor/programs/lending/src/lib.rs create mode 100644 finance/lending/anchor/programs/lending/src/math.rs create mode 100644 finance/lending/anchor/programs/lending/src/state/lending_market.rs create mode 100644 finance/lending/anchor/programs/lending/src/state/mod.rs create mode 100644 finance/lending/anchor/programs/lending/src/state/obligation.rs create mode 100644 finance/lending/anchor/programs/lending/src/state/price_feed.rs create mode 100644 finance/lending/anchor/programs/lending/src/state/reserve.rs create mode 100644 finance/lending/anchor/programs/lending/tests/common/mod.rs create mode 100644 finance/lending/anchor/programs/lending/tests/test_borrow_repay.rs create mode 100644 finance/lending/anchor/programs/lending/tests/test_deposit_redeem.rs create mode 100644 finance/lending/anchor/programs/lending/tests/test_interest.rs create mode 100644 finance/lending/anchor/programs/lending/tests/test_liquidation.rs create mode 100644 finance/lending/anchor/programs/lending/tests/test_reserve.rs create mode 100644 finance/lending/anchor/programs/lending/tests/test_rounding.rs diff --git a/finance/lending/anchor/Anchor.toml b/finance/lending/anchor/Anchor.toml new file mode 100644 index 00000000..2bc8d887 --- /dev/null +++ b/finance/lending/anchor/Anchor.toml @@ -0,0 +1,19 @@ +[toolchain] +# Pinned to match the rest of solana-program-examples (see tokens/token-swap). +# Unpin when the repo-wide Solana version is bumped. +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +lending = "4bvT6A8S7ZVL6bSvK2KoL2nQ4F5H6AF9133kCYbMJj1t" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +# Anchor 1.0+ runs Rust + LiteSVM tests via cargo test. +test = "cargo test" diff --git a/finance/lending/anchor/CHANGELOG.md b/finance/lending/anchor/CHANGELOG.md new file mode 100644 index 00000000..91e0dbb4 --- /dev/null +++ b/finance/lending/anchor/CHANGELOG.md @@ -0,0 +1,17 @@ +# Changelog + +## 0.1.0 + +Initial lending program: a Kamino/Solend-style borrow/lend market. + +- Lending market, per-asset reserves with a program-owned liquidity vault and a + share-token mint, and per-borrower obligations. +- Share-token deposit accounting with an exchange rate driven by accrued interest. +- Utilization-based kinked interest-rate curve compounded through a cumulative + borrow-rate index; per-obligation scaled debt. +- Oracle-priced obligation health with loan-to-value and liquidation-threshold + limits, and close-factor-capped liquidation with a seize bonus. +- Switchboard-On-Demand-shaped price feed with a `set_price` test writer. +- Rust + LiteSVM integration tests covering supply/redeem, borrow/repay, + withdraw, interest accrual, liquidation, the share-inflation guard, and + rounding/stale-input edge cases. diff --git a/finance/lending/anchor/Cargo.toml b/finance/lending/anchor/Cargo.toml new file mode 100644 index 00000000..64a26014 --- /dev/null +++ b/finance/lending/anchor/Cargo.toml @@ -0,0 +1,17 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +# overflow-checks is belt-and-braces: every arithmetic path in the program already +# uses checked_* math, but enabling it means any missed raw op traps instead of wrapping. +overflow-checks = true +lto = "fat" +codegen-units = 1 + +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/finance/lending/anchor/README.md b/finance/lending/anchor/README.md new file mode 100644 index 00000000..115684b6 --- /dev/null +++ b/finance/lending/anchor/README.md @@ -0,0 +1,126 @@ +# Lending + +A Kamino/Solend-style borrow/lend program: suppliers earn interest on deposits, +borrowers post collateral and draw other assets against it, and liquidators keep +the market solvent. It demonstrates the techniques the most-used Solana lending +protocols share โ€” share-token deposit accounting, a utilization-based interest +index, oracle-priced obligation health, and close-factor-capped liquidation. + +## Purpose + +Lending markets let one set of users supply liquidity to earn yield while another +set borrows it against collateral. This program implements that end to end: + +- **Suppliers** deposit a token and receive **share tokens** representing their + slice of the pool. The share-to-liquidity exchange rate rises as borrowers pay + interest, so redeeming later returns more than was deposited. +- **Borrowers** post their share tokens as collateral in an obligation and borrow + a different token, up to a loan-to-value limit. +- **Liquidators** repay part of an unhealthy obligation's debt and seize its + collateral at a discount, pulling the position back to solvency. + +Concrete directional example (a short): supply USDC and post the USDC share +tokens as collateral, borrow NVDAx, and sell it. You are **long your collateral +(USDC) and short the borrowed asset (NVDAx)**. While the loan is open you pay a +variable borrow rate that tracks pool utilization. Buy NVDAx back later, call +`repay_obligation_liquidity`, then `withdraw_obligation_collateral` and +`redeem_reserve_collateral` to exit. If NVDAx instead rises far enough, your debt +crosses the liquidation threshold and a liquidator can close part of the position. + +## Major Concepts + +### Accounts + +- **`LendingMarket`** โ€” top-level config (owner, quote-currency mint). PDA seeds + `["lending_market", owner]`. +- **`Reserve`** โ€” one per asset. Owns a program-controlled liquidity vault and a + share-token mint, and stores the interest-rate config, the cumulative borrow- + rate index, available liquidity, and scaled total debt. PDA seeds + `["reserve", market, liquidity_mint]`. +- **`Obligation`** โ€” one per borrower per market: the share-token collateral + posted and the liquidity borrowed, with cached quote-currency valuations. PDA + seeds `["obligation", market, owner]`. +- **`PriceFeed`** โ€” a price for one token (see Oracle below). + +### Share tokens (the deposit claim) + +Supplying liquidity mints share tokens; redeeming burns them. The exchange rate +is `total_liquidity / share_supply`, where `total_liquidity = available_liquidity ++ current_debt`. `available_liquidity` (not the vault's raw token balance) is the +source of truth, so a token donated directly to the vault cannot inflate the rate +โ€” closing the classic empty-pool inflation attack. The first deposit mints 1:1. + +### Interest: a kinked curve and a cumulative index + +Each `refresh_reserve` advances `cumulative_borrow_rate_index` by +`(1 + rate_per_slot * elapsed_slots)`. `rate_per_slot` comes from a kinked +utilization curve โ€” linear from `min_borrow_rate_bps` to `optimal_borrow_rate_bps` +up to `optimal_utilization_bps`, then steeper to `max_borrow_rate_bps` at full +utilization. Each borrow stores its principal as **scaled debt** (principal รท +index at borrow time), so every obligation's debt grows automatically as the +index advances โ€” no per-obligation accrual loop. + +### Obligation health + +`refresh_obligation` recomputes, from the refreshed reserves and their prices: +`borrowed_value`, `allowed_borrow_value` (ฮฃ collateral value ร— `loan_to_value_bps`) +and `unhealthy_borrow_value` (ฮฃ collateral value ร— `liquidation_threshold_bps`). +Borrowing and withdrawing are gated by `allowed_borrow_value`; an obligation is +liquidatable once `borrowed_value > unhealthy_borrow_value`. Collateral is valued +rounding down and debt rounding up, so health is always judged conservatively. + +### Fixed-point math + +All money math is integer-only `u128` โ€” no floats, no fixed-point crates. Ratios +(rates, the index, the exchange rate, obligation values) are scaled by +`FIXED_POINT_SCALE` (10^18). Every conversion rounds in the protocol's favour +(user output floored, debt ceiled), so dust cannot be extracted by repeated +round-trips. + +### Oracle + +`PriceFeed` mirrors a Switchboard On-Demand pull feed: a signed mantissa, an +exponent (`price = mantissa * 10^exponent`), and the slot the price was written. +Freshness is checked in **slots** (`MAX_PRICE_STALENESS_SLOTS`), not wall-clock +time. The `set_price` handler writes the feed directly so the LiteSVM tests are +deterministic; in production a reserve points at the real Switchboard feed and the +program decodes `PullFeedAccountData` (`price_mantissa = current_result.value`, +`exponent = -18`, `last_updated_slot = current_result.slot`) instead. Switchboard +is used rather than Pyth here for its lower compute cost. + +### Custody + +Supplied liquidity sits in program-owned vault PDAs, and posted collateral sits in +per-obligation vault PDAs whose authority is the obligation PDA. The market owner +can update reserve risk parameters (`update_reserve_config`) but has no path to +move user funds โ€” there is no admin withdrawal or escape hatch. + +### Instruction handlers + +Admin: `init_lending_market`, `init_reserve`, `update_reserve_config`, `set_price`. +Supply side: `refresh_reserve`, `deposit_reserve_liquidity`, +`redeem_reserve_collateral`. Borrow side: `init_obligation`, `refresh_obligation`, +`deposit_obligation_collateral`, `withdraw_obligation_collateral`, +`borrow_obligation_liquidity`, `repay_obligation_liquidity`, `liquidate_obligation`. + +Value-dependent handlers require the reserves and the obligation to have been +refreshed in the same transaction, so a typical action transaction is +`[refresh_reserve โ€ฆ, refresh_obligation, ]`. + +## Setup + +- Rust and the Solana toolchain (`cargo-build-sbf`), Anchor 1.0.x, Solana 3.1.8. +- This program has no client/JavaScript code; tests are Rust + LiteSVM. + +## Testing + +```sh +anchor build # or: cargo build-sbf โ€” produces target/deploy/lending.so +anchor test # or: cargo test โ€” runs the LiteSVM integration tests +``` + +`anchor build` (or `cargo build-sbf`) must run first: the tests load the compiled +`target/deploy/lending.so` via `include_bytes!`. The suite covers the +non-happy-path branches โ€” interest accrual, borrowing at the LTV limit, stale +reserve/price rejection, liquidation of an unhealthy obligation after a price +move, the share-inflation guard, and rounding edges. diff --git a/finance/lending/anchor/programs/lending/Cargo.toml b/finance/lending/anchor/programs/lending/Cargo.toml new file mode 100644 index 00000000..723f5ec6 --- /dev/null +++ b/finance/lending/anchor/programs/lending/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "lending" +version = "0.1.0" +description = "Kamino/Solend-style borrow/lend program" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "lending" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +# init-if-needed: the obligation share vault and the test price feed are created lazily. +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/lending/anchor/programs/lending/Xargo.toml b/finance/lending/anchor/programs/lending/Xargo.toml new file mode 100644 index 00000000..475fb71e --- /dev/null +++ b/finance/lending/anchor/programs/lending/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/finance/lending/anchor/programs/lending/src/constants.rs b/finance/lending/anchor/programs/lending/src/constants.rs new file mode 100644 index 00000000..4ff0db05 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/constants.rs @@ -0,0 +1,46 @@ +use anchor_lang::prelude::*; + +/// Fixed-point scale for every ratio in the program: interest rates, the +/// cumulative borrow-rate index, the share-token exchange rate, and obligation +/// values. A ratio `r` is stored as the integer `r * FIXED_POINT_SCALE`. +/// +/// All money math is integer-only (no floats, no fixed-point crates). 10^18 +/// keeps a single slot's interest โ€” which can be a tiny fraction of the index โ€” +/// from truncating to zero, while u128's ~3.4e38 ceiling leaves headroom for the +/// index to grow and for intermediate products before the final narrowing cast. +#[constant] +pub const FIXED_POINT_SCALE: u128 = 1_000_000_000_000_000_000; + +/// log10(FIXED_POINT_SCALE). Used to fold the price exponent and the fixed-point +/// scale into one power of ten so price conversions never form a needless 10^18 +/// intermediate that would overflow for high-priced assets. +pub const FIXED_POINT_SCALE_DECIMALS: i32 = 18; + +/// Denominator for every basis-point config value. 100% == 10_000 bps. +#[constant] +pub const BPS_DENOMINATOR: u128 = 10_000; + +/// Slots per year, for turning an APR (in bps) into a per-slot rate. +/// Solana targets ~2.5 slots/second: 2.5 * 60 * 60 * 24 * 365 = 78_840_000. +#[constant] +pub const SLOTS_PER_YEAR: u128 = 78_840_000; + +/// Maximum distinct reserves an obligation may use as collateral, and +/// separately as borrows. Bounds the account size and the compute cost of +/// refresh_obligation (which iterates every entry). +pub const MAX_OBLIGATION_RESERVES: usize = 4; + +/// A price feed older than this many slots is rejected as stale (~10s at 2.5 +/// slots/second). Freshness is measured in slots, not unix time, because the +/// runtime guarantees slot progression while the timestamp is validator-influenced. +#[constant] +pub const MAX_PRICE_STALENESS_SLOTS: u64 = 25; + +// PDA seeds. +pub const LENDING_MARKET_SEED: &[u8] = b"lending_market"; +pub const RESERVE_SEED: &[u8] = b"reserve"; +pub const LIQUIDITY_VAULT_SEED: &[u8] = b"liquidity_vault"; +pub const SHARE_MINT_SEED: &[u8] = b"share_mint"; +pub const OBLIGATION_SEED: &[u8] = b"obligation"; +pub const OBLIGATION_SHARE_VAULT_SEED: &[u8] = b"obligation_share_vault"; +pub const PRICE_FEED_SEED: &[u8] = b"price_feed"; diff --git a/finance/lending/anchor/programs/lending/src/errors.rs b/finance/lending/anchor/programs/lending/src/errors.rs new file mode 100644 index 00000000..f4624320 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/errors.rs @@ -0,0 +1,37 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum LendingError { + #[msg("Arithmetic operation overflowed")] + MathOverflow, + #[msg("Reserve config has an invalid value")] + InvalidConfig, + #[msg("Amount must be greater than zero")] + ZeroAmount, + #[msg("Deposit is too small to mint any share tokens")] + DepositTooSmall, + #[msg("Reserve does not have enough available liquidity")] + InsufficientReserveLiquidity, + #[msg("Reserve must be refreshed in this same transaction before use")] + ReserveStale, + #[msg("Obligation must be refreshed in this same transaction before use")] + ObligationStale, + #[msg("Price feed has not been updated recently enough")] + StalePriceFeed, + #[msg("Price feed reported a non-positive price")] + InvalidOraclePrice, + #[msg("Borrow would exceed the obligation's allowed borrow value")] + BorrowTooLarge, + #[msg("Withdraw would leave the obligation undercollateralized")] + WithdrawTooLarge, + #[msg("Obligation is healthy and cannot be liquidated")] + ObligationHealthy, + #[msg("Obligation already uses the maximum number of reserves")] + TooManyReserves, + #[msg("Reserve is not part of this obligation")] + ReserveNotFound, + #[msg("A refresh account did not match the obligation's stored reserves")] + InvalidObligationAccount, + #[msg("Signer is not authorized for this price feed")] + UnauthorizedPriceFeed, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs new file mode 100644 index 00000000..d3fba8a8 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs @@ -0,0 +1,32 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::Mint; + +use crate::constants::LENDING_MARKET_SEED; +use crate::state::LendingMarket; + +pub fn handle_init_lending_market(context: Context) -> Result<()> { + let market = &mut context.accounts.lending_market; + market.owner = context.accounts.owner.key(); + market.quote_currency_mint = context.accounts.quote_currency_mint.key(); + market.bump = context.bumps.lending_market; + Ok(()) +} + +#[derive(Accounts)] +pub struct InitLendingMarket<'info> { + #[account( + init, + payer = owner, + space = LendingMarket::DISCRIMINATOR.len() + LendingMarket::INIT_SPACE, + seeds = [LENDING_MARKET_SEED, owner.key().as_ref()], + bump, + )] + pub lending_market: Account<'info, LendingMarket>, + + #[account(mut)] + pub owner: Signer<'info>, + + pub quote_currency_mint: InterfaceAccount<'info, Mint>, + + pub system_program: Program<'info, System>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs new file mode 100644 index 00000000..5f75a6cc --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs @@ -0,0 +1,78 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; + +use crate::constants::{ + FIXED_POINT_SCALE, LENDING_MARKET_SEED, LIQUIDITY_VAULT_SEED, RESERVE_SEED, SHARE_MINT_SEED, +}; +use crate::state::{LendingMarket, PriceFeed, Reserve, ReserveConfig}; + +pub fn handle_init_reserve(context: Context, config: ReserveConfig) -> Result<()> { + config.validate()?; + + let reserve = &mut context.accounts.reserve; + reserve.lending_market = context.accounts.lending_market.key(); + reserve.liquidity_mint = context.accounts.liquidity_mint.key(); + reserve.liquidity_vault = context.accounts.liquidity_vault.key(); + reserve.share_mint = context.accounts.share_mint.key(); + reserve.price_feed = context.accounts.price_feed.key(); + reserve.liquidity_decimals = context.accounts.liquidity_mint.decimals; + reserve.available_liquidity = 0; + reserve.share_mint_supply = 0; + reserve.borrowed_amount_scaled = 0; + reserve.cumulative_borrow_rate_index = FIXED_POINT_SCALE; + reserve.last_update_slot = Clock::get()?.slot; + reserve.config = config; + reserve.bump = context.bumps.reserve; + Ok(()) +} + +#[derive(Accounts)] +pub struct InitReserve<'info> { + #[account( + has_one = owner, + seeds = [LENDING_MARKET_SEED, owner.key().as_ref()], + bump = lending_market.bump, + )] + pub lending_market: Account<'info, LendingMarket>, + + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + init, + payer = owner, + space = Reserve::DISCRIMINATOR.len() + Reserve::INIT_SPACE, + seeds = [RESERVE_SEED, lending_market.key().as_ref(), liquidity_mint.key().as_ref()], + bump, + )] + pub reserve: Account<'info, Reserve>, + + pub liquidity_mint: InterfaceAccount<'info, Mint>, + + #[account( + init, + payer = owner, + token::mint = liquidity_mint, + token::authority = reserve, + seeds = [LIQUIDITY_VAULT_SEED, reserve.key().as_ref()], + bump, + )] + pub liquidity_vault: InterfaceAccount<'info, TokenAccount>, + + #[account( + init, + payer = owner, + mint::decimals = liquidity_mint.decimals, + mint::authority = reserve, + seeds = [SHARE_MINT_SEED, reserve.key().as_ref()], + bump, + )] + pub share_mint: InterfaceAccount<'info, Mint>, + + #[account(constraint = price_feed.mint == liquidity_mint.key() @ crate::errors::LendingError::InvalidConfig)] + pub price_feed: Account<'info, PriceFeed>, + + pub token_program: Interface<'info, TokenInterface>, + + pub system_program: Program<'info, System>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/mod.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/mod.rs new file mode 100644 index 00000000..5737a8a1 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/mod.rs @@ -0,0 +1,9 @@ +pub mod init_lending_market; +pub mod init_reserve; +pub mod set_price; +pub mod update_reserve_config; + +pub use init_lending_market::*; +pub use init_reserve::*; +pub use set_price::*; +pub use update_reserve_config::*; diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/set_price.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/set_price.rs new file mode 100644 index 00000000..e0c8344f --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/set_price.rs @@ -0,0 +1,55 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::Mint; + +use crate::constants::PRICE_FEED_SEED; +use crate::errors::LendingError; +use crate::state::PriceFeed; + +/// Test stand-in for a Switchboard On-Demand feed: writes a price directly so +/// LiteSVM tests are deterministic. In production the reserve points at a real +/// Switchboard feed instead and this handler is unused. +pub fn handle_set_price( + context: Context, + price_mantissa: i128, + exponent: i32, +) -> Result<()> { + let feed = &mut context.accounts.price_feed; + + // On first creation the authority is unset (default Pubkey); claim it for + // the signer. On later updates only that authority may write. + if feed.authority == Pubkey::default() { + feed.authority = context.accounts.authority.key(); + feed.mint = context.accounts.mint.key(); + feed.bump = context.bumps.price_feed; + } else { + require_keys_eq!( + feed.authority, + context.accounts.authority.key(), + LendingError::UnauthorizedPriceFeed + ); + } + + feed.price_mantissa = price_mantissa; + feed.exponent = exponent; + feed.last_updated_slot = Clock::get()?.slot; + Ok(()) +} + +#[derive(Accounts)] +pub struct SetPrice<'info> { + #[account( + init_if_needed, + payer = authority, + space = PriceFeed::DISCRIMINATOR.len() + PriceFeed::INIT_SPACE, + seeds = [PRICE_FEED_SEED, mint.key().as_ref()], + bump, + )] + pub price_feed: Account<'info, PriceFeed>, + + #[account(mut)] + pub authority: Signer<'info>, + + pub mint: InterfaceAccount<'info, Mint>, + + pub system_program: Program<'info, System>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/update_reserve_config.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/update_reserve_config.rs new file mode 100644 index 00000000..c4ebda7a --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/update_reserve_config.rs @@ -0,0 +1,31 @@ +use anchor_lang::prelude::*; + +use crate::constants::LENDING_MARKET_SEED; +use crate::state::{LendingMarket, Reserve, ReserveConfig}; + +pub fn handle_update_reserve_config( + context: Context, + config: ReserveConfig, +) -> Result<()> { + config.validate()?; + context.accounts.reserve.config = config; + Ok(()) +} + +#[derive(Accounts)] +pub struct UpdateReserveConfig<'info> { + #[account( + has_one = owner, + seeds = [LENDING_MARKET_SEED, owner.key().as_ref()], + bump = lending_market.bump, + )] + pub lending_market: Account<'info, LendingMarket>, + + pub owner: Signer<'info>, + + #[account( + mut, + has_one = lending_market, + )] + pub reserve: Account<'info, Reserve>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/borrow_obligation_liquidity.rs b/finance/lending/anchor/programs/lending/src/instructions/borrow_obligation_liquidity.rs new file mode 100644 index 00000000..70a4859d --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/borrow_obligation_liquidity.rs @@ -0,0 +1,120 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::constants::FIXED_POINT_SCALE; +use crate::errors::LendingError; +use crate::math::{market_value, mul_div_ceil, reserve_signer_seeds, Rounding}; +use crate::state::{Obligation, PriceFeed, Reserve}; + +/// Borrow liquidity against the obligation's collateral. The new debt's value +/// (rounded up) plus the existing debt must stay within the obligation's +/// allowed-borrow value. The borrowed amount is recorded as scaled principal at +/// the reserve's current index (rounded up) so it accrues interest going forward. +pub fn handle_borrow_obligation_liquidity( + context: Context, + liquidity_amount: u64, +) -> Result<()> { + require!(liquidity_amount > 0, LendingError::ZeroAmount); + let slot = Clock::get()?.slot; + let reserve_key = context.accounts.reserve.key(); + + context.accounts.obligation.require_refreshed()?; + context.accounts.reserve.require_refreshed()?; + + let price_scaled = context.accounts.price_feed.price_scaled(slot)?; + let decimals = context.accounts.reserve.liquidity_decimals; + let borrow_value = market_value(liquidity_amount, decimals, price_scaled, Rounding::Up)?; + + let projected_borrowed_value = context + .accounts + .obligation + .borrowed_value + .checked_add(borrow_value) + .ok_or(LendingError::MathOverflow)?; + require!( + projected_borrowed_value <= context.accounts.obligation.allowed_borrow_value, + LendingError::BorrowTooLarge + ); + require!( + liquidity_amount <= context.accounts.reserve.available_liquidity, + LendingError::InsufficientReserveLiquidity + ); + + let scaled_added = mul_div_ceil( + liquidity_amount as u128, + FIXED_POINT_SCALE, + context.accounts.reserve.cumulative_borrow_rate_index, + )?; + + { + let reserve = &mut context.accounts.reserve; + reserve.borrowed_amount_scaled = reserve + .borrowed_amount_scaled + .checked_add(scaled_added) + .ok_or(LendingError::MathOverflow)?; + reserve.available_liquidity = reserve + .available_liquidity + .checked_sub(liquidity_amount) + .ok_or(LendingError::MathOverflow)?; + } + + { + let obligation = &mut context.accounts.obligation; + let index = obligation.upsert_borrow(reserve_key)?; + obligation.borrows[index].borrowed_scaled = obligation.borrows[index] + .borrowed_scaled + .checked_add(scaled_added) + .ok_or(LendingError::MathOverflow)?; + obligation.stale = true; + } + + let reserve = &context.accounts.reserve; + let bump = [reserve.bump]; + let seeds = reserve_signer_seeds(&reserve.lending_market, &reserve.liquidity_mint, &bump); + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.liquidity_vault.to_account_info(), + mint: context.accounts.liquidity_mint.to_account_info(), + to: context.accounts.user_liquidity.to_account_info(), + authority: reserve.to_account_info(), + }, + &[&seeds], + ), + liquidity_amount, + decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct BorrowObligationLiquidity<'info> { + #[account(mut, has_one = owner)] + pub obligation: Account<'info, Obligation>, + + pub owner: Signer<'info>, + + #[account( + mut, + has_one = liquidity_mint, + has_one = liquidity_vault, + has_one = price_feed, + )] + pub reserve: Account<'info, Reserve>, + + pub price_feed: Account<'info, PriceFeed>, + + pub liquidity_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub liquidity_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub user_liquidity: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/deposit_obligation_collateral.rs b/finance/lending/anchor/programs/lending/src/instructions/deposit_obligation_collateral.rs new file mode 100644 index 00000000..01bc1610 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/deposit_obligation_collateral.rs @@ -0,0 +1,75 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::constants::OBLIGATION_SHARE_VAULT_SEED; +use crate::errors::LendingError; +use crate::state::{Obligation, Reserve}; + +/// Post share tokens as collateral. The shares move into a per-(reserve, +/// obligation) vault owned by the obligation PDA. No health check is needed โ€” +/// adding collateral only improves health โ€” but the obligation is marked stale +/// so its cached values are recomputed before the next health-dependent action. +pub fn handle_deposit_obligation_collateral( + context: Context, + share_amount: u64, +) -> Result<()> { + require!(share_amount > 0, LendingError::ZeroAmount); + + let reserve_key = context.accounts.reserve.key(); + let obligation = &mut context.accounts.obligation; + let index = obligation.upsert_collateral(reserve_key)?; + obligation.deposits[index].deposited_shares = obligation.deposits[index] + .deposited_shares + .checked_add(share_amount) + .ok_or(LendingError::MathOverflow)?; + obligation.stale = true; + + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.user_share.to_account_info(), + mint: context.accounts.share_mint.to_account_info(), + to: context.accounts.obligation_share_vault.to_account_info(), + authority: context.accounts.owner.to_account_info(), + }, + ), + share_amount, + context.accounts.share_mint.decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct DepositObligationCollateral<'info> { + #[account(mut, has_one = owner)] + pub obligation: Account<'info, Obligation>, + + #[account(mut)] + pub owner: Signer<'info>, + + #[account(has_one = share_mint)] + pub reserve: Account<'info, Reserve>, + + pub share_mint: InterfaceAccount<'info, Mint>, + + #[account( + init_if_needed, + payer = owner, + token::mint = share_mint, + token::authority = obligation, + seeds = [OBLIGATION_SHARE_VAULT_SEED, reserve.key().as_ref(), obligation.key().as_ref()], + bump, + )] + pub obligation_share_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub user_share: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, + + pub system_program: Program<'info, System>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/deposit_reserve_liquidity.rs b/finance/lending/anchor/programs/lending/src/instructions/deposit_reserve_liquidity.rs new file mode 100644 index 00000000..7ae43702 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/deposit_reserve_liquidity.rs @@ -0,0 +1,100 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + mint_to, transfer_checked, Mint, MintTo, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::errors::LendingError; +use crate::math::{mul_div_floor, reserve_signer_seeds}; +use crate::state::Reserve; + +/// Supply liquidity to a reserve and receive share tokens. The first deposit +/// mints share tokens 1:1; later deposits mint +/// `liquidity_amount * share_supply / total_liquidity`, floored so the protocol +/// keeps any rounding dust. +pub fn handle_deposit_reserve_liquidity( + context: Context, + liquidity_amount: u64, +) -> Result<()> { + require!(liquidity_amount > 0, LendingError::ZeroAmount); + let reserve = &mut context.accounts.reserve; + reserve.require_refreshed()?; + + let share_supply = reserve.share_mint_supply as u128; + let share_amount = if share_supply == 0 { + liquidity_amount as u128 + } else { + mul_div_floor(liquidity_amount as u128, share_supply, reserve.total_liquidity()?)? + }; + require!(share_amount > 0, LendingError::DepositTooSmall); + let share_amount = u64::try_from(share_amount).map_err(|_| LendingError::MathOverflow)?; + + // Effects before interactions. + reserve.available_liquidity = reserve + .available_liquidity + .checked_add(liquidity_amount) + .ok_or(LendingError::MathOverflow)?; + reserve.share_mint_supply = reserve + .share_mint_supply + .checked_add(share_amount) + .ok_or(LendingError::MathOverflow)?; + + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.user_liquidity.to_account_info(), + mint: context.accounts.liquidity_mint.to_account_info(), + to: context.accounts.liquidity_vault.to_account_info(), + authority: context.accounts.owner.to_account_info(), + }, + ), + liquidity_amount, + reserve.liquidity_decimals, + )?; + + let bump = [reserve.bump]; + let seeds = reserve_signer_seeds(&reserve.lending_market, &reserve.liquidity_mint, &bump); + mint_to( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + MintTo { + mint: context.accounts.share_mint.to_account_info(), + to: context.accounts.user_share.to_account_info(), + authority: reserve.to_account_info(), + }, + &[&seeds], + ), + share_amount, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct DepositReserveLiquidity<'info> { + #[account( + mut, + has_one = liquidity_mint, + has_one = liquidity_vault, + has_one = share_mint, + )] + pub reserve: Account<'info, Reserve>, + + pub liquidity_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub liquidity_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub share_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub user_liquidity: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub user_share: InterfaceAccount<'info, TokenAccount>, + + pub owner: Signer<'info>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/init_obligation.rs b/finance/lending/anchor/programs/lending/src/instructions/init_obligation.rs new file mode 100644 index 00000000..07b5d523 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/init_obligation.rs @@ -0,0 +1,40 @@ +use anchor_lang::prelude::*; + +use crate::constants::OBLIGATION_SEED; +use crate::state::{LendingMarket, Obligation}; + +pub fn handle_init_obligation(context: Context) -> Result<()> { + let obligation = &mut context.accounts.obligation; + obligation.lending_market = context.accounts.lending_market.key(); + obligation.owner = context.accounts.owner.key(); + obligation.last_update_slot = Clock::get()?.slot; + // Stale until the first refresh; an empty obligation has nothing to value yet. + obligation.stale = true; + obligation.deposited_value = 0; + obligation.borrowed_value = 0; + obligation.allowed_borrow_value = 0; + obligation.unhealthy_borrow_value = 0; + obligation.deposits = Vec::new(); + obligation.borrows = Vec::new(); + obligation.bump = context.bumps.obligation; + Ok(()) +} + +#[derive(Accounts)] +pub struct InitObligation<'info> { + pub lending_market: Account<'info, LendingMarket>, + + #[account( + init, + payer = owner, + space = Obligation::DISCRIMINATOR.len() + Obligation::INIT_SPACE, + seeds = [OBLIGATION_SEED, lending_market.key().as_ref(), owner.key().as_ref()], + bump, + )] + pub obligation: Account<'info, Obligation>, + + #[account(mut)] + pub owner: Signer<'info>, + + pub system_program: Program<'info, System>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/liquidate_obligation.rs b/finance/lending/anchor/programs/lending/src/instructions/liquidate_obligation.rs new file mode 100644 index 00000000..ec257b74 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/liquidate_obligation.rs @@ -0,0 +1,205 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::constants::{BPS_DENOMINATOR, FIXED_POINT_SCALE, OBLIGATION_SEED, OBLIGATION_SHARE_VAULT_SEED}; +use crate::errors::LendingError; +use crate::math::{market_value, mul_div_ceil, mul_div_floor, value_to_amount, Rounding}; +use crate::state::{Obligation, PriceFeed, Reserve}; + +/// Repay part of an unhealthy obligation's debt and seize a matching amount of +/// its collateral share tokens plus a bonus. A single liquidation may repay at +/// most the collateral reserve's close factor of the borrow. The seized +/// collateral is valued at the borrow repaid plus the liquidation bonus, all +/// rounded toward the borrower so the obligation is never over-seized. +/// +/// Self-liquidation (the owner liquidating their own position) is not blocked: +/// it is only possible while unhealthy and is economically pointless, matching +/// how Solend and Kamino behave. +pub fn handle_liquidate_obligation( + context: Context, + liquidity_amount: u64, +) -> Result<()> { + require!(liquidity_amount > 0, LendingError::ZeroAmount); + let slot = Clock::get()?.slot; + + context.accounts.obligation.require_refreshed()?; + context.accounts.repay_reserve.require_refreshed()?; + context.accounts.collateral_reserve.require_refreshed()?; + + require!( + context.accounts.obligation.borrowed_value > context.accounts.obligation.unhealthy_borrow_value, + LendingError::ObligationHealthy + ); + + let repay_reserve_key = context.accounts.repay_reserve.key(); + let collateral_reserve_key = context.accounts.collateral_reserve.key(); + let repay_price = context.accounts.repay_price_feed.price_scaled(slot)?; + let collateral_price = context.accounts.collateral_price_feed.price_scaled(slot)?; + + let borrow_index = context.accounts.obligation.find_borrow(repay_reserve_key)?; + let collateral_index = context.accounts.obligation.find_collateral(collateral_reserve_key)?; + let borrowed_scaled = context.accounts.obligation.borrows[borrow_index].borrowed_scaled; + let deposited_shares = context.accounts.obligation.deposits[collateral_index].deposited_shares; + + // How much debt this liquidation repays, capped by the close factor. + let interest_index = context.accounts.repay_reserve.cumulative_borrow_rate_index; + let debt_now = mul_div_ceil(borrowed_scaled, interest_index, FIXED_POINT_SCALE)?; + let debt_now = u64::try_from(debt_now).map_err(|_| LendingError::MathOverflow)?; + let max_repay = mul_div_floor( + debt_now as u128, + context.accounts.collateral_reserve.config.close_factor_bps as u128, + BPS_DENOMINATOR, + )?; + let repay = liquidity_amount.min(u64::try_from(max_repay).map_err(|_| LendingError::MathOverflow)?); + require!(repay > 0, LendingError::ZeroAmount); + + // Collateral to seize: value of the repayment plus the bonus, converted into + // the collateral token and then into share tokens. Every step rounds down. + let repay_value = market_value( + repay, + context.accounts.repay_reserve.liquidity_decimals, + repay_price, + Rounding::Down, + )?; + let bonus_value = mul_div_floor( + repay_value, + context.accounts.collateral_reserve.config.liquidation_bonus_bps as u128, + BPS_DENOMINATOR, + )?; + let seize_value = repay_value + .checked_add(bonus_value) + .ok_or(LendingError::MathOverflow)?; + let seize_liquidity = value_to_amount( + seize_value, + context.accounts.collateral_reserve.liquidity_decimals, + collateral_price, + Rounding::Down, + )?; + let seize_shares = mul_div_floor( + seize_liquidity as u128, + context.accounts.collateral_reserve.share_mint_supply as u128, + context.accounts.collateral_reserve.total_liquidity()?.max(1), + )?; + let seize_shares = u64::try_from(seize_shares) + .map_err(|_| LendingError::MathOverflow)? + .min(deposited_shares); + require!(seize_shares > 0, LendingError::ZeroAmount); + + let scaled_removed = + mul_div_floor(repay as u128, FIXED_POINT_SCALE, interest_index)?.min(borrowed_scaled); + + // Effects: repay side. + { + let repay_reserve = &mut context.accounts.repay_reserve; + repay_reserve.borrowed_amount_scaled = repay_reserve + .borrowed_amount_scaled + .checked_sub(scaled_removed) + .ok_or(LendingError::MathOverflow)?; + repay_reserve.available_liquidity = repay_reserve + .available_liquidity + .checked_add(repay) + .ok_or(LendingError::MathOverflow)?; + } + + // Effects: obligation debt and collateral. + let (lending_market, owner, obligation_bump) = { + let obligation = &mut context.accounts.obligation; + obligation.borrows[borrow_index].borrowed_scaled = borrowed_scaled + .checked_sub(scaled_removed) + .ok_or(LendingError::MathOverflow)?; + if obligation.borrows[borrow_index].borrowed_scaled == 0 { + obligation.borrows.remove(borrow_index); + } + obligation.deposits[collateral_index].deposited_shares = deposited_shares + .checked_sub(seize_shares) + .ok_or(LendingError::MathOverflow)?; + if obligation.deposits[collateral_index].deposited_shares == 0 { + obligation.deposits.remove(collateral_index); + } + obligation.stale = true; + (obligation.lending_market, obligation.owner, obligation.bump) + }; + + // Interactions: liquidator repays, then receives the seized share tokens. + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.liquidator_repay_source.to_account_info(), + mint: context.accounts.repay_liquidity_mint.to_account_info(), + to: context.accounts.repay_liquidity_vault.to_account_info(), + authority: context.accounts.liquidator.to_account_info(), + }, + ), + repay, + context.accounts.repay_reserve.liquidity_decimals, + )?; + + let bump = [obligation_bump]; + let seeds: [&[u8]; 4] = [OBLIGATION_SEED, lending_market.as_ref(), owner.as_ref(), &bump]; + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.obligation_collateral_vault.to_account_info(), + mint: context.accounts.collateral_share_mint.to_account_info(), + to: context.accounts.liquidator_collateral_dest.to_account_info(), + authority: context.accounts.obligation.to_account_info(), + }, + &[&seeds], + ), + seize_shares, + context.accounts.collateral_share_mint.decimals, + )?; + + Ok(()) +} + +// Liquidation touches 13 accounts; every Account/InterfaceAccount is boxed so +// account deserialization happens on the heap and stays within the BPF stack frame. +#[derive(Accounts)] +pub struct LiquidateObligation<'info> { + #[account(mut)] + pub obligation: Box>, + + pub liquidator: Signer<'info>, + + #[account(mut)] + pub repay_reserve: Box>, + + pub collateral_reserve: Box>, + + #[account(address = repay_reserve.price_feed)] + pub repay_price_feed: Box>, + + #[account(address = collateral_reserve.price_feed)] + pub collateral_price_feed: Box>, + + #[account(address = repay_reserve.liquidity_mint)] + pub repay_liquidity_mint: Box>, + + #[account(address = collateral_reserve.share_mint)] + pub collateral_share_mint: Box>, + + #[account(mut, address = repay_reserve.liquidity_vault)] + pub repay_liquidity_vault: Box>, + + #[account( + mut, + seeds = [OBLIGATION_SHARE_VAULT_SEED, collateral_reserve.key().as_ref(), obligation.key().as_ref()], + bump, + token::mint = collateral_share_mint, + token::authority = obligation, + )] + pub obligation_collateral_vault: Box>, + + #[account(mut)] + pub liquidator_repay_source: Box>, + + #[account(mut)] + pub liquidator_collateral_dest: Box>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/mod.rs b/finance/lending/anchor/programs/lending/src/instructions/mod.rs new file mode 100644 index 00000000..a1905200 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/mod.rs @@ -0,0 +1,23 @@ +pub mod admin; +pub mod borrow_obligation_liquidity; +pub mod deposit_obligation_collateral; +pub mod deposit_reserve_liquidity; +pub mod init_obligation; +pub mod liquidate_obligation; +pub mod redeem_reserve_collateral; +pub mod refresh_obligation; +pub mod refresh_reserve; +pub mod repay_obligation_liquidity; +pub mod withdraw_obligation_collateral; + +pub use admin::*; +pub use borrow_obligation_liquidity::*; +pub use deposit_obligation_collateral::*; +pub use deposit_reserve_liquidity::*; +pub use init_obligation::*; +pub use liquidate_obligation::*; +pub use redeem_reserve_collateral::*; +pub use refresh_obligation::*; +pub use refresh_reserve::*; +pub use repay_obligation_liquidity::*; +pub use withdraw_obligation_collateral::*; diff --git a/finance/lending/anchor/programs/lending/src/instructions/redeem_reserve_collateral.rs b/finance/lending/anchor/programs/lending/src/instructions/redeem_reserve_collateral.rs new file mode 100644 index 00000000..6d0309b0 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/redeem_reserve_collateral.rs @@ -0,0 +1,103 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + burn, transfer_checked, Burn, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::errors::LendingError; +use crate::math::{mul_div_floor, reserve_signer_seeds}; +use crate::state::Reserve; + +/// Burn share tokens and withdraw the underlying liquidity they represent: +/// `share_amount * total_liquidity / share_supply`, floored so the protocol +/// keeps any rounding dust. Capped by the reserve's available (un-borrowed) +/// liquidity. +pub fn handle_redeem_reserve_collateral( + context: Context, + share_amount: u64, +) -> Result<()> { + require!(share_amount > 0, LendingError::ZeroAmount); + let reserve = &mut context.accounts.reserve; + reserve.require_refreshed()?; + + let share_supply = reserve.share_mint_supply as u128; + require!(share_supply > 0, LendingError::InsufficientReserveLiquidity); + let liquidity_amount = mul_div_floor( + share_amount as u128, + reserve.total_liquidity()?, + share_supply, + )?; + let liquidity_amount = u64::try_from(liquidity_amount).map_err(|_| LendingError::MathOverflow)?; + require!( + liquidity_amount <= reserve.available_liquidity, + LendingError::InsufficientReserveLiquidity + ); + + reserve.available_liquidity = reserve + .available_liquidity + .checked_sub(liquidity_amount) + .ok_or(LendingError::MathOverflow)?; + reserve.share_mint_supply = reserve + .share_mint_supply + .checked_sub(share_amount) + .ok_or(LendingError::MathOverflow)?; + + burn( + CpiContext::new( + context.accounts.token_program.key(), + Burn { + mint: context.accounts.share_mint.to_account_info(), + from: context.accounts.user_share.to_account_info(), + authority: context.accounts.owner.to_account_info(), + }, + ), + share_amount, + )?; + + let bump = [reserve.bump]; + let seeds = reserve_signer_seeds(&reserve.lending_market, &reserve.liquidity_mint, &bump); + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.liquidity_vault.to_account_info(), + mint: context.accounts.liquidity_mint.to_account_info(), + to: context.accounts.user_liquidity.to_account_info(), + authority: reserve.to_account_info(), + }, + &[&seeds], + ), + liquidity_amount, + reserve.liquidity_decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct RedeemReserveCollateral<'info> { + #[account( + mut, + has_one = liquidity_mint, + has_one = liquidity_vault, + has_one = share_mint, + )] + pub reserve: Account<'info, Reserve>, + + pub liquidity_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub liquidity_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub share_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub user_liquidity: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub user_share: InterfaceAccount<'info, TokenAccount>, + + pub owner: Signer<'info>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/refresh_obligation.rs b/finance/lending/anchor/programs/lending/src/instructions/refresh_obligation.rs new file mode 100644 index 00000000..440c5096 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/refresh_obligation.rs @@ -0,0 +1,134 @@ +use anchor_lang::prelude::*; + +use crate::constants::BPS_DENOMINATOR; +use crate::errors::LendingError; +use crate::math::{market_value, mul_div_ceil, mul_div_floor, Rounding}; +use crate::state::{Obligation, PriceFeed, Reserve}; + +/// Recompute the obligation's deposited/borrowed values and its borrow limits +/// from the current state of every reserve it touches. +/// +/// The reserve and price-feed accounts are passed as `remaining_accounts`, two +/// per entry โ€” first the deposit reserves in `obligation.deposits` order, then +/// the borrow reserves in `obligation.borrows` order โ€” each as +/// `[reserve, price_feed]`. Every reserve must already be refreshed this slot. +/// +/// Collateral value is floored and debt value is ceiled, so health is always +/// evaluated conservatively against the borrower. +pub fn handle_refresh_obligation(context: Context) -> Result<()> { + let slot = Clock::get()?.slot; + let obligation = &mut context.accounts.obligation; + let accounts = context.remaining_accounts; + let mut cursor = 0usize; + + let mut deposited_value: u128 = 0; + let mut allowed_borrow_value: u128 = 0; + let mut unhealthy_borrow_value: u128 = 0; + + for collateral in obligation.deposits.iter_mut() { + let (reserve, price_scaled) = read_pair(accounts, &mut cursor, collateral.reserve, slot)?; + + let liquidity = mul_div_floor( + collateral.deposited_shares as u128, + reserve.total_liquidity()?, + (reserve.share_mint_supply as u128).max(1), + )?; + let liquidity = u64::try_from(liquidity).map_err(|_| LendingError::MathOverflow)?; + let value = market_value(liquidity, reserve.liquidity_decimals, price_scaled, Rounding::Down)?; + + collateral.market_value = value; + deposited_value = deposited_value + .checked_add(value) + .ok_or(LendingError::MathOverflow)?; + allowed_borrow_value = allowed_borrow_value + .checked_add(mul_div_floor( + value, + reserve.config.loan_to_value_bps as u128, + BPS_DENOMINATOR, + )?) + .ok_or(LendingError::MathOverflow)?; + unhealthy_borrow_value = unhealthy_borrow_value + .checked_add(mul_div_floor( + value, + reserve.config.liquidation_threshold_bps as u128, + BPS_DENOMINATOR, + )?) + .ok_or(LendingError::MathOverflow)?; + } + + let mut borrowed_value: u128 = 0; + for borrow in obligation.borrows.iter_mut() { + let (reserve, price_scaled) = read_pair(accounts, &mut cursor, borrow.reserve, slot)?; + + let debt = mul_div_ceil( + borrow.borrowed_scaled, + reserve.cumulative_borrow_rate_index, + crate::constants::FIXED_POINT_SCALE, + )?; + let debt = u64::try_from(debt).map_err(|_| LendingError::MathOverflow)?; + let value = market_value(debt, reserve.liquidity_decimals, price_scaled, Rounding::Up)?; + + borrow.market_value = value; + borrowed_value = borrowed_value + .checked_add(value) + .ok_or(LendingError::MathOverflow)?; + } + + require!( + cursor == accounts.len(), + LendingError::InvalidObligationAccount + ); + + obligation.deposited_value = deposited_value; + obligation.allowed_borrow_value = allowed_borrow_value; + obligation.unhealthy_borrow_value = unhealthy_borrow_value; + obligation.borrowed_value = borrowed_value; + obligation.last_update_slot = slot; + obligation.stale = false; + Ok(()) +} + +/// Read the next `[reserve, price_feed]` pair from `remaining_accounts`, +/// checking it matches the obligation's stored reserve and that both the +/// reserve (refreshed this slot) and the price (fresh) are usable. +fn read_pair<'a, 'info>( + accounts: &'a [AccountInfo<'info>], + cursor: &mut usize, + expected_reserve: Pubkey, + slot: u64, +) -> Result<(Reserve, u128)> +where + 'a: 'info, +{ + let reserve_info = accounts + .get(*cursor) + .ok_or(LendingError::InvalidObligationAccount)?; + let price_info = accounts + .get(*cursor + 1) + .ok_or(LendingError::InvalidObligationAccount)?; + *cursor += 2; + + require_keys_eq!( + reserve_info.key(), + expected_reserve, + LendingError::InvalidObligationAccount + ); + let reserve = Account::::try_from(reserve_info)?; + reserve.require_refreshed()?; + + require_keys_eq!( + price_info.key(), + reserve.price_feed, + LendingError::InvalidObligationAccount + ); + let price_feed = Account::::try_from(price_info)?; + let price_scaled = price_feed.price_scaled(slot)?; + + Ok((reserve.into_inner(), price_scaled)) +} + +#[derive(Accounts)] +pub struct RefreshObligation<'info> { + #[account(mut)] + pub obligation: Account<'info, Obligation>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/refresh_reserve.rs b/finance/lending/anchor/programs/lending/src/instructions/refresh_reserve.rs new file mode 100644 index 00000000..151f095a --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/refresh_reserve.rs @@ -0,0 +1,16 @@ +use anchor_lang::prelude::*; + +use crate::state::Reserve; + +/// Accrue interest up to the current slot. Must run (as its own instruction in +/// the same transaction) before any handler that reads the reserve's value, and +/// before `refresh_obligation` for any reserve the obligation touches. +pub fn handle_refresh_reserve(context: Context) -> Result<()> { + context.accounts.reserve.accrue_interest(Clock::get()?.slot) +} + +#[derive(Accounts)] +pub struct RefreshReserve<'info> { + #[account(mut)] + pub reserve: Account<'info, Reserve>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/repay_obligation_liquidity.rs b/finance/lending/anchor/programs/lending/src/instructions/repay_obligation_liquidity.rs new file mode 100644 index 00000000..acce54e1 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/repay_obligation_liquidity.rs @@ -0,0 +1,99 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::constants::FIXED_POINT_SCALE; +use crate::errors::LendingError; +use crate::math::{mul_div_ceil, mul_div_floor}; +use crate::state::{Obligation, Reserve}; + +/// Repay borrowed liquidity, clamped to the live debt. The repaid amount removes +/// scaled principal rounded down, so any sub-unit of principal lingers with the +/// borrower rather than being forgiven by rounding. Anyone may repay on behalf +/// of an obligation, so there is no owner check. +pub fn handle_repay_obligation_liquidity( + context: Context, + liquidity_amount: u64, +) -> Result<()> { + require!(liquidity_amount > 0, LendingError::ZeroAmount); + let reserve_key = context.accounts.reserve.key(); + context.accounts.reserve.require_refreshed()?; + + let index = context.accounts.reserve.cumulative_borrow_rate_index; + let decimals = context.accounts.reserve.liquidity_decimals; + + let borrow_index = context.accounts.obligation.find_borrow(reserve_key)?; + let borrowed_scaled = context.accounts.obligation.borrows[borrow_index].borrowed_scaled; + + let debt_now = mul_div_ceil(borrowed_scaled, index, FIXED_POINT_SCALE)?; + let debt_now = u64::try_from(debt_now).map_err(|_| LendingError::MathOverflow)?; + let repay = liquidity_amount.min(debt_now); + require!(repay > 0, LendingError::ZeroAmount); + + let scaled_removed = mul_div_floor(repay as u128, FIXED_POINT_SCALE, index)?.min(borrowed_scaled); + + { + let reserve = &mut context.accounts.reserve; + reserve.borrowed_amount_scaled = reserve + .borrowed_amount_scaled + .checked_sub(scaled_removed) + .ok_or(LendingError::MathOverflow)?; + reserve.available_liquidity = reserve + .available_liquidity + .checked_add(repay) + .ok_or(LendingError::MathOverflow)?; + } + + { + let obligation = &mut context.accounts.obligation; + obligation.borrows[borrow_index].borrowed_scaled = borrowed_scaled + .checked_sub(scaled_removed) + .ok_or(LendingError::MathOverflow)?; + if obligation.borrows[borrow_index].borrowed_scaled == 0 { + obligation.borrows.remove(borrow_index); + } + obligation.stale = true; + } + + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.user_liquidity.to_account_info(), + mint: context.accounts.liquidity_mint.to_account_info(), + to: context.accounts.liquidity_vault.to_account_info(), + authority: context.accounts.repayer.to_account_info(), + }, + ), + repay, + decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct RepayObligationLiquidity<'info> { + #[account(mut)] + pub obligation: Account<'info, Obligation>, + + #[account( + mut, + has_one = liquidity_mint, + has_one = liquidity_vault, + )] + pub reserve: Account<'info, Reserve>, + + pub liquidity_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub liquidity_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub user_liquidity: InterfaceAccount<'info, TokenAccount>, + + pub repayer: Signer<'info>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/withdraw_obligation_collateral.rs b/finance/lending/anchor/programs/lending/src/instructions/withdraw_obligation_collateral.rs new file mode 100644 index 00000000..c272aac3 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/withdraw_obligation_collateral.rs @@ -0,0 +1,125 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::constants::{BPS_DENOMINATOR, OBLIGATION_SEED, OBLIGATION_SHARE_VAULT_SEED}; +use crate::errors::LendingError; +use crate::math::{market_value, mul_div_floor, Rounding}; +use crate::state::{Obligation, PriceFeed, Reserve}; + +/// Withdraw posted share-token collateral, but only as long as the obligation +/// stays within its borrow limit afterwards. The post-withdraw allowed-borrow +/// value is simulated and the withdraw is rejected if the existing debt would +/// exceed it. +pub fn handle_withdraw_obligation_collateral( + context: Context, + share_amount: u64, +) -> Result<()> { + require!(share_amount > 0, LendingError::ZeroAmount); + let slot = Clock::get()?.slot; + + context.accounts.obligation.require_refreshed()?; + context.accounts.reserve.require_refreshed()?; + let reserve = &context.accounts.reserve; + let price_scaled = context.accounts.price_feed.price_scaled(slot)?; + + let obligation = &mut context.accounts.obligation; + let index = obligation.find_collateral(reserve.key())?; + require!( + obligation.deposits[index].deposited_shares >= share_amount, + LendingError::WithdrawTooLarge + ); + + // Value of the collateral being removed, and the borrow power it backed. + let removed_liquidity = mul_div_floor( + share_amount as u128, + reserve.total_liquidity()?, + (reserve.share_mint_supply as u128).max(1), + )?; + let removed_liquidity = u64::try_from(removed_liquidity).map_err(|_| LendingError::MathOverflow)?; + let removed_value = market_value( + removed_liquidity, + reserve.liquidity_decimals, + price_scaled, + Rounding::Down, + )?; + let removed_allowed = mul_div_floor( + removed_value, + reserve.config.loan_to_value_bps as u128, + BPS_DENOMINATOR, + )?; + let new_allowed_borrow_value = obligation + .allowed_borrow_value + .checked_sub(removed_allowed) + .ok_or(LendingError::MathOverflow)?; + require!( + obligation.borrowed_value <= new_allowed_borrow_value, + LendingError::WithdrawTooLarge + ); + + // Effects. + obligation.deposits[index].deposited_shares = obligation.deposits[index] + .deposited_shares + .checked_sub(share_amount) + .ok_or(LendingError::MathOverflow)?; + if obligation.deposits[index].deposited_shares == 0 { + obligation.deposits.remove(index); + } + obligation.stale = true; + + let lending_market = obligation.lending_market; + let owner = obligation.owner; + let bump = [obligation.bump]; + let seeds: [&[u8]; 4] = [ + OBLIGATION_SEED, + lending_market.as_ref(), + owner.as_ref(), + &bump, + ]; + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.obligation_share_vault.to_account_info(), + mint: context.accounts.share_mint.to_account_info(), + to: context.accounts.user_share.to_account_info(), + authority: obligation.to_account_info(), + }, + &[&seeds], + ), + share_amount, + context.accounts.share_mint.decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct WithdrawObligationCollateral<'info> { + #[account(mut, has_one = owner)] + pub obligation: Account<'info, Obligation>, + + pub owner: Signer<'info>, + + #[account(has_one = share_mint, has_one = price_feed)] + pub reserve: Account<'info, Reserve>, + + pub price_feed: Account<'info, PriceFeed>, + + pub share_mint: InterfaceAccount<'info, Mint>, + + #[account( + mut, + seeds = [OBLIGATION_SHARE_VAULT_SEED, reserve.key().as_ref(), obligation.key().as_ref()], + bump, + token::mint = share_mint, + token::authority = obligation, + )] + pub obligation_share_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub user_share: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor/programs/lending/src/lib.rs b/finance/lending/anchor/programs/lending/src/lib.rs new file mode 100644 index 00000000..e2892ca6 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/lib.rs @@ -0,0 +1,101 @@ +use anchor_lang::prelude::*; + +pub mod constants; +pub mod errors; +pub mod math; +pub mod instructions; +pub mod state; + +use instructions::*; +use state::ReserveConfig; + +declare_id!("4bvT6A8S7ZVL6bSvK2KoL2nQ4F5H6AF9133kCYbMJj1t"); + +#[program] +pub mod lending { + use super::*; + + pub fn init_lending_market(context: Context) -> Result<()> { + instructions::handle_init_lending_market(context) + } + + pub fn init_reserve(context: Context, config: ReserveConfig) -> Result<()> { + instructions::handle_init_reserve(context, config) + } + + pub fn update_reserve_config( + context: Context, + config: ReserveConfig, + ) -> Result<()> { + instructions::handle_update_reserve_config(context, config) + } + + pub fn set_price( + context: Context, + price_mantissa: i128, + exponent: i32, + ) -> Result<()> { + instructions::handle_set_price(context, price_mantissa, exponent) + } + + pub fn refresh_reserve(context: Context) -> Result<()> { + instructions::handle_refresh_reserve(context) + } + + pub fn deposit_reserve_liquidity( + context: Context, + liquidity_amount: u64, + ) -> Result<()> { + instructions::handle_deposit_reserve_liquidity(context, liquidity_amount) + } + + pub fn redeem_reserve_collateral( + context: Context, + share_amount: u64, + ) -> Result<()> { + instructions::handle_redeem_reserve_collateral(context, share_amount) + } + + pub fn init_obligation(context: Context) -> Result<()> { + instructions::handle_init_obligation(context) + } + + pub fn refresh_obligation(context: Context) -> Result<()> { + instructions::handle_refresh_obligation(context) + } + + pub fn deposit_obligation_collateral( + context: Context, + share_amount: u64, + ) -> Result<()> { + instructions::handle_deposit_obligation_collateral(context, share_amount) + } + + pub fn withdraw_obligation_collateral( + context: Context, + share_amount: u64, + ) -> Result<()> { + instructions::handle_withdraw_obligation_collateral(context, share_amount) + } + + pub fn borrow_obligation_liquidity( + context: Context, + liquidity_amount: u64, + ) -> Result<()> { + instructions::handle_borrow_obligation_liquidity(context, liquidity_amount) + } + + pub fn repay_obligation_liquidity( + context: Context, + liquidity_amount: u64, + ) -> Result<()> { + instructions::handle_repay_obligation_liquidity(context, liquidity_amount) + } + + pub fn liquidate_obligation( + context: Context, + liquidity_amount: u64, + ) -> Result<()> { + instructions::handle_liquidate_obligation(context, liquidity_amount) + } +} diff --git a/finance/lending/anchor/programs/lending/src/math.rs b/finance/lending/anchor/programs/lending/src/math.rs new file mode 100644 index 00000000..7731fec4 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/math.rs @@ -0,0 +1,116 @@ +use anchor_lang::prelude::*; + +use crate::constants::{FIXED_POINT_SCALE_DECIMALS, RESERVE_SEED}; +use crate::errors::LendingError; + +/// Which way to break ties when a division truncates. Deposits/redeems and +/// collateral valuations round the user's favourable quantity DOWN; debt and +/// protocol-owed quantities round UP. The protocol never loses a base unit to +/// rounding, so dust cannot be extracted by repeated round-trips. +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum Rounding { + Down, + Up, +} + +/// 10^exponent as a u128, erroring instead of wrapping. +pub fn ten_pow(exponent: u32) -> Result { + Ok(10u128 + .checked_pow(exponent) + .ok_or(LendingError::MathOverflow)?) +} + +/// floor((a * b) / denominator), computed in u128. +pub fn mul_div_floor(a: u128, b: u128, denominator: u128) -> Result { + require!(denominator > 0, LendingError::MathOverflow); + let product = a.checked_mul(b).ok_or(LendingError::MathOverflow)?; + Ok(product + .checked_div(denominator) + .ok_or(LendingError::MathOverflow)?) +} + +/// ceil((a * b) / denominator), computed in u128. +pub fn mul_div_ceil(a: u128, b: u128, denominator: u128) -> Result { + require!(denominator > 0, LendingError::MathOverflow); + let product = a.checked_mul(b).ok_or(LendingError::MathOverflow)?; + let rounding = denominator + .checked_sub(1) + .ok_or(LendingError::MathOverflow)?; + Ok(product + .checked_add(rounding) + .ok_or(LendingError::MathOverflow)? + .checked_div(denominator) + .ok_or(LendingError::MathOverflow)?) +} + +fn mul_div(a: u128, b: u128, denominator: u128, rounding: Rounding) -> Result { + match rounding { + Rounding::Down => mul_div_floor(a, b, denominator), + Rounding::Up => mul_div_ceil(a, b, denominator), + } +} + +/// Quote-currency value (in FIXED_POINT_SCALE-scaled units) of `amount` base +/// units of a token with `decimals`, given `price_scaled` from a price feed. +/// +/// `price_scaled` already carries the FIXED_POINT_SCALE factor (it is the real +/// price multiplied by FIXED_POINT_SCALE, see `PriceFeed::price_scaled`), so the +/// value is `amount * price_scaled / 10^decimals`. +pub fn market_value( + amount: u64, + decimals: u8, + price_scaled: u128, + rounding: Rounding, +) -> Result { + let divisor = ten_pow(decimals as u32)?; + mul_div(amount as u128, price_scaled, divisor, rounding) +} + +/// Inverse of [`market_value`]: how many base units of a token with `decimals` +/// are worth `value_scaled` quote-currency value at `price_scaled`. +pub fn value_to_amount( + value_scaled: u128, + decimals: u8, + price_scaled: u128, + rounding: Rounding, +) -> Result { + let multiplier = ten_pow(decimals as u32)?; + let amount = mul_div(value_scaled, multiplier, price_scaled, rounding)?; + u64::try_from(amount).map_err(|_| LendingError::MathOverflow.into()) +} + +/// Combine a price feed's exponent with the fixed-point scale into a single net +/// power of ten. `price_scaled = real_price * FIXED_POINT_SCALE`, and +/// `real_price = mantissa * 10^exponent`, so +/// `price_scaled = mantissa * 10^(exponent + FIXED_POINT_SCALE_DECIMALS)`. +/// Folding the two powers avoids forming a 10^18 intermediate that would +/// overflow for high-priced assets. +pub fn price_mantissa_to_scaled(mantissa: u128, exponent: i32) -> Result { + let net_exponent = exponent + .checked_add(FIXED_POINT_SCALE_DECIMALS) + .ok_or(LendingError::MathOverflow)?; + if net_exponent >= 0 { + Ok(mantissa + .checked_mul(ten_pow(net_exponent as u32)?) + .ok_or(LendingError::MathOverflow)?) + } else { + Ok(mantissa + .checked_div(ten_pow((-net_exponent) as u32)?) + .ok_or(LendingError::MathOverflow)?) + } +} + +/// Signer seeds for a reserve PDA, which is the authority over its liquidity +/// vault and the mint authority of its share token. +pub fn reserve_signer_seeds<'a>( + lending_market: &'a Pubkey, + liquidity_mint: &'a Pubkey, + bump: &'a [u8; 1], +) -> [&'a [u8]; 4] { + [ + RESERVE_SEED, + lending_market.as_ref(), + liquidity_mint.as_ref(), + bump, + ] +} diff --git a/finance/lending/anchor/programs/lending/src/state/lending_market.rs b/finance/lending/anchor/programs/lending/src/state/lending_market.rs new file mode 100644 index 00000000..d4ee951d --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/state/lending_market.rs @@ -0,0 +1,16 @@ +use anchor_lang::prelude::*; + +/// Top-level configuration shared by every reserve and obligation under it. +/// The owner is the only account that may create reserves and change their config. +#[account] +#[derive(InitSpace)] +pub struct LendingMarket { + pub owner: Pubkey, + + /// The mint that obligation values are denominated in (for example USDC). + /// Stored for reference; valuations come from each reserve's own price feed, + /// which must report prices in this currency. + pub quote_currency_mint: Pubkey, + + pub bump: u8, +} diff --git a/finance/lending/anchor/programs/lending/src/state/mod.rs b/finance/lending/anchor/programs/lending/src/state/mod.rs new file mode 100644 index 00000000..02285562 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/state/mod.rs @@ -0,0 +1,9 @@ +pub mod lending_market; +pub mod obligation; +pub mod price_feed; +pub mod reserve; + +pub use lending_market::*; +pub use obligation::*; +pub use price_feed::*; +pub use reserve::*; diff --git a/finance/lending/anchor/programs/lending/src/state/obligation.rs b/finance/lending/anchor/programs/lending/src/state/obligation.rs new file mode 100644 index 00000000..af161e36 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/state/obligation.rs @@ -0,0 +1,124 @@ +use anchor_lang::prelude::*; + +use crate::constants::MAX_OBLIGATION_RESERVES; +use crate::errors::LendingError; + +/// A borrower's position in one lending market: the share-token collateral they +/// have posted and the liquidity they have borrowed, plus the cached quote- +/// currency valuations that `refresh_obligation` recomputes. +#[account] +#[derive(InitSpace)] +pub struct Obligation { + pub lending_market: Pubkey, + + pub owner: Pubkey, + + pub last_update_slot: u64, + + /// Set whenever deposits/borrows change; cleared by `refresh_obligation`. + /// Health-dependent handlers reject a stale obligation so they never act on + /// cached values that a prior instruction in the same transaction invalidated. + pub stale: bool, + + /// Sum of every deposit's market value, FIXED_POINT_SCALE-scaled. + pub deposited_value: u128, + + /// Sum of every borrow's market value, FIXED_POINT_SCALE-scaled. + pub borrowed_value: u128, + + /// ฮฃ (deposit value * reserve loan_to_value). Borrows may not exceed this. + pub allowed_borrow_value: u128, + + /// ฮฃ (deposit value * reserve liquidation_threshold). Above this the + /// obligation is liquidatable. + pub unhealthy_borrow_value: u128, + + #[max_len(MAX_OBLIGATION_RESERVES)] + pub deposits: Vec, + + #[max_len(MAX_OBLIGATION_RESERVES)] + pub borrows: Vec, + + pub bump: u8, +} + +#[derive(InitSpace, Clone, Copy, AnchorSerialize, AnchorDeserialize, Debug, Default)] +pub struct ObligationCollateral { + pub reserve: Pubkey, + pub deposited_shares: u64, + pub market_value: u128, +} + +#[derive(InitSpace, Clone, Copy, AnchorSerialize, AnchorDeserialize, Debug, Default)] +pub struct ObligationLiquidity { + pub reserve: Pubkey, + /// Borrowed principal, scaled by the reserve's index at borrow time so the + /// live debt grows automatically as that index advances: + /// `debt = borrowed_scaled * reserve.cumulative_borrow_rate_index / FIXED_POINT_SCALE`. + pub borrowed_scaled: u128, + pub market_value: u128, +} + +impl Obligation { + /// Reject a health-dependent action when the obligation has not been + /// refreshed in this same transaction. + pub fn require_refreshed(&self) -> Result<()> { + require!(!self.stale, LendingError::ObligationStale); + require_eq!( + self.last_update_slot, + Clock::get()?.slot, + LendingError::ObligationStale + ); + Ok(()) + } + + /// Index of the collateral entry for `reserve`, creating an empty one if the + /// obligation has room. Used when posting collateral. + pub fn upsert_collateral(&mut self, reserve: Pubkey) -> Result { + if let Some(index) = self.deposits.iter().position(|entry| entry.reserve == reserve) { + return Ok(index); + } + require!( + self.deposits.len() < MAX_OBLIGATION_RESERVES, + LendingError::TooManyReserves + ); + self.deposits.push(ObligationCollateral { + reserve, + deposited_shares: 0, + market_value: 0, + }); + Ok(self.deposits.len() - 1) + } + + /// Index of the borrow entry for `reserve`, creating an empty one if the + /// obligation has room. Used when borrowing. + pub fn upsert_borrow(&mut self, reserve: Pubkey) -> Result { + if let Some(index) = self.borrows.iter().position(|entry| entry.reserve == reserve) { + return Ok(index); + } + require!( + self.borrows.len() < MAX_OBLIGATION_RESERVES, + LendingError::TooManyReserves + ); + self.borrows.push(ObligationLiquidity { + reserve, + borrowed_scaled: 0, + market_value: 0, + }); + Ok(self.borrows.len() - 1) + } + + pub fn find_collateral(&self, reserve: Pubkey) -> Result { + self.deposits + .iter() + .position(|entry| entry.reserve == reserve) + .ok_or(LendingError::ReserveNotFound.into()) + } + + pub fn find_borrow(&self, reserve: Pubkey) -> Result { + self.borrows + .iter() + .position(|entry| entry.reserve == reserve) + .ok_or(LendingError::ReserveNotFound.into()) + } +} diff --git a/finance/lending/anchor/programs/lending/src/state/price_feed.rs b/finance/lending/anchor/programs/lending/src/state/price_feed.rs new file mode 100644 index 00000000..52aa8978 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/state/price_feed.rs @@ -0,0 +1,47 @@ +use anchor_lang::prelude::*; + +use crate::constants::MAX_PRICE_STALENESS_SLOTS; +use crate::errors::LendingError; +use crate::math::price_mantissa_to_scaled; + +/// A price for one token, denominated in the market's quote currency. +/// +/// The layout mirrors a Switchboard On-Demand pull feed: a signed mantissa plus +/// an exponent (`price = price_mantissa * 10^exponent`) and the slot the value +/// was written. In production this account would be the real Switchboard feed +/// and the program would decode it with the `switchboard-on-demand` crate +/// (`PullFeedAccountData`): `price_mantissa = current_result.value`, +/// `exponent = -18`, `last_updated_slot = current_result.slot`. Here the +/// `set_price` handler writes it directly so LiteSVM tests are deterministic. +#[account] +#[derive(InitSpace)] +pub struct PriceFeed { + pub mint: Pubkey, + + pub price_mantissa: i128, + + pub exponent: i32, + + pub last_updated_slot: u64, + + /// Account permitted to call `set_price`. In production this field is unused + /// because the feed is owned by Switchboard, not this program. + pub authority: Pubkey, + + pub bump: u8, +} + +impl PriceFeed { + /// The price multiplied by FIXED_POINT_SCALE, after asserting the feed is + /// fresh and positive. Combining the price exponent with the fixed-point + /// scale (see `price_mantissa_to_scaled`) keeps the conversion overflow-safe. + pub fn price_scaled(&self, current_slot: u64) -> Result { + let age = current_slot + .checked_sub(self.last_updated_slot) + .ok_or(LendingError::MathOverflow)?; + require!(age <= MAX_PRICE_STALENESS_SLOTS, LendingError::StalePriceFeed); + require!(self.price_mantissa > 0, LendingError::InvalidOraclePrice); + + price_mantissa_to_scaled(self.price_mantissa as u128, self.exponent) + } +} diff --git a/finance/lending/anchor/programs/lending/src/state/reserve.rs b/finance/lending/anchor/programs/lending/src/state/reserve.rs new file mode 100644 index 00000000..2880ad23 --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/state/reserve.rs @@ -0,0 +1,209 @@ +use anchor_lang::prelude::*; + +use crate::constants::{BPS_DENOMINATOR, FIXED_POINT_SCALE, SLOTS_PER_YEAR}; +use crate::errors::LendingError; +use crate::math::{mul_div_ceil, mul_div_floor}; + +/// One asset's lending pool. Suppliers deposit `liquidity_mint` tokens into +/// `liquidity_vault` and receive share tokens (`share_mint`); the share-to- +/// liquidity exchange rate rises as borrowers pay interest. Borrowers draw +/// `liquidity_mint` out against collateral held in their obligation. +#[account] +#[derive(InitSpace)] +pub struct Reserve { + pub lending_market: Pubkey, + + pub liquidity_mint: Pubkey, + + /// Program-owned token account holding the un-borrowed liquidity. Its + /// authority is this reserve PDA. + pub liquidity_vault: Pubkey, + + /// Share-token mint. Supply equals `share_mint_supply`. Mint authority is + /// this reserve PDA. + pub share_mint: Pubkey, + + pub price_feed: Pubkey, + + pub liquidity_decimals: u8, + + /// Base units sitting in `liquidity_vault`, available to borrow or redeem. + /// This is the source of truth for the pool size, not the vault's token + /// balance, so a raw token donation cannot move the exchange rate. + pub available_liquidity: u64, + + /// Outstanding share-token supply, tracked here so valuations need only the + /// reserve account (not the mint) to convert shares to liquidity. + pub share_mint_supply: u64, + + /// Total borrowed principal, scaled so that the live debt is + /// `borrowed_amount_scaled * cumulative_borrow_rate_index / FIXED_POINT_SCALE`. + pub borrowed_amount_scaled: u128, + + /// Monotonically increasing interest index, FIXED_POINT_SCALE-scaled. + /// Starts at FIXED_POINT_SCALE (1.0) and only ever multiplies by factors >= 1. + pub cumulative_borrow_rate_index: u128, + + pub last_update_slot: u64, + + pub config: ReserveConfig, + + pub bump: u8, +} + +/// Risk and interest-rate parameters. All ratios are basis points (10_000 = 100%). +#[derive(InitSpace, Clone, Copy, AnchorSerialize, AnchorDeserialize, Debug, Default)] +pub struct ReserveConfig { + /// Fraction of deposited collateral value a borrower may borrow against. + pub loan_to_value_bps: u16, + /// Above this fraction the obligation may be liquidated. + pub liquidation_threshold_bps: u16, + /// Extra collateral a liquidator receives, as a fraction of the repaid value. + pub liquidation_bonus_bps: u16, + /// Maximum fraction of a borrow that one liquidation may repay. + pub close_factor_bps: u16, + /// Utilization at which the borrow rate reaches `optimal_borrow_rate_bps`. + pub optimal_utilization_bps: u16, + /// Borrow APR at 0% utilization. + pub min_borrow_rate_bps: u16, + /// Borrow APR at `optimal_utilization_bps`. + pub optimal_borrow_rate_bps: u16, + /// Borrow APR at 100% utilization. + pub max_borrow_rate_bps: u16, +} + +impl ReserveConfig { + pub fn validate(&self) -> Result<()> { + let within_bps = |value: u16| (value as u128) <= BPS_DENOMINATOR; + require!( + within_bps(self.loan_to_value_bps) + && within_bps(self.liquidation_threshold_bps) + && within_bps(self.liquidation_bonus_bps) + && within_bps(self.close_factor_bps) + && within_bps(self.optimal_utilization_bps), + LendingError::InvalidConfig + ); + // A zero close factor would make every liquidation a no-op. + require!(self.close_factor_bps > 0, LendingError::InvalidConfig); + // The kink must be strictly inside (0, 100%) so neither rate slope divides by zero. + require!( + self.optimal_utilization_bps > 0 + && (self.optimal_utilization_bps as u128) < BPS_DENOMINATOR, + LendingError::InvalidConfig + ); + // You cannot be allowed to borrow past the point you'd be liquidated. + require!( + self.loan_to_value_bps <= self.liquidation_threshold_bps, + LendingError::InvalidConfig + ); + require!( + self.min_borrow_rate_bps <= self.optimal_borrow_rate_bps + && self.optimal_borrow_rate_bps <= self.max_borrow_rate_bps, + LendingError::InvalidConfig + ); + Ok(()) + } +} + +impl Reserve { + /// Live total debt owed to the pool, rounded up (protocol-favourable). + pub fn current_borrowed_amount(&self) -> Result { + let amount = mul_div_ceil( + self.borrowed_amount_scaled, + self.cumulative_borrow_rate_index, + FIXED_POINT_SCALE, + )?; + u64::try_from(amount).map_err(|_| LendingError::MathOverflow.into()) + } + + /// Available liquidity plus live debt โ€” the pool size the share token is a claim on. + pub fn total_liquidity(&self) -> Result { + Ok((self.available_liquidity as u128) + .checked_add(self.current_borrowed_amount()? as u128) + .ok_or(LendingError::MathOverflow)?) + } + + /// Borrowed fraction of the pool, in basis points (0..=10_000). + pub fn utilization_bps(&self) -> Result { + let total = self.total_liquidity()?; + if total == 0 { + return Ok(0); + } + mul_div_floor(self.current_borrowed_amount()? as u128, BPS_DENOMINATOR, total) + } + + /// Per-slot borrow rate (FIXED_POINT_SCALE-scaled) from the kinked curve: + /// linear from `min` to `optimal` up to the kink, then steeper from `optimal` + /// to `max` between the kink and full utilization. + pub fn current_borrow_rate_per_slot(&self) -> Result { + let utilization = self.utilization_bps()?; + let optimal_utilization = self.config.optimal_utilization_bps as u128; + + let apr_bps = if utilization <= optimal_utilization { + let rate_range = (self.config.optimal_borrow_rate_bps as u128) + .checked_sub(self.config.min_borrow_rate_bps as u128) + .ok_or(LendingError::MathOverflow)?; + let climbed = mul_div_floor(rate_range, utilization, optimal_utilization)?; + (self.config.min_borrow_rate_bps as u128) + .checked_add(climbed) + .ok_or(LendingError::MathOverflow)? + } else { + let rate_range = (self.config.max_borrow_rate_bps as u128) + .checked_sub(self.config.optimal_borrow_rate_bps as u128) + .ok_or(LendingError::MathOverflow)?; + let utilization_above = utilization + .checked_sub(optimal_utilization) + .ok_or(LendingError::MathOverflow)?; + let utilization_range = BPS_DENOMINATOR + .checked_sub(optimal_utilization) + .ok_or(LendingError::MathOverflow)?; + let climbed = mul_div_floor(rate_range, utilization_above, utilization_range)?; + (self.config.optimal_borrow_rate_bps as u128) + .checked_add(climbed) + .ok_or(LendingError::MathOverflow)? + }; + + // apr_bps / (BPS_DENOMINATOR * SLOTS_PER_YEAR), carried at FIXED_POINT_SCALE. + let per_year_denominator = BPS_DENOMINATOR + .checked_mul(SLOTS_PER_YEAR) + .ok_or(LendingError::MathOverflow)?; + mul_div_floor(apr_bps, FIXED_POINT_SCALE, per_year_denominator) + } + + /// Advance the interest index for the slots elapsed since the last refresh. + /// `new_index = old_index * (1 + rate_per_slot * elapsed_slots)`, a single + /// multiply per refresh that compounds across refreshes (Solend's approach). + pub fn accrue_interest(&mut self, current_slot: u64) -> Result<()> { + let elapsed = current_slot + .checked_sub(self.last_update_slot) + .ok_or(LendingError::MathOverflow)?; + + if elapsed > 0 && self.borrowed_amount_scaled > 0 { + let rate_per_slot = self.current_borrow_rate_per_slot()?; + let accrued = rate_per_slot + .checked_mul(elapsed as u128) + .ok_or(LendingError::MathOverflow)?; + let growth_factor = FIXED_POINT_SCALE + .checked_add(accrued) + .ok_or(LendingError::MathOverflow)?; + self.cumulative_borrow_rate_index = mul_div_floor( + self.cumulative_borrow_rate_index, + growth_factor, + FIXED_POINT_SCALE, + )?; + } + + self.last_update_slot = current_slot; + Ok(()) + } + + /// Reject use of a reserve whose interest has not been accrued this slot. + pub fn require_refreshed(&self) -> Result<()> { + require_eq!( + self.last_update_slot, + Clock::get()?.slot, + LendingError::ReserveStale + ); + Ok(()) + } +} diff --git a/finance/lending/anchor/programs/lending/tests/common/mod.rs b/finance/lending/anchor/programs/lending/tests/common/mod.rs new file mode 100644 index 00000000..4204b4a0 --- /dev/null +++ b/finance/lending/anchor/programs/lending/tests/common/mod.rs @@ -0,0 +1,630 @@ +#![allow(dead_code)] +//! Shared LiteSVM harness for the lending program tests. +//! +//! Sets up a lending market with reserves, funds users, and exposes one method +//! per protocol action. Actions that read value (deposit/redeem/borrow/withdraw/ +//! liquidate) bundle the required `refresh_reserve` / `refresh_obligation` +//! instructions into the same transaction, exactly as a real client must. + +use anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + system_program, + }, + AccountDeserialize, InstructionData, ToAccountMetas, +}; +use anchor_spl::token::ID as TOKEN_PROGRAM_ID; +use litesvm::LiteSVM; +use solana_keypair::Keypair; +use solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, get_token_account_balance, + mint_tokens_to_token_account, send_transaction_from_instructions, +}; +use solana_signer::Signer; + +use lending::constants::{ + LENDING_MARKET_SEED, LIQUIDITY_VAULT_SEED, OBLIGATION_SEED, OBLIGATION_SHARE_VAULT_SEED, + PRICE_FEED_SEED, RESERVE_SEED, SHARE_MINT_SEED, +}; +use lending::state::{Obligation, Reserve, ReserveConfig}; + +pub use anchor_lang::prelude::Pubkey; + +/// A FIXED_POINT_SCALE-scaled price exponent: prices are passed as +/// `mantissa * 10^-18`, matching a Switchboard On-Demand feed's 1e18 result. +pub const PRICE_EXPONENT: i32 = -18; + +pub fn dollars(whole: u64) -> i128 { + // price mantissa for `whole` dollars at exponent -18. + (whole as i128) * 1_000_000_000_000_000_000 +} + +pub fn cents(amount: u64) -> i128 { + (amount as i128) * 10_000_000_000_000_000 +} + +pub fn ata(owner: &Pubkey, mint: &Pubkey) -> Pubkey { + let ata_program: Pubkey = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap(); + Pubkey::find_program_address( + &[owner.as_ref(), TOKEN_PROGRAM_ID.as_ref(), mint.as_ref()], + &ata_program, + ) + .0 +} + +fn pda(seeds: &[&[u8]]) -> Pubkey { + Pubkey::find_program_address(seeds, &lending::id()).0 +} + +/// Map kite's transaction result to a String so tests can assert on the program +/// error message embedded in failed-transaction logs. +fn send( + svm: &mut LiteSVM, + instructions: Vec, + signers: &[&Keypair], + payer: &Pubkey, +) -> Result<(), String> { + send_transaction_from_instructions(svm, instructions, signers, payer) + .map_err(|thrown| format!("{thrown:?}")) +} + +/// Handle to one reserve and its associated PDAs. +#[derive(Clone, Copy)] +pub struct ReserveHandle { + pub mint: Pubkey, + pub decimals: u8, + pub reserve: Pubkey, + pub share_mint: Pubkey, + pub liquidity_vault: Pubkey, + pub price_feed: Pubkey, +} + +pub struct Env { + pub svm: LiteSVM, + /// Market owner; also the mint authority for every test mint and the price + /// feed authority. + pub owner: Keypair, + pub market: Pubkey, +} + +impl Env { + pub fn new() -> Self { + let mut svm = LiteSVM::new(); + let program_bytes = include_bytes!("../../../../target/deploy/lending.so"); + svm.add_program(lending::id(), program_bytes).unwrap(); + + let owner = create_wallet(&mut svm, 1_000_000_000_000).unwrap(); + let quote_mint = create_token_mint(&mut svm, &owner, 6, None).unwrap(); + let market = pda(&[LENDING_MARKET_SEED, owner.pubkey().as_ref()]); + + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::InitLendingMarket { + lending_market: market, + owner: owner.pubkey(), + quote_currency_mint: quote_mint, + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::InitLendingMarket {}.data(), + }; + send(&mut svm, vec![instruction], &[&owner], &owner.pubkey()).unwrap(); + + Env { svm, owner, market } + } + + pub fn current_slot(&self) -> u64 { + self.svm.get_sysvar::().slot + } + + /// Advance time so interest accrues and blockhashes differ. + pub fn warp_slots(&mut self, slots: u64) { + let target = self.current_slot() + slots; + self.svm.warp_to_slot(target); + self.svm.expire_blockhash(); + } + + pub fn set_price(&mut self, mint: Pubkey, price_mantissa: i128) { + let price_feed = pda(&[PRICE_FEED_SEED, mint.as_ref()]); + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::SetPrice { + price_feed, + authority: self.owner.pubkey(), + mint, + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::SetPrice { + price_mantissa, + exponent: PRICE_EXPONENT, + } + .data(), + }; + let owner = self.owner.insecure_clone(); + send(&mut self.svm, vec![instruction], &[&owner], &owner.pubkey()).unwrap(); + } + + pub fn add_reserve( + &mut self, + decimals: u8, + price_mantissa: i128, + config: ReserveConfig, + ) -> ReserveHandle { + let owner = self.owner.insecure_clone(); + let mint = create_token_mint(&mut self.svm, &owner, decimals, None).unwrap(); + self.set_price(mint, price_mantissa); + + let reserve = pda(&[RESERVE_SEED, self.market.as_ref(), mint.as_ref()]); + let share_mint = pda(&[SHARE_MINT_SEED, reserve.as_ref()]); + let liquidity_vault = pda(&[LIQUIDITY_VAULT_SEED, reserve.as_ref()]); + let price_feed = pda(&[PRICE_FEED_SEED, mint.as_ref()]); + + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::InitReserve { + lending_market: self.market, + owner: owner.pubkey(), + reserve, + liquidity_mint: mint, + liquidity_vault, + share_mint, + price_feed, + token_program: TOKEN_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::InitReserve { config }.data(), + }; + send(&mut self.svm, vec![instruction], &[&owner], &owner.pubkey()).unwrap(); + + ReserveHandle { + mint, + decimals, + reserve, + share_mint, + liquidity_vault, + price_feed, + } + } + + pub fn try_update_config( + &mut self, + handle: &ReserveHandle, + config: ReserveConfig, + ) -> Result<(), String> { + let owner = self.owner.insecure_clone(); + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::UpdateReserveConfig { + lending_market: self.market, + owner: owner.pubkey(), + reserve: handle.reserve, + } + .to_account_metas(None), + data: lending::instruction::UpdateReserveConfig { config }.data(), + }; + send(&mut self.svm, vec![instruction], &[&owner], &owner.pubkey()) + } + + pub fn create_user(&mut self) -> Keypair { + create_wallet(&mut self.svm, 1_000_000_000_000).unwrap() + } + + /// Create the user's token account for a mint and mint `amount` into it. + pub fn fund(&mut self, user: &Keypair, mint: Pubkey, amount: u64) -> Pubkey { + let owner = self.owner.insecure_clone(); + let token_account = + create_associated_token_account(&mut self.svm, &user.pubkey(), &mint, user).unwrap(); + if amount > 0 { + mint_tokens_to_token_account(&mut self.svm, &mint, &token_account, amount, &owner) + .unwrap(); + } + token_account + } + + fn refresh_reserve_ix(&self, handle: &ReserveHandle) -> Instruction { + Instruction { + program_id: lending::id(), + accounts: lending::accounts::RefreshReserve { + reserve: handle.reserve, + } + .to_account_metas(None), + data: lending::instruction::RefreshReserve {}.data(), + } + } + + /// Supply liquidity to a reserve, receiving share tokens. Returns the user's + /// share-token account. + pub fn try_supply( + &mut self, + user: &Keypair, + handle: &ReserveHandle, + amount: u64, + ) -> Result { + let user_liquidity = ata(&user.pubkey(), &handle.mint); + let user_share = create_associated_token_account( + &mut self.svm, + &user.pubkey(), + &handle.share_mint, + user, + ) + .unwrap(); + + let deposit = Instruction { + program_id: lending::id(), + accounts: lending::accounts::DepositReserveLiquidity { + reserve: handle.reserve, + liquidity_mint: handle.mint, + liquidity_vault: handle.liquidity_vault, + share_mint: handle.share_mint, + user_liquidity, + user_share, + owner: user.pubkey(), + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::DepositReserveLiquidity { + liquidity_amount: amount, + } + .data(), + }; + let refresh = self.refresh_reserve_ix(handle); + send(&mut self.svm, vec![refresh, deposit], &[user], &user.pubkey())?; + Ok(user_share) + } + + pub fn supply(&mut self, user: &Keypair, handle: &ReserveHandle, amount: u64) -> Pubkey { + self.try_supply(user, handle, amount).unwrap() + } + + pub fn try_redeem( + &mut self, + user: &Keypair, + handle: &ReserveHandle, + share_amount: u64, + ) -> Result<(), String> { + let user_liquidity = ata(&user.pubkey(), &handle.mint); + let user_share = ata(&user.pubkey(), &handle.share_mint); + let redeem = Instruction { + program_id: lending::id(), + accounts: lending::accounts::RedeemReserveCollateral { + reserve: handle.reserve, + liquidity_mint: handle.mint, + liquidity_vault: handle.liquidity_vault, + share_mint: handle.share_mint, + user_liquidity, + user_share, + owner: user.pubkey(), + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::RedeemReserveCollateral { share_amount }.data(), + }; + let refresh = self.refresh_reserve_ix(handle); + send(&mut self.svm, vec![refresh, redeem], &[user], &user.pubkey()) + } + + pub fn init_obligation(&mut self, user: &Keypair) -> Pubkey { + let obligation = pda(&[OBLIGATION_SEED, self.market.as_ref(), user.pubkey().as_ref()]); + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::InitObligation { + lending_market: self.market, + obligation, + owner: user.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::InitObligation {}.data(), + }; + send(&mut self.svm, vec![instruction], &[user], &user.pubkey()).unwrap(); + obligation + } + + pub fn obligation_share_vault(&self, handle: &ReserveHandle, obligation: Pubkey) -> Pubkey { + pda(&[ + OBLIGATION_SHARE_VAULT_SEED, + handle.reserve.as_ref(), + obligation.as_ref(), + ]) + } + + pub fn post_collateral( + &mut self, + user: &Keypair, + obligation: Pubkey, + handle: &ReserveHandle, + share_amount: u64, + ) { + let user_share = ata(&user.pubkey(), &handle.share_mint); + let vault = self.obligation_share_vault(handle, obligation); + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::DepositObligationCollateral { + obligation, + owner: user.pubkey(), + reserve: handle.reserve, + share_mint: handle.share_mint, + obligation_share_vault: vault, + user_share, + token_program: TOKEN_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::DepositObligationCollateral { share_amount }.data(), + }; + send(&mut self.svm, vec![instruction], &[user], &user.pubkey()).unwrap(); + } + + fn refresh_obligation_ix( + &self, + obligation: Pubkey, + deposit_reserves: &[&ReserveHandle], + borrow_reserves: &[&ReserveHandle], + ) -> Instruction { + let mut accounts = lending::accounts::RefreshObligation { obligation }.to_account_metas(None); + for handle in deposit_reserves.iter().chain(borrow_reserves.iter()) { + accounts.push(AccountMeta::new_readonly(handle.reserve, false)); + accounts.push(AccountMeta::new_readonly(handle.price_feed, false)); + } + Instruction { + program_id: lending::id(), + accounts, + data: lending::instruction::RefreshObligation {}.data(), + } + } + + /// All reserves an obligation touches must be refreshed before + /// refresh_obligation; this collects the de-duplicated refresh instructions. + fn refresh_all_ix(&self, reserves: &[&ReserveHandle]) -> Vec { + let mut seen: Vec = Vec::new(); + let mut instructions = Vec::new(); + for handle in reserves { + if !seen.contains(&handle.reserve) { + seen.push(handle.reserve); + instructions.push(self.refresh_reserve_ix(handle)); + } + } + instructions + } + + /// `existing_deposits` / `existing_borrows` must list the obligation's + /// CURRENT positions (what `refresh_obligation` will value). The reserve + /// being borrowed is refreshed too, but is only added to `refresh_obligation` + /// once it actually has a borrow entry โ€” so the first borrow of a new reserve + /// passes it only via `borrow`, not via `existing_borrows`. + #[allow(clippy::too_many_arguments)] + pub fn try_borrow( + &mut self, + user: &Keypair, + obligation: Pubkey, + existing_deposits: &[&ReserveHandle], + existing_borrows: &[&ReserveHandle], + borrow: &ReserveHandle, + amount: u64, + ) -> Result<(), String> { + let mut refresh_set: Vec<&ReserveHandle> = existing_deposits.to_vec(); + refresh_set.extend_from_slice(existing_borrows); + refresh_set.push(borrow); + + let mut instructions = self.refresh_all_ix(&refresh_set); + instructions.push(self.refresh_obligation_ix(obligation, existing_deposits, existing_borrows)); + instructions.push(self.borrow_ix(user, obligation, borrow, amount)); + send(&mut self.svm, instructions, &[user], &user.pubkey()) + } + + fn borrow_ix( + &self, + user: &Keypair, + obligation: Pubkey, + borrow: &ReserveHandle, + amount: u64, + ) -> Instruction { + let user_liquidity = ata(&user.pubkey(), &borrow.mint); + Instruction { + program_id: lending::id(), + accounts: lending::accounts::BorrowObligationLiquidity { + obligation, + owner: user.pubkey(), + reserve: borrow.reserve, + price_feed: borrow.price_feed, + liquidity_mint: borrow.mint, + liquidity_vault: borrow.liquidity_vault, + user_liquidity, + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::BorrowObligationLiquidity { + liquidity_amount: amount, + } + .data(), + } + } + + /// Borrow while deliberately skipping the `refresh_obligation` instruction, + /// to exercise the `ObligationStale` guard. + pub fn try_borrow_skip_obligation_refresh( + &mut self, + user: &Keypair, + obligation: Pubkey, + all_reserves: &[&ReserveHandle], + borrow: &ReserveHandle, + amount: u64, + ) -> Result<(), String> { + let mut instructions = self.refresh_all_ix(all_reserves); + instructions.push(self.borrow_ix(user, obligation, borrow, amount)); + send(&mut self.svm, instructions, &[user], &user.pubkey()) + } + + pub fn repay( + &mut self, + user: &Keypair, + obligation: Pubkey, + borrow: &ReserveHandle, + amount: u64, + ) { + let user_liquidity = ata(&user.pubkey(), &borrow.mint); + let instructions = vec![ + self.refresh_reserve_ix(borrow), + Instruction { + program_id: lending::id(), + accounts: lending::accounts::RepayObligationLiquidity { + obligation, + reserve: borrow.reserve, + liquidity_mint: borrow.mint, + liquidity_vault: borrow.liquidity_vault, + user_liquidity, + repayer: user.pubkey(), + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::RepayObligationLiquidity { + liquidity_amount: amount, + } + .data(), + }, + ]; + send(&mut self.svm, instructions, &[user], &user.pubkey()).unwrap(); + } + + #[allow(clippy::too_many_arguments)] + pub fn try_withdraw_collateral( + &mut self, + user: &Keypair, + obligation: Pubkey, + deposit_reserves: &[&ReserveHandle], + borrow_reserves: &[&ReserveHandle], + collateral: &ReserveHandle, + share_amount: u64, + ) -> Result<(), String> { + let user_share = ata(&user.pubkey(), &collateral.share_mint); + let vault = self.obligation_share_vault(collateral, obligation); + let mut all: Vec<&ReserveHandle> = deposit_reserves.to_vec(); + all.extend_from_slice(borrow_reserves); + + let mut instructions = self.refresh_all_ix(&all); + instructions.push(self.refresh_obligation_ix(obligation, deposit_reserves, borrow_reserves)); + instructions.push(Instruction { + program_id: lending::id(), + accounts: lending::accounts::WithdrawObligationCollateral { + obligation, + owner: user.pubkey(), + reserve: collateral.reserve, + price_feed: collateral.price_feed, + share_mint: collateral.share_mint, + obligation_share_vault: vault, + user_share, + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::WithdrawObligationCollateral { share_amount }.data(), + }); + send(&mut self.svm, instructions, &[user], &user.pubkey()) + } + + #[allow(clippy::too_many_arguments)] + pub fn try_liquidate( + &mut self, + liquidator: &Keypair, + obligation: Pubkey, + deposit_reserves: &[&ReserveHandle], + borrow_reserves: &[&ReserveHandle], + repay: &ReserveHandle, + collateral: &ReserveHandle, + amount: u64, + ) -> Result<(), String> { + let repay_source = ata(&liquidator.pubkey(), &repay.mint); + let collateral_dest = create_associated_token_account( + &mut self.svm, + &liquidator.pubkey(), + &collateral.share_mint, + liquidator, + ) + .unwrap(); + let vault = self.obligation_share_vault(collateral, obligation); + + let mut all: Vec<&ReserveHandle> = deposit_reserves.to_vec(); + all.extend_from_slice(borrow_reserves); + let mut instructions = self.refresh_all_ix(&all); + instructions.push(self.refresh_obligation_ix(obligation, deposit_reserves, borrow_reserves)); + instructions.push(Instruction { + program_id: lending::id(), + accounts: lending::accounts::LiquidateObligation { + obligation, + liquidator: liquidator.pubkey(), + repay_reserve: repay.reserve, + collateral_reserve: collateral.reserve, + repay_price_feed: repay.price_feed, + collateral_price_feed: collateral.price_feed, + repay_liquidity_mint: repay.mint, + collateral_share_mint: collateral.share_mint, + repay_liquidity_vault: repay.liquidity_vault, + obligation_collateral_vault: vault, + liquidator_repay_source: repay_source, + liquidator_collateral_dest: collateral_dest, + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::LiquidateObligation { + liquidity_amount: amount, + } + .data(), + }); + send(&mut self.svm, instructions, &[liquidator], &liquidator.pubkey()) + } + + /// Send a lone `refresh_reserve` so accrued interest lands in the index. + pub fn refresh_reserve_only(&mut self, payer: &Keypair, handle: &ReserveHandle) { + let instruction = self.refresh_reserve_ix(handle); + send(&mut self.svm, vec![instruction], &[payer], &payer.pubkey()).unwrap(); + } + + /// Refresh the listed reserves and then the obligation, recomputing its values. + pub fn refresh_obligation_only( + &mut self, + payer: &Keypair, + obligation: Pubkey, + deposits: &[&ReserveHandle], + borrows: &[&ReserveHandle], + ) { + let mut all: Vec<&ReserveHandle> = deposits.to_vec(); + all.extend_from_slice(borrows); + let mut instructions = self.refresh_all_ix(&all); + instructions.push(self.refresh_obligation_ix(obligation, deposits, borrows)); + send(&mut self.svm, instructions, &[payer], &payer.pubkey()).unwrap(); + } + + // --- state readers --- + + pub fn reserve(&self, handle: &ReserveHandle) -> Reserve { + let account = self.svm.get_account(&handle.reserve).unwrap(); + Reserve::try_deserialize(&mut account.data.as_slice()).unwrap() + } + + pub fn obligation(&self, obligation: Pubkey) -> Obligation { + let account = self.svm.get_account(&obligation).unwrap(); + Obligation::try_deserialize(&mut account.data.as_slice()).unwrap() + } + + pub fn token_balance(&self, token_account: Pubkey) -> u64 { + get_token_account_balance(&self.svm, &token_account).unwrap() + } +} + +/// A reasonable default reserve config: 75% LTV, 80% liquidation threshold, +/// 5% bonus, 50% close factor, kink at 80% utilization, 2%/20%/150% APR curve. +pub fn default_config() -> ReserveConfig { + ReserveConfig { + loan_to_value_bps: 7_500, + liquidation_threshold_bps: 8_000, + liquidation_bonus_bps: 500, + close_factor_bps: 5_000, + optimal_utilization_bps: 8_000, + min_borrow_rate_bps: 200, + optimal_borrow_rate_bps: 2_000, + max_borrow_rate_bps: 15_000, + } +} diff --git a/finance/lending/anchor/programs/lending/tests/test_borrow_repay.rs b/finance/lending/anchor/programs/lending/tests/test_borrow_repay.rs new file mode 100644 index 00000000..6e521423 --- /dev/null +++ b/finance/lending/anchor/programs/lending/tests/test_borrow_repay.rs @@ -0,0 +1,121 @@ +mod common; + +use common::{ata, default_config, dollars, Env, ReserveHandle}; +use solana_keypair::Keypair; +use solana_signer::Signer; + +/// One market with a collateral reserve and a separately-supplied borrow +/// reserve, plus a borrower who has posted 1000 units of collateral (value +/// $1000, so 75% LTV => $750 borrow power). Both tokens priced at $1, 6 decimals. +fn setup() -> (Env, ReserveHandle, ReserveHandle, Keypair, anchor_lang::prelude::Pubkey) { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + let borrow = env.add_reserve(6, dollars(1), default_config()); + + // A different supplier funds the borrow reserve's liquidity. + let supplier = env.create_user(); + env.fund(&supplier, borrow.mint, 1_000_000_000); + env.supply(&supplier, &borrow, 1_000_000_000); + + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.fund(&borrower, borrow.mint, 0); // create the borrowed-token account + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.init_obligation(&borrower); + env.post_collateral(&borrower, obligation, &collateral, 1_000_000_000); + + (env, collateral, borrow, borrower, obligation) +} + +#[test] +fn borrow_up_to_max_ltv_then_one_more_fails() { + let (mut env, collateral, borrow, borrower, obligation) = setup(); + + // $750 of borrow power, borrowing a $1 token => 750 units exactly. + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 750_000_000) + .unwrap(); + assert_eq!( + env.token_balance(ata(&borrower.pubkey(), &borrow.mint)), + 750_000_000 + ); + + // One more unit exceeds the allowed borrow value. + let result = env.try_borrow(&borrower, obligation, &[&collateral], &[&borrow], &borrow, 1); + assert!( + result.unwrap_err().contains("BorrowTooLarge"), + "borrowing past the LTV limit must be rejected" + ); +} + +#[test] +fn borrow_without_obligation_refresh_is_rejected() { + let (mut env, collateral, borrow, borrower, obligation) = setup(); + let result = env.try_borrow_skip_obligation_refresh( + &borrower, + obligation, + &[&collateral, &borrow], + &borrow, + 100_000_000, + ); + assert!(result.unwrap_err().contains("ObligationStale")); +} + +#[test] +fn borrow_with_stale_price_feed_is_rejected() { + let (mut env, collateral, borrow, borrower, obligation) = setup(); + // Advance well past the staleness window without re-publishing prices. + env.warp_slots(50); + let result = env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 100_000_000); + assert!(result.unwrap_err().contains("StalePriceFeed")); +} + +#[test] +fn repay_reduces_debt_and_over_repay_clamps() { + let (mut env, collateral, borrow, borrower, obligation) = setup(); + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 500_000_000) + .unwrap(); + assert_eq!(env.reserve(&borrow).borrowed_amount_scaled > 0, true); + + env.repay(&borrower, obligation, &borrow, 200_000_000); + let obligation_state = env.obligation(obligation); + assert_eq!(obligation_state.borrows.len(), 1); + + // Over-repay: ask to repay far more than owed; it clamps to the remaining debt. + env.repay(&borrower, obligation, &borrow, 1_000_000_000); + assert_eq!(env.reserve(&borrow).borrowed_amount_scaled, 0); + assert!(env.obligation(obligation).borrows.is_empty()); +} + +#[test] +fn withdraw_blocked_while_borrowed_then_allowed_after_repay() { + let (mut env, collateral, borrow, borrower, obligation) = setup(); + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 750_000_000) + .unwrap(); + + // At the LTV limit, withdrawing any collateral would undercollateralize. + let blocked = env.try_withdraw_collateral( + &borrower, + obligation, + &[&collateral], + &[&borrow], + &collateral, + 100_000_000, + ); + assert!(blocked.unwrap_err().contains("WithdrawTooLarge")); + + // Repay everything, then the collateral is free to withdraw. + env.repay(&borrower, obligation, &borrow, 750_000_000); + env.try_withdraw_collateral( + &borrower, + obligation, + &[&collateral], + &[], + &collateral, + 1_000_000_000, + ) + .unwrap(); + assert_eq!( + env.token_balance(ata(&borrower.pubkey(), &collateral.share_mint)), + 1_000_000_000 + ); +} diff --git a/finance/lending/anchor/programs/lending/tests/test_deposit_redeem.rs b/finance/lending/anchor/programs/lending/tests/test_deposit_redeem.rs new file mode 100644 index 00000000..f52f3cf8 --- /dev/null +++ b/finance/lending/anchor/programs/lending/tests/test_deposit_redeem.rs @@ -0,0 +1,61 @@ +mod common; + +use common::{default_config, Env}; +use solana_kite::mint_tokens_to_token_account; + +#[test] +fn first_deposit_mints_shares_one_to_one() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let supplier = env.create_user(); + let deposit = 1_000_000_000; // 1000 USDC + env.fund(&supplier, usdc.mint, deposit); + let share_account = env.supply(&supplier, &usdc, deposit); + + assert_eq!(env.token_balance(share_account), deposit); + let reserve = env.reserve(&usdc); + assert_eq!(reserve.available_liquidity, deposit); + assert_eq!(reserve.share_mint_supply, deposit); +} + +#[test] +fn raw_token_donation_does_not_inflate_exchange_rate() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let first = env.create_user(); + let amount = 1_000_000_000; + env.fund(&first, usdc.mint, amount); + env.supply(&first, &usdc, amount); + + // Attacker donates raw tokens straight into the reserve vault. available_liquidity + // is the source of truth, so this must NOT change the share exchange rate. + let owner = env.owner.insecure_clone(); + mint_tokens_to_token_account(&mut env.svm, &usdc.mint, &usdc.liquidity_vault, amount, &owner) + .unwrap(); + + let second = env.create_user(); + env.fund(&second, usdc.mint, amount); + let second_shares = env.supply(&second, &usdc, amount); + + // Despite the donation, the second supplier still gets 1:1 shares. + assert_eq!(env.token_balance(second_shares), amount); +} + +#[test] +fn redeem_returns_underlying_liquidity() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let supplier = env.create_user(); + let amount = 1_000_000_000; + let liquidity_account = env.fund(&supplier, usdc.mint, amount); + let share_account = env.supply(&supplier, &usdc, amount); + assert_eq!(env.token_balance(liquidity_account), 0); + + env.try_redeem(&supplier, &usdc, amount).unwrap(); + assert_eq!(env.token_balance(liquidity_account), amount); + assert_eq!(env.token_balance(share_account), 0); + assert_eq!(env.reserve(&usdc).share_mint_supply, 0); +} diff --git a/finance/lending/anchor/programs/lending/tests/test_interest.rs b/finance/lending/anchor/programs/lending/tests/test_interest.rs new file mode 100644 index 00000000..0fc8ed3c --- /dev/null +++ b/finance/lending/anchor/programs/lending/tests/test_interest.rs @@ -0,0 +1,63 @@ +mod common; + +use common::{default_config, dollars, ata, Env}; +use lending::constants::FIXED_POINT_SCALE; +use solana_signer::Signer; + +/// Borrowing at non-zero utilization, then letting slots pass, must grow the +/// reserve's interest index, the borrower's debt, and the share exchange rate. +#[test] +fn interest_accrues_on_borrows_over_time() { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + let borrow = env.add_reserve(6, dollars(1), default_config()); + + // Supplier funds 1000 units of borrow liquidity. + let supplier = env.create_user(); + let supplied = 1_000_000_000; + env.fund(&supplier, borrow.mint, supplied); + let supplier_liquidity = ata(&supplier.pubkey(), &borrow.mint); + env.supply(&supplier, &borrow, supplied); + + // Borrower posts collateral and borrows 500 units => 50% utilization. + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.fund(&borrower, borrow.mint, 0); + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.init_obligation(&borrower); + env.post_collateral(&borrower, obligation, &collateral, 1_000_000_000); + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 500_000_000) + .unwrap(); + + assert_eq!(env.reserve(&borrow).cumulative_borrow_rate_index, FIXED_POINT_SCALE); + + // Let ~0.1 year pass (2.5 slots/s => ~7.884M slots), re-publish prices, refresh. + env.warp_slots(7_884_000); + env.set_price(collateral.mint, dollars(1)); + env.set_price(borrow.mint, dollars(1)); + env.refresh_reserve_only(&borrower, &borrow); + + let index_after = env.reserve(&borrow).cumulative_borrow_rate_index; + assert!( + index_after > FIXED_POINT_SCALE, + "interest index must grow once time passes with outstanding borrows" + ); + + // The borrower now owes more than the principal. + env.refresh_obligation_only(&borrower, obligation, &[&collateral], &[&borrow]); + let owed_value = env.obligation(obligation).borrowed_value; + let principal_value = 500u128 * FIXED_POINT_SCALE; // $500 at FIXED_POINT_SCALE per dollar + assert!( + owed_value > principal_value, + "debt value {owed_value} should exceed the $500 principal {principal_value}" + ); + + // The share exchange rate rose: redeeming shares returns more liquidity than + // was deposited per share. Redeem a slice that fits in available liquidity. + env.try_redeem(&supplier, &borrow, 100_000_000).unwrap(); + let returned = env.token_balance(supplier_liquidity); + assert!( + returned > 100_000_000, + "100M shares should redeem for more than 100M liquidity after interest, got {returned}" + ); +} diff --git a/finance/lending/anchor/programs/lending/tests/test_liquidation.rs b/finance/lending/anchor/programs/lending/tests/test_liquidation.rs new file mode 100644 index 00000000..66284d85 --- /dev/null +++ b/finance/lending/anchor/programs/lending/tests/test_liquidation.rs @@ -0,0 +1,100 @@ +mod common; + +use common::{ata, cents, default_config, dollars, Env, ReserveHandle}; +use solana_keypair::Keypair; +use solana_signer::Signer; + +/// A borrower with $1000 of collateral who has borrowed $700 (healthy at 80% +/// liquidation threshold), plus a liquidator funded with the borrow token. +fn setup() -> ( + Env, + ReserveHandle, + ReserveHandle, + Keypair, + anchor_lang::prelude::Pubkey, + Keypair, +) { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + let borrow = env.add_reserve(6, dollars(1), default_config()); + + let supplier = env.create_user(); + env.fund(&supplier, borrow.mint, 1_000_000_000); + env.supply(&supplier, &borrow, 1_000_000_000); + + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.fund(&borrower, borrow.mint, 0); + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.init_obligation(&borrower); + env.post_collateral(&borrower, obligation, &collateral, 1_000_000_000); + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 700_000_000) + .unwrap(); + + let liquidator = env.create_user(); + env.fund(&liquidator, borrow.mint, 1_000_000_000); + + (env, collateral, borrow, borrower, obligation, liquidator) +} + +#[test] +fn healthy_obligation_cannot_be_liquidated() { + let (mut env, collateral, borrow, _borrower, obligation, liquidator) = setup(); + let result = env.try_liquidate( + &liquidator, + obligation, + &[&collateral], + &[&borrow], + &borrow, + &collateral, + 100_000_000, + ); + assert!(result.unwrap_err().contains("ObligationHealthy")); +} + +#[test] +fn unhealthy_obligation_liquidated_with_bonus_capped_by_close_factor() { + let (mut env, collateral, borrow, _borrower, obligation, liquidator) = setup(); + + // Collateral price falls to $0.80: collateral value $800, liquidation + // threshold 80% => $640, while debt is $700 => liquidatable. + env.set_price(collateral.mint, cents(80)); + + let liquidator_repay_account = ata(&liquidator.pubkey(), &borrow.mint); + let liquidator_collateral_account = ata(&liquidator.pubkey(), &collateral.share_mint); + let vault_before = env.reserve(&borrow).available_liquidity; + + // Offer to repay far more than the close factor allows; it caps at 50% of the + // $700 debt = $350. + env.try_liquidate( + &liquidator, + obligation, + &[&collateral], + &[&borrow], + &borrow, + &collateral, + 1_000_000_000, + ) + .unwrap(); + + // Exactly $350 (350M base units) was repaid โ€” close-factor cap, not the full offer. + assert_eq!( + env.token_balance(liquidator_repay_account), + 1_000_000_000 - 350_000_000 + ); + assert_eq!( + env.reserve(&borrow).available_liquidity, + vault_before + 350_000_000 + ); + + // Liquidator seized collateral shares worth repay + 5% bonus, priced at $0.80: + // (350 * 1.05) / 0.80 = 459.375 collateral units => 459_375_000 shares (1:1 here). + assert_eq!( + env.token_balance(liquidator_collateral_account), + 459_375_000 + ); + + // The borrower's debt and collateral both dropped. + let obligation_state = env.obligation(obligation); + assert_eq!(obligation_state.deposits[0].deposited_shares, 1_000_000_000 - 459_375_000); +} diff --git a/finance/lending/anchor/programs/lending/tests/test_reserve.rs b/finance/lending/anchor/programs/lending/tests/test_reserve.rs new file mode 100644 index 00000000..4af509ee --- /dev/null +++ b/finance/lending/anchor/programs/lending/tests/test_reserve.rs @@ -0,0 +1,59 @@ +mod common; + +use common::{default_config, Env}; +use lending::constants::FIXED_POINT_SCALE; + +#[test] +fn init_market_and_reserve() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let reserve = env.reserve(&usdc); + assert_eq!(reserve.lending_market, env.market); + assert_eq!(reserve.liquidity_mint, usdc.mint); + assert_eq!(reserve.liquidity_decimals, 6); + assert_eq!(reserve.available_liquidity, 0); + assert_eq!(reserve.share_mint_supply, 0); + assert_eq!(reserve.borrowed_amount_scaled, 0); + // The interest index starts at 1.0. + assert_eq!(reserve.cumulative_borrow_rate_index, FIXED_POINT_SCALE); +} + +#[test] +fn rejects_ltv_above_liquidation_threshold() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let mut bad = default_config(); + bad.loan_to_value_bps = 9_000; + bad.liquidation_threshold_bps = 8_000; + let result = env.try_update_config(&usdc, bad); + assert!( + result.unwrap_err().contains("InvalidConfig"), + "LTV above the liquidation threshold must be rejected" + ); +} + +#[test] +fn rejects_misordered_interest_rate_curve() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let mut bad = default_config(); + bad.min_borrow_rate_bps = 5_000; + bad.optimal_borrow_rate_bps = 2_000; // optimal below min + bad.max_borrow_rate_bps = 15_000; + let result = env.try_update_config(&usdc, bad); + assert!(result.unwrap_err().contains("InvalidConfig")); +} + +#[test] +fn accepts_valid_config_update() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let mut updated = default_config(); + updated.loan_to_value_bps = 6_000; + env.try_update_config(&usdc, updated).unwrap(); + assert_eq!(env.reserve(&usdc).config.loan_to_value_bps, 6_000); +} diff --git a/finance/lending/anchor/programs/lending/tests/test_rounding.rs b/finance/lending/anchor/programs/lending/tests/test_rounding.rs new file mode 100644 index 00000000..054f2966 --- /dev/null +++ b/finance/lending/anchor/programs/lending/tests/test_rounding.rs @@ -0,0 +1,106 @@ +mod common; + +use common::{ata, default_config, dollars, Env}; +use solana_signer::Signer; + +/// After interest makes the pool worth more than its share supply, a deposit so +/// small it would mint zero shares is rejected rather than silently giving the +/// depositor nothing. +#[test] +fn deposit_that_would_mint_zero_shares_is_rejected() { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + let borrow = env.add_reserve(6, dollars(1), default_config()); + + let supplier = env.create_user(); + env.fund(&supplier, borrow.mint, 1_000_000_000); + env.supply(&supplier, &borrow, 1_000_000_000); + + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.fund(&borrower, borrow.mint, 0); + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.init_obligation(&borrower); + env.post_collateral(&borrower, obligation, &collateral, 1_000_000_000); + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 500_000_000) + .unwrap(); + + // Accrue enough interest that total liquidity exceeds the share supply. + env.warp_slots(7_884_000); + env.refresh_reserve_only(&borrower, &borrow); + assert!(env.reserve(&borrow).cumulative_borrow_rate_index > lending::constants::FIXED_POINT_SCALE); + + let dust_depositor = env.create_user(); + env.fund(&dust_depositor, borrow.mint, 1); + let result = env.try_supply(&dust_depositor, &borrow, 1); + assert!( + result.unwrap_err().contains("DepositTooSmall"), + "a 1-unit deposit into an appreciated pool mints zero shares and must be rejected" + ); +} + +#[test] +fn deposit_redeem_round_trip_creates_no_value() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, dollars(1), default_config()); + + let user = env.create_user(); + let amount = 777_777_777; + let liquidity_account = env.fund(&user, usdc.mint, amount); + let share_account = env.supply(&user, &usdc, amount); + + let shares = env.token_balance(share_account); + env.try_redeem(&user, &usdc, shares).unwrap(); + + // The round trip must never return more than was put in. + assert!(env.token_balance(liquidity_account) <= amount); +} + +#[test] +fn withdraw_at_health_boundary_then_one_more_unit_fails() { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + let borrow = env.add_reserve(6, dollars(1), default_config()); + + let supplier = env.create_user(); + env.fund(&supplier, borrow.mint, 1_000_000_000); + env.supply(&supplier, &borrow, 1_000_000_000); + + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.fund(&borrower, borrow.mint, 0); + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.init_obligation(&borrower); + env.post_collateral(&borrower, obligation, &collateral, 1_000_000_000); + + // Borrow $600 against $1000 collateral (75% LTV => $750 power). + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 600_000_000) + .unwrap(); + + // Withdrawing $200 of collateral lands exactly on the limit: new power + // $750 - 0.75*$200 = $600 == debt. This must pass. + env.try_withdraw_collateral( + &borrower, + obligation, + &[&collateral], + &[&borrow], + &collateral, + 200_000_000, + ) + .unwrap(); + assert_eq!( + env.token_balance(ata(&borrower.pubkey(), &collateral.share_mint)), + 200_000_000 + ); + + // One more unit now pushes the obligation past its limit. + let result = env.try_withdraw_collateral( + &borrower, + obligation, + &[&collateral], + &[&borrow], + &collateral, + 1, + ); + assert!(result.unwrap_err().contains("WithdrawTooLarge")); +} From 8305ca9dcd3a396f79e49ea7d376a4f0d205c778 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 2 Jun 2026 22:18:00 +0000 Subject: [PATCH 003/138] Fix anchor build: drop #[constant] from u128 constants `anchor build`'s IDL generation compiles a generated test under the idl-build feature, where the `#[constant]` macro mis-evaluates the 1e18 u128 literal as i32 ("literal out of range for i32"), failing CI. These values don't need to be in the IDL, so they're plain `pub const`s now. https://claude.ai/code/session_01RwE8f8ahP5S6SDNTsXmpj9 --- finance/lending/anchor/programs/lending/src/constants.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/finance/lending/anchor/programs/lending/src/constants.rs b/finance/lending/anchor/programs/lending/src/constants.rs index 4ff0db05..3affc32e 100644 --- a/finance/lending/anchor/programs/lending/src/constants.rs +++ b/finance/lending/anchor/programs/lending/src/constants.rs @@ -1,4 +1,7 @@ -use anchor_lang::prelude::*; +// These are plain `pub const`s rather than Anchor `#[constant]`s: `#[constant]` +// only re-exports a value into the IDL, and anchor's idl-build mis-evaluates a +// u128 literal this large as i32 ("literal out of range for i32"). None of these +// need to appear in the IDL, so plain consts both compile and keep the IDL clean. /// Fixed-point scale for every ratio in the program: interest rates, the /// cumulative borrow-rate index, the share-token exchange rate, and obligation @@ -8,7 +11,6 @@ use anchor_lang::prelude::*; /// keeps a single slot's interest โ€” which can be a tiny fraction of the index โ€” /// from truncating to zero, while u128's ~3.4e38 ceiling leaves headroom for the /// index to grow and for intermediate products before the final narrowing cast. -#[constant] pub const FIXED_POINT_SCALE: u128 = 1_000_000_000_000_000_000; /// log10(FIXED_POINT_SCALE). Used to fold the price exponent and the fixed-point @@ -17,12 +19,10 @@ pub const FIXED_POINT_SCALE: u128 = 1_000_000_000_000_000_000; pub const FIXED_POINT_SCALE_DECIMALS: i32 = 18; /// Denominator for every basis-point config value. 100% == 10_000 bps. -#[constant] pub const BPS_DENOMINATOR: u128 = 10_000; /// Slots per year, for turning an APR (in bps) into a per-slot rate. /// Solana targets ~2.5 slots/second: 2.5 * 60 * 60 * 24 * 365 = 78_840_000. -#[constant] pub const SLOTS_PER_YEAR: u128 = 78_840_000; /// Maximum distinct reserves an obligation may use as collateral, and @@ -33,7 +33,6 @@ pub const MAX_OBLIGATION_RESERVES: usize = 4; /// A price feed older than this many slots is rejected as stale (~10s at 2.5 /// slots/second). Freshness is measured in slots, not unix time, because the /// runtime guarantees slot progression while the timestamp is validator-influenced. -#[constant] pub const MAX_PRICE_STALENESS_SLOTS: u64 = 25; // PDA seeds. From 5fe327a7ab55b24fd5c097c45374b6d91d785384 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 2 Jun 2026 23:43:01 +0000 Subject: [PATCH 004/138] Break claim_winnings payout into named steps Split the single pro-rata expression into intermediary variables (losing_pool_share_numerator, winnings, payout) so each step of the parimutuel split reads on its own line. --- .../src/instructions/claim_winnings.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs index bc0ec379..c4d3c0c3 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs @@ -59,15 +59,19 @@ pub fn handle_claim_winnings(context: Context) -> Result<()> { ); let stake = context.accounts.bet.amount; + // Total staked on the winning outcome, and the losers' stakes after the fee. let winning_pool = context.accounts.event.winning_pool; let distributable_losing_pool = context.accounts.event.distributable_losing_pool; - // Pro-rata share of the losing pool, on top of the returned stake. u128 - // intermediate avoids overflow; the floor leaves at most a few base units - // of dust in the vault. - let winnings_share = - (stake as u128 * distributable_losing_pool as u128 / winning_pool as u128) as u64; - let payout = stake + winnings_share; + // Parimutuel split: winners share the losing pool in proportion to their + // own stake. Work in u128 and divide once, after the multiply, so the + // result is floored a single time โ€” dividing first would throw away + // precision. The floor leaves at most a few base units of dust in the vault. + let losing_pool_share_numerator = stake as u128 * distributable_losing_pool as u128; + let winnings = (losing_pool_share_numerator / winning_pool as u128) as u64; + + // Winners always get their own stake back on top of their winnings. + let payout = stake + winnings; let event_id = context.accounts.event.event_id; let event_bump = context.accounts.event.bump; From adb4977c611eaaa19c86b206f1ac0f0e4592571d Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 3 Jun 2026 00:02:14 +0000 Subject: [PATCH 005/138] Add Quasar version of the lending program A Quasar (zero-copy, no_std) port of finance/lending, mirroring the shipped Quasar escrow/vault examples' fixed-size-account idiom: - Isolated single-collateral / single-borrow obligations (fixed-size accounts) rather than the Anchor version's Vec-based multi-asset obligation. Quasar does support Vec and CtxWithRemaining, but the DeFi examples favour fixed-size positions, so this follows that idiom. - Interest accrues inline per instruction instead of via a separate refresh. - Keeps every core technique: share-token deposits, a kinked-curve cumulative interest index, oracle-priced health, and close-factor liquidation with a bonus. - Integer-only u128 math scaled by 1e18, rounding in the protocol's favour. quasar-svm tests cover supply/redeem, borrow up to the LTV limit (and rejection beyond), repay, interest accrual lifting share value, and liquidation of an unhealthy position with the healthy path rejected. https://claude.ai/code/session_01RwE8f8ahP5S6SDNTsXmpj9 --- finance/lending/quasar/CHANGELOG.md | 16 + finance/lending/quasar/Cargo.toml | 35 ++ finance/lending/quasar/Quasar.toml | 22 + finance/lending/quasar/README.md | 75 +++ finance/lending/quasar/src/constants.rs | 34 ++ finance/lending/quasar/src/error.rs | 18 + .../lending/quasar/src/instructions/admin.rs | 211 +++++++ .../lending/quasar/src/instructions/mod.rs | 7 + .../quasar/src/instructions/position.rs | 562 ++++++++++++++++++ .../lending/quasar/src/instructions/supply.rs | 177 ++++++ finance/lending/quasar/src/lib.rs | 136 +++++ finance/lending/quasar/src/logic.rs | 90 +++ finance/lending/quasar/src/math.rs | 223 +++++++ finance/lending/quasar/src/state.rs | 85 +++ finance/lending/quasar/src/tests.rs | 487 +++++++++++++++ 15 files changed, 2178 insertions(+) create mode 100644 finance/lending/quasar/CHANGELOG.md create mode 100644 finance/lending/quasar/Cargo.toml create mode 100644 finance/lending/quasar/Quasar.toml create mode 100644 finance/lending/quasar/README.md create mode 100644 finance/lending/quasar/src/constants.rs create mode 100644 finance/lending/quasar/src/error.rs create mode 100644 finance/lending/quasar/src/instructions/admin.rs create mode 100644 finance/lending/quasar/src/instructions/mod.rs create mode 100644 finance/lending/quasar/src/instructions/position.rs create mode 100644 finance/lending/quasar/src/instructions/supply.rs create mode 100644 finance/lending/quasar/src/lib.rs create mode 100644 finance/lending/quasar/src/logic.rs create mode 100644 finance/lending/quasar/src/math.rs create mode 100644 finance/lending/quasar/src/state.rs create mode 100644 finance/lending/quasar/src/tests.rs diff --git a/finance/lending/quasar/CHANGELOG.md b/finance/lending/quasar/CHANGELOG.md new file mode 100644 index 00000000..1e804dad --- /dev/null +++ b/finance/lending/quasar/CHANGELOG.md @@ -0,0 +1,16 @@ +# Changelog + +## 0.1.0 + +Initial Quasar port of the Kamino/Solend-style borrow/lend program. + +- Lending market, per-asset reserves with a program-owned liquidity vault and a + share-token mint, and isolated single-collateral / single-borrow obligations. +- Share-token deposit accounting with an exchange rate driven by accrued interest. +- Utilization-based kinked interest-rate curve compounded through a cumulative + borrow-rate index, accrued inline per instruction. +- Oracle-priced health with loan-to-value and liquidation-threshold limits, and + close-factor-capped liquidation with a seize bonus. +- Switchboard-On-Demand-shaped price feed with a `set_price` test writer. +- quasar-svm integration tests covering supply/redeem, borrow/repay, interest + accrual, and liquidation (including the healthy-rejection path). diff --git a/finance/lending/quasar/Cargo.toml b/finance/lending/quasar/Cargo.toml new file mode 100644 index 00000000..d935ad46 --- /dev/null +++ b/finance/lending/quasar/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "quasar-lending" +version = "0.1.0" +edition = "2021" + +# Standalone workspace โ€” Quasar uses a different resolver and dependency tree +# from the root program-examples workspace. +[workspace] + +[lints.rust.unexpected_cfgs] +level = "warn" +check-cfg = [ + 'cfg(target_os, values("solana"))', +] + +[lib] +crate-type = ["cdylib", "lib"] + +[features] +alloc = [] +client = [] +debug = [] + +[dependencies] +# Pinned to rev 623bb70 for the same reason as the other Quasar examples: master +# HEAD fails to compile because zeropod 0.3.x generates accessor methods that +# conflict with hand-written ones in quasar-spl. Unpin once upstream merges the fix. +quasar-lang = { git = "https://github.com/blueshift-gg/quasar", rev = "623bb70" } +quasar-spl = { git = "https://github.com/blueshift-gg/quasar", rev = "623bb70" } +solana-instruction = { version = "3.2.0" } + +[dev-dependencies] +quasar-svm = { git = "https://github.com/blueshift-gg/quasar-svm" } +spl-token-interface = { version = "2.0.0" } +solana-program-pack = { version = "3.1.0" } diff --git a/finance/lending/quasar/Quasar.toml b/finance/lending/quasar/Quasar.toml new file mode 100644 index 00000000..c3e8d514 --- /dev/null +++ b/finance/lending/quasar/Quasar.toml @@ -0,0 +1,22 @@ +[project] +name = "quasar_lending" + +[toolchain] +type = "solana" + +[testing] +language = "rust" + +[testing.rust] +framework = "quasar-svm" + +[testing.rust.test] +program = "cargo" +args = [ + "test", + "tests::", +] + +[clients] +path = "target/client" +languages = ["rust"] diff --git a/finance/lending/quasar/README.md b/finance/lending/quasar/README.md new file mode 100644 index 00000000..a8adeb03 --- /dev/null +++ b/finance/lending/quasar/README.md @@ -0,0 +1,75 @@ +# Lending (Quasar) + +A Kamino/Solend-style borrow/lend program written with [Quasar](https://quasar-lang.com), +a zero-copy, `no_std` Solana framework. It is the Quasar counterpart to the Anchor +version in [`../anchor`](../anchor) and keeps the same core techniques: share-token +deposits, a kinked-curve interest index, oracle-priced obligation health, and +close-factor liquidation with a bonus. + +## What's different from the Anchor version + +Quasar accounts are fixed-size and zero-copy. Quasar *does* support bounded +collections (`Vec` / `PodVec`) and remaining accounts (`CtxWithRemaining`) โ€” +the `multisig` example uses both โ€” so a multi-asset obligation is expressible. But +the shipped Quasar DeFi examples (`escrow`, `vault`) model one position with +fixed-size accounts, so this port follows that idiom: + +- **Isolated single-pair positions.** Each `Obligation` holds exactly one + collateral reserve and one borrow reserve (fixed fields), instead of the Anchor + version's `Vec`-based multi-asset obligation. This is the "isolated market" + shape and removes the need for `Vec` elements and variable-account + refreshes. +- **Inline interest accrual.** There is no separate `refresh_reserve` / + `refresh_obligation` step: each value-dependent handler accrues the reserves it + touches at the top of the instruction. Health is then computed inline from the + freshly accrued reserves and the oracle prices passed in. + +Everything else mirrors the Anchor version. + +## Major concepts + +- **`LendingMarket`** โ€” market config (owner, quote-currency mint). PDA: + `["lending_market", owner]`. +- **`Reserve`** โ€” one asset's pool. Owns a program-controlled liquidity vault and + a share-token mint (both PDAs, authority = the reserve), and stores the + interest-rate config, the cumulative borrow-rate index, available liquidity, and + scaled total debt. PDA: `["reserve", market, liquidity_mint]`. +- **`Obligation`** โ€” a borrower's isolated position: the collateral reserve and + deposited share amount, plus the borrow reserve and scaled debt. PDA: + `["obligation", market, owner]`. +- **`PriceFeed`** โ€” a Switchboard-On-Demand-shaped price (`mantissa * 10^exponent` + + slot). `set_price` writes it directly for deterministic tests; in production a + reserve points at the real Switchboard feed. Freshness is checked in slots. +- **Share tokens** โ€” supplying mints them, redeeming burns them; the exchange rate + `total_liquidity / share_supply` rises as borrowers pay interest. + `available_liquidity` (not the vault's raw balance) is the source of truth, so a + token donation can't inflate the rate. +- **Integer-only math** โ€” `u128`, scaled by `FIXED_POINT_SCALE` (10^18), every + conversion rounding in the protocol's favour. + +### Instruction handlers (numeric discriminators) + +`init_lending_market` (0), `init_reserve` (1), `set_price` (2), +`deposit_reserve_liquidity` (3), `redeem_reserve_collateral` (4), +`init_obligation` (5), `deposit_obligation_collateral` (6), +`withdraw_obligation_collateral` (7), `borrow_obligation_liquidity` (8), +`repay_obligation_liquidity` (9), `liquidate_obligation` (10). + +## Setup + +- Rust and the Solana toolchain (`cargo-build-sbf`). +- Quasar (`quasar-lang` / `quasar-spl`), pinned to the rev used across the repo's + Quasar examples (see `Cargo.toml` for the rationale). + +## Testing + +```sh +cargo build-sbf # produces target/deploy/quasar_lending.so +cargo test tests:: # runs the quasar-svm integration tests +``` + +`cargo build-sbf` must run first: the tests load the compiled +`target/deploy/quasar_lending.so` into `quasar-svm`. The suite drives the full +lifecycle โ€” supply/redeem (1:1 first deposit), borrow up to the LTV limit (and +rejection beyond it), repay, interest accrual lifting the share value after slots +pass, and liquidation of an unhealthy position (with a healthy position rejected). diff --git a/finance/lending/quasar/src/constants.rs b/finance/lending/quasar/src/constants.rs new file mode 100644 index 00000000..67d37b8f --- /dev/null +++ b/finance/lending/quasar/src/constants.rs @@ -0,0 +1,34 @@ +//! Shared constants for the Quasar lending program. + +/// Fixed-point scale (10^18) for every ratio: interest rates, the cumulative +/// borrow-rate index, the share-token exchange rate, and obligation values. +/// All money math is integer-only `u128`; a ratio `r` is stored as +/// `r * FIXED_POINT_SCALE`. +pub const FIXED_POINT_SCALE: u128 = 1_000_000_000_000_000_000; + +/// log10(FIXED_POINT_SCALE). Folds the price exponent and the fixed-point scale +/// into one power of ten so price conversions never form a needless 10^18 +/// intermediate that would overflow for high-priced assets. +pub const FIXED_POINT_SCALE_DECIMALS: i32 = 18; + +/// 100% expressed in basis points. +pub const BPS_DENOMINATOR: u128 = 10_000; + +/// Slots per year (~2.5 slots/s), for turning an APR in bps into a per-slot rate. +pub const SLOTS_PER_YEAR: u128 = 78_840_000; + +/// Reject a price feed older than this many slots (~10s at 2.5 slots/s). +pub const MAX_PRICE_STALENESS_SLOTS: u64 = 25; + +/// SPL token account size, for the rent-exempt vault created in `init_reserve`. +pub const TOKEN_ACCOUNT_SPACE: u64 = 165; + +/// SPL mint size, for the rent-exempt share mint created in `init_reserve`. +pub const MINT_SPACE: u64 = 82; + +// PDA seeds for the `Seed::from(...)` signer arrays in the CPI-signing handlers. +// (The `#[seeds(...)]` attributes on the account types carry their own literals.) +pub const RESERVE_SEED: &[u8] = b"reserve"; +pub const LIQUIDITY_VAULT_SEED: &[u8] = b"liquidity_vault"; +pub const SHARE_MINT_SEED: &[u8] = b"share_mint"; +pub const OBLIGATION_SEED: &[u8] = b"obligation"; diff --git a/finance/lending/quasar/src/error.rs b/finance/lending/quasar/src/error.rs new file mode 100644 index 00000000..45a11189 --- /dev/null +++ b/finance/lending/quasar/src/error.rs @@ -0,0 +1,18 @@ +use quasar_lang::prelude::*; + +/// Program errors. `#[error_code]` assigns codes starting at 6000 and generates +/// the `From for ProgramError` conversion that `?` and `require!` use. +#[error_code] +pub enum LendingError { + MathOverflow = 6000, + InvalidConfig, + ZeroAmount, + DepositTooSmall, + InsufficientLiquidity, + StalePrice, + InvalidOraclePrice, + BorrowTooLarge, + WithdrawTooLarge, + ObligationHealthy, + WrongReserve, +} diff --git a/finance/lending/quasar/src/instructions/admin.rs b/finance/lending/quasar/src/instructions/admin.rs new file mode 100644 index 00000000..b8f41cf5 --- /dev/null +++ b/finance/lending/quasar/src/instructions/admin.rs @@ -0,0 +1,211 @@ +use { + crate::{ + constants::{MINT_SPACE, TOKEN_ACCOUNT_SPACE}, + error::LendingError, + logic::now, + math::validate_config, + state::{ + LendingMarket, LendingMarketInner, LiquidityVaultPda, PriceFeed, PriceFeedInner, + Reserve, ReserveInner, ShareMintPda, + }, + }, + quasar_lang::{prelude::*, sysvars::Sysvar}, + quasar_spl::{initialize_account3, initialize_mint2, prelude::*}, +}; + +// --------------------------------------------------------------------------- +// init_lending_market +// --------------------------------------------------------------------------- + +#[derive(Accounts)] +pub struct InitLendingMarket { + #[account(mut)] + pub owner: Signer, + #[account(init, payer = owner, address = LendingMarket::seeds(owner.address()))] + pub lending_market: Account, + pub quote_mint: Account, + pub system_program: Program, +} + +impl InitLendingMarket { + #[inline(always)] + pub fn run(&mut self, bumps: &InitLendingMarketBumps) -> Result<(), ProgramError> { + self.lending_market.set_inner(LendingMarketInner { + owner: *self.owner.address(), + quote_mint: *self.quote_mint.address(), + bump: bumps.lending_market, + }); + Ok(()) + } +} + +// --------------------------------------------------------------------------- +// init_reserve +// --------------------------------------------------------------------------- + +#[derive(Accounts)] +pub struct InitReserve { + #[account(mut)] + pub owner: Signer, + #[account(has_one(owner), address = LendingMarket::seeds(owner.address()))] + pub lending_market: Account, + #[account(init, payer = owner, address = Reserve::seeds(lending_market.address(), liquidity_mint.address()))] + pub reserve: Account, + pub liquidity_mint: Account, + /// Created and initialized as a token account (authority = reserve) in the handler. + #[account(mut, address = LiquidityVaultPda::seeds(reserve.address()))] + pub liquidity_vault: UncheckedAccount, + /// Created and initialized as a share-token mint (authority = reserve) in the handler. + #[account(mut, address = ShareMintPda::seeds(reserve.address()))] + pub share_mint: UncheckedAccount, + #[account(address = PriceFeed::seeds(liquidity_mint.address()))] + pub price_feed: Account, + pub token_program: Program, + pub system_program: Program, +} + +impl InitReserve { + #[inline(always)] + #[allow(clippy::too_many_arguments)] + pub fn run( + &mut self, + loan_to_value_bps: u16, + liquidation_threshold_bps: u16, + liquidation_bonus_bps: u16, + close_factor_bps: u16, + optimal_utilization_bps: u16, + min_borrow_rate_bps: u16, + optimal_borrow_rate_bps: u16, + max_borrow_rate_bps: u16, + bumps: &InitReserveBumps, + ) -> Result<(), ProgramError> { + validate_config( + loan_to_value_bps, + liquidation_threshold_bps, + liquidation_bonus_bps, + close_factor_bps, + optimal_utilization_bps, + min_borrow_rate_bps, + optimal_borrow_rate_bps, + max_borrow_rate_bps, + )?; + + let reserve_address = *self.reserve.address(); + let decimals = self.liquidity_mint.decimals; + let rent = Rent::get()?; + + // Create the program-owned liquidity vault PDA, then initialize it as a + // token account whose authority is the reserve PDA. + let vault_bump = [bumps.liquidity_vault]; + let vault_seeds = [ + Seed::from(crate::constants::LIQUIDITY_VAULT_SEED), + Seed::from(reserve_address.as_ref()), + Seed::from(vault_bump.as_ref()), + ]; + self.system_program + .create_account( + &self.owner, + &self.liquidity_vault, + rent.minimum_balance_unchecked(TOKEN_ACCOUNT_SPACE as usize), + TOKEN_ACCOUNT_SPACE, + self.token_program.address(), + ) + .invoke_signed(&vault_seeds)?; + initialize_account3( + self.token_program.to_account_view(), + self.liquidity_vault.to_account_view(), + self.liquidity_mint.to_account_view(), + &reserve_address, + ) + .invoke()?; + + // Create the share-token mint PDA (authority = reserve, same decimals). + let mint_bump = [bumps.share_mint]; + let mint_seeds = [ + Seed::from(crate::constants::SHARE_MINT_SEED), + Seed::from(reserve_address.as_ref()), + Seed::from(mint_bump.as_ref()), + ]; + self.system_program + .create_account( + &self.owner, + &self.share_mint, + rent.minimum_balance_unchecked(MINT_SPACE as usize), + MINT_SPACE, + self.token_program.address(), + ) + .invoke_signed(&mint_seeds)?; + initialize_mint2( + self.token_program.to_account_view(), + self.share_mint.to_account_view(), + decimals, + &reserve_address, + None, + ) + .invoke()?; + + self.reserve.set_inner(ReserveInner { + lending_market: *self.lending_market.address(), + liquidity_mint: *self.liquidity_mint.address(), + liquidity_vault: *self.liquidity_vault.address(), + share_mint: *self.share_mint.address(), + price_feed: *self.price_feed.address(), + available_liquidity: 0, + share_mint_supply: 0, + borrowed_amount_scaled: 0, + cumulative_borrow_rate_index: crate::constants::FIXED_POINT_SCALE, + last_update_slot: now()?, + liquidity_decimals: decimals, + loan_to_value_bps, + liquidation_threshold_bps, + liquidation_bonus_bps, + close_factor_bps, + optimal_utilization_bps, + min_borrow_rate_bps, + optimal_borrow_rate_bps, + max_borrow_rate_bps, + bump: bumps.reserve, + }); + Ok(()) + } +} + +// --------------------------------------------------------------------------- +// set_price (Switchboard stand-in for tests) +// --------------------------------------------------------------------------- + +#[derive(Accounts)] +pub struct SetPrice { + #[account(mut)] + pub authority: Signer, + #[account(init(idempotent), payer = authority, address = PriceFeed::seeds(mint.address()))] + pub price_feed: Account, + pub mint: Account, + pub system_program: Program, +} + +impl SetPrice { + #[inline(always)] + pub fn run( + &mut self, + price_mantissa: i128, + exponent: i32, + bumps: &SetPriceBumps, + ) -> Result<(), ProgramError> { + // On first creation the stored authority is the zero address; claim it. + // Afterwards only that authority may update the feed. + let existing = self.price_feed.authority; + if existing != Address::default() { + require_keys_eq!(existing, *self.authority.address(), LendingError::InvalidConfig); + } + self.price_feed.set_inner(PriceFeedInner { + mint: *self.mint.address(), + price_mantissa, + exponent, + last_updated_slot: now()?, + authority: *self.authority.address(), + bump: bumps.price_feed, + }); + Ok(()) + } +} diff --git a/finance/lending/quasar/src/instructions/mod.rs b/finance/lending/quasar/src/instructions/mod.rs new file mode 100644 index 00000000..d4c65b96 --- /dev/null +++ b/finance/lending/quasar/src/instructions/mod.rs @@ -0,0 +1,7 @@ +pub mod admin; +pub mod position; +pub mod supply; + +pub use admin::*; +pub use position::*; +pub use supply::*; diff --git a/finance/lending/quasar/src/instructions/position.rs b/finance/lending/quasar/src/instructions/position.rs new file mode 100644 index 00000000..008b4a81 --- /dev/null +++ b/finance/lending/quasar/src/instructions/position.rs @@ -0,0 +1,562 @@ +use { + crate::{ + constants::BPS_DENOMINATOR, + error::LendingError, + instructions::supply::reserve_seeds, + logic::{accrue, now, price_scaled, snapshot_obligation, snapshot_reserve, SCALE}, + math::{current_debt, market_value, mul_div_ceil, mul_div_floor, total_liquidity, value_to_amount, Rounding}, + state::{ + LendingMarket, Obligation, ObligationInner, ObligationVaultPda, PriceFeed, Reserve, + }, + }, + quasar_lang::prelude::*, + quasar_spl::prelude::*, +}; + +/// Obligation PDA signer seeds, used to authorize transfers out of the +/// obligation's collateral vault. +macro_rules! obligation_seeds { + ($lending_market:expr, $owner:expr, $bump:expr) => { + [ + Seed::from(crate::constants::OBLIGATION_SEED), + Seed::from($lending_market.as_ref()), + Seed::from($owner.as_ref()), + Seed::from($bump.as_ref()), + ] + }; +} + +// --------------------------------------------------------------------------- +// init_obligation +// --------------------------------------------------------------------------- + +#[derive(Accounts)] +pub struct InitObligation { + #[account(mut)] + pub owner: Signer, + pub lending_market: Account, + #[account(init, payer = owner, address = Obligation::seeds(lending_market.address(), owner.address()))] + pub obligation: Account, + pub system_program: Program, +} + +impl InitObligation { + #[inline(always)] + pub fn run(&mut self, bumps: &InitObligationBumps) -> Result<(), ProgramError> { + self.obligation.set_inner(ObligationInner { + lending_market: *self.lending_market.address(), + owner: *self.owner.address(), + collateral_reserve: Address::default(), + deposited_shares: 0, + borrow_reserve: Address::default(), + borrowed_scaled: 0, + bump: bumps.obligation, + }); + Ok(()) + } +} + +// --------------------------------------------------------------------------- +// deposit_obligation_collateral +// --------------------------------------------------------------------------- + +#[derive(Accounts)] +pub struct DepositObligationCollateral { + #[account(mut)] + pub owner: Signer, + pub lending_market: Account, + #[account(mut, has_one(owner), has_one(lending_market), address = Obligation::seeds(lending_market.address(), owner.address()))] + pub obligation: Account, + #[account(has_one(share_mint))] + pub reserve: Account, + pub share_mint: Account, + #[account( + init(idempotent), + payer = owner, + token(mint = share_mint, authority = obligation, token_program = token_program), + address = ObligationVaultPda::seeds(reserve.address(), obligation.address()) + )] + pub obligation_vault: InterfaceAccount, + #[account(mut)] + pub owner_share: Account, + pub rent: Sysvar, + pub token_program: Program, + pub system_program: Program, +} + +impl DepositObligationCollateral { + #[inline(always)] + pub fn run(&mut self, shares: u64) -> Result<(), ProgramError> { + require!(shares > 0, LendingError::ZeroAmount); + let reserve_address = *self.reserve.address(); + + let mut obligation = snapshot_obligation(&self.obligation); + if obligation.collateral_reserve == Address::default() { + obligation.collateral_reserve = reserve_address; + } else { + require_keys_eq!(obligation.collateral_reserve, reserve_address, LendingError::WrongReserve); + } + obligation.deposited_shares = obligation + .deposited_shares + .checked_add(shares) + .ok_or(LendingError::MathOverflow)?; + let decimals = self.share_mint.decimals; + self.obligation.set_inner(obligation); + + self.token_program + .transfer_checked( + &self.owner_share, + &self.share_mint, + &self.obligation_vault, + &self.owner, + shares, + decimals, + ) + .invoke() + } +} + +// --------------------------------------------------------------------------- +// borrow_obligation_liquidity +// --------------------------------------------------------------------------- + +#[derive(Accounts)] +pub struct BorrowObligationLiquidity { + #[account(mut)] + pub owner: Signer, + pub lending_market: Account, + #[account(mut, has_one(owner), has_one(lending_market), address = Obligation::seeds(lending_market.address(), owner.address()))] + pub obligation: Account, + #[account(mut, has_one(lending_market))] + pub collateral_reserve: Account, + pub collateral_price: Account, + #[account(mut, has_one(lending_market), has_one(liquidity_mint), has_one(liquidity_vault))] + pub borrow_reserve: Account, + pub borrow_price: Account, + pub liquidity_mint: Account, + #[account(mut)] + pub liquidity_vault: Account, + #[account(mut)] + pub owner_liquidity: Account, + pub token_program: Program, +} + +impl BorrowObligationLiquidity { + #[inline(always)] + pub fn run(&mut self, amount: u64) -> Result<(), ProgramError> { + require!(amount > 0, LendingError::ZeroAmount); + let slot = now()?; + + require_keys_eq!( + self.obligation.collateral_reserve, + *self.collateral_reserve.address(), + LendingError::WrongReserve + ); + require_keys_eq!( + self.collateral_reserve.price_feed, + *self.collateral_price.address(), + LendingError::WrongReserve + ); + require_keys_eq!( + self.borrow_reserve.price_feed, + *self.borrow_price.address(), + LendingError::WrongReserve + ); + + let mut collateral = snapshot_reserve(&self.collateral_reserve); + accrue(&mut collateral, slot)?; + let mut borrow = snapshot_reserve(&self.borrow_reserve); + accrue(&mut borrow, slot)?; + let mut obligation = snapshot_obligation(&self.obligation); + if obligation.borrow_reserve != Address::default() { + require_keys_eq!( + obligation.borrow_reserve, + *self.borrow_reserve.address(), + LendingError::WrongReserve + ); + } + + // Borrow power from collateral value. + let collateral_total = total_liquidity( + collateral.available_liquidity, + collateral.borrowed_amount_scaled, + collateral.cumulative_borrow_rate_index, + )?; + let collateral_liquidity = mul_div_floor( + obligation.deposited_shares as u128, + collateral_total, + (collateral.share_mint_supply as u128).max(1), + )?; + let collateral_value = market_value( + u64::try_from(collateral_liquidity).map_err(|_| LendingError::MathOverflow)?, + collateral.liquidity_decimals, + price_scaled(&self.collateral_price, slot)?, + Rounding::Down, + )?; + let allowed = mul_div_floor(collateral_value, collateral.loan_to_value_bps as u128, BPS_DENOMINATOR)?; + + // Existing debt value + the new borrow, both rounded up. + let borrow_price = price_scaled(&self.borrow_price, slot)?; + let existing_debt = current_debt(obligation.borrowed_scaled, borrow.cumulative_borrow_rate_index)?; + let existing_value = market_value(existing_debt, borrow.liquidity_decimals, borrow_price, Rounding::Up)?; + let new_value = market_value(amount, borrow.liquidity_decimals, borrow_price, Rounding::Up)?; + let projected = existing_value.checked_add(new_value).ok_or(LendingError::MathOverflow)?; + require!(projected <= allowed, LendingError::BorrowTooLarge); + require!(amount <= borrow.available_liquidity, LendingError::InsufficientLiquidity); + + let scaled_added = mul_div_ceil(amount as u128, SCALE, borrow.cumulative_borrow_rate_index)?; + borrow.borrowed_amount_scaled = borrow + .borrowed_amount_scaled + .checked_add(scaled_added) + .ok_or(LendingError::MathOverflow)?; + borrow.available_liquidity = borrow + .available_liquidity + .checked_sub(amount) + .ok_or(LendingError::MathOverflow)?; + obligation.borrow_reserve = *self.borrow_reserve.address(); + obligation.borrowed_scaled = obligation + .borrowed_scaled + .checked_add(scaled_added) + .ok_or(LendingError::MathOverflow)?; + + let bump = [borrow.bump]; + let lending_market = borrow.lending_market; + let liquidity_mint = borrow.liquidity_mint; + let decimals = borrow.liquidity_decimals; + self.collateral_reserve.set_inner(collateral); + self.borrow_reserve.set_inner(borrow); + self.obligation.set_inner(obligation); + + let seeds = reserve_seeds!(lending_market, liquidity_mint, bump); + self.token_program + .transfer_checked( + &self.liquidity_vault, + &self.liquidity_mint, + &self.owner_liquidity, + &self.borrow_reserve, + amount, + decimals, + ) + .invoke_signed(&seeds) + } +} + +// --------------------------------------------------------------------------- +// repay_obligation_liquidity +// --------------------------------------------------------------------------- + +#[derive(Accounts)] +pub struct RepayObligationLiquidity { + #[account(mut)] + pub repayer: Signer, + #[account(mut)] + pub obligation: Account, + #[account(mut, has_one(liquidity_mint), has_one(liquidity_vault))] + pub borrow_reserve: Account, + pub liquidity_mint: Account, + #[account(mut)] + pub liquidity_vault: Account, + #[account(mut)] + pub repayer_liquidity: Account, + pub token_program: Program, +} + +impl RepayObligationLiquidity { + #[inline(always)] + pub fn run(&mut self, amount: u64) -> Result<(), ProgramError> { + require!(amount > 0, LendingError::ZeroAmount); + let slot = now()?; + + require_keys_eq!( + self.obligation.borrow_reserve, + *self.borrow_reserve.address(), + LendingError::WrongReserve + ); + + let mut borrow = snapshot_reserve(&self.borrow_reserve); + accrue(&mut borrow, slot)?; + let mut obligation = snapshot_obligation(&self.obligation); + + let debt = current_debt(obligation.borrowed_scaled, borrow.cumulative_borrow_rate_index)?; + let repay = amount.min(debt); + require!(repay > 0, LendingError::ZeroAmount); + let scaled_removed = mul_div_floor(repay as u128, SCALE, borrow.cumulative_borrow_rate_index)? + .min(obligation.borrowed_scaled); + + borrow.borrowed_amount_scaled = borrow + .borrowed_amount_scaled + .checked_sub(scaled_removed) + .ok_or(LendingError::MathOverflow)?; + borrow.available_liquidity = borrow + .available_liquidity + .checked_add(repay) + .ok_or(LendingError::MathOverflow)?; + obligation.borrowed_scaled = obligation + .borrowed_scaled + .checked_sub(scaled_removed) + .ok_or(LendingError::MathOverflow)?; + + let decimals = borrow.liquidity_decimals; + self.borrow_reserve.set_inner(borrow); + self.obligation.set_inner(obligation); + + self.token_program + .transfer_checked( + &self.repayer_liquidity, + &self.liquidity_mint, + &self.liquidity_vault, + &self.repayer, + repay, + decimals, + ) + .invoke() + } +} + +// --------------------------------------------------------------------------- +// withdraw_obligation_collateral +// --------------------------------------------------------------------------- + +#[derive(Accounts)] +pub struct WithdrawObligationCollateral { + #[account(mut)] + pub owner: Signer, + pub lending_market: Account, + #[account(mut, has_one(owner), has_one(lending_market), address = Obligation::seeds(lending_market.address(), owner.address()))] + pub obligation: Account, + #[account(mut, has_one(lending_market), has_one(share_mint))] + pub collateral_reserve: Account, + pub collateral_price: Account, + pub share_mint: Account, + /// Pass the borrow reserve + price when the obligation has debt; ignored when + /// `borrowed_scaled == 0` (nothing to value). + pub borrow_reserve: Account, + pub borrow_price: Account, + #[account(mut, address = ObligationVaultPda::seeds(collateral_reserve.address(), obligation.address()))] + pub obligation_vault: InterfaceAccount, + #[account(mut)] + pub owner_share: Account, + pub token_program: Program, +} + +impl WithdrawObligationCollateral { + #[inline(always)] + pub fn run(&mut self, shares: u64) -> Result<(), ProgramError> { + require!(shares > 0, LendingError::ZeroAmount); + let slot = now()?; + + require_keys_eq!( + self.obligation.collateral_reserve, + *self.collateral_reserve.address(), + LendingError::WrongReserve + ); + require_keys_eq!( + self.collateral_reserve.price_feed, + *self.collateral_price.address(), + LendingError::WrongReserve + ); + + let mut collateral = snapshot_reserve(&self.collateral_reserve); + accrue(&mut collateral, slot)?; + let mut obligation = snapshot_obligation(&self.obligation); + require!(obligation.deposited_shares >= shares, LendingError::WithdrawTooLarge); + + // Remaining collateral value after withdrawing `shares`. + let remaining_shares = obligation.deposited_shares - shares; + let collateral_total = total_liquidity( + collateral.available_liquidity, + collateral.borrowed_amount_scaled, + collateral.cumulative_borrow_rate_index, + )?; + let remaining_liquidity = mul_div_floor( + remaining_shares as u128, + collateral_total, + (collateral.share_mint_supply as u128).max(1), + )?; + let remaining_value = market_value( + u64::try_from(remaining_liquidity).map_err(|_| LendingError::MathOverflow)?, + collateral.liquidity_decimals, + price_scaled(&self.collateral_price, slot)?, + Rounding::Down, + )?; + let allowed = mul_div_floor(remaining_value, collateral.loan_to_value_bps as u128, BPS_DENOMINATOR)?; + + // Debt value (zero when the obligation has no borrow). + let debt_value = if obligation.borrowed_scaled > 0 { + require_keys_eq!( + obligation.borrow_reserve, + *self.borrow_reserve.address(), + LendingError::WrongReserve + ); + require_keys_eq!( + self.borrow_reserve.price_feed, + *self.borrow_price.address(), + LendingError::WrongReserve + ); + let mut borrow = snapshot_reserve(&self.borrow_reserve); + accrue(&mut borrow, slot)?; + let debt = current_debt(obligation.borrowed_scaled, borrow.cumulative_borrow_rate_index)?; + market_value(debt, borrow.liquidity_decimals, price_scaled(&self.borrow_price, slot)?, Rounding::Up)? + } else { + 0 + }; + require!(debt_value <= allowed, LendingError::WithdrawTooLarge); + + obligation.deposited_shares = remaining_shares; + + let decimals = self.share_mint.decimals; + let lending_market = obligation.lending_market; + let owner = obligation.owner; + let bump = [obligation.bump]; + self.collateral_reserve.set_inner(collateral); + self.obligation.set_inner(obligation); + + let seeds = obligation_seeds!(lending_market, owner, bump); + self.token_program + .transfer_checked( + &self.obligation_vault, + &self.share_mint, + &self.owner_share, + &self.obligation, + shares, + decimals, + ) + .invoke_signed(&seeds) + } +} + +// --------------------------------------------------------------------------- +// liquidate_obligation +// --------------------------------------------------------------------------- + +#[derive(Accounts)] +pub struct LiquidateObligation { + #[account(mut)] + pub liquidator: Signer, + #[account(mut, has_one(lending_market))] + pub obligation: Account, + pub lending_market: Account, + #[account(mut, has_one(lending_market), has_one(share_mint))] + pub collateral_reserve: Account, + pub collateral_price: Account, + pub share_mint: Account, + #[account(mut, address = ObligationVaultPda::seeds(collateral_reserve.address(), obligation.address()))] + pub obligation_vault: InterfaceAccount, + #[account(mut)] + pub liquidator_collateral: Account, + #[account(mut, has_one(lending_market), has_one(liquidity_mint), has_one(liquidity_vault))] + pub borrow_reserve: Account, + pub borrow_price: Account, + pub liquidity_mint: Account, + #[account(mut)] + pub liquidity_vault: Account, + #[account(mut)] + pub liquidator_liquidity: Account, + pub token_program: Program, +} + +impl LiquidateObligation { + #[inline(always)] + pub fn run(&mut self, amount: u64) -> Result<(), ProgramError> { + require!(amount > 0, LendingError::ZeroAmount); + let slot = now()?; + + require_keys_eq!(self.obligation.collateral_reserve, *self.collateral_reserve.address(), LendingError::WrongReserve); + require_keys_eq!(self.obligation.borrow_reserve, *self.borrow_reserve.address(), LendingError::WrongReserve); + require_keys_eq!(self.collateral_reserve.price_feed, *self.collateral_price.address(), LendingError::WrongReserve); + require_keys_eq!(self.borrow_reserve.price_feed, *self.borrow_price.address(), LendingError::WrongReserve); + + let mut collateral = snapshot_reserve(&self.collateral_reserve); + accrue(&mut collateral, slot)?; + let mut borrow = snapshot_reserve(&self.borrow_reserve); + accrue(&mut borrow, slot)?; + let mut obligation = snapshot_obligation(&self.obligation); + + let collateral_price = price_scaled(&self.collateral_price, slot)?; + let borrow_price = price_scaled(&self.borrow_price, slot)?; + + // Health: unhealthy when debt value exceeds collateral value * liq threshold. + let collateral_total = total_liquidity( + collateral.available_liquidity, + collateral.borrowed_amount_scaled, + collateral.cumulative_borrow_rate_index, + )?; + let collateral_liquidity = mul_div_floor( + obligation.deposited_shares as u128, + collateral_total, + (collateral.share_mint_supply as u128).max(1), + )?; + let collateral_value = market_value( + u64::try_from(collateral_liquidity).map_err(|_| LendingError::MathOverflow)?, + collateral.liquidity_decimals, + collateral_price, + Rounding::Down, + )?; + let unhealthy_threshold = mul_div_floor(collateral_value, collateral.liquidation_threshold_bps as u128, BPS_DENOMINATOR)?; + let debt = current_debt(obligation.borrowed_scaled, borrow.cumulative_borrow_rate_index)?; + let debt_value = market_value(debt, borrow.liquidity_decimals, borrow_price, Rounding::Up)?; + require!(debt_value > unhealthy_threshold, LendingError::ObligationHealthy); + + // Repay capped by the close factor. + let max_repay = mul_div_floor(debt as u128, collateral.close_factor_bps as u128, BPS_DENOMINATOR)?; + let repay = amount.min(u64::try_from(max_repay).map_err(|_| LendingError::MathOverflow)?); + require!(repay > 0, LendingError::ZeroAmount); + + // Seize collateral worth repay value + bonus, converted to share tokens. + let repay_value = market_value(repay, borrow.liquidity_decimals, borrow_price, Rounding::Down)?; + let bonus = mul_div_floor(repay_value, collateral.liquidation_bonus_bps as u128, BPS_DENOMINATOR)?; + let seize_value = repay_value.checked_add(bonus).ok_or(LendingError::MathOverflow)?; + let seize_liquidity = value_to_amount(seize_value, collateral.liquidity_decimals, collateral_price, Rounding::Down)?; + let seize_shares = mul_div_floor( + seize_liquidity as u128, + collateral.share_mint_supply as u128, + collateral_total.max(1), + )?; + let seize_shares = u64::try_from(seize_shares) + .map_err(|_| LendingError::MathOverflow)? + .min(obligation.deposited_shares); + require!(seize_shares > 0, LendingError::ZeroAmount); + + let scaled_removed = mul_div_floor(repay as u128, SCALE, borrow.cumulative_borrow_rate_index)? + .min(obligation.borrowed_scaled); + + borrow.borrowed_amount_scaled = borrow.borrowed_amount_scaled.checked_sub(scaled_removed).ok_or(LendingError::MathOverflow)?; + borrow.available_liquidity = borrow.available_liquidity.checked_add(repay).ok_or(LendingError::MathOverflow)?; + obligation.borrowed_scaled = obligation.borrowed_scaled.checked_sub(scaled_removed).ok_or(LendingError::MathOverflow)?; + obligation.deposited_shares = obligation.deposited_shares.checked_sub(seize_shares).ok_or(LendingError::MathOverflow)?; + + let share_decimals = self.share_mint.decimals; + let borrow_decimals = borrow.liquidity_decimals; + let lending_market = obligation.lending_market; + let owner = obligation.owner; + let bump = [obligation.bump]; + self.collateral_reserve.set_inner(collateral); + self.borrow_reserve.set_inner(borrow); + self.obligation.set_inner(obligation); + + // Liquidator repays the debt token... + self.token_program + .transfer_checked( + &self.liquidator_liquidity, + &self.liquidity_mint, + &self.liquidity_vault, + &self.liquidator, + repay, + borrow_decimals, + ) + .invoke()?; + + // ...and receives the seized collateral share tokens (obligation PDA signs). + let seeds = obligation_seeds!(lending_market, owner, bump); + self.token_program + .transfer_checked( + &self.obligation_vault, + &self.share_mint, + &self.liquidator_collateral, + &self.obligation, + seize_shares, + share_decimals, + ) + .invoke_signed(&seeds) + } +} diff --git a/finance/lending/quasar/src/instructions/supply.rs b/finance/lending/quasar/src/instructions/supply.rs new file mode 100644 index 00000000..ae0f5750 --- /dev/null +++ b/finance/lending/quasar/src/instructions/supply.rs @@ -0,0 +1,177 @@ +use { + crate::{ + error::LendingError, + logic::{accrue, now, snapshot_reserve}, + math::{mul_div_floor, total_liquidity}, + state::Reserve, + }, + quasar_lang::prelude::*, + quasar_spl::prelude::*, +}; + +/// Reserve PDA signer seeds, used to authorize mint/transfer from the vault. +macro_rules! reserve_seeds { + ($lending_market:expr, $liquidity_mint:expr, $bump:expr) => { + [ + Seed::from(crate::constants::RESERVE_SEED), + Seed::from($lending_market.as_ref()), + Seed::from($liquidity_mint.as_ref()), + Seed::from($bump.as_ref()), + ] + }; +} +pub(crate) use reserve_seeds; + +// --------------------------------------------------------------------------- +// deposit_reserve_liquidity +// --------------------------------------------------------------------------- + +#[derive(Accounts)] +pub struct DepositReserveLiquidity { + #[account(mut)] + pub supplier: Signer, + #[account(mut, has_one(liquidity_mint), has_one(liquidity_vault), has_one(share_mint))] + pub reserve: Account, + pub liquidity_mint: Account, + #[account(mut)] + pub liquidity_vault: Account, + #[account(mut)] + pub share_mint: Account, + #[account(mut)] + pub supplier_liquidity: Account, + #[account(mut)] + pub supplier_share: Account, + pub token_program: Program, +} + +impl DepositReserveLiquidity { + #[inline(always)] + pub fn run(&mut self, amount: u64) -> Result<(), ProgramError> { + require!(amount > 0, LendingError::ZeroAmount); + let slot = now()?; + + let mut reserve = snapshot_reserve(&self.reserve); + accrue(&mut reserve, slot)?; + + let total = total_liquidity( + reserve.available_liquidity, + reserve.borrowed_amount_scaled, + reserve.cumulative_borrow_rate_index, + )?; + let shares = if reserve.share_mint_supply == 0 { + amount as u128 + } else { + mul_div_floor(amount as u128, reserve.share_mint_supply as u128, total)? + }; + require!(shares > 0, LendingError::DepositTooSmall); + let shares = u64::try_from(shares).map_err(|_| LendingError::MathOverflow)?; + + reserve.available_liquidity = reserve + .available_liquidity + .checked_add(amount) + .ok_or(LendingError::MathOverflow)?; + reserve.share_mint_supply = reserve + .share_mint_supply + .checked_add(shares) + .ok_or(LendingError::MathOverflow)?; + + let decimals = reserve.liquidity_decimals; + let bump = [reserve.bump]; + let lending_market = reserve.lending_market; + let liquidity_mint = reserve.liquidity_mint; + self.reserve.set_inner(reserve); + + self.token_program + .transfer_checked( + &self.supplier_liquidity, + &self.liquidity_mint, + &self.liquidity_vault, + &self.supplier, + amount, + decimals, + ) + .invoke()?; + + let seeds = reserve_seeds!(lending_market, liquidity_mint, bump); + self.token_program + .mint_to(&self.share_mint, &self.supplier_share, &self.reserve, shares) + .invoke_signed(&seeds) + } +} + +// --------------------------------------------------------------------------- +// redeem_reserve_collateral +// --------------------------------------------------------------------------- + +#[derive(Accounts)] +pub struct RedeemReserveCollateral { + #[account(mut)] + pub supplier: Signer, + #[account(mut, has_one(liquidity_mint), has_one(liquidity_vault), has_one(share_mint))] + pub reserve: Account, + pub liquidity_mint: Account, + #[account(mut)] + pub liquidity_vault: Account, + #[account(mut)] + pub share_mint: Account, + #[account(mut)] + pub supplier_liquidity: Account, + #[account(mut)] + pub supplier_share: Account, + pub token_program: Program, +} + +impl RedeemReserveCollateral { + #[inline(always)] + pub fn run(&mut self, shares: u64) -> Result<(), ProgramError> { + require!(shares > 0, LendingError::ZeroAmount); + let slot = now()?; + + let mut reserve = snapshot_reserve(&self.reserve); + accrue(&mut reserve, slot)?; + require!(reserve.share_mint_supply > 0, LendingError::InsufficientLiquidity); + + let total = total_liquidity( + reserve.available_liquidity, + reserve.borrowed_amount_scaled, + reserve.cumulative_borrow_rate_index, + )?; + let liquidity = mul_div_floor(shares as u128, total, reserve.share_mint_supply as u128)?; + let liquidity = u64::try_from(liquidity).map_err(|_| LendingError::MathOverflow)?; + require!( + liquidity <= reserve.available_liquidity, + LendingError::InsufficientLiquidity + ); + + reserve.available_liquidity = reserve + .available_liquidity + .checked_sub(liquidity) + .ok_or(LendingError::MathOverflow)?; + reserve.share_mint_supply = reserve + .share_mint_supply + .checked_sub(shares) + .ok_or(LendingError::MathOverflow)?; + + let decimals = reserve.liquidity_decimals; + let bump = [reserve.bump]; + let lending_market = reserve.lending_market; + let liquidity_mint = reserve.liquidity_mint; + self.reserve.set_inner(reserve); + + self.token_program + .burn(&self.supplier_share, &self.share_mint, &self.supplier, shares) + .invoke()?; + + let seeds = reserve_seeds!(lending_market, liquidity_mint, bump); + self.token_program + .transfer_checked( + &self.liquidity_vault, + &self.liquidity_mint, + &self.supplier_liquidity, + &self.reserve, + liquidity, + decimals, + ) + .invoke_signed(&seeds) + } +} diff --git a/finance/lending/quasar/src/lib.rs b/finance/lending/quasar/src/lib.rs new file mode 100644 index 00000000..56d85132 --- /dev/null +++ b/finance/lending/quasar/src/lib.rs @@ -0,0 +1,136 @@ +#![cfg_attr(not(test), no_std)] +// Quasar's `#[account]` / `#[derive(Accounts)]` macros drive account validation +// and CPIs from struct fields that handler code never reads directly, which +// rustc flags as dead code. The shipped Quasar examples allow it crate-wide. +#![allow(dead_code)] + +//! A Kamino/Solend-style borrow/lend program, ported to Quasar. +//! +//! Quasar accounts are fixed-size and zero-copy, so this port models an isolated +//! single-collateral, single-borrow position per obligation (mirroring how the +//! shipped Quasar `escrow`/`vault` examples use fixed-size accounts), and accrues +//! interest inline rather than via a separate `refresh` instruction. It keeps +//! every core lending technique: share-token deposits, a kinked-curve interest +//! index, oracle-priced health, and close-factor liquidation with a bonus. + +use quasar_lang::prelude::*; + +mod constants; +mod error; +mod instructions; +mod logic; +mod math; +mod state; + +#[cfg(test)] +mod tests; + +use instructions::*; + +declare_id!("RDZr26xXfPx8wqQfxcvJLWccp5ep7jQpnxcbCWPiPQq"); + +#[program] +mod quasar_lending { + use super::*; + + #[instruction(discriminator = 0)] + pub fn init_lending_market(ctx: Ctx) -> Result<(), ProgramError> { + ctx.accounts.run(&ctx.bumps) + } + + #[instruction(discriminator = 1)] + #[allow(clippy::too_many_arguments)] + pub fn init_reserve( + ctx: Ctx, + loan_to_value_bps: u16, + liquidation_threshold_bps: u16, + liquidation_bonus_bps: u16, + close_factor_bps: u16, + optimal_utilization_bps: u16, + min_borrow_rate_bps: u16, + optimal_borrow_rate_bps: u16, + max_borrow_rate_bps: u16, + ) -> Result<(), ProgramError> { + ctx.accounts.run( + loan_to_value_bps, + liquidation_threshold_bps, + liquidation_bonus_bps, + close_factor_bps, + optimal_utilization_bps, + min_borrow_rate_bps, + optimal_borrow_rate_bps, + max_borrow_rate_bps, + &ctx.bumps, + ) + } + + #[instruction(discriminator = 2)] + pub fn set_price( + ctx: Ctx, + price_mantissa: i128, + exponent: i32, + ) -> Result<(), ProgramError> { + ctx.accounts.run(price_mantissa, exponent, &ctx.bumps) + } + + #[instruction(discriminator = 3)] + pub fn deposit_reserve_liquidity( + ctx: Ctx, + amount: u64, + ) -> Result<(), ProgramError> { + ctx.accounts.run(amount) + } + + #[instruction(discriminator = 4)] + pub fn redeem_reserve_collateral( + ctx: Ctx, + shares: u64, + ) -> Result<(), ProgramError> { + ctx.accounts.run(shares) + } + + #[instruction(discriminator = 5)] + pub fn init_obligation(ctx: Ctx) -> Result<(), ProgramError> { + ctx.accounts.run(&ctx.bumps) + } + + #[instruction(discriminator = 6)] + pub fn deposit_obligation_collateral( + ctx: Ctx, + shares: u64, + ) -> Result<(), ProgramError> { + ctx.accounts.run(shares) + } + + #[instruction(discriminator = 7)] + pub fn withdraw_obligation_collateral( + ctx: Ctx, + shares: u64, + ) -> Result<(), ProgramError> { + ctx.accounts.run(shares) + } + + #[instruction(discriminator = 8)] + pub fn borrow_obligation_liquidity( + ctx: Ctx, + amount: u64, + ) -> Result<(), ProgramError> { + ctx.accounts.run(amount) + } + + #[instruction(discriminator = 9)] + pub fn repay_obligation_liquidity( + ctx: Ctx, + amount: u64, + ) -> Result<(), ProgramError> { + ctx.accounts.run(amount) + } + + #[instruction(discriminator = 10)] + pub fn liquidate_obligation( + ctx: Ctx, + amount: u64, + ) -> Result<(), ProgramError> { + ctx.accounts.run(amount) + } +} diff --git a/finance/lending/quasar/src/logic.rs b/finance/lending/quasar/src/logic.rs new file mode 100644 index 00000000..c717b1f1 --- /dev/null +++ b/finance/lending/quasar/src/logic.rs @@ -0,0 +1,90 @@ +//! Helpers that bridge Quasar's zero-copy accounts and the integer math in +//! [`crate::math`]. Account scalar getters return Pod types, so these read each +//! field into a native-typed `*Inner` snapshot that math operates on and +//! `set_inner` writes back. + +use quasar_lang::{prelude::*, sysvars::Sysvar}; + +use crate::{ + constants::{FIXED_POINT_SCALE, MAX_PRICE_STALENESS_SLOTS}, + error::LendingError, + math::{accrue_index, price_mantissa_to_scaled}, + state::{Obligation, ObligationInner, PriceFeed, Reserve, ReserveInner}, +}; + +/// Current slot as a native `u64`. +pub fn now() -> Result { + Ok(u64::from(Clock::get()?.slot)) +} + +/// Read a reserve into a native-typed, mutable snapshot. +pub fn snapshot_reserve(reserve: &Account) -> ReserveInner { + ReserveInner { + lending_market: reserve.lending_market, + liquidity_mint: reserve.liquidity_mint, + liquidity_vault: reserve.liquidity_vault, + share_mint: reserve.share_mint, + price_feed: reserve.price_feed, + available_liquidity: u64::from(reserve.available_liquidity), + share_mint_supply: u64::from(reserve.share_mint_supply), + borrowed_amount_scaled: u128::from(reserve.borrowed_amount_scaled), + cumulative_borrow_rate_index: u128::from(reserve.cumulative_borrow_rate_index), + last_update_slot: u64::from(reserve.last_update_slot), + liquidity_decimals: reserve.liquidity_decimals, + loan_to_value_bps: u16::from(reserve.loan_to_value_bps), + liquidation_threshold_bps: u16::from(reserve.liquidation_threshold_bps), + liquidation_bonus_bps: u16::from(reserve.liquidation_bonus_bps), + close_factor_bps: u16::from(reserve.close_factor_bps), + optimal_utilization_bps: u16::from(reserve.optimal_utilization_bps), + min_borrow_rate_bps: u16::from(reserve.min_borrow_rate_bps), + optimal_borrow_rate_bps: u16::from(reserve.optimal_borrow_rate_bps), + max_borrow_rate_bps: u16::from(reserve.max_borrow_rate_bps), + bump: reserve.bump, + } +} + +/// Read an obligation into a native-typed, mutable snapshot. +pub fn snapshot_obligation(obligation: &Account) -> ObligationInner { + ObligationInner { + lending_market: obligation.lending_market, + owner: obligation.owner, + collateral_reserve: obligation.collateral_reserve, + deposited_shares: u64::from(obligation.deposited_shares), + borrow_reserve: obligation.borrow_reserve, + borrowed_scaled: u128::from(obligation.borrowed_scaled), + bump: obligation.bump, + } +} + +/// Advance a reserve snapshot's interest index to `slot` (Solend-style: a single +/// `index *= 1 + rate_per_slot * elapsed` per call, compounding across calls). +pub fn accrue(reserve: &mut ReserveInner, slot: u64) -> Result<(), ProgramError> { + reserve.cumulative_borrow_rate_index = accrue_index( + reserve.cumulative_borrow_rate_index, + reserve.borrowed_amount_scaled, + reserve.available_liquidity, + reserve.last_update_slot, + slot, + reserve.optimal_utilization_bps, + reserve.min_borrow_rate_bps, + reserve.optimal_borrow_rate_bps, + reserve.max_borrow_rate_bps, + )?; + reserve.last_update_slot = slot; + Ok(()) +} + +/// The feed's price scaled by `FIXED_POINT_SCALE`, after staleness + positivity checks. +pub fn price_scaled(feed: &Account, slot: u64) -> Result { + let last_updated = u64::from(feed.last_updated_slot); + let age = slot + .checked_sub(last_updated) + .ok_or(LendingError::MathOverflow)?; + require!(age <= MAX_PRICE_STALENESS_SLOTS, LendingError::StalePrice); + let mantissa = i128::from(feed.price_mantissa); + require!(mantissa > 0, LendingError::InvalidOraclePrice); + price_mantissa_to_scaled(mantissa as u128, i32::from(feed.exponent)) +} + +/// `FIXED_POINT_SCALE` re-export for handlers that scale borrow principal. +pub const SCALE: u128 = FIXED_POINT_SCALE; diff --git a/finance/lending/quasar/src/math.rs b/finance/lending/quasar/src/math.rs new file mode 100644 index 00000000..b25b4ced --- /dev/null +++ b/finance/lending/quasar/src/math.rs @@ -0,0 +1,223 @@ +//! Integer-only money math (no floats, no fixed-point crates), shared by the +//! handlers. Ratios are scaled by `FIXED_POINT_SCALE`; conversions round in the +//! protocol's favour. + +use quasar_lang::prelude::*; + +use crate::{ + constants::{BPS_DENOMINATOR, FIXED_POINT_SCALE, FIXED_POINT_SCALE_DECIMALS, SLOTS_PER_YEAR}, + error::LendingError, +}; + +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum Rounding { + Down, + Up, +} + +pub fn ten_pow(exponent: u32) -> Result { + 10u128.checked_pow(exponent).ok_or(LendingError::MathOverflow.into()) +} + +pub fn mul_div_floor(a: u128, b: u128, denominator: u128) -> Result { + require!(denominator > 0, LendingError::MathOverflow); + let product = a.checked_mul(b).ok_or(LendingError::MathOverflow)?; + Ok(product.checked_div(denominator).ok_or(LendingError::MathOverflow)?) +} + +pub fn mul_div_ceil(a: u128, b: u128, denominator: u128) -> Result { + require!(denominator > 0, LendingError::MathOverflow); + let product = a.checked_mul(b).ok_or(LendingError::MathOverflow)?; + let rounding = denominator.checked_sub(1).ok_or(LendingError::MathOverflow)?; + Ok(product + .checked_add(rounding) + .ok_or(LendingError::MathOverflow)? + .checked_div(denominator) + .ok_or(LendingError::MathOverflow)?) +} + +fn mul_div(a: u128, b: u128, denominator: u128, rounding: Rounding) -> Result { + match rounding { + Rounding::Down => mul_div_floor(a, b, denominator), + Rounding::Up => mul_div_ceil(a, b, denominator), + } +} + +/// `price_scaled = real_price * FIXED_POINT_SCALE`, where +/// `real_price = mantissa * 10^exponent`. The exponent and the fixed-point scale +/// are folded into one power of ten to stay overflow-safe for high prices. +pub fn price_mantissa_to_scaled(mantissa: u128, exponent: i32) -> Result { + let net = exponent + .checked_add(FIXED_POINT_SCALE_DECIMALS) + .ok_or(LendingError::MathOverflow)?; + if net >= 0 { + Ok(mantissa + .checked_mul(ten_pow(net as u32)?) + .ok_or(LendingError::MathOverflow)?) + } else { + Ok(mantissa + .checked_div(ten_pow((-net) as u32)?) + .ok_or(LendingError::MathOverflow)?) + } +} + +/// Quote-currency value (FIXED_POINT_SCALE-scaled) of `amount` base units of a +/// token with `decimals`, given `price_scaled`. +pub fn market_value( + amount: u64, + decimals: u8, + price_scaled: u128, + rounding: Rounding, +) -> Result { + mul_div(amount as u128, price_scaled, ten_pow(decimals as u32)?, rounding) +} + +/// Inverse of [`market_value`]: base units of a token worth `value_scaled`. +pub fn value_to_amount( + value_scaled: u128, + decimals: u8, + price_scaled: u128, + rounding: Rounding, +) -> Result { + let amount = mul_div(value_scaled, ten_pow(decimals as u32)?, price_scaled, rounding)?; + u64::try_from(amount).map_err(|_| LendingError::MathOverflow.into()) +} + +// --- reserve interest / share helpers (free functions over reserve fields) --- + +/// Live total debt owed to the pool, rounded up (protocol-favourable). +pub fn current_debt(borrowed_scaled: u128, index: u128) -> Result { + let debt = mul_div_ceil(borrowed_scaled, index, FIXED_POINT_SCALE)?; + u64::try_from(debt).map_err(|_| LendingError::MathOverflow.into()) +} + +/// Available liquidity plus live debt โ€” what the share token is a claim on. +pub fn total_liquidity( + available: u64, + borrowed_scaled: u128, + index: u128, +) -> Result { + (available as u128) + .checked_add(current_debt(borrowed_scaled, index)? as u128) + .ok_or(LendingError::MathOverflow.into()) +} + +/// Borrowed fraction of the pool in basis points (0..=10_000). +pub fn utilization_bps( + available: u64, + borrowed_scaled: u128, + index: u128, +) -> Result { + let total = total_liquidity(available, borrowed_scaled, index)?; + if total == 0 { + return Ok(0); + } + mul_div_floor(current_debt(borrowed_scaled, index)? as u128, BPS_DENOMINATOR, total) +} + +/// Per-slot borrow rate (FIXED_POINT_SCALE-scaled) from the kinked curve. +#[allow(clippy::too_many_arguments)] +pub fn borrow_rate_per_slot( + utilization: u128, + optimal_utilization_bps: u16, + min_rate_bps: u16, + optimal_rate_bps: u16, + max_rate_bps: u16, +) -> Result { + let optimal_utilization = optimal_utilization_bps as u128; + let apr_bps = if utilization <= optimal_utilization { + let range = (optimal_rate_bps as u128) + .checked_sub(min_rate_bps as u128) + .ok_or(LendingError::MathOverflow)?; + (min_rate_bps as u128) + .checked_add(mul_div_floor(range, utilization, optimal_utilization.max(1))?) + .ok_or(LendingError::MathOverflow)? + } else { + let range = (max_rate_bps as u128) + .checked_sub(optimal_rate_bps as u128) + .ok_or(LendingError::MathOverflow)?; + let above = utilization + .checked_sub(optimal_utilization) + .ok_or(LendingError::MathOverflow)?; + let span = BPS_DENOMINATOR + .checked_sub(optimal_utilization) + .ok_or(LendingError::MathOverflow)?; + (optimal_rate_bps as u128) + .checked_add(mul_div_floor(range, above, span.max(1))?) + .ok_or(LendingError::MathOverflow)? + }; + let denominator = BPS_DENOMINATOR + .checked_mul(SLOTS_PER_YEAR) + .ok_or(LendingError::MathOverflow)?; + mul_div_floor(apr_bps, FIXED_POINT_SCALE, denominator) +} + +/// Advance the interest index for elapsed slots: +/// `new_index = index * (1 + rate_per_slot * elapsed)`. +#[allow(clippy::too_many_arguments)] +pub fn accrue_index( + index: u128, + borrowed_scaled: u128, + available: u64, + last_update_slot: u64, + now: u64, + optimal_utilization_bps: u16, + min_rate_bps: u16, + optimal_rate_bps: u16, + max_rate_bps: u16, +) -> Result { + let elapsed = now + .checked_sub(last_update_slot) + .ok_or(LendingError::MathOverflow)?; + if elapsed == 0 || borrowed_scaled == 0 { + return Ok(index); + } + let utilization = utilization_bps(available, borrowed_scaled, index)?; + let rate = borrow_rate_per_slot( + utilization, + optimal_utilization_bps, + min_rate_bps, + optimal_rate_bps, + max_rate_bps, + )?; + let growth = FIXED_POINT_SCALE + .checked_add(rate.checked_mul(elapsed as u128).ok_or(LendingError::MathOverflow)?) + .ok_or(LendingError::MathOverflow)?; + mul_div_floor(index, growth, FIXED_POINT_SCALE) +} + +pub fn validate_config( + loan_to_value_bps: u16, + liquidation_threshold_bps: u16, + liquidation_bonus_bps: u16, + close_factor_bps: u16, + optimal_utilization_bps: u16, + min_borrow_rate_bps: u16, + optimal_borrow_rate_bps: u16, + max_borrow_rate_bps: u16, +) -> Result<(), ProgramError> { + let within = |value: u16| (value as u128) <= BPS_DENOMINATOR; + require!( + within(loan_to_value_bps) + && within(liquidation_threshold_bps) + && within(liquidation_bonus_bps) + && within(close_factor_bps) + && within(optimal_utilization_bps), + LendingError::InvalidConfig + ); + require!(close_factor_bps > 0, LendingError::InvalidConfig); + require!( + optimal_utilization_bps > 0 && (optimal_utilization_bps as u128) < BPS_DENOMINATOR, + LendingError::InvalidConfig + ); + require!( + loan_to_value_bps <= liquidation_threshold_bps, + LendingError::InvalidConfig + ); + require!( + min_borrow_rate_bps <= optimal_borrow_rate_bps + && optimal_borrow_rate_bps <= max_borrow_rate_bps, + LendingError::InvalidConfig + ); + Ok(()) +} diff --git a/finance/lending/quasar/src/state.rs b/finance/lending/quasar/src/state.rs new file mode 100644 index 00000000..69188285 --- /dev/null +++ b/finance/lending/quasar/src/state.rs @@ -0,0 +1,85 @@ +//! Program accounts. Quasar accounts are zero-copy; fixed-size fields only +//! (no `Vec`), which is why this Quasar port models an isolated single-collateral, +//! single-borrow position per obligation rather than the Anchor version's +//! multi-asset obligation. + +use quasar_lang::prelude::*; + +/// Top-level market config. PDA: `["lending_market", owner]`. +#[account(discriminator = 1, set_inner)] +#[seeds(b"lending_market", owner: Address)] +pub struct LendingMarket { + pub owner: Address, + pub quote_mint: Address, + pub bump: u8, +} + +/// One asset's pool. PDA: `["reserve", lending_market, liquidity_mint]`. +/// The reserve PDA is the authority of both `liquidity_vault` and `share_mint`. +#[account(discriminator = 2, set_inner)] +#[seeds(b"reserve", lending_market: Address, liquidity_mint: Address)] +pub struct Reserve { + pub lending_market: Address, + pub liquidity_mint: Address, + pub liquidity_vault: Address, + pub share_mint: Address, + pub price_feed: Address, + pub available_liquidity: u64, + pub share_mint_supply: u64, + pub borrowed_amount_scaled: u128, + pub cumulative_borrow_rate_index: u128, + pub last_update_slot: u64, + pub liquidity_decimals: u8, + pub loan_to_value_bps: u16, + pub liquidation_threshold_bps: u16, + pub liquidation_bonus_bps: u16, + pub close_factor_bps: u16, + pub optimal_utilization_bps: u16, + pub min_borrow_rate_bps: u16, + pub optimal_borrow_rate_bps: u16, + pub max_borrow_rate_bps: u16, + pub bump: u8, +} + +/// A borrower's isolated position. PDA: `["obligation", lending_market, owner]`. +/// `collateral_reserve` / `borrow_reserve` are the zero address until first used. +#[account(discriminator = 3, set_inner)] +#[seeds(b"obligation", lending_market: Address, owner: Address)] +pub struct Obligation { + pub lending_market: Address, + pub owner: Address, + pub collateral_reserve: Address, + pub deposited_shares: u64, + pub borrow_reserve: Address, + pub borrowed_scaled: u128, + pub bump: u8, +} + +/// Switchboard-On-Demand-shaped price feed. PDA: `["price_feed", mint]`. +/// `price = price_mantissa * 10^exponent`; freshness is checked in slots. +/// In production this account would be the real Switchboard feed. +#[account(discriminator = 4, set_inner)] +#[seeds(b"price_feed", mint: Address)] +pub struct PriceFeed { + pub mint: Address, + pub price_mantissa: i128, + pub exponent: i32, + pub last_updated_slot: u64, + pub authority: Address, + pub bump: u8, +} + +/// PDA marker for a reserve's liquidity vault: `["liquidity_vault", reserve]`. +#[derive(Seeds)] +#[seeds(b"liquidity_vault", reserve: Address)] +pub struct LiquidityVaultPda; + +/// PDA marker for a reserve's share mint: `["share_mint", reserve]`. +#[derive(Seeds)] +#[seeds(b"share_mint", reserve: Address)] +pub struct ShareMintPda; + +/// PDA marker for an obligation's collateral vault: `["obligation_vault", reserve, obligation]`. +#[derive(Seeds)] +#[seeds(b"obligation_vault", reserve: Address, obligation: Address)] +pub struct ObligationVaultPda; diff --git a/finance/lending/quasar/src/tests.rs b/finance/lending/quasar/src/tests.rs new file mode 100644 index 00000000..42eb7691 --- /dev/null +++ b/finance/lending/quasar/src/tests.rs @@ -0,0 +1,487 @@ +extern crate std; + +use { + alloc::{vec, vec::Vec}, + quasar_svm::{Account, Instruction, Pubkey, QuasarSvm}, + solana_instruction::AccountMeta, + spl_token_interface::state::{Account as SplToken, AccountState, Mint as SplMint}, + std::fs, +}; + +// Prices are passed as `mantissa * 10^-18` (Switchboard-shaped). +const EXP: i32 = -18; +fn dollars(whole: u64) -> i128 { + (whole as i128) * 1_000_000_000_000_000_000 +} +fn cents(amount: u64) -> i128 { + (amount as i128) * 10_000_000_000_000_000 +} + +const DECIMALS: u8 = 6; +const UNIT: u64 = 1_000_000; // 1 token at 6 decimals + +// Deterministic addresses. +const OWNER: Pubkey = Pubkey::new_from_array([1; 32]); +const SUPPLIER: Pubkey = Pubkey::new_from_array([2; 32]); +const BORROWER: Pubkey = Pubkey::new_from_array([3; 32]); +const LIQUIDATOR: Pubkey = Pubkey::new_from_array([4; 32]); +const COLL_MINT: Pubkey = Pubkey::new_from_array([5; 32]); +const BORROW_MINT: Pubkey = Pubkey::new_from_array([6; 32]); +const QUOTE_MINT: Pubkey = Pubkey::new_from_array([7; 32]); +// Token accounts. +const SUPPLIER_BORROW: Pubkey = Pubkey::new_from_array([10; 32]); +const SUPPLIER_BORROW_SHARE: Pubkey = Pubkey::new_from_array([11; 32]); +const BORROWER_COLL: Pubkey = Pubkey::new_from_array([12; 32]); +const BORROWER_COLL_SHARE: Pubkey = Pubkey::new_from_array([13; 32]); +const BORROWER_BORROW: Pubkey = Pubkey::new_from_array([14; 32]); +const LIQUIDATOR_BORROW: Pubkey = Pubkey::new_from_array([15; 32]); +const LIQUIDATOR_COLL_SHARE: Pubkey = Pubkey::new_from_array([16; 32]); + +fn token_program() -> Pubkey { + quasar_svm::SPL_TOKEN_PROGRAM_ID +} +fn system_program() -> Pubkey { + quasar_svm::system_program::ID +} + +fn pda(seeds: &[&[u8]]) -> (Pubkey, u8) { + Pubkey::find_program_address(seeds, &crate::ID) +} + +fn meta(address: Pubkey, writable: bool, signer: bool) -> AccountMeta { + if writable { + let mut m = AccountMeta::new(address.into(), signer); + m.is_signer = signer; + m + } else { + AccountMeta::new_readonly(address.into(), signer) + } +} + +fn system(address: Pubkey) -> Account { + quasar_svm::token::create_keyed_system_account(&address, 10_000_000_000) +} +fn empty(address: Pubkey) -> Account { + Account { + address, + lamports: 0, + data: vec![], + owner: system_program(), + executable: false, + } +} +fn mint(address: Pubkey, authority: Pubkey) -> Account { + quasar_svm::token::create_keyed_mint_account( + &address, + &SplMint { + mint_authority: Some(authority).into(), + supply: 1_000_000_000_000, + decimals: DECIMALS, + is_initialized: true, + freeze_authority: None.into(), + }, + ) +} +fn token(address: Pubkey, the_mint: Pubkey, owner: Pubkey, amount: u64) -> Account { + quasar_svm::token::create_keyed_token_account( + &address, + &SplToken { + mint: the_mint, + owner, + amount, + state: AccountState::Initialized, + ..SplToken::default() + }, + ) +} + +/// Read an SPL token account's amount from committed bytes (offset 64..72). +fn balance(result: &quasar_svm::ExecutionResult, address: Pubkey) -> u64 { + let account = result.account(&address).expect("account present"); + u64::from_le_bytes(account.data[64..72].try_into().unwrap()) +} + +struct World { + svm: QuasarSvm, + market: Pubkey, + coll_reserve: Pubkey, + coll_vault: Pubkey, + coll_share_mint: Pubkey, + coll_price: Pubkey, + borrow_reserve: Pubkey, + borrow_vault: Pubkey, + borrow_share_mint: Pubkey, + borrow_price: Pubkey, + obligation: Pubkey, + obligation_vault: Pubkey, +} + +impl World { + fn new() -> Self { + let elf = fs::read("target/deploy/quasar_lending.so").unwrap(); + let mut svm = QuasarSvm::new() + .with_program(&crate::ID, &elf) + .with_token_program(); + + let (market, _) = pda(&[b"lending_market", OWNER.as_ref()]); + let (coll_reserve, _) = pda(&[b"reserve", market.as_ref(), COLL_MINT.as_ref()]); + let (borrow_reserve, _) = pda(&[b"reserve", market.as_ref(), BORROW_MINT.as_ref()]); + let (coll_vault, _) = pda(&[b"liquidity_vault", coll_reserve.as_ref()]); + let (borrow_vault, _) = pda(&[b"liquidity_vault", borrow_reserve.as_ref()]); + let (coll_share_mint, _) = pda(&[b"share_mint", coll_reserve.as_ref()]); + let (borrow_share_mint, _) = pda(&[b"share_mint", borrow_reserve.as_ref()]); + let (coll_price, _) = pda(&[b"price_feed", COLL_MINT.as_ref()]); + let (borrow_price, _) = pda(&[b"price_feed", BORROW_MINT.as_ref()]); + let (obligation, _) = pda(&[b"obligation", market.as_ref(), BORROWER.as_ref()]); + let (obligation_vault, _) = + pda(&[b"obligation_vault", coll_reserve.as_ref(), obligation.as_ref()]); + + for account in [ + system(OWNER), + system(SUPPLIER), + system(BORROWER), + system(LIQUIDATOR), + mint(COLL_MINT, OWNER), + mint(BORROW_MINT, OWNER), + mint(QUOTE_MINT, OWNER), + // PDAs created by the program. + empty(market), + empty(coll_reserve), + empty(borrow_reserve), + empty(coll_vault), + empty(borrow_vault), + empty(coll_share_mint), + empty(borrow_share_mint), + empty(coll_price), + empty(borrow_price), + empty(obligation), + empty(obligation_vault), + // Funded user token accounts. + token(SUPPLIER_BORROW, BORROW_MINT, SUPPLIER, 1_000 * UNIT), + token(SUPPLIER_BORROW_SHARE, borrow_share_mint, SUPPLIER, 0), + token(BORROWER_COLL, COLL_MINT, BORROWER, 1_000 * UNIT), + token(BORROWER_COLL_SHARE, coll_share_mint, BORROWER, 0), + token(BORROWER_BORROW, BORROW_MINT, BORROWER, 0), + token(LIQUIDATOR_BORROW, BORROW_MINT, LIQUIDATOR, 1_000 * UNIT), + token(LIQUIDATOR_COLL_SHARE, coll_share_mint, LIQUIDATOR, 0), + ] { + svm.set_account(account); + } + + World { + svm, + market, + coll_reserve, + coll_vault, + coll_share_mint, + coll_price, + borrow_reserve, + borrow_vault, + borrow_share_mint, + borrow_price, + obligation, + obligation_vault, + } + } + + fn run(&mut self, data: Vec, metas: Vec) -> quasar_svm::ExecutionResult { + let instruction = Instruction { + program_id: crate::ID, + accounts: metas, + data, + }; + self.svm.process_instruction(&instruction, &[]) + } + + fn init_market(&mut self) { + let metas = vec![ + meta(OWNER, true, true), + meta(self.market, true, false), + meta(QUOTE_MINT, false, false), + meta(system_program(), false, false), + ]; + self.run(vec![0], metas).assert_success(); + } + + fn set_price(&mut self, the_mint: Pubkey, price_feed: Pubkey, mantissa: i128) { + let mut data = vec![2u8]; + data.extend_from_slice(&mantissa.to_le_bytes()); + data.extend_from_slice(&EXP.to_le_bytes()); + let metas = vec![ + meta(OWNER, true, true), + meta(price_feed, true, false), + meta(the_mint, false, false), + meta(system_program(), false, false), + ]; + self.run(data, metas).assert_success(); + } + + #[allow(clippy::too_many_arguments)] + fn init_reserve(&mut self, the_mint: Pubkey, reserve: Pubkey, vault: Pubkey, share: Pubkey, price: Pubkey) { + // 75% LTV, 80% liq threshold, 5% bonus, 50% close factor, kink 80%, + // 2% / 20% / 150% APR curve. + let config: [u16; 8] = [7_500, 8_000, 500, 5_000, 8_000, 200, 2_000, 15_000]; + let mut data = vec![1u8]; + for value in config { + data.extend_from_slice(&value.to_le_bytes()); + } + let metas = vec![ + meta(OWNER, true, true), + meta(self.market, false, false), + meta(reserve, true, false), + meta(the_mint, false, false), + meta(vault, true, false), + meta(share, true, false), + meta(price, false, false), + meta(token_program(), false, false), + meta(system_program(), false, false), + ]; + self.run(data, metas).assert_success(); + } + + fn setup_markets(&mut self) { + self.init_market(); + self.set_price(COLL_MINT, self.coll_price, dollars(1)); + self.set_price(BORROW_MINT, self.borrow_price, dollars(1)); + self.init_reserve(COLL_MINT, self.coll_reserve, self.coll_vault, self.coll_share_mint, self.coll_price); + self.init_reserve(BORROW_MINT, self.borrow_reserve, self.borrow_vault, self.borrow_share_mint, self.borrow_price); + } + + #[allow(clippy::too_many_arguments)] + fn deposit( + &mut self, + supplier: Pubkey, + reserve: Pubkey, + the_mint: Pubkey, + vault: Pubkey, + share: Pubkey, + supplier_liq: Pubkey, + supplier_share: Pubkey, + amount: u64, + ) -> quasar_svm::ExecutionResult { + let mut data = vec![3u8]; + data.extend_from_slice(&amount.to_le_bytes()); + let metas = vec![ + meta(supplier, true, true), + meta(reserve, true, false), + meta(the_mint, false, false), + meta(vault, true, false), + meta(share, true, false), + meta(supplier_liq, true, false), + meta(supplier_share, true, false), + meta(token_program(), false, false), + ]; + self.run(data, metas) + } + + fn redeem( + &mut self, + supplier_liq: Pubkey, + supplier_share: Pubkey, + shares: u64, + ) -> quasar_svm::ExecutionResult { + let mut data = vec![4u8]; + data.extend_from_slice(&shares.to_le_bytes()); + let metas = vec![ + meta(SUPPLIER, true, true), + meta(self.borrow_reserve, true, false), + meta(BORROW_MINT, false, false), + meta(self.borrow_vault, true, false), + meta(self.borrow_share_mint, true, false), + meta(supplier_liq, true, false), + meta(supplier_share, true, false), + meta(token_program(), false, false), + ]; + self.run(data, metas) + } + + fn init_obligation(&mut self) { + let metas = vec![ + meta(BORROWER, true, true), + meta(self.market, false, false), + meta(self.obligation, true, false), + meta(system_program(), false, false), + ]; + self.run(vec![5], metas).assert_success(); + } + + fn post_collateral(&mut self, shares: u64) -> quasar_svm::ExecutionResult { + let mut data = vec![6u8]; + data.extend_from_slice(&shares.to_le_bytes()); + let metas = vec![ + meta(BORROWER, true, true), + meta(self.market, false, false), + meta(self.obligation, true, false), + meta(self.coll_reserve, false, false), + meta(self.coll_share_mint, false, false), + meta(self.obligation_vault, true, false), + meta(BORROWER_COLL_SHARE, true, false), + meta(quasar_svm::solana_sdk_ids::sysvar::rent::ID, false, false), + meta(token_program(), false, false), + meta(system_program(), false, false), + ]; + self.run(data, metas) + } + + fn borrow(&mut self, amount: u64) -> quasar_svm::ExecutionResult { + let mut data = vec![8u8]; + data.extend_from_slice(&amount.to_le_bytes()); + let metas = vec![ + meta(BORROWER, true, true), + meta(self.market, false, false), + meta(self.obligation, true, false), + meta(self.coll_reserve, true, false), + meta(self.coll_price, false, false), + meta(self.borrow_reserve, true, false), + meta(self.borrow_price, false, false), + meta(BORROW_MINT, false, false), + meta(self.borrow_vault, true, false), + meta(BORROWER_BORROW, true, false), + meta(token_program(), false, false), + ]; + self.run(data, metas) + } + + fn repay(&mut self, amount: u64) -> quasar_svm::ExecutionResult { + let mut data = vec![9u8]; + data.extend_from_slice(&amount.to_le_bytes()); + let metas = vec![ + meta(BORROWER, true, true), + meta(self.obligation, true, false), + meta(self.borrow_reserve, true, false), + meta(BORROW_MINT, false, false), + meta(self.borrow_vault, true, false), + meta(BORROWER_BORROW, true, false), + meta(token_program(), false, false), + ]; + self.run(data, metas) + } + + fn liquidate(&mut self, amount: u64) -> quasar_svm::ExecutionResult { + let mut data = vec![10u8]; + data.extend_from_slice(&amount.to_le_bytes()); + let metas = vec![ + meta(LIQUIDATOR, true, true), + meta(self.obligation, true, false), + meta(self.market, false, false), + meta(self.coll_reserve, true, false), + meta(self.coll_price, false, false), + meta(self.coll_share_mint, false, false), + meta(self.obligation_vault, true, false), + meta(LIQUIDATOR_COLL_SHARE, true, false), + meta(self.borrow_reserve, true, false), + meta(self.borrow_price, false, false), + meta(BORROW_MINT, false, false), + meta(self.borrow_vault, true, false), + meta(LIQUIDATOR_BORROW, true, false), + meta(token_program(), false, false), + ]; + self.run(data, metas) + } + + /// Supplier funds the borrow reserve; borrower posts 1000 units of collateral. + fn bootstrap_position(&mut self) { + self.setup_markets(); + self.deposit( + SUPPLIER, self.borrow_reserve, BORROW_MINT, self.borrow_vault, + self.borrow_share_mint, SUPPLIER_BORROW, SUPPLIER_BORROW_SHARE, 1_000 * UNIT, + ) + .assert_success(); + self.deposit( + BORROWER, self.coll_reserve, COLL_MINT, self.coll_vault, + self.coll_share_mint, BORROWER_COLL, BORROWER_COLL_SHARE, 1_000 * UNIT, + ) + .assert_success(); + self.init_obligation(); + self.post_collateral(1_000 * UNIT).assert_success(); + } +} + +#[test] +fn supply_mints_shares_one_to_one_and_redeem_returns_liquidity() { + let mut world = World::new(); + world.setup_markets(); + + let result = world.deposit( + SUPPLIER, world.borrow_reserve, BORROW_MINT, world.borrow_vault, + world.borrow_share_mint, SUPPLIER_BORROW, SUPPLIER_BORROW_SHARE, 1_000 * UNIT, + ); + result.assert_success(); + assert_eq!(balance(&result, SUPPLIER_BORROW_SHARE), 1_000 * UNIT, "first deposit mints 1:1"); + assert_eq!(balance(&result, SUPPLIER_BORROW), 0); + + let result = world.redeem(SUPPLIER_BORROW, SUPPLIER_BORROW_SHARE, 1_000 * UNIT); + result.assert_success(); + assert_eq!(balance(&result, SUPPLIER_BORROW), 1_000 * UNIT, "redeem returns liquidity"); + assert_eq!(balance(&result, SUPPLIER_BORROW_SHARE), 0); +} + +#[test] +fn borrow_up_to_ltv_succeeds_and_beyond_fails() { + let mut world = World::new(); + world.bootstrap_position(); + + // $1000 collateral, 75% LTV => borrow up to 750 units of the $1 borrow token. + let result = world.borrow(750 * UNIT); + result.assert_success(); + assert_eq!(balance(&result, BORROWER_BORROW), 750 * UNIT); + + // One unit more exceeds the allowed borrow value. + assert!(world.borrow(UNIT).is_err(), "borrowing past LTV must fail"); +} + +#[test] +fn repay_reduces_debt() { + let mut world = World::new(); + world.bootstrap_position(); + world.borrow(500 * UNIT).assert_success(); + + let result = world.repay(200 * UNIT); + result.assert_success(); + // Borrower spent 200 of the 500 borrowed. + assert_eq!(balance(&result, BORROWER_BORROW), 300 * UNIT); +} + +#[test] +fn interest_accrues_and_lifts_share_value() { + let mut world = World::new(); + world.bootstrap_position(); + world.borrow(500 * UNIT).assert_success(); + + // ~0.1 year passes; re-publish prices so feeds stay fresh. + world.svm.sysvars.warp_to_slot(7_884_000); + world.set_price(COLL_MINT, world.coll_price, dollars(1)); + world.set_price(BORROW_MINT, world.borrow_price, dollars(1)); + + // Supplier redeems 100 shares; interest on the 500 borrowed means each share + // is now worth more than one liquidity unit. + let result = world.redeem(SUPPLIER_BORROW, SUPPLIER_BORROW_SHARE, 100 * UNIT); + result.assert_success(); + assert!( + balance(&result, SUPPLIER_BORROW) > 100 * UNIT, + "100 shares should redeem for more than 100 units after interest, got {}", + balance(&result, SUPPLIER_BORROW) + ); +} + +#[test] +fn unhealthy_position_is_liquidated_and_healthy_is_rejected() { + let mut world = World::new(); + world.bootstrap_position(); + world.borrow(700 * UNIT).assert_success(); + + // Healthy at $1 collateral ($1000 * 80% = $800 threshold > $700 debt). + assert!(world.liquidate(350 * UNIT).is_err(), "healthy obligation must not be liquidatable"); + + // Collateral price halves to $0.50: $500 collateral, $400 threshold < $700 debt. + world.set_price(COLL_MINT, world.coll_price, cents(50)); + + let result = world.liquidate(350 * UNIT); + result.assert_success(); + // Liquidator repaid 350 of the borrow token and seized collateral share tokens. + assert_eq!(balance(&result, LIQUIDATOR_BORROW), 650 * UNIT); + assert!( + balance(&result, LIQUIDATOR_COLL_SHARE) > 0, + "liquidator should receive seized collateral shares" + ); +} From 35911e7ca2e39a44b45191bb35a6a66b29093c95 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 3 Jun 2026 15:40:11 +0000 Subject: [PATCH 006/138] chore(ci): remove stale steel entries from .ghaignore All 14 steel project paths referenced directories that no longer exist (the steel framework was removed; there is no steel workflow). Removing the dead ignore entries. https://claude.ai/code/session_013dpnF6uSGWXjkJJZseqzcP --- .github/.ghaignore | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/.github/.ghaignore b/.github/.ghaignore index c95646ed..c5aa4fa8 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -47,27 +47,4 @@ tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor tokens/token-extensions/mint-close-authority/native tokens/token-extensions/transfer-fee/native -tokens/token-extensions/non-transferable/native - -# all steel projects - -basics/account-data/steel -basics/checking-accounts/steel -basics/close-account/steel -basics/counter/steel -basics/create-account/steel -basics/cross-program-invocation/steel -basics/favorites/steel -basics/pda-rent-payer/steel -basics/processing-instructions/steel -basics/program-derived-addresses/steel -basics/realloc/steel -basics/rent/steel -basics/transfer-sol/steel - -finance/escrow/steel - -tokens/pda-mint-authority/steel -tokens/token-minter/steel -finance/token-swap/steel -tokens/transfer-tokens/steel \ No newline at end of file +tokens/token-extensions/non-transferable/native \ No newline at end of file From fdeaccc975bed8f8a54fa08904501404df5d3862 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 3 Jun 2026 16:00:05 +0000 Subject: [PATCH 007/138] ci: re-enable escrow, token-swap, external-delegate anchor examples These three Anchor examples were already migrated to Anchor 1.0.0 with complete Rust (litesvm/solana-kite) test suites, but were still listed in .ghaignore for reasons that no longer apply: - finance/escrow/anchor: old reason was a JS helpers bug (#40); the test is now pure Rust, so that bug is irrelevant. Verified: anchor test green (4/4 + lib test). - finance/token-swap/anchor: verified anchor build + 18/18 tests pass. - tokens/external-delegate-token-master/anchor: verified 3/3 tests pass. All three verified locally with Anchor 1.0.0, Solana CLI, and surfpool, matching the CI flow (anchor keys sync -> anchor build -> anchor test). Also clarifies basics/pyth/anchor's ignore reason: it fails because pyth-solana-receiver-sdk 1.1.0 pulls a borsh version incompatible with Anchor 1.0 / Solana 3.x (PriceUpdateV2 fails BorshDeserialize). Left ignored pending a compatible upstream SDK. https://claude.ai/code/session_013dpnF6uSGWXjkJJZseqzcP --- .github/.ghaignore | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/.github/.ghaignore b/.github/.ghaignore index c5aa4fa8..ab3226b8 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -12,9 +12,9 @@ tokens/transfer-tokens/native tokens/token-minter/native tokens/create-token/native -finance/token-swap/anchor - -# not building +# not building: pyth-solana-receiver-sdk 1.1.0 pulls a borsh version that +# conflicts with Anchor 1.0 / Solana 3.x (PriceUpdateV2 fails BorshDeserialize). +# Blocked on an upstream SDK release compatible with solana 3.x. basics/pyth/anchor # not building @@ -23,10 +23,6 @@ compression/cnft-vault/anchor # builds but need to test on localhost compression/cnft-burn/anchor -# test failing -# https://github.com/solana-developers/helpers/issues/40 -finance/escrow/anchor - # not live tokens/token-extensions/group/anchor tokens/token-extensions/group/quasar @@ -35,10 +31,6 @@ tokens/token-extensions/group/quasar basics/cross-program-invocation/quasar - -# error in tests -tokens/external-delegate-token-master/anchor - # build failed - program outdated tokens/token-extensions/metadata/anchor From 8ce1c14ce28b1f7e3ab1308ea04de0124c4a4d68 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Thu, 4 Jun 2026 15:15:47 -0400 Subject: [PATCH 008/138] Add CHANGELOG --- CHANGELOG.md | 25 +++++++++++++++++++++++++ README.md | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..b53215c6 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,25 @@ +# Changelog + +All notable changes to this repository are documented here. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). + +## [2026-04-08] โ€” Quicknode fork modernization (Mike MacCana) + +Mike MacCana led the Quicknode fork of the [Solana Foundation program examples](https://github.com/solana-developers/program-examples) from late 2025. The first commits on this repository lineage are dated **8 April 2026**; the summary below covers that work through the initial merge. + +### What changed (high level) + +**Toolchain and frameworks.** The tree had accumulated examples from several years of Solana development (including Anchor releases going back to the ~0.26 era in 2022 and many intermediate versions). The fork brought the Anchor examples up to **Anchor 1.0.0** stable (from 1.0.0-rc.5), refreshed Agave/Solana CLI pins, standardized on **pnpm**, and added parallel implementations in **[Quasar](https://quasar-lang.com/docs)**, **Pinocchio**, **Native Rust**, and **ASM** where applicable. Token-2022 examples were renamed to **`token-extensions`**. + +**Testing.** Replaced the old pattern of local validators, Bankrun, and scattered TypeScript `anchor test` flows with **LiteSVM in-process tests** for most Anchor programs โ€” matching current Anchor defaults (`cargo test` wired through `Anchor.toml` / `pnpm test`). Fixed broken or flaky tests across Native, Pinocchio, and Anchor; added missing harnesses (e.g. block-list Pinocchio). CI was reworked for a repo this size: path filtering, caching, matrix sharding, and reliable detection of framework roots. + +**Programs and layout.** Broke large monolithic `lib.rs` files into **instruction handler modules**; adopted **`InitSpace`** and explicit PDA bumps instead of magic account sizes; corrected several logic bugs (escrow, token swap invariant, counter authority checks, compression Bubblegum program id, and more). Expanded finance and token-extension coverage; reorganized transfer-hook examples (including block-list under Pinocchio). + +**Documentation.** Rewrote the root README (framework badges, clearer example blurbs, ASM links), ran a style and **truth audit** on READMEs, and linked canonical [Solana terminology](https://solana.com/docs/references/terminology) on first mention. Added this changelog, `CONTRIBUTING.md` (aligned with LiteSVM testing), a README template and per-example Anchor READMEs, fixed Husky for GUI git clients, and removed unused maintainer scripts (`sync-package-json`, `cicd.sh`, local-validator helpers for the allow/block-list UI). + +**Removed / deferred.** Dropped duplicate or WIP trees (duplicate block-list Pinocchio copy, Quasar metadata example blocked on `sol_realloc`, root `yarn.lock`). Some examples remain excluded from CI via `.ghaignore` until they build cleanly again (compression, escrow, pyth, and others โ€” see that file for the live list). + +## Before June 2026 + +There was **no changelog** before June 2026. Older history lives in git only. \ No newline at end of file diff --git a/README.md b/README.md index 93263dea..4564857e 100644 --- a/README.md +++ b/README.md @@ -339,4 +339,4 @@ Work with Metaplex compressed NFTs. --- -**PRs welcome!** Follow the [contributing guidelines](./CONTRIBUTING.md) to keep things consistent. +**PRs welcome!** Follow the [contributing guidelines](./CONTRIBUTING.md) and see [CHANGELOG.md](./CHANGELOG.md) for release history. From ee5939c5e70454497bcd455aafa46208d5f7b77d Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Thu, 4 Jun 2026 15:25:53 -0400 Subject: [PATCH 009/138] Add missing Quasar READMEs --- CHANGELOG.md | 2 +- basics/account-data/quasar/README.md | 34 ++ basics/checking-accounts/quasar/README.md | 34 ++ basics/close-account/quasar/README.md | 34 ++ basics/counter/quasar/README.md | 34 ++ basics/create-account/quasar/README.md | 34 ++ basics/favorites/quasar/README.md | 34 ++ basics/hello-solana/quasar/README.md | 34 ++ basics/pda-rent-payer/quasar/README.md | 34 ++ .../processing-instructions/quasar/README.md | 34 ++ .../quasar/README.md | 34 ++ basics/pyth/quasar/README.md | 34 ++ basics/realloc/quasar/README.md | 34 ++ basics/rent/quasar/README.md | 34 ++ basics/repository-layout/quasar/README.md | 34 ++ basics/transfer-sol/quasar/README.md | 34 ++ compression/cnft-burn/quasar/README.md | 34 ++ compression/cnft-vault/quasar/README.md | 34 ++ compression/cutils/quasar/README.md | 34 ++ finance/escrow/quasar/README.md | 34 ++ finance/token-fundraiser/quasar/README.md | 34 ++ finance/token-swap/quasar/README.md | 34 ++ scripts/generate-quasar-readmes.mjs | 341 ++++++++++++++++++ tokens/create-token/quasar/README.md | 34 ++ .../quasar/README.md | 34 ++ tokens/nft-minter/quasar/README.md | 34 ++ tokens/nft-operations/quasar/README.md | 34 ++ tokens/pda-mint-authority/quasar/README.md | 34 ++ .../default-account-state/quasar/README.md | 3 + tokens/token-2022/metadata/quasar/README.md | 3 + .../token-extensions/basics/quasar/README.md | 34 ++ .../cpi-guard/quasar/README.md | 33 ++ .../default-account-state/quasar/README.md | 33 ++ .../token-extensions/group/quasar/README.md | 33 ++ .../immutable-owner/quasar/README.md | 33 ++ .../interest-bearing/quasar/README.md | 33 ++ .../memo-transfer/quasar/README.md | 33 ++ .../mint-close-authority/quasar/README.md | 33 ++ .../non-transferable/quasar/README.md | 33 ++ .../permanent-delegate/quasar/README.md | 33 ++ .../transfer-fee/quasar/README.md | 33 ++ .../account-data-as-seed/quasar/README.md | 34 ++ .../allow-block-list-token/quasar/README.md | 34 ++ .../transfer-hook/counter/quasar/README.md | 34 ++ .../hello-world/quasar/README.md | 34 ++ .../transfer-cost/quasar/README.md | 34 ++ .../transfer-switch/quasar/README.md | 34 ++ .../transfer-hook/whitelist/quasar/README.md | 34 ++ tokens/token-minter/quasar/README.md | 34 ++ tokens/transfer-tokens/quasar/README.md | 34 ++ 50 files changed, 1902 insertions(+), 1 deletion(-) create mode 100644 basics/account-data/quasar/README.md create mode 100644 basics/checking-accounts/quasar/README.md create mode 100644 basics/close-account/quasar/README.md create mode 100644 basics/counter/quasar/README.md create mode 100644 basics/create-account/quasar/README.md create mode 100644 basics/favorites/quasar/README.md create mode 100644 basics/hello-solana/quasar/README.md create mode 100644 basics/pda-rent-payer/quasar/README.md create mode 100644 basics/processing-instructions/quasar/README.md create mode 100644 basics/program-derived-addresses/quasar/README.md create mode 100644 basics/pyth/quasar/README.md create mode 100644 basics/realloc/quasar/README.md create mode 100644 basics/rent/quasar/README.md create mode 100644 basics/repository-layout/quasar/README.md create mode 100644 basics/transfer-sol/quasar/README.md create mode 100644 compression/cnft-burn/quasar/README.md create mode 100644 compression/cnft-vault/quasar/README.md create mode 100644 compression/cutils/quasar/README.md create mode 100644 finance/escrow/quasar/README.md create mode 100644 finance/token-fundraiser/quasar/README.md create mode 100644 finance/token-swap/quasar/README.md create mode 100644 scripts/generate-quasar-readmes.mjs create mode 100644 tokens/create-token/quasar/README.md create mode 100644 tokens/external-delegate-token-master/quasar/README.md create mode 100644 tokens/nft-minter/quasar/README.md create mode 100644 tokens/nft-operations/quasar/README.md create mode 100644 tokens/pda-mint-authority/quasar/README.md create mode 100644 tokens/token-2022/default-account-state/quasar/README.md create mode 100644 tokens/token-2022/metadata/quasar/README.md create mode 100644 tokens/token-extensions/basics/quasar/README.md create mode 100644 tokens/token-extensions/cpi-guard/quasar/README.md create mode 100644 tokens/token-extensions/default-account-state/quasar/README.md create mode 100644 tokens/token-extensions/group/quasar/README.md create mode 100644 tokens/token-extensions/immutable-owner/quasar/README.md create mode 100644 tokens/token-extensions/interest-bearing/quasar/README.md create mode 100644 tokens/token-extensions/memo-transfer/quasar/README.md create mode 100644 tokens/token-extensions/mint-close-authority/quasar/README.md create mode 100644 tokens/token-extensions/non-transferable/quasar/README.md create mode 100644 tokens/token-extensions/permanent-delegate/quasar/README.md create mode 100644 tokens/token-extensions/transfer-fee/quasar/README.md create mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/README.md create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/README.md create mode 100644 tokens/token-extensions/transfer-hook/counter/quasar/README.md create mode 100644 tokens/token-extensions/transfer-hook/hello-world/quasar/README.md create mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/quasar/README.md create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/quasar/README.md create mode 100644 tokens/token-extensions/transfer-hook/whitelist/quasar/README.md create mode 100644 tokens/token-minter/quasar/README.md create mode 100644 tokens/transfer-tokens/quasar/README.md diff --git a/CHANGELOG.md b/CHANGELOG.md index b53215c6..136c0305 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ Mike MacCana led the Quicknode fork of the [Solana Foundation program examples]( **Programs and layout.** Broke large monolithic `lib.rs` files into **instruction handler modules**; adopted **`InitSpace`** and explicit PDA bumps instead of magic account sizes; corrected several logic bugs (escrow, token swap invariant, counter authority checks, compression Bubblegum program id, and more). Expanded finance and token-extension coverage; reorganized transfer-hook examples (including block-list under Pinocchio). -**Documentation.** Rewrote the root README (framework badges, clearer example blurbs, ASM links), ran a style and **truth audit** on READMEs, and linked canonical [Solana terminology](https://solana.com/docs/references/terminology) on first mention. Added this changelog, `CONTRIBUTING.md` (aligned with LiteSVM testing), a README template and per-example Anchor READMEs, fixed Husky for GUI git clients, and removed unused maintainer scripts (`sync-package-json`, `cicd.sh`, local-validator helpers for the allow/block-list UI). +**Documentation.** Rewrote the root README (framework badges, clearer example blurbs, ASM links), ran a style and **truth audit** on READMEs, and linked canonical [Solana terminology](https://solana.com/docs/references/terminology) on first mention. Added this changelog, `CONTRIBUTING.md` (aligned with LiteSVM testing), README templates, per-example Anchor and Quasar READMEs, fixed Husky for GUI git clients, removed unused maintainer scripts (`sync-package-json`, `cicd.sh`, local-validator helpers for the allow/block-list UI), dropped the orphan `tokens/spl-token-minter/` tree, and removed legacy root `package.json` dependencies (web3.js, Bankrun, chai). **Removed / deferred.** Dropped duplicate or WIP trees (duplicate block-list Pinocchio copy, Quasar metadata example blocked on `sol_realloc`, root `yarn.lock`). Some examples remain excluded from CI via `.ghaignore` until they build cleanly again (compression, escrow, pyth, and others โ€” see that file for the live list). diff --git a/basics/account-data/quasar/README.md b/basics/account-data/quasar/README.md new file mode 100644 index 00000000..e7162dac --- /dev/null +++ b/basics/account-data/quasar/README.md @@ -0,0 +1,34 @@ +# Account Data (Quasar) + +Store and retrieve data in a [program](https://solana.com/docs/terminology#program)-owned [account](https://solana.com/docs/terminology#account). + +See also: the [repository catalog](../../../README.md). + +## Major concepts + +- Account layout and serialization +- Quasar account views + +## Setup + +From `basics/account-data/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/checking-accounts/quasar/README.md b/basics/checking-accounts/quasar/README.md new file mode 100644 index 00000000..69e919f3 --- /dev/null +++ b/basics/checking-accounts/quasar/README.md @@ -0,0 +1,34 @@ +# Checking Accounts (Quasar) + +Validate signers, owners, and addresses on incoming [instructions](https://solana.com/docs/terminology#instruction). + +See also: [Checking Accounts overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Compile-time account checks +- Signer and mut constraints + +## Setup + +From `basics/checking-accounts/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/close-account/quasar/README.md b/basics/close-account/quasar/README.md new file mode 100644 index 00000000..6989dfeb --- /dev/null +++ b/basics/close-account/quasar/README.md @@ -0,0 +1,34 @@ +# Close Account (Quasar) + +Create a PDA [account](https://solana.com/docs/terminology#account), then close it and return [rent](https://solana.com/docs/terminology#rent) to the user. + +See also: the [repository catalog](../../../README.md). + +## Major concepts + +- PDA init and close +- Rent reclamation + +## Setup + +From `basics/close-account/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/counter/quasar/README.md b/basics/counter/quasar/README.md new file mode 100644 index 00000000..3d9e0bb3 --- /dev/null +++ b/basics/counter/quasar/README.md @@ -0,0 +1,34 @@ +# Counter (Quasar) + +Global counter in a [PDA](https://solana.com/docs/terminology#program-derived-address-pda) with initialize and increment handlers. + +See also: [Counter overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- PDA state +- Handler dispatch + +## Setup + +From `basics/counter/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/create-account/quasar/README.md b/basics/create-account/quasar/README.md new file mode 100644 index 00000000..f6f26b6b --- /dev/null +++ b/basics/create-account/quasar/README.md @@ -0,0 +1,34 @@ +# Create Account (Quasar) + +Create and fund rent-exempt accounts via the System Program. + +See also: [Create Account overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- System Program CPI +- Rent-exempt lamports + +## Setup + +From `basics/create-account/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/favorites/quasar/README.md b/basics/favorites/quasar/README.md new file mode 100644 index 00000000..aaf4e0b0 --- /dev/null +++ b/basics/favorites/quasar/README.md @@ -0,0 +1,34 @@ +# Favorites (Quasar) + +Per-user favorites in a PDA; only the owner can update their data. + +See also: the [repository catalog](../../../README.md). + +## Major concepts + +- Per-user PDA +- Authority checks + +## Setup + +From `basics/favorites/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/hello-solana/quasar/README.md b/basics/hello-solana/quasar/README.md new file mode 100644 index 00000000..d3157bcf --- /dev/null +++ b/basics/hello-solana/quasar/README.md @@ -0,0 +1,34 @@ +# Hello Solana (Quasar) + +Minimal program that logs a greeting. + +See also: [Hello Solana overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Program entrypoint +- Instruction data + +## Setup + +From `basics/hello-solana/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/pda-rent-payer/quasar/README.md b/basics/pda-rent-payer/quasar/README.md new file mode 100644 index 00000000..03595c90 --- /dev/null +++ b/basics/pda-rent-payer/quasar/README.md @@ -0,0 +1,34 @@ +# PDA Rent Payer (Quasar) + +A [PDA](https://solana.com/docs/terminology#program-derived-address-pda) pays [rent](https://solana.com/docs/terminology#rent) when creating another account. + +See also: [Pda Rent Payer overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- PDA signer +- Rent payer pattern + +## Setup + +From `basics/pda-rent-payer/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/processing-instructions/quasar/README.md b/basics/processing-instructions/quasar/README.md new file mode 100644 index 00000000..b63db717 --- /dev/null +++ b/basics/processing-instructions/quasar/README.md @@ -0,0 +1,34 @@ +# Processing Instructions (Quasar) + +Pass arguments into an [instruction handler](https://solana.com/docs/terminology#instruction-handler). + +See also: [Processing Instructions overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Instruction data +- Handler parameters + +## Setup + +From `basics/processing-instructions/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/program-derived-addresses/quasar/README.md b/basics/program-derived-addresses/quasar/README.md new file mode 100644 index 00000000..5fb66eac --- /dev/null +++ b/basics/program-derived-addresses/quasar/README.md @@ -0,0 +1,34 @@ +# Program Derived Addresses (Quasar) + +Derive and use PDAs for deterministic program-owned addresses. + +See also: the [repository catalog](../../../README.md). + +## Major concepts + +- Seed derivation +- PDA-owned state + +## Setup + +From `basics/program-derived-addresses/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/pyth/quasar/README.md b/basics/pyth/quasar/README.md new file mode 100644 index 00000000..4b7fba4f --- /dev/null +++ b/basics/pyth/quasar/README.md @@ -0,0 +1,34 @@ +# Pyth Price Feeds (Quasar) + +Read a Pyth price feed and use oracle data in program logic. + +See also: [Pyth overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Oracle accounts +- Price feed layout + +## Setup + +From `basics/pyth/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/realloc/quasar/README.md b/basics/realloc/quasar/README.md new file mode 100644 index 00000000..bb084856 --- /dev/null +++ b/basics/realloc/quasar/README.md @@ -0,0 +1,34 @@ +# Realloc (Quasar) + +Grow or shrink account data when storage needs change. + +See also: [Realloc overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Account reallocation +- Rent on resize + +## Setup + +From `basics/realloc/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/rent/quasar/README.md b/basics/rent/quasar/README.md new file mode 100644 index 00000000..e5c358dc --- /dev/null +++ b/basics/rent/quasar/README.md @@ -0,0 +1,34 @@ +# Rent (Quasar) + +Compute account size and minimum rent-exempt [lamports](https://solana.com/docs/terminology#lamport). + +See also: [Rent overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Rent-exempt balance +- Space planning + +## Setup + +From `basics/rent/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/repository-layout/quasar/README.md b/basics/repository-layout/quasar/README.md new file mode 100644 index 00000000..af19e187 --- /dev/null +++ b/basics/repository-layout/quasar/README.md @@ -0,0 +1,34 @@ +# Repository Layout (Quasar) + +Organize a program across modules (state, handlers, errors). + +See also: [Repository Layout overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Multi-file layout +- Separation of concerns + +## Setup + +From `basics/repository-layout/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/basics/transfer-sol/quasar/README.md b/basics/transfer-sol/quasar/README.md new file mode 100644 index 00000000..26ff05fb --- /dev/null +++ b/basics/transfer-sol/quasar/README.md @@ -0,0 +1,34 @@ +# Transfer SOL (Quasar) + +Transfer native SOL via the System Program. + +See also: [Transfer Sol overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- System transfer CPI +- Signer-funded lamports + +## Setup + +From `basics/transfer-sol/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/compression/cnft-burn/quasar/README.md b/compression/cnft-burn/quasar/README.md new file mode 100644 index 00000000..97bd2e3a --- /dev/null +++ b/compression/cnft-burn/quasar/README.md @@ -0,0 +1,34 @@ +# cNFT Burn (Quasar) + +Burn compressed NFTs via Metaplex Bubblegum CPIs. + +See also: the [repository catalog](../../../README.md). + +## Major concepts + +- Compressed NFTs +- Bubblegum CPI + +## Setup + +From `compression/cnft-burn/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/compression/cnft-vault/quasar/README.md b/compression/cnft-vault/quasar/README.md new file mode 100644 index 00000000..2d3fdd4d --- /dev/null +++ b/compression/cnft-vault/quasar/README.md @@ -0,0 +1,34 @@ +# cNFT Vault (Quasar) + +Deposit and withdraw compressed NFTs from a PDA vault. + +See also: the [repository catalog](../../../README.md). + +## Major concepts + +- cNFT transfers +- PDA vault + +## Setup + +From `compression/cnft-vault/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/compression/cutils/quasar/README.md b/compression/cutils/quasar/README.md new file mode 100644 index 00000000..9c30e4c5 --- /dev/null +++ b/compression/cutils/quasar/README.md @@ -0,0 +1,34 @@ +# Compression Utilities (Quasar) + +Helpers for working with Metaplex compressed NFTs in a program. + +See also: the [repository catalog](../../../README.md). + +## Major concepts + +- Compression proofs +- Merkle tree accounts + +## Setup + +From `compression/cutils/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/finance/escrow/quasar/README.md b/finance/escrow/quasar/README.md new file mode 100644 index 00000000..b4f5ec1a --- /dev/null +++ b/finance/escrow/quasar/README.md @@ -0,0 +1,34 @@ +# Escrow (Quasar) + +Atomic token swap escrow between maker and taker. + +See also: the [repository catalog](../../../README.md). + +## Major concepts + +- Escrow PDA +- See [Anchor variant](../anchor/README.md) for the full walkthrough + +## Setup + +From `finance/escrow/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/finance/token-fundraiser/quasar/README.md b/finance/token-fundraiser/quasar/README.md new file mode 100644 index 00000000..c0d47666 --- /dev/null +++ b/finance/token-fundraiser/quasar/README.md @@ -0,0 +1,34 @@ +# Token Fundraiser (Quasar) + +Onchain crowdfunding toward a target amount in a chosen token. + +See also: the [repository catalog](../../../README.md). + +## Major concepts + +- Fundraiser PDA +- Contributor deposits + +## Setup + +From `finance/token-fundraiser/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/finance/token-swap/quasar/README.md b/finance/token-swap/quasar/README.md new file mode 100644 index 00000000..00936b0d --- /dev/null +++ b/finance/token-swap/quasar/README.md @@ -0,0 +1,34 @@ +# Token Swap (AMM) (Quasar) + +Constant-product AMM: pools, liquidity, swaps with slippage guards. + +See also: [Token Swap overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Pool PDA and LP tokens +- See [finance/token-swap/README.md](../token-swap/README.md) + +## Setup + +From `finance/token-swap/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/scripts/generate-quasar-readmes.mjs b/scripts/generate-quasar-readmes.mjs new file mode 100644 index 00000000..6214fae9 --- /dev/null +++ b/scripts/generate-quasar-readmes.mjs @@ -0,0 +1,341 @@ +#!/usr/bin/env node +/** + * Generate Quasar README.md files. Run: node scripts/generate-quasar-readmes.mjs + */ +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const root = path.join(path.dirname(fileURLToPath(import.meta.url)), ".."); + +/** @type {Record} */ +const examples = { + "basics/account-data/quasar": { + title: "Account Data", + purpose: + "Store and retrieve data in a [program](https://solana.com/docs/terminology#program)-owned [account](https://solana.com/docs/terminology#account).", + concepts: ["Account layout and serialization", "Quasar account views"], + }, + "basics/checking-accounts/quasar": { + title: "Checking Accounts", + purpose: + "Validate signers, owners, and addresses on incoming [instructions](https://solana.com/docs/terminology#instruction).", + concepts: ["Compile-time account checks", "Signer and mut constraints"], + }, + "basics/close-account/quasar": { + title: "Close Account", + purpose: + "Create a PDA [account](https://solana.com/docs/terminology#account), then close it and return [rent](https://solana.com/docs/terminology#rent) to the user.", + concepts: ["PDA init and close", "Rent reclamation"], + }, + "basics/counter/quasar": { + title: "Counter", + purpose: + "Global counter in a [PDA](https://solana.com/docs/terminology#program-derived-address-pda) with initialize and increment handlers.", + concepts: ["PDA state", "Handler dispatch"], + }, + "basics/create-account/quasar": { + title: "Create Account", + purpose: "Create and fund rent-exempt accounts via the System Program.", + concepts: ["System Program CPI", "Rent-exempt lamports"], + }, + "basics/favorites/quasar": { + title: "Favorites", + purpose: "Per-user favorites in a PDA; only the owner can update their data.", + concepts: ["Per-user PDA", "Authority checks"], + }, + "basics/hello-solana/quasar": { + title: "Hello Solana", + purpose: "Minimal program that logs a greeting.", + concepts: ["Program entrypoint", "Instruction data"], + }, + "basics/pda-rent-payer/quasar": { + title: "PDA Rent Payer", + purpose: + "A [PDA](https://solana.com/docs/terminology#program-derived-address-pda) pays [rent](https://solana.com/docs/terminology#rent) when creating another account.", + concepts: ["PDA signer", "Rent payer pattern"], + }, + "basics/processing-instructions/quasar": { + title: "Processing Instructions", + purpose: "Pass arguments into an [instruction handler](https://solana.com/docs/terminology#instruction-handler).", + concepts: ["Instruction data", "Handler parameters"], + }, + "basics/program-derived-addresses/quasar": { + title: "Program Derived Addresses", + purpose: "Derive and use PDAs for deterministic program-owned addresses.", + concepts: ["Seed derivation", "PDA-owned state"], + }, + "basics/pyth/quasar": { + title: "Pyth Price Feeds", + purpose: "Read a Pyth price feed and use oracle data in program logic.", + concepts: ["Oracle accounts", "Price feed layout"], + }, + "basics/realloc/quasar": { + title: "Realloc", + purpose: "Grow or shrink account data when storage needs change.", + concepts: ["Account reallocation", "Rent on resize"], + }, + "basics/rent/quasar": { + title: "Rent", + purpose: "Compute account size and minimum rent-exempt [lamports](https://solana.com/docs/terminology#lamport).", + concepts: ["Rent-exempt balance", "Space planning"], + }, + "basics/repository-layout/quasar": { + title: "Repository Layout", + purpose: "Organize a program across modules (state, handlers, errors).", + concepts: ["Multi-file layout", "Separation of concerns"], + }, + "basics/transfer-sol/quasar": { + title: "Transfer SOL", + purpose: "Transfer native SOL via the System Program.", + concepts: ["System transfer CPI", "Signer-funded lamports"], + }, + "compression/cnft-burn/quasar": { + title: "cNFT Burn", + purpose: "Burn compressed NFTs via Metaplex Bubblegum CPIs.", + concepts: ["Compressed NFTs", "Bubblegum CPI"], + }, + "compression/cnft-vault/quasar": { + title: "cNFT Vault", + purpose: "Deposit and withdraw compressed NFTs from a PDA vault.", + concepts: ["cNFT transfers", "PDA vault"], + }, + "compression/cutils/quasar": { + title: "Compression Utilities", + purpose: "Helpers for working with Metaplex compressed NFTs in a program.", + concepts: ["Compression proofs", "Merkle tree accounts"], + }, + "finance/escrow/quasar": { + title: "Escrow", + purpose: "Atomic token swap escrow between maker and taker.", + concepts: ["Escrow PDA", "See [Anchor variant](../anchor/README.md) for the full walkthrough"], + }, + "finance/token-fundraiser/quasar": { + title: "Token Fundraiser", + purpose: "Onchain crowdfunding toward a target amount in a chosen token.", + concepts: ["Fundraiser PDA", "Contributor deposits"], + }, + "finance/token-swap/quasar": { + title: "Token Swap (AMM)", + purpose: "Constant-product AMM: pools, liquidity, swaps with slippage guards.", + concepts: ["Pool PDA and LP tokens", "See [finance/token-swap/README.md](../token-swap/README.md)"], + }, + "tokens/create-token/quasar": { + title: "Create Token", + purpose: "Create a mint with metadata using Token and Metaplex programs.", + concepts: ["Mint + metadata CPI", "See [tokens/create-token/README.md](../create-token/README.md)"], + }, + "tokens/external-delegate-token-master/quasar": { + title: "External Delegate Token Master", + purpose: "Token transfers authorized by an external secp256k1 signature.", + concepts: ["Delegate approval", "Signature verification"], + }, + "tokens/nft-minter/quasar": { + title: "NFT Minter", + purpose: "Mint an NFT from inside your program.", + concepts: ["NFT mint", "Metadata CPI"], + }, + "tokens/nft-operations/quasar": { + title: "NFT Operations", + purpose: "Collection mint, NFT mint, and collection verification via Metaplex.", + concepts: ["Collection NFTs", "Verification CPI"], + }, + "tokens/pda-mint-authority/quasar": { + title: "PDA Mint Authority", + purpose: "Mint with a PDA as mint authority.", + concepts: ["PDA mint authority", "mint_to CPI"], + }, + "tokens/token-minter/quasar": { + title: "Token Minter", + purpose: "Mint tokens using the [Classic Token Program](https://solana.com/docs/terminology#token-program).", + concepts: ["Mint authority", "Token account init"], + }, + "tokens/transfer-tokens/quasar": { + title: "Transfer Tokens", + purpose: "Transfer tokens between accounts via CPI.", + concepts: ["Token transfer CPI", "Associated token accounts"], + }, + "tokens/token-extensions/basics/quasar": { + title: "Token Extensions โ€” Basics", + purpose: + "Mint and transfer with the [Token Extensions Program](https://solana.com/docs/terminology#token-extensions-program).", + concepts: ["Extension mints", "Token Extensions CPI"], + }, + "tokens/token-extensions/cpi-guard/quasar": { + title: "Token Extensions โ€” CPI Guard", + purpose: "Block certain token actions inside CPI contexts.", + concepts: ["CPI Guard extension"], + }, + "tokens/token-extensions/default-account-state/quasar": { + title: "Token Extensions โ€” Default Account State", + purpose: "New token accounts frozen by default until thawed.", + concepts: ["Default account state extension"], + }, + "tokens/token-extensions/group/quasar": { + title: "Token Extensions โ€” Group Pointer", + purpose: "Link mints to a group via Group Pointer.", + concepts: ["Group pointer extension"], + }, + "tokens/token-extensions/immutable-owner/quasar": { + title: "Token Extensions โ€” Immutable Owner", + purpose: "Token accounts with an immutable owner field.", + concepts: ["Immutable owner extension"], + }, + "tokens/token-extensions/interest-bearing/quasar": { + title: "Token Extensions โ€” Interest Bearing", + purpose: "Balances that reflect accrued interest over time.", + concepts: ["Interest bearing extension"], + }, + "tokens/token-extensions/memo-transfer/quasar": { + title: "Token Extensions โ€” Memo Transfer", + purpose: "Require a memo on every transfer.", + concepts: ["Memo transfer extension"], + }, + "tokens/token-extensions/mint-close-authority/quasar": { + title: "Token Extensions โ€” Mint Close Authority", + purpose: "Designated account may close the mint.", + concepts: ["Mint close authority extension"], + }, + "tokens/token-extensions/non-transferable/quasar": { + title: "Token Extensions โ€” Non-Transferable", + purpose: "Tokens that cannot be transferred.", + concepts: ["Non-transferable extension"], + }, + "tokens/token-extensions/permanent-delegate/quasar": { + title: "Token Extensions โ€” Permanent Delegate", + purpose: "Permanent delegate retains transfer rights.", + concepts: ["Permanent delegate extension"], + }, + "tokens/token-extensions/transfer-fee/quasar": { + title: "Token Extensions โ€” Transfer Fee", + purpose: "Fee charged on each transfer at the mint.", + concepts: ["Transfer fee extension"], + }, + "tokens/token-extensions/transfer-hook/account-data-as-seed/quasar": { + title: "Transfer Hook โ€” Account Data as Seed", + purpose: "Derive extra accounts from token account data in a transfer hook.", + concepts: ["Transfer hook", "Extra account metas"], + }, + "tokens/token-extensions/transfer-hook/allow-block-list-token/quasar": { + title: "Transfer Hook โ€” Allow/Block List", + purpose: "Allow/block list enforced by a transfer hook program.", + concepts: ["Transfer hook", "List authority"], + }, + "tokens/token-extensions/transfer-hook/counter/quasar": { + title: "Transfer Hook โ€” Counter", + purpose: "Count transfers in hook-side state.", + concepts: ["Transfer hook", "Counter PDA"], + }, + "tokens/token-extensions/transfer-hook/hello-world/quasar": { + title: "Transfer Hook โ€” Hello World", + purpose: "Minimal transfer hook executed on each transfer.", + concepts: ["Transfer hook", "Extra account meta list"], + }, + "tokens/token-extensions/transfer-hook/transfer-cost/quasar": { + title: "Transfer Hook โ€” Transfer Cost", + purpose: "Additional fee on each transfer via the hook.", + concepts: ["Transfer hook", "Fee collection"], + }, + "tokens/token-extensions/transfer-hook/transfer-switch/quasar": { + title: "Transfer Hook โ€” Transfer Switch", + purpose: "Globally enable or disable transfers.", + concepts: ["Transfer hook", "Admin switch"], + }, + "tokens/token-extensions/transfer-hook/whitelist/quasar": { + title: "Transfer Hook โ€” Whitelist", + purpose: "Only whitelisted accounts may receive tokens.", + concepts: ["Transfer hook", "Whitelist PDA"], + }, +}; + +const redirects = { + "tokens/token-2022/default-account-state/quasar": "tokens/token-extensions/default-account-state/quasar", + "tokens/token-2022/metadata/quasar": "tokens/token-extensions/metadata/anchor", +}; + +function titleCase(segment) { + return segment + .split("-") + .map((w) => w.charAt(0).toUpperCase() + w.slice(1)) + .join(" "); +} + +function parentOverviewRel(quasarRel) { + const parent = path.dirname(quasarRel); + const readme = path.join(root, parent, "README.md"); + if (fs.existsSync(readme)) { + return `See also: [${titleCase(path.basename(parent))} overview](../README.md) and the [repository catalog](${"../".repeat(quasarRel.split("/").length)}README.md).`; + } + const depth = quasarRel.split("/").length; + return `See also: the [repository catalog](${"../".repeat(depth)}README.md).`; +} + +function render(quasarRel, meta) { + const concepts = meta.concepts.map((c) => `- ${c}`).join("\n"); + return `# ${meta.title} (Quasar) + +${meta.purpose} + +${parentOverviewRel(quasarRel)} + +## Major concepts + +${concepts} + +## Setup + +From \`${quasarRel}/\`: + +\`\`\`bash +quasar build +\`\`\` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see \`Quasar.toml\`). + +## Testing + +In-process tests via **Quasar SVM** (\`quasar-svm\` in \`Quasar.toml\`): + +\`\`\`bash +cargo test +\`\`\` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read \`src/\` and \`Quasar.toml\`. Compare with the [Anchor](../anchor/) variant in the same example where present. +`; +} + +function renderRedirect(fromRel, toRel) { + const fromDir = path.join(root, fromRel); + const toReadme = path.join(root, toRel, "README.md"); + let link = path.relative(fromDir, toReadme).replace(/\\/g, "/"); + if (!link.startsWith(".")) link = `./${link}`; + return `# Deprecated path + +This tree is a leftover \`token-2022\` path. Use [\`${toRel}\`](${link}) instead. +`; +} + +let written = 0; +for (const [rel, meta] of Object.entries(examples)) { + const readmePath = path.join(root, rel, "README.md"); + if (fs.existsSync(readmePath)) continue; + fs.mkdirSync(path.dirname(readmePath), { recursive: true }); + fs.writeFileSync(readmePath, render(rel, meta)); + written++; + console.log("wrote", rel); +} + +for (const [rel, to] of Object.entries(redirects)) { + const readmePath = path.join(root, rel, "README.md"); + if (fs.existsSync(readmePath)) continue; + fs.mkdirSync(path.dirname(readmePath), { recursive: true }); + fs.writeFileSync(readmePath, renderRedirect(rel, to)); + written++; + console.log("redirect", rel); +} + +console.log(`Done. ${written} README(s) created.`); diff --git a/tokens/create-token/quasar/README.md b/tokens/create-token/quasar/README.md new file mode 100644 index 00000000..80960c39 --- /dev/null +++ b/tokens/create-token/quasar/README.md @@ -0,0 +1,34 @@ +# Create Token (Quasar) + +Create a mint with metadata using Token and Metaplex programs. + +See also: [Create Token overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Mint + metadata CPI +- See [tokens/create-token/README.md](../create-token/README.md) + +## Setup + +From `tokens/create-token/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/external-delegate-token-master/quasar/README.md b/tokens/external-delegate-token-master/quasar/README.md new file mode 100644 index 00000000..706dacb6 --- /dev/null +++ b/tokens/external-delegate-token-master/quasar/README.md @@ -0,0 +1,34 @@ +# External Delegate Token Master (Quasar) + +Token transfers authorized by an external secp256k1 signature. + +See also: the [repository catalog](../../../README.md). + +## Major concepts + +- Delegate approval +- Signature verification + +## Setup + +From `tokens/external-delegate-token-master/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/nft-minter/quasar/README.md b/tokens/nft-minter/quasar/README.md new file mode 100644 index 00000000..92d27cb7 --- /dev/null +++ b/tokens/nft-minter/quasar/README.md @@ -0,0 +1,34 @@ +# NFT Minter (Quasar) + +Mint an NFT from inside your program. + +See also: [Nft Minter overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- NFT mint +- Metadata CPI + +## Setup + +From `tokens/nft-minter/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/nft-operations/quasar/README.md b/tokens/nft-operations/quasar/README.md new file mode 100644 index 00000000..bc17d65f --- /dev/null +++ b/tokens/nft-operations/quasar/README.md @@ -0,0 +1,34 @@ +# NFT Operations (Quasar) + +Collection mint, NFT mint, and collection verification via Metaplex. + +See also: the [repository catalog](../../../README.md). + +## Major concepts + +- Collection NFTs +- Verification CPI + +## Setup + +From `tokens/nft-operations/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/pda-mint-authority/quasar/README.md b/tokens/pda-mint-authority/quasar/README.md new file mode 100644 index 00000000..092416af --- /dev/null +++ b/tokens/pda-mint-authority/quasar/README.md @@ -0,0 +1,34 @@ +# PDA Mint Authority (Quasar) + +Mint with a PDA as mint authority. + +See also: [Pda Mint Authority overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- PDA mint authority +- mint_to CPI + +## Setup + +From `tokens/pda-mint-authority/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-2022/default-account-state/quasar/README.md b/tokens/token-2022/default-account-state/quasar/README.md new file mode 100644 index 00000000..ca74b447 --- /dev/null +++ b/tokens/token-2022/default-account-state/quasar/README.md @@ -0,0 +1,3 @@ +# Deprecated path + +This tree is a leftover `token-2022` path. Use [`tokens/token-extensions/default-account-state/quasar`](../../../token-extensions/default-account-state/quasar/README.md) instead. diff --git a/tokens/token-2022/metadata/quasar/README.md b/tokens/token-2022/metadata/quasar/README.md new file mode 100644 index 00000000..a01ef4b3 --- /dev/null +++ b/tokens/token-2022/metadata/quasar/README.md @@ -0,0 +1,3 @@ +# Deprecated path + +This tree is a leftover `token-2022` path. Use [`tokens/token-extensions/metadata/anchor`](../../../token-extensions/metadata/anchor/README.md) instead. diff --git a/tokens/token-extensions/basics/quasar/README.md b/tokens/token-extensions/basics/quasar/README.md new file mode 100644 index 00000000..fec9c267 --- /dev/null +++ b/tokens/token-extensions/basics/quasar/README.md @@ -0,0 +1,34 @@ +# Token Extensions โ€” Basics (Quasar) + +Mint and transfer with the [Token Extensions Program](https://solana.com/docs/terminology#token-extensions-program). + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Extension mints +- Token Extensions CPI + +## Setup + +From `tokens/token-extensions/basics/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/cpi-guard/quasar/README.md b/tokens/token-extensions/cpi-guard/quasar/README.md new file mode 100644 index 00000000..1715b8cd --- /dev/null +++ b/tokens/token-extensions/cpi-guard/quasar/README.md @@ -0,0 +1,33 @@ +# Token Extensions โ€” CPI Guard (Quasar) + +Block certain token actions inside CPI contexts. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- CPI Guard extension + +## Setup + +From `tokens/token-extensions/cpi-guard/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/default-account-state/quasar/README.md b/tokens/token-extensions/default-account-state/quasar/README.md new file mode 100644 index 00000000..88d3bd04 --- /dev/null +++ b/tokens/token-extensions/default-account-state/quasar/README.md @@ -0,0 +1,33 @@ +# Token Extensions โ€” Default Account State (Quasar) + +New token accounts frozen by default until thawed. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Default account state extension + +## Setup + +From `tokens/token-extensions/default-account-state/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/group/quasar/README.md b/tokens/token-extensions/group/quasar/README.md new file mode 100644 index 00000000..91ca9a79 --- /dev/null +++ b/tokens/token-extensions/group/quasar/README.md @@ -0,0 +1,33 @@ +# Token Extensions โ€” Group Pointer (Quasar) + +Link mints to a group via Group Pointer. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Group pointer extension + +## Setup + +From `tokens/token-extensions/group/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/immutable-owner/quasar/README.md b/tokens/token-extensions/immutable-owner/quasar/README.md new file mode 100644 index 00000000..b951799c --- /dev/null +++ b/tokens/token-extensions/immutable-owner/quasar/README.md @@ -0,0 +1,33 @@ +# Token Extensions โ€” Immutable Owner (Quasar) + +Token accounts with an immutable owner field. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Immutable owner extension + +## Setup + +From `tokens/token-extensions/immutable-owner/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/interest-bearing/quasar/README.md b/tokens/token-extensions/interest-bearing/quasar/README.md new file mode 100644 index 00000000..a1e340ce --- /dev/null +++ b/tokens/token-extensions/interest-bearing/quasar/README.md @@ -0,0 +1,33 @@ +# Token Extensions โ€” Interest Bearing (Quasar) + +Balances that reflect accrued interest over time. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Interest bearing extension + +## Setup + +From `tokens/token-extensions/interest-bearing/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/memo-transfer/quasar/README.md b/tokens/token-extensions/memo-transfer/quasar/README.md new file mode 100644 index 00000000..f21b2106 --- /dev/null +++ b/tokens/token-extensions/memo-transfer/quasar/README.md @@ -0,0 +1,33 @@ +# Token Extensions โ€” Memo Transfer (Quasar) + +Require a memo on every transfer. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Memo transfer extension + +## Setup + +From `tokens/token-extensions/memo-transfer/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/mint-close-authority/quasar/README.md b/tokens/token-extensions/mint-close-authority/quasar/README.md new file mode 100644 index 00000000..beab3875 --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/quasar/README.md @@ -0,0 +1,33 @@ +# Token Extensions โ€” Mint Close Authority (Quasar) + +Designated account may close the mint. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Mint close authority extension + +## Setup + +From `tokens/token-extensions/mint-close-authority/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/non-transferable/quasar/README.md b/tokens/token-extensions/non-transferable/quasar/README.md new file mode 100644 index 00000000..87d9c370 --- /dev/null +++ b/tokens/token-extensions/non-transferable/quasar/README.md @@ -0,0 +1,33 @@ +# Token Extensions โ€” Non-Transferable (Quasar) + +Tokens that cannot be transferred. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Non-transferable extension + +## Setup + +From `tokens/token-extensions/non-transferable/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/permanent-delegate/quasar/README.md b/tokens/token-extensions/permanent-delegate/quasar/README.md new file mode 100644 index 00000000..6c518f6b --- /dev/null +++ b/tokens/token-extensions/permanent-delegate/quasar/README.md @@ -0,0 +1,33 @@ +# Token Extensions โ€” Permanent Delegate (Quasar) + +Permanent delegate retains transfer rights. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Permanent delegate extension + +## Setup + +From `tokens/token-extensions/permanent-delegate/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/transfer-fee/quasar/README.md b/tokens/token-extensions/transfer-fee/quasar/README.md new file mode 100644 index 00000000..7c51c8c2 --- /dev/null +++ b/tokens/token-extensions/transfer-fee/quasar/README.md @@ -0,0 +1,33 @@ +# Token Extensions โ€” Transfer Fee (Quasar) + +Fee charged on each transfer at the mint. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Transfer fee extension + +## Setup + +From `tokens/token-extensions/transfer-fee/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/README.md b/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/README.md new file mode 100644 index 00000000..8e4fdb29 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/README.md @@ -0,0 +1,34 @@ +# Transfer Hook โ€” Account Data as Seed (Quasar) + +Derive extra accounts from token account data in a transfer hook. + +See also: the [repository catalog](../../../../../README.md). + +## Major concepts + +- Transfer hook +- Extra account metas + +## Setup + +From `tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/README.md b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/README.md new file mode 100644 index 00000000..3c829adb --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/README.md @@ -0,0 +1,34 @@ +# Transfer Hook โ€” Allow/Block List (Quasar) + +Allow/block list enforced by a transfer hook program. + +See also: [Allow Block List Token overview](../README.md) and the [repository catalog](../../../../../README.md). + +## Major concepts + +- Transfer hook +- List authority + +## Setup + +From `tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/transfer-hook/counter/quasar/README.md b/tokens/token-extensions/transfer-hook/counter/quasar/README.md new file mode 100644 index 00000000..11c23c10 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/counter/quasar/README.md @@ -0,0 +1,34 @@ +# Transfer Hook โ€” Counter (Quasar) + +Count transfers in hook-side state. + +See also: the [repository catalog](../../../../../README.md). + +## Major concepts + +- Transfer hook +- Counter PDA + +## Setup + +From `tokens/token-extensions/transfer-hook/counter/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/transfer-hook/hello-world/quasar/README.md b/tokens/token-extensions/transfer-hook/hello-world/quasar/README.md new file mode 100644 index 00000000..c0341cae --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/quasar/README.md @@ -0,0 +1,34 @@ +# Transfer Hook โ€” Hello World (Quasar) + +Minimal transfer hook executed on each transfer. + +See also: the [repository catalog](../../../../../README.md). + +## Major concepts + +- Transfer hook +- Extra account meta list + +## Setup + +From `tokens/token-extensions/transfer-hook/hello-world/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/quasar/README.md b/tokens/token-extensions/transfer-hook/transfer-cost/quasar/README.md new file mode 100644 index 00000000..54bee20d --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-cost/quasar/README.md @@ -0,0 +1,34 @@ +# Transfer Hook โ€” Transfer Cost (Quasar) + +Additional fee on each transfer via the hook. + +See also: the [repository catalog](../../../../../README.md). + +## Major concepts + +- Transfer hook +- Fee collection + +## Setup + +From `tokens/token-extensions/transfer-hook/transfer-cost/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/quasar/README.md b/tokens/token-extensions/transfer-hook/transfer-switch/quasar/README.md new file mode 100644 index 00000000..7f33b4d7 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/quasar/README.md @@ -0,0 +1,34 @@ +# Transfer Hook โ€” Transfer Switch (Quasar) + +Globally enable or disable transfers. + +See also: the [repository catalog](../../../../../README.md). + +## Major concepts + +- Transfer hook +- Admin switch + +## Setup + +From `tokens/token-extensions/transfer-hook/transfer-switch/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-extensions/transfer-hook/whitelist/quasar/README.md b/tokens/token-extensions/transfer-hook/whitelist/quasar/README.md new file mode 100644 index 00000000..cbc37121 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/quasar/README.md @@ -0,0 +1,34 @@ +# Transfer Hook โ€” Whitelist (Quasar) + +Only whitelisted accounts may receive tokens. + +See also: the [repository catalog](../../../../../README.md). + +## Major concepts + +- Transfer hook +- Whitelist PDA + +## Setup + +From `tokens/token-extensions/transfer-hook/whitelist/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/token-minter/quasar/README.md b/tokens/token-minter/quasar/README.md new file mode 100644 index 00000000..206340b0 --- /dev/null +++ b/tokens/token-minter/quasar/README.md @@ -0,0 +1,34 @@ +# Token Minter (Quasar) + +Mint tokens using the [Classic Token Program](https://solana.com/docs/terminology#token-program). + +See also: [Token Minter overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Mint authority +- Token account init + +## Setup + +From `tokens/token-minter/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. diff --git a/tokens/transfer-tokens/quasar/README.md b/tokens/transfer-tokens/quasar/README.md new file mode 100644 index 00000000..61d03915 --- /dev/null +++ b/tokens/transfer-tokens/quasar/README.md @@ -0,0 +1,34 @@ +# Transfer Tokens (Quasar) + +Transfer tokens between accounts via CPI. + +See also: [Transfer Tokens overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Token transfer CPI +- Associated token accounts + +## Setup + +From `tokens/transfer-tokens/quasar/`: + +```bash +quasar build +``` + +Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). + +## Testing + +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): + +```bash +cargo test +``` + +Tests invoke instruction handlers and assert onchain state. No local validator. + +## Usage + +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. From efdb93c5d971c18e6bd0e627b1609fe24a531f94 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Thu, 4 Jun 2026 15:26:43 -0400 Subject: [PATCH 010/138] Remove deprecated frontend packages --- package.json | 7 - pnpm-lock.yaml | 702 ------------------------------------------------- 2 files changed, 709 deletions(-) diff --git a/package.json b/package.json index 49befcc2..2fd29427 100644 --- a/package.json +++ b/package.json @@ -25,12 +25,5 @@ "husky": "^9.0.11", "lint-staged": "^15.4.3", "typescript": "^5.2.2" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0", - "@solana/web3.js": "^1.98.4", - "anchor-bankrun": "^0.4.0", - "chai": "^5.1.1", - "solana-bankrun": "^0.3.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bfb4a4a6..6c73d748 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,22 +7,6 @@ settings: importers: .: - dependencies: - '@anchor-lang/core': - specifier: 1.0.0 - version: 1.0.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) - anchor-bankrun: - specifier: ^0.4.0 - version: 0.4.0(@coral-xyz/anchor@0.32.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10))(solana-bankrun@0.3.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)) - chai: - specifier: ^5.1.1 - version: 5.1.1 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) devDependencies: '@biomejs/biome': specifier: 2.4.10 @@ -42,24 +26,6 @@ importers: packages: - '@anchor-lang/borsh@1.0.0': - resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} - engines: {node: '>=10'} - peerDependencies: - '@solana/web3.js': ^1.69.0 - - '@anchor-lang/core@1.0.0': - resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} - engines: {node: '>=17'} - - '@anchor-lang/errors@1.0.0': - resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} - engines: {node: '>=10'} - - '@babel/runtime@7.25.0': - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} - engines: {node: '>=6.9.0'} - '@biomejs/biome@2.4.10': resolution: {integrity: sha512-xxA3AphFQ1geij4JTHXv4EeSTda1IFn22ye9LdyVPoJU19fNVl0uzfEuhsfQ4Yue/0FaLs2/ccVi4UDiE7R30w==} engines: {node: '>=14.21.3'} @@ -117,94 +83,9 @@ packages: cpu: [x64] os: [win32] - '@coral-xyz/anchor-errors@0.31.1': - resolution: {integrity: sha512-NhNEku4F3zzUSBtrYz84FzYWm48+9OvmT1Hhnwr6GnPQry2dsEqH/ti/7ASjjpoFTWRnPXrjAIT1qM6Isop+LQ==} - engines: {node: '>=10'} - - '@coral-xyz/anchor@0.32.1': - resolution: {integrity: sha512-zAyxFtfeje2FbMA1wzgcdVs7Hng/MijPKpRijoySPCicnvcTQs/+dnPZ/cR+LcXM9v9UYSyW81uRNYZtN5G4yg==} - engines: {node: '>=17'} - - '@coral-xyz/borsh@0.31.1': - resolution: {integrity: sha512-9N8AU9F0ubriKfNE3g1WF0/4dtlGXoBN/hd1PvbNBamBNwRgHxH4P+o3Zt7rSEloW1HUs6LfZEchlx9fW7POYw==} - engines: {node: '>=10'} - peerDependencies: - '@solana/web3.js': ^1.69.0 - - '@noble/curves@1.4.2': - resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.12': - resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.14.2': resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==} - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.5.12': - resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} - - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - anchor-bankrun@0.4.0: - resolution: {integrity: sha512-s+K7E0IGAlmkhuo8nbiqVsQf2yJ+3l9GjNQJSmkRDe25dQj4Yef9rJh77FH6EQ5H6yQYfzuhgm/5GD6JMjdTZg==} - engines: {node: '>= 10'} - peerDependencies: - '@coral-xyz/anchor': ^0.30.0 - '@solana/web3.js': ^1.78.4 - solana-bankrun: ^0.2.0 - ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} @@ -217,56 +98,14 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - - base-x@3.0.10: - resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-layout@1.2.2: - resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} - engines: {node: '>=4.5'} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@5.1.1: - resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} - engines: {node: '>=12'} - chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -282,16 +121,6 @@ packages: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - cross-fetch@3.2.0: - resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -305,14 +134,6 @@ packages: supports-color: optional: true - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -320,15 +141,6 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -336,13 +148,6 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -351,9 +156,6 @@ packages: resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -362,17 +164,11 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - husky@9.0.11: resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} engines: {node: '>=18'} hasBin: true - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - is-fullwidth-code-point@4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} @@ -392,23 +188,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.1.1: - resolution: {integrity: sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w==} - engines: {node: '>=8'} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -426,9 +205,6 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} - loupe@3.1.1: - resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -447,19 +223,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -472,9 +235,6 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -483,10 +243,6 @@ packages: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} - picomatch@2.3.2: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} @@ -496,9 +252,6 @@ packages: engines: {node: '>=0.10'} hasBin: true - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -506,12 +259,6 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rpc-websockets@9.0.2: - resolution: {integrity: sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -532,41 +279,6 @@ packages: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} - solana-bankrun-darwin-arm64@0.3.0: - resolution: {integrity: sha512-+NbDncf0U6l3knuacRBiqpjZ2DSp+5lZaAU518gH7/x6qubbui/d000STaIBK+uNTPBS/AL/bCN+7PkXqmA3lA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.0: - resolution: {integrity: sha512-1/F0xdMa4qvc5o6z16FCCbZ5jbdvKvxpx5kyPcMWRiRPwyvi+zltMxciPAYMlg3wslQqGz88uFhrBEzq2eTumQ==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.0: - resolution: {integrity: sha512-U6CANjkmMl+lgNA7UH0GKs5V7LtVIUDzJBZefGGqLfqUNv3EjA/PrrToM0hAOWJgkxSwdz6zW+p5sw5FmnbXtg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.0: - resolution: {integrity: sha512-qJSkCFs0k2n4XtTnyxGMiZsuqO2TiqTYgWjQ+3mZhGNUAMys/Vq8bd7/SyBm6RR7EfVuRXRxZvh+F8oKZ77V4w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.0: - resolution: {integrity: sha512-xsS2CS2xb1Sw4ivNXM0gPz/qpW9BX0neSvt/pnok5L330Nu9xlTnKAY8FhzzqOP9P9sJlGRM787Y6d0yYwt6xQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.0: - resolution: {integrity: sha512-YkH7sa8TB/AoRPzG17CXJtYsRIQHEkEqGLz1Vwc13taXhDBkjO7z6NI5JYw7n0ybRymDHwMYTc7sd+5J40TyVQ==} - engines: {node: '>= 10'} - string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -583,32 +295,10 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - superstruct@0.15.5: - resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - typescript@5.4.5: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} @@ -617,20 +307,6 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -640,30 +316,6 @@ packages: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} @@ -671,39 +323,6 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10))': - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - buffer-layout: 1.2.2 - - '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)': - dependencies: - '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0 - '@noble/hashes': 1.8.0 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - bs58: 4.0.1 - buffer-layout: 1.2.2 - camelcase: 6.3.0 - cross-fetch: 3.2.0 - eventemitter3: 4.0.7 - pako: 2.1.0 - superstruct: 0.15.5 - toml: 3.0.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@anchor-lang/errors@1.0.0': {} - - '@babel/runtime@7.25.0': - dependencies: - regenerator-runtime: 0.14.1 - '@biomejs/biome@2.4.10': optionalDependencies: '@biomejs/cli-darwin-arm64': 2.4.10 @@ -739,126 +358,10 @@ snapshots: '@biomejs/cli-win32-x64@2.4.10': optional: true - '@coral-xyz/anchor-errors@0.31.1': {} - - '@coral-xyz/anchor@0.32.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)': - dependencies: - '@coral-xyz/anchor-errors': 0.31.1 - '@coral-xyz/borsh': 0.31.1(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)) - '@noble/hashes': 1.8.0 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - bs58: 4.0.1 - buffer-layout: 1.2.2 - camelcase: 6.3.0 - cross-fetch: 3.2.0 - eventemitter3: 4.0.7 - pako: 2.1.0 - superstruct: 0.15.5 - toml: 3.0.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@coral-xyz/borsh@0.31.1(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10))': - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - buffer-layout: 1.2.2 - - '@noble/curves@1.4.2': - dependencies: - '@noble/hashes': 1.4.0 - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.3.0(typescript@5.4.5)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.4.5) - typescript: 5.4.5 - - '@solana/codecs-numbers@2.3.0(typescript@5.4.5)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.4.5) - '@solana/errors': 2.3.0(typescript@5.4.5) - typescript: 5.4.5 - - '@solana/errors@2.3.0(typescript@5.4.5)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 5.4.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.25.0 - '@noble/curves': 1.4.2 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.4.5) - agentkeepalive: 4.5.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.1.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.0.2 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.12': - dependencies: - tslib: 2.6.3 - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.14.2 - - '@types/node@12.20.55': {} - '@types/node@20.14.2': dependencies: undici-types: 5.26.5 - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 20.14.2 - - '@types/ws@8.5.12': - dependencies: - '@types/node': 20.14.2 - - JSONStream@1.3.5: - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - anchor-bankrun@0.4.0(@coral-xyz/anchor@0.32.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10))(solana-bankrun@0.3.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)): - dependencies: - '@coral-xyz/anchor': 0.32.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) - solana-bankrun: 0.3.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) - ansi-escapes@7.3.0: dependencies: environment: 1.1.0 @@ -867,56 +370,12 @@ snapshots: ansi-styles@6.2.3: {} - assertion-error@2.0.1: {} - - base-x@3.0.10: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - braces@3.0.3: dependencies: fill-range: 7.1.1 - bs58@4.0.1: - dependencies: - base-x: 3.0.10 - - buffer-layout@1.2.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - camelcase@6.3.0: {} - - chai@5.1.1: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.1 - pathval: 2.0.0 - chalk@5.6.2: {} - check-error@2.1.1: {} - cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -930,16 +389,6 @@ snapshots: commander@13.1.0: {} - commander@14.0.3: {} - - commander@2.20.3: {} - - cross-fetch@3.2.0: - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -950,22 +399,10 @@ snapshots: dependencies: ms: 2.1.3 - deep-eql@5.0.2: {} - - delay@5.0.0: {} - emoji-regex@10.6.0: {} environment@1.1.0: {} - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - eventemitter3@4.0.7: {} - eventemitter3@5.0.1: {} execa@8.0.1: @@ -980,30 +417,18 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 get-east-asian-width@1.6.0: {} - get-func-name@2.0.2: {} - get-stream@8.0.1: {} human-signals@5.0.0: {} - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - husky@9.0.11: {} - ieee754@1.2.1: {} - is-fullwidth-code-point@4.0.0: {} is-fullwidth-code-point@5.1.0: @@ -1016,32 +441,6 @@ snapshots: isexe@2.0.0: {} - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - - jayson@4.1.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - JSONStream: 1.3.5 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - json-stringify-safe@5.0.1: {} - - jsonparse@1.3.1: {} - lilconfig@3.1.3: {} lint-staged@15.5.2: @@ -1076,10 +475,6 @@ snapshots: strip-ansi: 7.2.0 wrap-ansi: 9.0.2 - loupe@3.1.1: - dependencies: - get-func-name: 2.0.2 - merge-stream@2.0.0: {} micromatch@4.0.8: @@ -1093,13 +488,6 @@ snapshots: ms@2.1.3: {} - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.1: - optional: true - npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -1112,20 +500,14 @@ snapshots: dependencies: mimic-function: 5.0.1 - pako@2.1.0: {} - path-key@3.1.1: {} path-key@4.0.0: {} - pathval@2.0.0: {} - picomatch@2.3.2: {} pidtree@0.6.0: {} - regenerator-runtime@0.14.1: {} - restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -1133,21 +515,6 @@ snapshots: rfdc@1.4.1: {} - rpc-websockets@9.0.2: - dependencies: - '@swc/helpers': 0.5.12 - '@types/uuid': 8.3.4 - '@types/ws': 8.5.12 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -1166,37 +533,6 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 - solana-bankrun-darwin-arm64@0.3.0: - optional: true - - solana-bankrun-darwin-universal@0.3.0: - optional: true - - solana-bankrun-darwin-x64@0.3.0: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.0: - optional: true - - solana-bankrun-linux-x64-musl@0.3.0: - optional: true - - solana-bankrun@0.3.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.0 - solana-bankrun-darwin-universal: 0.3.0 - solana-bankrun-darwin-x64: 0.3.0 - solana-bankrun-linux-x64-gnu: 0.3.0 - solana-bankrun-linux-x64-musl: 0.3.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - string-argv@0.3.2: {} string-width@7.2.0: @@ -1211,42 +547,14 @@ snapshots: strip-final-newline@3.0.0: {} - superstruct@0.15.5: {} - - superstruct@2.0.2: {} - - text-encoding-utf-8@1.0.2: {} - - through@2.3.8: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - toml@3.0.0: {} - - tr46@0.0.3: {} - - tslib@2.6.3: {} - typescript@5.4.5: {} undici-types@5.26.5: {} - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -1257,14 +565,4 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - yaml@2.9.0: {} From 6934a3800a42ceb97030304616b45b7efe591016 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 4 Jun 2026 19:51:33 +0000 Subject: [PATCH 011/138] test(token-extensions): add LiteSVM Rust tests for multiple-extensions and default-account-state native examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These two native examples only had TypeScript tests that import from `node:test` while being run under `ts-mocha`, so mocha discovered zero tests, printed "0 passing", and exited 0 โ€” the suites were never actually executed in CI (false green). Add real Rust LiteSVM integration tests (matching the pattern used by the basics native examples) that exercise each program end to end: - multiple-extensions: creates a Token-2022 mint and asserts the MintCloseAuthority (with the expected authority) and NonTransferable extensions are present. - default-account-state: creates a Token-2022 mint and asserts the DefaultAccountState extension was flipped from Frozen to Initialized. LiteSVM bundles the SPL Token-2022 program, so no extra fixtures are needed beyond the program .so that CI builds via `cargo build-sbf`. --- Cargo.lock | 12 +++ .../native/program/Cargo.toml | 8 ++ .../native/program/tests/test.rs | 77 ++++++++++++++++++ .../native/program/Cargo.toml | 8 ++ .../native/program/tests/test.rs | 79 +++++++++++++++++++ 5 files changed, 184 insertions(+) create mode 100644 tokens/token-extensions/default-account-state/native/program/tests/test.rs create mode 100644 tokens/token-extensions/multiple-extensions/native/program/tests/test.rs diff --git a/Cargo.lock b/Cargo.lock index 59f2c1cc..c043d3e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5276,8 +5276,14 @@ version = "0.1.0" dependencies = [ "borsh", "borsh-derive 1.6.1", + "litesvm", + "solana-instruction", + "solana-keypair", + "solana-native-token", "solana-program 4.0.0", + "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", + "solana-transaction 3.1.0", "spl-associated-token-account-interface", "spl-token-2022-interface", "spl-token-interface", @@ -5300,8 +5306,14 @@ version = "0.1.0" dependencies = [ "borsh", "borsh-derive 1.6.1", + "litesvm", + "solana-instruction", + "solana-keypair", + "solana-native-token", "solana-program 4.0.0", + "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", + "solana-transaction 3.1.0", "spl-token-2022-interface", ] diff --git a/tokens/token-extensions/default-account-state/native/program/Cargo.toml b/tokens/token-extensions/default-account-state/native/program/Cargo.toml index 81658934..d99df025 100644 --- a/tokens/token-extensions/default-account-state/native/program/Cargo.toml +++ b/tokens/token-extensions/default-account-state/native/program/Cargo.toml @@ -21,3 +21,11 @@ custom-panic = [] [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm.workspace = true +solana-instruction.workspace = true +solana-keypair.workspace = true +solana-native-token.workspace = true +solana-pubkey.workspace = true +solana-transaction.workspace = true diff --git a/tokens/token-extensions/default-account-state/native/program/tests/test.rs b/tokens/token-extensions/default-account-state/native/program/tests/test.rs new file mode 100644 index 00000000..5e2567e1 --- /dev/null +++ b/tokens/token-extensions/default-account-state/native/program/tests/test.rs @@ -0,0 +1,77 @@ +use { + litesvm::LiteSVM, + solana_instruction::{AccountMeta, Instruction}, + solana_keypair::{Keypair, Signer}, + solana_native_token::LAMPORTS_PER_SOL, + solana_pubkey::{pubkey, Pubkey}, + solana_transaction::Transaction, + spl_token_2022_interface::{ + extension::{ + default_account_state::DefaultAccountState, BaseStateWithExtensions, + StateWithExtensions, + }, + state::{AccountState, Mint}, + }, + token_2022_default_account_state_program::CreateTokenArgs, +}; + +const RENT_SYSVAR_ID: Pubkey = pubkey!("SysvarRent111111111111111111111111111111111"); + +#[test] +fn test_create_token_with_default_account_state() { + let mut svm = LiteSVM::new(); + + let program_id = Pubkey::new_unique(); + let program_bytes = + include_bytes!("../../tests/fixtures/token_2022_default_account_state_program.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + // litesvm bundles the SPL Token-2022 program by default. + let token_program_id = spl_token_2022_interface::id(); + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + let mint = Keypair::new(); + + let data = borsh::to_vec(&CreateTokenArgs { token_decimals: 9 }).unwrap(); + + // The mint authority is also the freeze authority, so it (== payer here) + // must sign the update_default_account_state CPI. Solana dedupes accounts + // by pubkey and ORs the signer flag, so reusing payer as the authority + // gives that account its required signature. + let ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), true), // mint account + AccountMeta::new(payer.pubkey(), false), // mint authority + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new_readonly(RENT_SYSVAR_ID, false), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), + AccountMeta::new_readonly(token_program_id, false), + ], + data, + }; + + let tx = Transaction::new_signed_with_payer( + &[ix], + Some(&payer.pubkey()), + &[&payer, &mint], + svm.latest_blockhash(), + ); + + svm.send_transaction(tx).unwrap(); + + // The mint should be owned by Token-2022, carry the DefaultAccountState + // extension, and that default state should have been flipped to + // Initialized by the program (it starts as Frozen). + let mint_account = svm.get_account(&mint.pubkey()).unwrap(); + assert_eq!(mint_account.owner, token_program_id); + + let state = StateWithExtensions::::unpack(&mint_account.data).unwrap(); + assert_eq!(state.base.decimals, 9); + assert!(state.base.is_initialized); + + let default_state = state.get_extension::().unwrap(); + assert_eq!(default_state.state, AccountState::Initialized as u8); +} diff --git a/tokens/token-extensions/multiple-extensions/native/program/Cargo.toml b/tokens/token-extensions/multiple-extensions/native/program/Cargo.toml index d8d654ee..6a264c37 100644 --- a/tokens/token-extensions/multiple-extensions/native/program/Cargo.toml +++ b/tokens/token-extensions/multiple-extensions/native/program/Cargo.toml @@ -19,3 +19,11 @@ custom-panic = [] [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm.workspace = true +solana-instruction.workspace = true +solana-keypair.workspace = true +solana-native-token.workspace = true +solana-pubkey.workspace = true +solana-transaction.workspace = true diff --git a/tokens/token-extensions/multiple-extensions/native/program/tests/test.rs b/tokens/token-extensions/multiple-extensions/native/program/tests/test.rs new file mode 100644 index 00000000..f6f414a1 --- /dev/null +++ b/tokens/token-extensions/multiple-extensions/native/program/tests/test.rs @@ -0,0 +1,79 @@ +use { + litesvm::LiteSVM, + solana_instruction::{AccountMeta, Instruction}, + solana_keypair::{Keypair, Signer}, + solana_native_token::LAMPORTS_PER_SOL, + solana_pubkey::{pubkey, Pubkey}, + solana_transaction::Transaction, + spl_token_2022_interface::{ + extension::{ + mint_close_authority::MintCloseAuthority, non_transferable::NonTransferable, + BaseStateWithExtensions, StateWithExtensions, + }, + state::Mint, + }, + token_2022_multiple_extensions_program::CreateTokenArgs, +}; + +const RENT_SYSVAR_ID: Pubkey = pubkey!("SysvarRent111111111111111111111111111111111"); + +#[test] +fn test_create_token_with_multiple_extensions() { + let mut svm = LiteSVM::new(); + + let program_id = Pubkey::new_unique(); + let program_bytes = + include_bytes!("../../tests/fixtures/token_2022_multiple_extensions_program.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + // litesvm bundles the SPL Token-2022 program by default. + let token_program_id = spl_token_2022_interface::id(); + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + let mint = Keypair::new(); + + let data = borsh::to_vec(&CreateTokenArgs { token_decimals: 9 }).unwrap(); + + let ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), true), // mint account + AccountMeta::new(payer.pubkey(), false), // mint authority + AccountMeta::new(payer.pubkey(), false), // close authority + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new_readonly(RENT_SYSVAR_ID, false), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), + AccountMeta::new_readonly(token_program_id, false), + ], + data, + }; + + let tx = Transaction::new_signed_with_payer( + &[ix], + Some(&payer.pubkey()), + &[&payer, &mint], + svm.latest_blockhash(), + ); + + svm.send_transaction(tx).unwrap(); + + // The mint should now exist, be owned by Token-2022, and carry both the + // MintCloseAuthority and NonTransferable extensions. + let mint_account = svm.get_account(&mint.pubkey()).unwrap(); + assert_eq!(mint_account.owner, token_program_id); + + let state = StateWithExtensions::::unpack(&mint_account.data).unwrap(); + assert_eq!(state.base.decimals, 9); + assert!(state.base.is_initialized); + + let close_authority = state.get_extension::().unwrap(); + let close_authority_key: Option = close_authority.close_authority.into(); + assert_eq!(close_authority_key, Some(payer.pubkey())); + + // NonTransferable has no fields; its presence is what we assert. + state + .get_extension::() + .expect("NonTransferable extension should be present"); +} From 1e39179e523463005e62110d0e009234a4670346 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 4 Jun 2026 20:43:05 +0000 Subject: [PATCH 012/138] test(escrow): migrate native escrow off solana-program 1.18 and add LiteSVM test The escrow native program was pinned to solana-program =1.18.17, whose curve25519-dalek 3.2.1 dependency requires zeroize <1.4. That conflicts with any modern test dependency (litesvm / solana-keypair 3.x pull ed25519-dalek 2 -> zeroize >=1.5), so the program could not be given a LiteSVM Rust test while on the old toolchain. Its only existing test was a TypeScript suite that imported from `node:test` but ran under `ts-mocha`, so it executed zero tests (false green). Migrate the program to the same modern dependencies the rest of the repo uses: - solana-program 4.0 + solana-system-interface for the system program - spl-token-interface / spl-associated-token-account-interface (the lightweight client crates built on the split solana-* crates) Required code changes: - The deprecated `spl_token::instruction::transfer` (which would fail `clippy -D warnings`) is replaced with `transfer_checked`, reading the decimals from the mint accounts the instructions already receive. The external account interface is unchanged. - `AccountInfo::realloc(0, true)` -> `resize(0)` (renamed in solana 4.0). Add a LiteSVM integration test covering the full make-offer / take-offer flow: mint two tokens, make an offer (asserting the vault is funded), take it, and assert the vault + offer accounts are closed and both parties received the expected amounts. --- finance/escrow/native/Cargo.lock | 3048 ++++++++++++----- finance/escrow/native/program/Cargo.toml | 15 +- .../program/src/instructions/make_offer.rs | 18 +- .../program/src/instructions/take_offer.rs | 30 +- finance/escrow/native/program/src/utils.rs | 2 +- finance/escrow/native/program/tests/test.rs | 178 + 6 files changed, 2462 insertions(+), 829 deletions(-) create mode 100644 finance/escrow/native/program/tests/test.rs diff --git a/finance/escrow/native/Cargo.lock b/finance/escrow/native/Cargo.lock index 80a2e2b0..e33c721a 100644 --- a/finance/escrow/native/Cargo.lock +++ b/finance/escrow/native/Cargo.lock @@ -4,30 +4,30 @@ version = 4 [[package]] name = "aead" -version = "0.4.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ + "crypto-common", "generic-array", ] [[package]] name = "aes" -version = "0.7.5" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", "cpufeatures", - "opaque-debug", ] [[package]] name = "aes-gcm-siv" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589c637f0e68c877bbd59a4599bbe849cac8e5f3e4b5a3ebae8f528cd218dcdc" +checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" dependencies = [ "aead", "aes", @@ -39,14 +39,71 @@ dependencies = [ ] [[package]] -name = "ahash" -version = "0.7.8" +name = "agave-feature-set" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +checksum = "bfe79fc4c114c51ea8461d829bb49853a21a76c7c8ef20e9041b071558f628ce" dependencies = [ - "getrandom 0.2.17", - "once_cell", - "version_check", + "ahash", + "solana-epoch-schedule", + "solana-hash 3.1.0", + "solana-pubkey 3.0.0", + "solana-sha256-hasher", + "solana-svm-feature-set", +] + +[[package]] +name = "agave-reserved-account-keys" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e8ceb5117fa390898f473b0d165f88482a2b36fb4a47441d8b40e22823207cb" +dependencies = [ + "agave-feature-set", + "solana-pubkey 3.0.0", + "solana-sdk-ids", +] + +[[package]] +name = "agave-syscalls" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98807b80e4367cc38c2b24ea30d6d16466553982aeedb0b0cb2c70bbae8ba5b0" +dependencies = [ + "bincode", + "libsecp256k1", + "num-traits", + "solana-account", + "solana-account-info", + "solana-big-mod-exp", + "solana-blake3-hasher", + "solana-bn254", + "solana-clock", + "solana-cpi", + "solana-curve25519", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keccak-hasher", + "solana-loader-v3-interface", + "solana-poseidon", + "solana-program-entrypoint", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-secp256k1-recover", + "solana-sha256-hasher", + "solana-stable-layout", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-type-overrides", + "solana-sysvar 3.1.1", + "solana-sysvar-id", + "solana-transaction-context", + "thiserror 2.0.18", ] [[package]] @@ -56,20 +113,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", + "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", ] -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - [[package]] name = "allocator-api2" version = "0.2.21" @@ -77,10 +126,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] -name = "anyhow" -version = "1.0.101" +name = "ansi_term" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] [[package]] name = "ark-bn254" @@ -88,9 +140,20 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" dependencies = [ - "ark-ec", - "ark-ff", - "ark-std", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-std 0.5.0", ] [[package]] @@ -99,13 +162,34 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" dependencies = [ - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "hashbrown 0.13.2", - "itertools", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.2", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-integer", "num-traits", "zeroize", ] @@ -116,20 +200,40 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "digest 0.10.7", - "itertools", - "num-bigint", + "itertools 0.10.5", + "num-bigint 0.4.6", "num-traits", "paste", "rustc_version", "zeroize", ] +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "paste", + "zeroize", +] + [[package]] name = "ark-ff-asm" version = "0.4.2" @@ -140,42 +244,93 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.116", +] + [[package]] name = "ark-ff-macros" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ - "num-bigint", + "num-bigint 0.4.6", "num-traits", "proc-macro2", "quote", "syn 1.0.109", ] +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.116", +] + [[package]] name = "ark-poly" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "hashbrown 0.13.2", ] +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.2", +] + [[package]] name = "ark-serialize" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ - "ark-serialize-derive", - "ark-std", + "ark-serialize-derive 0.4.2", + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive 0.5.0", + "ark-std 0.5.0", + "arrayvec", "digest 0.10.7", - "num-bigint", + "num-bigint 0.4.6", ] [[package]] @@ -189,6 +344,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + [[package]] name = "ark-std" version = "0.4.0" @@ -199,6 +365,16 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -212,21 +388,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] -name = "assert_matches" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" - -[[package]] -name = "atty" -version = "0.2.14" +name = "ascii" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", -] +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" [[package]] name = "autocfg" @@ -234,6 +399,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[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" @@ -242,9 +413,15 @@ checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" [[package]] name = "base64" -version = "0.21.7" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bincode" @@ -260,18 +437,6 @@ name = "bitflags" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" -dependencies = [ - "serde_core", -] - -[[package]] -name = "bitmaps" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" -dependencies = [ - "typenum", -] [[package]] name = "blake3" @@ -293,7 +458,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "block-padding", "generic-array", ] @@ -306,68 +470,16 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "borsh" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" -dependencies = [ - "borsh-derive 0.9.3", - "hashbrown 0.11.2", -] - -[[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.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" dependencies = [ - "borsh-derive 1.6.0", + "borsh-derive", "cfg_aliases", ] -[[package]] -name = "borsh-derive" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" -dependencies = [ - "borsh-derive-internal 0.9.3", - "borsh-schema-derive-internal 0.9.3", - "proc-macro-crate 0.1.5", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "borsh-derive" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" -dependencies = [ - "borsh-derive-internal 0.10.4", - "borsh-schema-derive-internal 0.10.4", - "proc-macro-crate 0.1.5", - "proc-macro2", - "syn 1.0.109", -] - [[package]] name = "borsh-derive" version = "1.6.0" @@ -375,62 +487,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" dependencies = [ "once_cell", - "proc-macro-crate 3.4.0", + "proc-macro-crate", "proc-macro2", "quote", "syn 2.0.116", ] [[package]] -name = "borsh-derive-internal" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[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.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "borsh-schema-derive-internal" -version = "0.10.4" +name = "bs58" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "tinyvec", ] -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" - [[package]] name = "bumpalo" version = "3.20.1" @@ -480,8 +551,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" dependencies = [ "find-msvc-tools", - "jobserver", - "libc", "shlex", ] @@ -498,42 +567,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] -name = "chrono" -version = "0.4.43" +name = "cfg_eval" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" dependencies = [ - "num-traits", + "proc-macro2", + "quote", + "syn 2.0.116", ] [[package]] name = "cipher" -version = "0.3.0" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "generic-array", + "crypto-common", + "inout", ] [[package]] -name = "console_error_panic_hook" -version = "0.1.7" +name = "combine" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" dependencies = [ - "cfg-if", - "wasm-bindgen", + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", ] [[package]] -name = "console_log" -version = "0.2.2" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" -dependencies = [ - "log", - "web-sys", -] +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "constant_time_eq" @@ -550,31 +621,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - [[package]] name = "crunchy" version = "0.2.4" @@ -582,63 +628,91 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] -name = "crypto-common" -version = "0.1.6" +name = "crypto-bigint" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "typenum", + "rand_core 0.6.4", + "subtle", + "zeroize", ] [[package]] -name = "crypto-mac" -version = "0.8.0" +name = "crypto-common" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", - "subtle", + "rand_core 0.6.4", + "typenum", ] [[package]] name = "ctr" -version = "0.8.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ "cipher", ] [[package]] name = "curve25519-dalek" -version = "3.2.1" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rand_core 0.6.4", + "rustc_version", "serde", "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.116", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + [[package]] name = "darling" -version = "0.20.11" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] name = "darling_core" -version = "0.20.11" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", @@ -648,17 +722,51 @@ dependencies = [ "syn 2.0.116", ] +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.116", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", + "quote", + "syn 2.0.116", +] + [[package]] name = "darling_macro" -version = "0.20.11" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "darling_core", + "darling_core 0.23.0", "quote", "syn 2.0.116", ] +[[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 = "derivation-path" version = "0.2.0" @@ -692,43 +800,66 @@ 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 = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + +[[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 = "ed25519" -version = "1.5.3" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ + "pkcs8", "signature", ] [[package]] name = "ed25519-dalek" -version = "1.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ "curve25519-dalek", "ed25519", - "rand 0.7.3", + "rand_core 0.6.4", "serde", - "sha2 0.9.9", + "sha2 0.10.9", + "subtle", "zeroize", ] [[package]] -name = "ed25519-dalek-bip32" -version = "0.2.0" +name = "educe" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" dependencies = [ - "derivation-path", - "ed25519-dalek", - "hmac 0.12.1", - "sha2 0.10.9", + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.116", ] [[package]] @@ -738,16 +869,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] -name = "env_logger" -version = "0.9.3" +name = "elliptic-curve" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685adfa4d6f3d765a26bc5dbc936577de9abf756c1feeb3089b01dd395034842" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", ] [[package]] @@ -760,11 +937,18 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" name = "escrow-native-program" version = "0.1.0" dependencies = [ - "borsh 1.6.0", + "borsh", + "litesvm", + "solana-instruction", + "solana-keypair", + "solana-native-token", "solana-program", - "spl-associated-token-account", - "spl-token", - "thiserror", + "solana-pubkey 3.0.0", + "solana-system-interface 2.0.0", + "solana-transaction", + "spl-associated-token-account-interface", + "spl-token-interface", + "thiserror 1.0.69", ] [[package]] @@ -773,6 +957,22 @@ 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 = "find-msvc-tools" version = "0.1.9" @@ -780,16 +980,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] -name = "fnv" -version = "1.0.7" +name = "five8" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "23f76610e969fa1784327ded240f1e28a3fd9520c9cec93b636fcf62dd37f772" +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 = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059c31d7d36c43fe39d89e55711858b4da8be7eb6dabac23c7289b1a19489406" [[package]] -name = "foldhash" -version = "0.1.5" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "generic-array" @@ -797,9 +1015,9 @@ version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ - "serde", "typenum", "version_check", + "zeroize", ] [[package]] @@ -809,10 +1027,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.9.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -841,12 +1057,23 @@ dependencies = [ ] [[package]] -name = "hashbrown" -version = "0.11.2" +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 = "hash32" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" dependencies = [ - "ahash 0.7.8", + "byteorder", ] [[package]] @@ -855,7 +1082,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.12", + "ahash", ] [[package]] @@ -865,8 +1092,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", - "equivalent", - "foldhash", ] [[package]] @@ -876,87 +1101,71 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] -name = "hermit-abi" -version = "0.1.19" +name = "hmac" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "libc", + "digest 0.10.7", ] [[package]] -name = "hmac" -version = "0.8.1" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] -name = "hmac" -version = "0.12.1" +name = "indexmap" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ - "digest 0.10.7", + "equivalent", + "hashbrown 0.16.1", ] [[package]] -name = "hmac-drbg" -version = "0.3.0" +name = "inout" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ - "digest 0.9.0", "generic-array", - "hmac 0.8.1", ] [[package]] -name = "humantime" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" - -[[package]] -name = "ident_case" -version = "1.0.1" +name = "itertools" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] [[package]] -name = "im" -version = "15.1.0" +name = "itertools" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ - "bitmaps", - "rand_core 0.6.4", - "rand_xoshiro", - "rayon", - "serde", - "sized-chunks", - "typenum", - "version_check", + "either", ] [[package]] -name = "indexmap" -version = "2.13.0" +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ - "equivalent", - "hashbrown 0.16.1", + "either", ] [[package]] name = "itertools" -version = "0.10.5" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] @@ -968,23 +1177,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] -name = "jobserver" -version = "0.1.34" +name = "js-sys" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ - "getrandom 0.3.4", - "libc", + "once_cell", + "wasm-bindgen", ] [[package]] -name = "js-sys" -version = "0.3.85" +name = "k256" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", "once_cell", - "wasm-bindgen", + "sha2 0.10.9", + "signature", ] [[package]] @@ -1017,14 +1230,12 @@ dependencies = [ "arrayref", "base64 0.12.3", "digest 0.9.0", - "hmac-drbg", "libsecp256k1-core", "libsecp256k1-gen-ecmult", "libsecp256k1-gen-genmult", "rand 0.7.3", "serde", "sha2 0.9.9", - "typenum", ] [[package]] @@ -1062,10 +1273,86 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" dependencies = [ - "ark-bn254", - "ark-ff", - "num-bigint", - "thiserror", + "ark-bn254 0.4.0", + "ark-ff 0.4.2", + "num-bigint 0.4.6", + "thiserror 1.0.69", +] + +[[package]] +name = "light-poseidon" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47a1ccadd0bb5a32c196da536fd72c59183de24a055f6bf0513bf845fefab862" +dependencies = [ + "ark-bn254 0.5.0", + "ark-ff 0.5.0", + "num-bigint 0.4.6", + "thiserror 1.0.69", +] + +[[package]] +name = "litesvm" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "347d8c652d592c618ac996f2ab21f8c0b0f2da3fbbca227a6887ee61bb75f2de" +dependencies = [ + "agave-feature-set", + "agave-reserved-account-keys", + "agave-syscalls", + "ansi_term", + "bincode", + "indexmap", + "itertools 0.14.0", + "log", + "serde", + "solana-account", + "solana-address 2.3.0", + "solana-address-lookup-table-interface", + "solana-bpf-loader-program", + "solana-builtins", + "solana-clock", + "solana-compute-budget", + "solana-compute-budget-instruction", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-feature-gate-interface", + "solana-fee", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction", + "solana-instructions-sysvar", + "solana-keypair", + "solana-last-restart-slot", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-message", + "solana-native-token", + "solana-nonce", + "solana-nonce-account", + "solana-precompile-error", + "solana-program-error", + "solana-program-runtime", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-sha256-hasher", + "solana-signature", + "solana-signer", + "solana-slot-hashes", + "solana-slot-history", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-log-collector", + "solana-svm-timings", + "solana-svm-transaction", + "solana-system-interface 2.0.0", + "solana-system-program", + "solana-sysvar 3.1.1", + "solana-sysvar-id", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "thiserror 2.0.18", ] [[package]] @@ -1089,15 +1376,6 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" -[[package]] -name = "memmap2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" -dependencies = [ - "libc", -] - [[package]] name = "memoffset" version = "0.9.1" @@ -1120,35 +1398,93 @@ dependencies = [ ] [[package]] -name = "num-bigint" -version = "0.4.6" +name = "num" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" dependencies = [ + "num-bigint 0.2.6", + "num-complex", "num-integer", + "num-iter", + "num-rational", "num-traits", ] [[package]] -name = "num-derive" -version = "0.4.2" +name = "num-bigint" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", + "autocfg", + "num-integer", + "num-traits", ] [[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" +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-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "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.116", +] + +[[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-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1174,7 +1510,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate", "proc-macro2", "quote", "syn 2.0.116", @@ -1222,13 +1558,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] -name = "pbkdf2" -version = "0.4.0" +name = "pastey" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" -dependencies = [ - "crypto-mac", -] +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" [[package]] name = "pbkdf2" @@ -1245,11 +1578,30 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "polyval" -version = "0.5.3" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if", "cpufeatures", @@ -1266,15 +1618,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml", -] - [[package]] name = "proc-macro-crate" version = "3.4.0" @@ -1352,6 +1695,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -1372,6 +1725,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + [[package]] name = "rand_core" version = "0.5.1" @@ -1391,41 +1754,21 @@ dependencies = [ ] [[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 = "rand_xoshiro" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "rayon" -version = "1.11.0" +name = "rand_core" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ - "either", - "rayon-core", + "getrandom 0.3.4", ] [[package]] -name = "rayon-core" -version = "1.13.0" +name = "rand_hc" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "rand_core 0.5.1", ] [[package]] @@ -1438,39 +1781,20 @@ dependencies = [ ] [[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" +name = "rfc6979" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", + "hmac", + "subtle", ] [[package]] -name = "regex-syntax" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" - -[[package]] -name = "rustc-hash" -version = "1.1.0" +name = "rustc-demangle" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] name = "rustc_version" @@ -1493,6 +1817,20 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[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.27" @@ -1509,6 +1847,15 @@ dependencies = [ "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.19" @@ -1554,21 +1901,21 @@ dependencies = [ [[package]] name = "serde_with" -version = "2.3.3" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" dependencies = [ - "serde", + "serde_core", "serde_with_macros", ] [[package]] name = "serde_with_macros" -version = "2.3.3" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" dependencies = [ - "darling", + "darling 0.23.0", "proc-macro2", "quote", "syn 2.0.116", @@ -1599,16 +1946,10 @@ dependencies = [ ] [[package]] -name = "sha3" -version = "0.9.1" +name = "sha2-const-stable" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "keccak", - "opaque-debug", -] +checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" [[package]] name = "sha3" @@ -1628,446 +1969,1541 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signature" -version = "1.6.4" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] [[package]] -name = "siphasher" -version = "0.3.11" +name = "smallvec" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] -name = "sized-chunks" -version = "0.6.5" +name = "solana-account" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +checksum = "efc0ed36decb689413b9da5d57f2be49eea5bebb3cf7897015167b0c4336e731" dependencies = [ - "bitmaps", - "typenum", + "bincode", + "serde", + "serde_bytes", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-sysvar 3.1.1", ] [[package]] -name = "smallvec" -version = "1.15.1" +name = "solana-account-info" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" +dependencies = [ + "bincode", + "serde_core", + "solana-address 2.3.0", + "solana-program-error", + "solana-program-memory", +] [[package]] -name = "solana-frozen-abi" -version = "1.18.17" +name = "solana-address" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4867f66e9527fa44451c861c1dc6d9b2a7c7a668d7c6a297cdefbe39f4395b33" +checksum = "a2ecac8e1b7f74c2baa9e774c42817e3e75b20787134b76cc4d45e8a604488f5" dependencies = [ - "block-buffer 0.10.4", - "bs58", - "bv", - "either", - "generic-array", - "im", - "lazy_static", - "log", - "memmap2", - "rustc_version", + "solana-address 2.3.0", +] + +[[package]] +name = "solana-address" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "500b83d41bda401b84ebff6033e2e7bc828870ea444805112d15fc0a3e470b9c" +dependencies = [ + "borsh", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "five8", + "five8_const", "serde", - "serde_bytes", "serde_derive", - "sha2 0.10.9", - "solana-frozen-abi-macro", - "subtle", - "thiserror", + "sha2-const-stable", + "solana-atomic-u64", + "solana-define-syscall 5.1.0", + "solana-program-error", + "solana-sanitize", + "solana-sha256-hasher", + "wincode", ] [[package]] -name = "solana-frozen-abi-macro" -version = "1.18.17" +name = "solana-address-lookup-table-interface" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168f24d97347b85f05192df58d6be3e3047a4aadc4001bc1b9e711a5ec878eea" +checksum = "115b4f773acc4f3f3cb986b0d335e9845c0368c82b0940410935bc11ae065578" dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.116", + "bincode", + "bytemuck", + "serde", + "serde_derive", + "solana-clock", + "solana-instruction", + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-slot-hashes", ] [[package]] -name = "solana-logger" -version = "1.18.17" +name = "solana-atomic-u64" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0511082fc62f2d086520fff5aa1917c389d8c840930c08ad255ae05952c08a2" +checksum = "085db4906d89324cef2a30840d59eaecf3d4231c560ec7c9f6614a93c652f501" dependencies = [ - "env_logger", - "lazy_static", - "log", + "parking_lot", ] [[package]] -name = "solana-program" -version = "1.18.17" +name = "solana-big-mod-exp" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c80fb6d791b3925d5ec4bf23a7c169ef5090c013059ec3ed7d0b2c04efa085" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "solana-define-syscall 3.0.0", +] + +[[package]] +name = "solana-bincode" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc5a636dc75e5c25651e34f7a36afc9ae60d38166687c5b0375abb580ac81a2" +checksum = "278a1a5bad62cd9da89ac8d4b7ec444e83caa8ae96aa656dfc27684b28d49a5d" dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff", - "ark-serialize", - "base64 0.21.7", "bincode", - "bitflags", + "serde_core", + "solana-instruction-error", +] + +[[package]] +name = "solana-blake3-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7116e1d942a2432ca3f514625104757ab8a56233787e95144c93950029e31176" +dependencies = [ "blake3", - "borsh 0.10.4", - "borsh 0.9.3", - "borsh 1.6.0", - "bs58", - "bv", + "solana-define-syscall 4.0.1", + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-bn254" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ff13a8867fcc7b0f1114764e1bf6191b4551dcaf93729ddc676cd4ec6abc9f" +dependencies = [ + "ark-bn254 0.5.0", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", "bytemuck", - "cc", - "console_error_panic_hook", - "console_log", - "curve25519-dalek", - "getrandom 0.2.17", - "itertools", - "js-sys", - "lazy_static", - "libc", - "libsecp256k1", - "light-poseidon", + "solana-define-syscall 5.1.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-borsh" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c04abbae16f57178a163125805637b8a076175bb5c0002fb04f4792bea901cf7" +dependencies = [ + "borsh", +] + +[[package]] +name = "solana-bpf-loader-program" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb423db3faa08533a122f867456bb5b7aab211818af004552ea6df5f3c43ef49" +dependencies = [ + "agave-syscalls", + "bincode", + "qualifier_attr", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-instruction", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-packet", + "solana-program-entrypoint", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-transaction-context", +] + +[[package]] +name = "solana-builtins" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc47a5aefa70261825037efd942c2c78a600f4dcc110d59808b359c5d37aa941" +dependencies = [ + "agave-feature-set", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-hash 3.1.0", + "solana-loader-v4-program", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-program", + "solana-vote-program", + "solana-zk-elgamal-proof-program", + "solana-zk-token-proof-program", +] + +[[package]] +name = "solana-builtins-default-costs" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a91f5db54bebaffb93e8bd0d85575139597de7cb1ac32f040442fd66bc90ed0" +dependencies = [ + "agave-feature-set", + "ahash", "log", - "memoffset", - "num-bigint", - "num-derive", - "num-traits", - "parking_lot", - "rand 0.8.5", - "rustc_version", - "rustversion", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-loader-v4-program", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-program", + "solana-vote-program", +] + +[[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", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-compute-budget" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de86231371bf26dbcf473a0ea7ca424184db0c7720fafbb899d2fca2eaf1ac2" +dependencies = [ + "solana-fee-structure", + "solana-program-runtime", +] + +[[package]] +name = "solana-compute-budget-instruction" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27f3d546bf7f979423b8cca3c16ac9b51c80104b5f6bba77ef90b41aa00ec96d" +dependencies = [ + "agave-feature-set", + "log", + "solana-borsh", + "solana-builtins-default-costs", + "solana-compute-budget", + "solana-compute-budget-interface", + "solana-instruction", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-svm-transaction", + "solana-transaction-error", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-compute-budget-interface" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8292c436b269ad23cecc8b24f7da3ab07ca111661e25e00ce0e1d22771951ab9" +dependencies = [ + "borsh", + "solana-instruction", + "solana-sdk-ids", +] + +[[package]] +name = "solana-compute-budget-program" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b54b78862ca94a2a86354c22f2789ffd095c5f972c15ca104020697dd2cf3409" +dependencies = [ + "solana-program-runtime", +] + +[[package]] +name = "solana-cpi" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dea26709d867aada85d0d3617db0944215c8bb28d3745b912de7db13a23280c" +dependencies = [ + "solana-account-info", + "solana-define-syscall 4.0.1", + "solana-instruction", + "solana-program-error", + "solana-pubkey 4.2.0", + "solana-stable-layout", +] + +[[package]] +name = "solana-curve25519" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aff7432cdf2ec6a44ac06b4d64d2ee006f6c0066d6456e032a7fe25be40cd5c" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "solana-define-syscall 3.0.0", + "subtle", + "thiserror 2.0.18", +] + +[[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-derivation-path" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff71743072690fdbdfcdc37700ae1cb77485aaad49019473a81aee099b1e0b8c" +dependencies = [ + "derivation-path", + "qstring", + "uriparse", +] + +[[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.4.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[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", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[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 = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eb265ff95e28eceda117e2e3d2d2a611ecbbfe911dfeeeecd1521814540ffab" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 4.4.0", + "solana-instruction", + "solana-nonce", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-system-interface 3.1.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-feature-gate-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-account", + "solana-account-info", + "solana-instruction", + "solana-program-error", + "solana-pubkey 4.2.0", + "solana-rent 4.2.0", + "solana-sdk-ids", + "solana-system-interface 3.1.0", +] + +[[package]] +name = "solana-fee" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c276ea9723bfb6bf9fa2bcde1fa652140b0879d258c78a482533c9c01f71f416" +dependencies = [ + "agave-feature-set", + "solana-fee-structure", + "solana-svm-transaction", +] + +[[package]] +name = "solana-fee-calculator" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ee18959f176ba6229105c6c2a2ddaaa04bd53615af9277d834b113571bd205" +dependencies = [ + "log", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-fee-structure" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2abdb1223eea8ec64136f39cb1ffcf257e00f915c957c35c0dd9e3f4e700b0" + +[[package]] +name = "solana-hash" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "337c246447142f660f778cf6cb582beba8e28deb05b3b24bfb9ffd7c562e5f41" +dependencies = [ + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-hash" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe51db00ac3aa9f950d1e6201a126acfa26e6d81bc4a183ba64ec02effcad883" +dependencies = [ + "borsh", + "bytemuck", + "bytemuck_derive", + "five8", + "serde", + "serde_derive", + "solana-atomic-u64", + "solana-sanitize", +] + +[[package]] +name = "solana-instruction" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ebb0ffd19263051bc3f683fcc086134b8ff23af894dcb63f7563c7137b42f1" +dependencies = [ + "bincode", + "borsh", + "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", + "serde", + "serde_derive", + "solana-program-error", +] + +[[package]] +name = "solana-instructions-sysvar" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e0732294560e88ecdb2bbc656e67383e9f88c78ec09469cef172f0d28cd1bcd" +dependencies = [ + "bitflags", + "solana-account-info", + "solana-instruction", + "solana-instruction-error", + "solana-program-error", + "solana-sanitize", + "solana-sdk-ids", + "solana-serialize-utils", + "solana-sysvar-id", +] + +[[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.4.0", +] + +[[package]] +name = "solana-keypair" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "263d614c12aa267a3278703175fd6440552ca61bc960b5a02a4482720c53438b" +dependencies = [ + "ed25519-dalek", + "five8", + "five8_core", + "rand 0.9.4", + "solana-address 2.3.0", + "solana-seed-phrase", + "solana-signature", + "solana-signer", +] + +[[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", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[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", - "serde_json", - "sha2 0.10.9", - "sha3 0.10.8", - "solana-frozen-abi", - "solana-frozen-abi-macro", + "solana-instruction", + "solana-pubkey 4.2.0", + "solana-sdk-ids", +] + +[[package]] +name = "solana-loader-v4-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c948b33ff81fa89699911b207059e493defdba9647eaf18f23abdf3674e0fb" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "solana-loader-v4-program" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4495b9ef97f369302d882f752465c563ac2aaf7f52cd1a9cf15891a90f986f5f" +dependencies = [ + "log", + "solana-account", + "solana-bincode", + "solana-bpf-loader-program", + "solana-instruction", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-transaction-context", +] + +[[package]] +name = "solana-message" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" +dependencies = [ + "bincode", + "blake3", + "lazy_static", + "serde", + "serde_derive", + "solana-address 2.3.0", + "solana-hash 4.4.0", + "solana-instruction", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-transaction-error", +] + +[[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 = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8dd4c280dca9d046139eb5b7a5ac9ad10403fbd64964c7d7571214950d758f" + +[[package]] +name = "solana-nonce" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95dbc9f2e33b6c10e231df15cb2a3bff9ea7eab6347f9e316fe75c97fd67bbb" +dependencies = [ + "serde", + "serde_derive", + "solana-fee-calculator", + "solana-hash 4.4.0", + "solana-pubkey 4.2.0", + "solana-sha256-hasher", +] + +[[package]] +name = "solana-nonce-account" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805fd25b29e5a1a0e6c3dd6320c9da80f275fbe4ff6e392617c303a2085c435e" +dependencies = [ + "solana-account", + "solana-hash 3.1.0", + "solana-nonce", + "solana-sdk-ids", +] + +[[package]] +name = "solana-packet" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edf2f25743c95229ac0fdc32f8f5893ef738dbf332c669e9861d33ddb0f469d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "solana-poseidon" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13ac13134287d7af80717353a8136e3c515d7f34d88e6f116b47350bd623e338" +dependencies = [ + "ark-bn254 0.4.0", + "ark-bn254 0.5.0", + "light-poseidon 0.2.0", + "light-poseidon 0.4.0", + "solana-define-syscall 3.0.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-precompile-error" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cafcd950de74c6c39d55dc8ca108bbb007799842ab370ef26cf45a34453c31e1" +dependencies = [ + "num-traits", +] + +[[package]] +name = "solana-program" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778f08fb0eaf52c9a3bef2978247f7fab0ccfddc44cfddb936d5ad9f98ede886" +dependencies = [ + "memoffset", + "solana-account-info", + "solana-big-mod-exp", + "solana-blake3-hasher", + "solana-borsh", + "solana-clock", + "solana-cpi", + "solana-define-syscall 5.1.0", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-epoch-stake", + "solana-example-mocks", + "solana-fee-calculator", + "solana-hash 4.4.0", + "solana-instruction", + "solana-instruction-error", + "solana-instructions-sysvar", + "solana-keccak-hasher", + "solana-last-restart-slot", + "solana-msg", + "solana-native-token", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 4.2.0", + "solana-rent 4.2.0", + "solana-sdk-ids", + "solana-secp256k1-recover", + "solana-serde-varint", + "solana-serialize-utils", + "solana-sha256-hasher", + "solana-short-vec", + "solana-slot-hashes", + "solana-slot-history", + "solana-stable-layout", + "solana-sysvar 4.0.0", + "solana-sysvar-id", +] + +[[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", + "solana-define-syscall 4.0.1", + "solana-program-error", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-program-error" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f04fa578707b3612b095f0c8e19b66a1233f7c42ca8082fcb3b745afcc0add6" +dependencies = [ + "borsh", + "serde", + "serde_derive", +] + +[[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 = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a88006a9b8594088cec9027ab77caaaa258a2aaa2083d3f086c44b42e50aeab" + +[[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", +] + +[[package]] +name = "solana-program-runtime" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c03c5100c43bf28fd03a11b66345ccdc28c1b7e5a7d49dbcff64e6442595627" +dependencies = [ + "base64 0.22.1", + "bincode", + "itertools 0.12.1", + "log", + "percentage", + "rand 0.8.5", + "serde", + "solana-account", + "solana-account-info", + "solana-clock", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-loader-v3-interface", + "solana-program-entrypoint", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-slot-hashes", + "solana-stable-layout", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-transaction", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-sysvar 3.1.1", + "solana-sysvar-id", + "solana-transaction-context", + "thiserror 2.0.18", +] + +[[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.3.0", +] + +[[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", "solana-sdk-macro", - "thiserror", - "tiny-bip39", - "wasm-bindgen", - "zeroize", + "solana-sysvar-id", +] + +[[package]] +name = "solana-rent" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9809b081e99bc142ce803bcd7ee18306759ce3b30a96a9da3f6f41c45e50ef0" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-sanitize" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" + +[[package]] +name = "solana-sbpf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15b079e08471a9dbfe1e48b2c7439c85aa2a055cbd54eddd8bd257b0a7dbb29" +dependencies = [ + "byteorder", + "combine", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "thiserror 2.0.18", + "winapi", +] + +[[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.3.0", +] + +[[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.116", +] + +[[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-seed-derivable" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff7bdb72758e3bec33ed0e2658a920f1f35dfb9ed576b951d20d63cb61ecd95c" +dependencies = [ + "solana-derivation-path", +] + +[[package]] +name = "solana-seed-phrase" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc905b200a95f2ea9146e43f2a7181e3aeb55de6bc12afb36462d00a3c7310de" +dependencies = [ + "hmac", + "pbkdf2", + "sha2 0.10.9", +] + +[[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 = "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", +] + +[[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.9", + "solana-define-syscall 4.0.1", + "solana-hash 4.4.0", +] + +[[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 = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "132a93134f1262aa832f1849b83bec6c9945669b866da18661a427943b9e801e" +dependencies = [ + "ed25519-dalek", + "five8", + "serde", + "serde-big-array", + "serde_derive", + "solana-sanitize", + "wincode", +] + +[[package]] +name = "solana-signer" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bfea97951fee8bae0d6038f39a5efcb6230ecdfe33425ac75196d1a1e3e3235" +dependencies = [ + "solana-pubkey 3.0.0", + "solana-signature", + "solana-transaction-error", +] + +[[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.4.0", + "solana-sdk-ids", + "solana-sysvar-id", +] + +[[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", + "solana-sysvar-id", ] [[package]] -name = "solana-sdk" -version = "1.18.17" +name = "solana-stable-layout" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df43d3a1e1637397ab43cbc216a5a8f977ec8a3cc3f3ae8c3851c83a3255dbcf" +checksum = "c9f6a291ba063a37780af29e7db14bdd3dc447584d8ba5b3fc4b88e2bbc982fa" +dependencies = [ + "solana-instruction", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-stake-interface" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9bc26191b533f9a6e5a14cca05174119819ced680a80febff2f5051a713f0db" dependencies = [ - "assert_matches", - "base64 0.21.7", - "bincode", - "bitflags", - "borsh 1.6.0", - "bs58", - "bytemuck", - "byteorder", - "chrono", - "derivation-path", - "digest 0.10.7", - "ed25519-dalek", - "ed25519-dalek-bip32", - "generic-array", - "hmac 0.12.1", - "itertools", - "js-sys", - "lazy_static", - "libsecp256k1", - "log", - "memmap2", - "num-derive", "num-traits", - "num_enum", - "pbkdf2 0.11.0", - "qstring", - "qualifier_attr", - "rand 0.7.3", - "rand 0.8.5", - "rustc_version", - "rustversion", "serde", - "serde_bytes", "serde_derive", - "serde_json", - "serde_with", - "sha2 0.10.9", - "sha3 0.10.8", - "siphasher", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-logger", - "solana-program", - "solana-sdk-macro", - "thiserror", - "uriparse", - "wasm-bindgen", + "solana-clock", + "solana-cpi", + "solana-instruction", + "solana-program-error", + "solana-pubkey 3.0.0", + "solana-system-interface 2.0.0", + "solana-sysvar 3.1.1", + "solana-sysvar-id", ] [[package]] -name = "solana-sdk-macro" -version = "1.18.17" +name = "solana-svm-callback" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86c76414183a325038ff020b22c07d1e9d2da0703ddc0244acfed37ee2921d96" +checksum = "012617d16d2994673d98792f7f6d93f612dea00b1b747a3c4aec24c12547875b" dependencies = [ - "bs58", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.116", + "solana-account", + "solana-clock", + "solana-precompile-error", + "solana-pubkey 3.0.0", ] [[package]] -name = "solana-security-txt" -version = "1.1.2" +name = "solana-svm-feature-set" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "156bb61a96c605fa124e052d630dba2f6fb57e08c7d15b757e1e958b3ed7b3fe" +checksum = "7cc2e2fdebd77159b7a14ee45c9dbb3f1d202e8e7ccc14e4cda78c006a7a78a9" + +[[package]] +name = "solana-svm-log-collector" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ce188c2c438ced63a975af79f06db2ff5accaf1a4027a26e35783be566f6070" dependencies = [ - "hashbrown 0.15.2", + "log", ] [[package]] -name = "solana-zk-token-sdk" -version = "1.18.17" +name = "solana-svm-measure" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea64909ba06fa651c95c4db35614430b1a0bc722e51996e97b5b779e3528bad" + +[[package]] +name = "solana-svm-timings" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513407f88394e437b4ff5aad892bc5bf51a655ae2401e6e63549734d3695c46f" +checksum = "a8a05b09e2caac9b4d7c35c5997d754433e15ee5f506509117eb77032e1718ac" +dependencies = [ + "eager", + "enum-iterator", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-svm-transaction" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be3250a278a769ba59059e13d0f16c2aba0ca1de7595fb0e02556091751560c8" +dependencies = [ + "solana-hash 3.1.0", + "solana-message", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-signature", + "solana-transaction", +] + +[[package]] +name = "solana-svm-type-overrides" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b78cd0bfb102d4197ce8c590f800a119ba0d358369ca57b0f66e94d1317fd0e" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "solana-system-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" dependencies = [ - "aes-gcm-siv", - "base64 0.21.7", - "bincode", - "bytemuck", - "byteorder", - "curve25519-dalek", - "getrandom 0.1.16", - "itertools", - "lazy_static", - "merlin", - "num-derive", "num-traits", - "rand 0.7.3", "serde", - "serde_json", - "sha3 0.9.1", - "solana-program", - "solana-sdk", - "subtle", - "thiserror", - "zeroize", + "serde_derive", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey 3.0.0", ] [[package]] -name = "spl-associated-token-account" -version = "3.0.4" +name = "solana-system-interface" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143109d789171379e6143ef23191786dfaac54289ad6e7917cfb26b36c432b10" +checksum = "a95a6f2e23ed861d6444ad4a6d6896c418d7d101b960787e65a8e33157cee81b" dependencies = [ - "assert_matches", - "borsh 1.6.0", - "num-derive", "num-traits", - "solana-program", - "spl-token", - "spl-token-2022", - "thiserror", + "serde", + "serde_derive", + "solana-address 2.3.0", + "solana-instruction", + "solana-msg", + "solana-program-error", ] [[package]] -name = "spl-discriminator" -version = "0.2.5" +name = "solana-system-program" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210101376962bb22bb13be6daea34656ea1cbc248fce2164b146e39203b55e03" +checksum = "8b4b6faeddf5a62c06991a9a077fd1097da6867060f884595a659b3b24dc3a4a" dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator-derive", + "bincode", + "log", + "serde", + "solana-account", + "solana-bincode", + "solana-fee-calculator", + "solana-instruction", + "solana-nonce", + "solana-nonce-account", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-sysvar 3.1.1", + "solana-transaction-context", +] + +[[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", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-define-syscall 4.0.1", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash 4.4.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-pubkey 4.2.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-slot-hashes", + "solana-slot-history", + "solana-sysvar-id", ] [[package]] -name = "spl-discriminator-derive" -version = "0.2.0" +name = "solana-sysvar" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" +checksum = "1632b69b4f72489db5949a10e8308c229dfa003f99ecaa7477b376807c7b81f4" dependencies = [ - "quote", - "spl-discriminator-syn", - "syn 2.0.116", + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-define-syscall 5.1.0", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash 4.4.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-pubkey 4.2.0", + "solana-rent 4.2.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-slot-hashes", + "solana-slot-history", + "solana-sysvar-id", ] [[package]] -name = "spl-discriminator-syn" -version = "0.2.1" +name = "solana-sysvar-id" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d1dbc82ab91422345b6df40a79e2b78c7bce1ebb366da323572dd60b7076b67" +checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" dependencies = [ - "proc-macro2", - "quote", - "sha2 0.10.9", - "syn 2.0.116", - "thiserror", + "solana-address 2.3.0", + "solana-sdk-ids", ] [[package]] -name = "spl-memo" -version = "4.0.4" +name = "solana-transaction" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49f49f95f2d02111ded31696ab38a081fab623d4c76bd4cb074286db4560836" +checksum = "96697cff5075a028265324255efed226099f6d761ca67342b230d09f72cc48d2" dependencies = [ - "solana-program", + "bincode", + "serde", + "serde_derive", + "solana-address 2.3.0", + "solana-hash 4.4.0", + "solana-instruction", + "solana-instruction-error", + "solana-message", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-signature", + "solana-signer", + "solana-transaction-error", ] [[package]] -name = "spl-pod" -version = "0.2.5" +name = "solana-transaction-context" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c52d84c55efeef8edcc226743dc089d7e3888b8e3474569aa3eff152b37b9996" +checksum = "b1a3c3a69688293a195b02c60a5384d855b8de19981f404c71ccb9e7f139b98f" dependencies = [ - "borsh 1.6.0", - "bytemuck", - "solana-program", - "solana-zk-token-sdk", - "spl-program-error", + "bincode", + "serde", + "solana-account", + "solana-instruction", + "solana-instructions-sysvar", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sbpf", + "solana-sdk-ids", ] [[package]] -name = "spl-program-error" -version = "0.4.4" +name = "solana-transaction-error" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45a49acb925db68aa501b926096b2164adbdcade7a0c24152af9f0742d0a602" +checksum = "4a2165ad25b694c654d5395fc7a049452a192376e4c96a7fad05580f6ba5ba1c" dependencies = [ - "num-derive", - "num-traits", - "solana-program", - "spl-program-error-derive", - "thiserror", + "serde", + "serde_derive", + "solana-instruction-error", + "solana-sanitize", ] [[package]] -name = "spl-program-error-derive" -version = "0.4.1" +name = "solana-vote-interface" +version = "4.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" +checksum = "db6e123e16bfdd7a81d71b4c4699e0b29580b619f4cd2ef5b6aae1eb85e8979f" dependencies = [ - "proc-macro2", - "quote", - "sha2 0.10.9", - "syn 2.0.116", + "bincode", + "cfg_eval", + "num-derive", + "num-traits", + "serde", + "serde_derive", + "serde_with", + "solana-clock", + "solana-hash 3.1.0", + "solana-instruction", + "solana-instruction-error", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-serde-varint", + "solana-serialize-utils", + "solana-short-vec", + "solana-system-interface 2.0.0", ] [[package]] -name = "spl-tlv-account-resolution" -version = "0.6.5" +name = "solana-vote-program" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fab8edfd37be5fa17c9e42c1bff86abbbaf0494b031b37957f2728ad2ff842ba" +checksum = "4164d0eb4760cbdb3dd46457999dba735079774381fe4042a70ec7484930a297" dependencies = [ + "agave-feature-set", + "bincode", + "log", + "num-derive", + "num-traits", + "serde", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-epoch-schedule", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keypair", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-signer", + "solana-slot-hashes", + "solana-transaction", + "solana-transaction-context", + "solana-vote-interface", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-zk-elgamal-proof-program" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f30c80edc4aac841745f7e93bbf1afc27d2b496b8ae9fe9777935151cb9352" +dependencies = [ + "agave-feature-set", "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "num-derive", + "num-traits", + "solana-instruction", + "solana-program-runtime", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-zk-sdk", ] [[package]] -name = "spl-token" -version = "4.0.3" +name = "solana-zk-sdk" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9eb465e4bf5ce1d498f05204c8089378c1ba34ef2777ea95852fc53a1fd4fb2" +checksum = "9602bcb1f7af15caef92b91132ec2347e1c51a72ecdbefdaefa3eac4b8711475" dependencies = [ - "arrayref", + "aes-gcm-siv", + "base64 0.22.1", + "bincode", "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "getrandom 0.2.17", + "itertools 0.12.1", + "js-sys", + "merlin", "num-derive", "num-traits", - "num_enum", - "solana-program", - "thiserror", + "rand 0.8.5", + "serde", + "serde_derive", + "serde_json", + "sha3", + "solana-derivation-path", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", + "subtle", + "thiserror 2.0.18", + "wasm-bindgen", + "zeroize", ] [[package]] -name = "spl-token-2022" -version = "3.0.5" +name = "solana-zk-token-proof-program" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c39e416aeb1ea0b22f3b2bbecaf7e38a92a1aa8f4a0c5785c94179694e846a0" +checksum = "962938a9994cc6d54b46b5f0d6a978024f4847272f560f8f11edd1575a0d8e8f" dependencies = [ - "arrayref", + "agave-feature-set", "bytemuck", "num-derive", "num-traits", - "num_enum", - "solana-program", - "solana-security-txt", + "solana-instruction", + "solana-program-runtime", + "solana-sdk-ids", + "solana-svm-log-collector", "solana-zk-token-sdk", - "spl-memo", - "spl-pod", - "spl-token", - "spl-token-group-interface", - "spl-token-metadata-interface", - "spl-transfer-hook-interface", - "spl-type-length-value", - "thiserror", ] [[package]] -name = "spl-token-group-interface" -version = "0.2.5" +name = "solana-zk-token-sdk" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "014817d6324b1e20c4bbc883e8ee30a5faa13e59d91d1b2b95df98b920150c17" +checksum = "6e5fe47f0389206960e272a6f1af3b06c2b32551be77f9e4254564b6d1177b83" dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode", "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "bytemuck_derive", + "curve25519-dalek", + "itertools 0.12.1", + "merlin", + "num-derive", + "num-traits", + "rand 0.8.5", + "serde", + "serde_json", + "sha3", + "solana-curve25519", + "solana-derivation-path", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", + "subtle", + "thiserror 2.0.18", + "zeroize", ] [[package]] -name = "spl-token-metadata-interface" -version = "0.3.5" +name = "spki" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3da00495b602ebcf5d8ba8b3ecff1ee454ce4c125c9077747be49c2d62335ba" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ - "borsh 1.6.0", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "base64ct", + "der", ] [[package]] -name = "spl-transfer-hook-interface" -version = "0.6.5" +name = "spl-associated-token-account-interface" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b5c08a89838e5a2931f79b17f611857f281a14a2100968a3ccef352cb7414b" +checksum = "e6433917b60441d68d99a17e121d9db0ea15a9a69c0e5afa34649cf5ba12612f" dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-tlv-account-resolution", - "spl-type-length-value", + "solana-instruction", + "solana-pubkey 3.0.0", ] [[package]] -name = "spl-type-length-value" -version = "0.4.6" +name = "spl-token-interface" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c872f93d0600e743116501eba2d53460e73a12c9a496875a42a7d70e034fe06d" +checksum = "8c564ac05a7c8d8b12e988a37d82695b5ba4db376d07ea98bc4882c81f96c7f3" dependencies = [ + "arrayref", "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "num-derive", + "num-traits", + "num_enum", + "solana-instruction", + "solana-program-error", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "thiserror 2.0.18", ] [[package]] @@ -2078,9 +3514,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.4.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -2105,21 +3541,21 @@ dependencies = [ ] [[package]] -name = "termcolor" -version = "1.4.1" +name = "thiserror" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "winapi-util", + "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" -version = "1.0.69" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.18", ] [[package]] @@ -2134,22 +3570,14 @@ dependencies = [ ] [[package]] -name = "tiny-bip39" -version = "0.8.2" +name = "thiserror-impl" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ - "anyhow", - "hmac 0.8.1", - "once_cell", - "pbkdf2 0.4.0", - "rand 0.7.3", - "rustc-hash", - "sha2 0.9.9", - "thiserror", - "unicode-normalization", - "wasm-bindgen", - "zeroize", + "proc-macro2", + "quote", + "syn 2.0.116", ] [[package]] @@ -2167,15 +3595,6 @@ 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_datetime" version = "0.7.5+spec-1.1.0" @@ -2219,22 +3638,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] -name = "unicode-normalization" -version = "0.1.25" +name = "universal-hash" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ - "tinyvec", + "crypto-common", + "subtle", ] [[package]] -name = "universal-hash" -version = "0.4.1" +name = "unreachable" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" dependencies = [ - "generic-array", - "subtle", + "void", ] [[package]] @@ -2253,6 +3672,12 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" @@ -2319,16 +3744,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "web-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "winapi" version = "0.3.9" @@ -2345,15 +3760,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -2361,20 +3767,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-link" -version = "0.2.1" +name = "wincode" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +checksum = "466e67917609b2d40a838a5b972d1a6237c9749600cb8de8f65559b90d48485b" +dependencies = [ + "pastey", + "proc-macro2", + "quote", + "thiserror 2.0.18", + "wincode-derive", +] [[package]] -name = "windows-sys" -version = "0.61.2" +name = "wincode-derive" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +checksum = "26a7a568eda854acc9945ed136a9d50b8c6d31911584624958808ae96eee3912" dependencies = [ - "windows-link", + "darling 0.21.3", + "proc-macro2", + "quote", + "syn 2.0.116", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "winnow" version = "0.7.14" @@ -2412,9 +3834,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.3.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] diff --git a/finance/escrow/native/program/Cargo.toml b/finance/escrow/native/program/Cargo.toml index 70d3b8c6..e052a5e5 100644 --- a/finance/escrow/native/program/Cargo.toml +++ b/finance/escrow/native/program/Cargo.toml @@ -5,9 +5,10 @@ edition = "2021" [dependencies] borsh = "1.5.1" -solana-program = "=1.18.17" -spl-token = { version = "4.0.0", features = [ "no-entrypoint" ] } -spl-associated-token-account = { version = "3.0.4", features = [ "no-entrypoint" ] } +solana-program = "4.0" +solana-system-interface = { version = "2.0.0", features = ["bincode"] } +spl-token-interface = "2.0.0" +spl-associated-token-account-interface = "2.0.0" thiserror = "1.0.0" [lib] @@ -19,3 +20,11 @@ custom-panic = [] [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-native-token = "3.0.0" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.1" diff --git a/finance/escrow/native/program/src/instructions/make_offer.rs b/finance/escrow/native/program/src/instructions/make_offer.rs index d9a99a67..0b502059 100644 --- a/finance/escrow/native/program/src/instructions/make_offer.rs +++ b/finance/escrow/native/program/src/instructions/make_offer.rs @@ -9,11 +9,14 @@ use { program_pack::Pack, pubkey::Pubkey, rent::Rent, - system_instruction, sysvar::Sysvar, }, - spl_associated_token_account::instruction as associated_token_account_instruction, - spl_token::{instruction as token_instruction, state::Account as TokenAccount}, + solana_system_interface::instruction as system_instruction, + spl_associated_token_account_interface::instruction as associated_token_account_instruction, + spl_token_interface::{ + instruction as token_instruction, + state::{Account as TokenAccount, Mint}, + }, }; #[derive(BorshDeserialize, BorshSerialize, Debug)] @@ -123,18 +126,25 @@ impl MakeOffer { // transfer Mint A tokens to vault // + // `transfer` is deprecated in favour of `transfer_checked`, which also + // verifies the mint and its decimals. Read the decimals from the mint + // account the caller passed in. + let mint_a_decimals = Mint::unpack(&token_mint_a.data.borrow())?.decimals; invoke( - &token_instruction::transfer( + &token_instruction::transfer_checked( token_program.key, maker_token_account_a.key, + token_mint_a.key, vault.key, maker.key, &[maker.key], args.token_a_offered_amount, + mint_a_decimals, )?, &[ token_program.clone(), maker_token_account_a.clone(), + token_mint_a.clone(), vault.clone(), maker.clone(), ], diff --git a/finance/escrow/native/program/src/instructions/take_offer.rs b/finance/escrow/native/program/src/instructions/take_offer.rs index 716e784b..0fd4f643 100644 --- a/finance/escrow/native/program/src/instructions/take_offer.rs +++ b/finance/escrow/native/program/src/instructions/take_offer.rs @@ -9,8 +9,11 @@ use { program_pack::Pack, pubkey::Pubkey, }, - spl_associated_token_account::instruction as associated_token_account_instruction, - spl_token::{instruction as token_instruction, state::Account as TokenAccount}, + spl_associated_token_account_interface::instruction as associated_token_account_instruction, + spl_token_interface::{ + instruction as token_instruction, + state::{Account as TokenAccount, Mint}, + }, }; #[derive(BorshDeserialize, BorshSerialize, Debug)] @@ -141,20 +144,29 @@ impl TakeOffer { ); solana_program::msg!("Taker B Balance Before Transfer: {}", taker_amount_b); - // taker transfer mint a tokens to vault + // `transfer` is deprecated in favour of `transfer_checked`, which also + // verifies the mint and its decimals. Read the decimals from the mint + // accounts the caller passed in. + let mint_a_decimals = Mint::unpack(&token_mint_a.data.borrow())?.decimals; + let mint_b_decimals = Mint::unpack(&token_mint_b.data.borrow())?.decimals; + + // taker transfers mint B tokens to the maker // invoke( - &token_instruction::transfer( + &token_instruction::transfer_checked( token_program.key, taker_token_account_b.key, + token_mint_b.key, maker_token_account_b.key, taker.key, &[taker.key], offer.token_b_wanted_amount, + mint_b_decimals, )?, &[ token_program.clone(), taker_token_account_b.clone(), + token_mint_b.clone(), maker_token_account_b.clone(), taker.clone(), ], @@ -163,13 +175,15 @@ impl TakeOffer { // transfer from vault to taker // invoke_signed( - &token_instruction::transfer( + &token_instruction::transfer_checked( token_program.key, vault.key, + token_mint_a.key, taker_token_account_a.key, offer_info.key, &[offer_info.key, taker.key], vault_amount_a, + mint_a_decimals, )?, &[ token_mint_a.clone(), @@ -205,7 +219,7 @@ impl TakeOffer { // close the vault account // invoke_signed( - &spl_token::instruction::close_account( + &token_instruction::close_account( token_program.key, vault.key, taker.key, @@ -222,9 +236,9 @@ impl TakeOffer { **offer_info.lamports.borrow_mut() -= lamports; **payer.lamports.borrow_mut() += lamports; - // Realloc the account to zero + // Resize the account to zero // - offer_info.realloc(0, true)?; + offer_info.resize(0)?; // Assign the account to the System Program // diff --git a/finance/escrow/native/program/src/utils.rs b/finance/escrow/native/program/src/utils.rs index 0d3276fc..509e3c97 100644 --- a/finance/escrow/native/program/src/utils.rs +++ b/finance/escrow/native/program/src/utils.rs @@ -7,7 +7,7 @@ pub fn assert_is_associated_token_account( mint: &Pubkey, ) -> Result<(), ProgramError> { let associated_token_account_address = - &spl_associated_token_account::get_associated_token_address(owner, mint); + &spl_associated_token_account_interface::address::get_associated_token_address(owner, mint); if token_address != associated_token_account_address { return Err(EscrowError::TokenAccountMismatch.into()); diff --git a/finance/escrow/native/program/tests/test.rs b/finance/escrow/native/program/tests/test.rs new file mode 100644 index 00000000..379727d5 --- /dev/null +++ b/finance/escrow/native/program/tests/test.rs @@ -0,0 +1,178 @@ +use { + litesvm::LiteSVM, + solana_instruction::{AccountMeta, Instruction}, + solana_keypair::{Keypair, Signer}, + solana_native_token::LAMPORTS_PER_SOL, + solana_program::program_pack::Pack, + solana_pubkey::Pubkey, + solana_system_interface::instruction::create_account, + solana_transaction::Transaction, + spl_associated_token_account_interface::{ + address::get_associated_token_address, instruction::create_associated_token_account, + }, + spl_token_interface::{ + instruction::{initialize_mint2, mint_to}, + state::{Account as TokenAccount, Mint}, + }, +}; + +// borsh-encoded `EscrowInstruction` discriminants (see program/src/lib.rs). +const MAKE_OFFER: u8 = 0; +const TAKE_OFFER: u8 = 1; + +const DECIMALS: u8 = 6; +const MINTED_AMOUNT: u64 = 100 * 1_000_000; // 100 tokens at 6 decimals +const AMOUNT_A: u64 = 4 * 1_000_000; // offered +const AMOUNT_B: u64 = 1_000_000; // wanted +const OFFER_ID: u64 = 0; + +/// Sign with `payer` (fee payer) plus any extra signers and send the tx, +/// asserting success. +fn send(svm: &mut LiteSVM, payer: &Keypair, ixs: &[Instruction], extra_signers: &[&Keypair]) { + let mut signers: Vec<&Keypair> = vec![payer]; + signers.extend_from_slice(extra_signers); + let tx = Transaction::new_signed_with_payer( + ixs, + Some(&payer.pubkey()), + &signers, + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); +} + +/// Create `mint`, an ATA for `holder`, and mint `MINTED_AMOUNT` into it. The +/// payer is the mint + freeze authority. +fn mint_tokens(svm: &mut LiteSVM, payer: &Keypair, mint: &Keypair, holder: &Pubkey) { + let token_program = spl_token_interface::id(); + let rent = svm.minimum_balance_for_rent_exemption(Mint::LEN); + + let create_mint_account = create_account( + &payer.pubkey(), + &mint.pubkey(), + rent, + Mint::LEN as u64, + &token_program, + ); + let init_mint = initialize_mint2( + &token_program, + &mint.pubkey(), + &payer.pubkey(), + Some(&payer.pubkey()), + DECIMALS, + ) + .unwrap(); + send(svm, payer, &[create_mint_account, init_mint], &[mint]); + + let ata = get_associated_token_address(holder, &mint.pubkey()); + let create_ata = + create_associated_token_account(&payer.pubkey(), holder, &mint.pubkey(), &token_program); + let mint_to_ix = mint_to( + &token_program, + &mint.pubkey(), + &ata, + &payer.pubkey(), + &[], + MINTED_AMOUNT, + ) + .unwrap(); + send(svm, payer, &[create_ata, mint_to_ix], &[]); +} + +fn token_amount(svm: &LiteSVM, address: &Pubkey) -> u64 { + let account = svm.get_account(address).unwrap(); + TokenAccount::unpack(&account.data).unwrap().amount +} + +#[test] +fn test_escrow_make_and_take() { + let mut svm = LiteSVM::new(); + let program_id = Pubkey::new_unique(); + let program_bytes = include_bytes!("../../tests/fixtures/escrow_native_program.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 100) + .unwrap(); + + let maker = Keypair::new(); + let taker = Keypair::new(); + let mint_a = Keypair::new(); + let mint_b = Keypair::new(); + svm.airdrop(&maker.pubkey(), LAMPORTS_PER_SOL).unwrap(); + svm.airdrop(&taker.pubkey(), LAMPORTS_PER_SOL).unwrap(); + + // Maker holds Mint A, taker holds Mint B. + mint_tokens(&mut svm, &payer, &mint_a, &maker.pubkey()); + mint_tokens(&mut svm, &payer, &mint_b, &taker.pubkey()); + + let token_program = spl_token_interface::id(); + let ata_program = spl_associated_token_account_interface::program::id(); + let system_program = solana_system_interface::program::ID; + + let (offer, _bump) = Pubkey::find_program_address( + &[b"offer", maker.pubkey().as_ref(), &OFFER_ID.to_le_bytes()], + &program_id, + ); + let vault = get_associated_token_address(&offer, &mint_a.pubkey()); + let maker_account_a = get_associated_token_address(&maker.pubkey(), &mint_a.pubkey()); + let maker_account_b = get_associated_token_address(&maker.pubkey(), &mint_b.pubkey()); + let taker_account_a = get_associated_token_address(&taker.pubkey(), &mint_a.pubkey()); + let taker_account_b = get_associated_token_address(&taker.pubkey(), &mint_b.pubkey()); + + // ---- Make Offer ---- + let mut make_data = vec![MAKE_OFFER]; + make_data.extend_from_slice(&OFFER_ID.to_le_bytes()); + make_data.extend_from_slice(&AMOUNT_A.to_le_bytes()); + make_data.extend_from_slice(&AMOUNT_B.to_le_bytes()); + + let make_ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(offer, false), + AccountMeta::new_readonly(mint_a.pubkey(), false), + AccountMeta::new_readonly(mint_b.pubkey(), false), + AccountMeta::new(maker_account_a, false), + AccountMeta::new(vault, false), + AccountMeta::new(maker.pubkey(), true), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new_readonly(token_program, false), + AccountMeta::new_readonly(ata_program, false), + AccountMeta::new_readonly(system_program, false), + ], + data: make_data, + }; + send(&mut svm, &payer, &[make_ix], &[&maker]); + + // Vault should hold the offered Mint A amount. + assert_eq!(token_amount(&svm, &vault), AMOUNT_A); + + // ---- Take Offer ---- + let take_ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(offer, false), + AccountMeta::new_readonly(mint_a.pubkey(), false), + AccountMeta::new_readonly(mint_b.pubkey(), false), + AccountMeta::new(maker_account_b, false), + AccountMeta::new(taker_account_a, false), + AccountMeta::new(taker_account_b, false), + AccountMeta::new(vault, false), + AccountMeta::new_readonly(maker.pubkey(), false), + AccountMeta::new(taker.pubkey(), true), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new_readonly(token_program, false), + AccountMeta::new_readonly(ata_program, false), + AccountMeta::new_readonly(system_program, false), + ], + data: vec![TAKE_OFFER], + }; + send(&mut svm, &payer, &[take_ix], &[&taker]); + + // Offer + vault should be closed (zero-lamport accounts are purged). + assert!(svm.get_account(&offer).map(|a| a.lamports).unwrap_or(0) == 0); + assert!(svm.get_account(&vault).map(|a| a.lamports).unwrap_or(0) == 0); + + // Taker received Mint A; maker received Mint B. + assert_eq!(token_amount(&svm, &taker_account_a), AMOUNT_A); + assert_eq!(token_amount(&svm, &maker_account_b), AMOUNT_B); +} From 5f11dbcf0bb2dd8d337c663eb4b5c220a3389c5a Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 4 Jun 2026 20:59:11 +0000 Subject: [PATCH 013/138] chore(native): remove false-green TypeScript suites now covered by Rust tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The three native examples now have real LiteSVM Rust tests, so their TypeScript suites โ€” which imported from `node:test` but ran under `ts-mocha`, executing zero tests (false green) โ€” are removed along with their now-unused JS tooling (ts-mocha, mocha, chai, solana-bankrun, etc.) and tsconfig.json. `build-and-test` is rewired to just build the program .so into tests/fixtures, which is what the LiteSVM `cargo test` consumes; the empty lockfiles keep `pnpm install --frozen-lockfile` passing in CI. Also fix the stale .gitignore exception path for the escrow Cargo.lock (escrow moved from tokens/ to finance/) and document the real reason it stays tracked (standalone, non-workspace crate). --- .gitignore | 5 +- finance/escrow/native/package.json | 22 +- finance/escrow/native/pnpm-lock.yaml | 1507 +------------ finance/escrow/native/tests/account.ts | 25 - finance/escrow/native/tests/instruction.ts | 112 - finance/escrow/native/tests/test.ts | 112 - finance/escrow/native/tests/utils.ts | 170 -- finance/escrow/native/tsconfig.json | 10 - .../default-account-state/native/package.json | 23 +- .../native/pnpm-lock.yaml | 1861 +---------------- .../native/tests/test.ts | 67 - .../native/tsconfig.json | 10 - .../multiple-extensions/native/package.json | 23 +- .../multiple-extensions/native/pnpm-lock.yaml | 1861 +---------------- .../multiple-extensions/native/tests/test.ts | 59 - .../multiple-extensions/native/tsconfig.json | 10 - 16 files changed, 12 insertions(+), 5865 deletions(-) delete mode 100644 finance/escrow/native/tests/account.ts delete mode 100644 finance/escrow/native/tests/instruction.ts delete mode 100644 finance/escrow/native/tests/test.ts delete mode 100644 finance/escrow/native/tests/utils.ts delete mode 100644 finance/escrow/native/tsconfig.json delete mode 100644 tokens/token-extensions/default-account-state/native/tests/test.ts delete mode 100644 tokens/token-extensions/default-account-state/native/tsconfig.json delete mode 100644 tokens/token-extensions/multiple-extensions/native/tests/test.ts delete mode 100644 tokens/token-extensions/multiple-extensions/native/tsconfig.json diff --git a/.gitignore b/.gitignore index 94ff54c0..e3147d99 100644 --- a/.gitignore +++ b/.gitignore @@ -8,8 +8,9 @@ node_modules/ **/*/node_modules **/*/package-lock.json **/*/Cargo.lock -# Exception: escrow native needs Cargo.lock to pin blake3 (see tokens/escrow/native/Cargo.toml) -!tokens/escrow/native/Cargo.lock +# Exception: escrow native is a standalone (non-workspace) crate, so it keeps +# its Cargo.lock tracked for reproducible builds. +!finance/escrow/native/Cargo.lock **/*/.anchor **/*/.DS_Store diff --git a/finance/escrow/native/package.json b/finance/escrow/native/package.json index f4b1d26d..00385f8d 100644 --- a/finance/escrow/native/package.json +++ b/finance/escrow/native/package.json @@ -1,25 +1,7 @@ { "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/spl-token": "^0.4.9", - "@solana/web3.js": "^1.98.4", - "bn.js": "^5.2.2" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^10.0.9", - "@types/node": "^22.8.6", - "borsh": "^2.0.0", - "chai": "^4.3.4", - "mocha": "^10.8.2", - "solana-bankrun": "^0.4.0", - "ts-mocha": "^10.0.0", - "typescript": "^5" + "deploy": "solana program deploy ./program/target/so/escrow_native_program.so" } } diff --git a/finance/escrow/native/pnpm-lock.yaml b/finance/escrow/native/pnpm-lock.yaml index 9e82e241..9b60ae17 100644 --- a/finance/escrow/native/pnpm-lock.yaml +++ b/finance/escrow/native/pnpm-lock.yaml @@ -6,1509 +6,4 @@ settings: importers: - .: - dependencies: - '@solana/spl-token': - specifier: ^0.4.9 - version: 0.4.9(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) - bn.js: - specifier: ^5.2.2 - version: 5.2.2 - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^10.0.9 - version: 10.0.9 - '@types/node': - specifier: ^22.8.6 - version: 22.8.6 - borsh: - specifier: ^2.0.0 - version: 2.0.0 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^10.8.2 - version: 10.8.2 - solana-bankrun: - specifier: ^0.4.0 - version: 0.4.0(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@10.8.2) - typescript: - specifier: ^5 - version: 5.6.3 - -packages: - - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.6.0': - resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.5.0': - resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout-utils@0.2.0': - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.0.0-rc.1': - resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-data-structures@2.0.0-rc.1': - resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.0.0-rc.1': - resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-strings@2.0.0-rc.1': - resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - typescript: '>=5' - - '@solana/codecs@2.0.0-rc.1': - resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.0.0-rc.1': - resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} - hasBin: true - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/options@2.0.0-rc.1': - resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} - peerDependencies: - typescript: '>=5' - - '@solana/spl-token-group@0.0.7': - resolution: {integrity: sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.95.3 - - '@solana/spl-token-metadata@0.1.6': - resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.95.3 - - '@solana/spl-token@0.4.9': - resolution: {integrity: sha512-g3wbj4F4gq82YQlwqhPB0gHFXfgsC6UmyGMxtSLf/BozT/oKd59465DbnlUK8L8EcimKMavxsVAMoLcEdeCicg==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.95.3 - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.13': - resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@10.0.9': - resolution: {integrity: sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.8.6': - resolution: {integrity: sha512-tosuJYKrIqjQIlVCM4PEGxOmyg3FCPa/fViuJChnGeEIhjA46oy8FMVoF9su1/v8PNs2a8Q0iFNyOx0uOF91nw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.5.12': - resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} - - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.10: - resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.1.2: - resolution: {integrity: sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@10.8.2: - resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} - engines: {node: '>= 14.0.0'} - hasBin: true - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.2: - resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.0.4: - resolution: {integrity: sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - solana-bankrun-darwin-arm64@0.4.0: - resolution: {integrity: sha512-6dz78Teoz7ez/3lpRLDjktYLJb79FcmJk2me4/YaB8WiO6W43OdExU4h+d2FyuAryO2DgBPXaBoBNY/8J1HJmw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.4.0: - resolution: {integrity: sha512-zSSw/Jx3KNU42pPMmrEWABd0nOwGJfsj7nm9chVZ3ae7WQg3Uty0hHAkn5NSDCj3OOiN0py9Dr1l9vmRJpOOxg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.4.0: - resolution: {integrity: sha512-LWjs5fsgHFtyr7YdJR6r0Ho5zrtzI6CY4wvwPXr8H2m3b4pZe6RLIZjQtabCav4cguc14G0K8yQB2PTMuGub8w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.4.0: - resolution: {integrity: sha512-SrlVrb82UIxt21Zr/XZFHVV/h9zd2/nP25PMpLJVLD7Pgl2yhkhfi82xj3OjxoQqWe+zkBJ+uszA0EEKr67yNw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.4.0: - resolution: {integrity: sha512-Nv328ZanmURdYfcLL+jwB1oMzX4ZzK57NwIcuJjGlf0XSNLq96EoaO5buEiUTo4Ls7MqqMyLbClHcrPE7/aKyA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.4.0: - resolution: {integrity: sha512-NMmXUipPBkt8NgnyNO3SCnPERP6xT/AMNMBooljGA3+rG6NN8lmXJsKeLqQTiFsDeWD74U++QM/DgcueSWvrIg==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.0: - resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - workerpool@6.5.1: - resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.26.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@noble/curves@1.6.0': - dependencies: - '@noble/hashes': 1.5.0 - - '@noble/hashes@1.5.0': {} - - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) - bigint-buffer: 1.1.5 - bignumber.js: 9.1.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.0.0-rc.1(typescript@5.6.3)': - dependencies: - '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) - typescript: 5.6.3 - - '@solana/codecs-core@2.3.0(typescript@5.6.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.6.3) - typescript: 5.6.3 - - '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.6.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.6.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) - typescript: 5.6.3 - - '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.6.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) - typescript: 5.6.3 - - '@solana/codecs-numbers@2.3.0(typescript@5.6.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.6.3) - '@solana/errors': 2.3.0(typescript@5.6.3) - typescript: 5.6.3 - - '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.6.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) - fastestsmallesttextencoderdecoder: 1.0.22 - typescript: 5.6.3 - - '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@2.0.0-rc.1(typescript@5.6.3)': - dependencies: - chalk: 5.3.0 - commander: 12.1.0 - typescript: 5.6.3 - - '@solana/errors@2.3.0(typescript@5.6.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 5.6.3 - - '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/spl-token-group@0.0.7(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': - dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': - dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - - '@solana/spl-token@0.4.9(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) - '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.26.0 - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.6.3) - agentkeepalive: 4.5.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.0.4 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.13': - dependencies: - tslib: 2.8.0 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.8.6 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.8.6 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@10.0.9': {} - - '@types/node@12.20.55': {} - - '@types/node@22.8.6': - dependencies: - undici-types: 6.19.8 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.8.6 - - '@types/ws@8.5.12': - dependencies: - '@types/node': 22.8.6 - - JSONStream@1.3.5: - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.3: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.10: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - - bignumber.js@9.1.2: {} - - binary-extensions@2.3.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.10 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.2 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.3.0: {} - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@12.1.0: {} - - commander@14.0.3: {} - - commander@2.20.3: {} - - debug@4.3.7(supports-color@8.1.1): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.2.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - file-uri-to-path@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - - jayson@4.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - JSONStream: 1.3.5 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - jsonparse@1.3.1: {} - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@10.8.2: - dependencies: - ansi-colors: 4.1.3 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.7(supports-color@8.1.1) - diff: 5.2.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 8.1.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.1.6 - ms: 2.1.3 - serialize-javascript: 6.0.2 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.5.1 - yargs: 16.2.0 - yargs-parser: 20.2.9 - yargs-unparser: 2.0.0 - - ms@2.1.3: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.2: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - regenerator-runtime@0.14.1: {} - - require-directory@2.1.1: {} - - rpc-websockets@9.0.4: - dependencies: - '@swc/helpers': 0.5.13 - '@types/uuid': 8.3.4 - '@types/ws': 8.5.12 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.4.0: - optional: true - - solana-bankrun-darwin-universal@0.4.0: - optional: true - - solana-bankrun-darwin-x64@0.4.0: - optional: true - - solana-bankrun-linux-x64-gnu@0.4.0: - optional: true - - solana-bankrun-linux-x64-musl@0.4.0: - optional: true - - solana-bankrun@0.4.0(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.4.0 - solana-bankrun-darwin-universal: 0.4.0 - solana-bankrun-darwin-x64: 0.4.0 - solana-bankrun-linux-x64-gnu: 0.4.0 - solana-bankrun-linux-x64-musl: 0.4.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - through@2.3.8: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.0.0(mocha@10.8.2): - dependencies: - mocha: 10.8.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.0: {} - - type-detect@4.1.0: {} - - typescript@5.6.3: {} - - undici-types@6.19.8: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.2 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - workerpool@6.5.1: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.9: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + .: {} diff --git a/finance/escrow/native/tests/account.ts b/finance/escrow/native/tests/account.ts deleted file mode 100644 index 0e88dc80..00000000 --- a/finance/escrow/native/tests/account.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as borsh from "borsh"; - -export const OfferSchema = { - struct: { - id: "u64", - maker: { array: { type: "u8", len: 32 } }, - token_mint_a: { array: { type: "u8", len: 32 } }, - token_mint_b: { array: { type: "u8", len: 32 } }, - token_b_wanted_amount: "u64", - bump: "u8", - }, -}; - -export type OfferRaw = { - id: bigint; - maker: Uint8Array; - token_mint_a: Uint8Array; - token_mint_b: Uint8Array; - token_b_wanted_amount: bigint; - bump: number; -}; - -export function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); -} diff --git a/finance/escrow/native/tests/instruction.ts b/finance/escrow/native/tests/instruction.ts deleted file mode 100644 index 19fa0e75..00000000 --- a/finance/escrow/native/tests/instruction.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID } from "@solana/spl-token"; -import { type PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; -import type BN from "bn.js"; -import * as borsh from "borsh"; - -enum EscrowInstruction { - MakeOffer = 0, - TakeOffer = 1, -} - -const MakeOfferSchema = { - struct: { - instruction: "u8", - id: "u64", - token_a_offered_amount: "u64", - token_b_wanted_amount: "u64", - }, -}; - -const TakeOfferSchema = { - struct: { - instruction: "u8", - }, -}; - -function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); -} - -export function buildMakeOffer(props: { - id: BN; - token_a_offered_amount: BN; - token_b_wanted_amount: BN; - offer: PublicKey; - mint_a: PublicKey; - mint_b: PublicKey; - maker_token_a: PublicKey; - vault: PublicKey; - maker: PublicKey; - payer: PublicKey; - programId: PublicKey; -}) { - const data = borshSerialize(MakeOfferSchema, { - instruction: EscrowInstruction.MakeOffer, - id: props.id, - token_a_offered_amount: props.token_a_offered_amount, - token_b_wanted_amount: props.token_b_wanted_amount, - }); - - return new TransactionInstruction({ - keys: [ - { pubkey: props.offer, isSigner: false, isWritable: true }, - { pubkey: props.mint_a, isSigner: false, isWritable: false }, - { pubkey: props.mint_b, isSigner: false, isWritable: false }, - { pubkey: props.maker_token_a, isSigner: false, isWritable: true }, - { pubkey: props.vault, isSigner: false, isWritable: true }, - { pubkey: props.maker, isSigner: true, isWritable: true }, - { pubkey: props.payer, isSigner: true, isWritable: true }, - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, - { - pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: props.programId, - data, - }); -} - -export function buildTakeOffer(props: { - offer: PublicKey; - mint_a: PublicKey; - mint_b: PublicKey; - maker_token_b: PublicKey; - taker_token_a: PublicKey; - taker_token_b: PublicKey; - vault: PublicKey; - taker: PublicKey; - maker: PublicKey; - payer: PublicKey; - programId: PublicKey; -}) { - const data = borshSerialize(TakeOfferSchema, { - instruction: EscrowInstruction.TakeOffer, - }); - - return new TransactionInstruction({ - keys: [ - { pubkey: props.offer, isSigner: false, isWritable: true }, - { pubkey: props.mint_a, isSigner: false, isWritable: false }, - { pubkey: props.mint_b, isSigner: false, isWritable: false }, - { pubkey: props.maker_token_b, isSigner: false, isWritable: true }, - { pubkey: props.taker_token_a, isSigner: false, isWritable: true }, - { pubkey: props.taker_token_b, isSigner: false, isWritable: true }, - { pubkey: props.vault, isSigner: false, isWritable: true }, - { pubkey: props.maker, isSigner: false, isWritable: false }, - { pubkey: props.taker, isSigner: true, isWritable: true }, - { pubkey: props.payer, isSigner: true, isWritable: true }, - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, - { - pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: props.programId, - data, - }); -} diff --git a/finance/escrow/native/tests/test.ts b/finance/escrow/native/tests/test.ts deleted file mode 100644 index 62f40bad..00000000 --- a/finance/escrow/native/tests/test.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { describe, test } from "node:test"; -import { AccountLayout } from "@solana/spl-token"; -import { PublicKey, Transaction } from "@solana/web3.js"; -import * as borsh from "borsh"; -import { assert } from "chai"; -import { start } from "solana-bankrun"; -import { type OfferRaw, OfferSchema } from "./account"; -import { buildMakeOffer, buildTakeOffer } from "./instruction"; -import { createValues, mintingTokens } from "./utils"; - -describe("Escrow!", async () => { - const values = createValues(); - - const context = await start([{ name: "escrow_native_program", programId: values.programId }], []); - - const client = context.banksClient; - const payer = context.payer; - - console.log(`Program Address : ${values.programId}`); - console.log(`Payer Address : ${payer.publicKey}`); - - test("mint tokens to maker and taker", async () => { - // mint token a to maker account - await mintingTokens({ - context, - holder: values.maker, - mintKeypair: values.mintAKeypair, - }); - - // mint Token B to Taker account - await mintingTokens({ - context, - holder: values.taker, - mintKeypair: values.mintBKeypair, - }); - }); - - test("Make Offer", async () => { - const ix = buildMakeOffer({ - id: values.id, - maker: values.maker.publicKey, - maker_token_a: values.makerAccountA, - offer: values.offer, - token_a_offered_amount: values.amountA, - token_b_wanted_amount: values.amountB, - vault: values.vault, - mint_a: values.mintAKeypair.publicKey, - mint_b: values.mintBKeypair.publicKey, - payer: payer.publicKey, - programId: values.programId, - }); - - const blockhash = context.lastBlockhash; - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, values.maker); - await client.processTransaction(tx); - - const offerInfo = await client.getAccount(values.offer); - const offer = borsh.deserialize(OfferSchema, Buffer.from(offerInfo.data)) as OfferRaw; - - const vaultInfo = await client.getAccount(values.vault); - const vaultTokenAccount = AccountLayout.decode(vaultInfo.data); - - assert(offer.id.toString() === values.id.toString(), "wrong id"); - // borsh deserializes pubkeys as raw byte arrays, wrap in PublicKey for comparison - assert(new PublicKey(offer.maker).toBase58() === values.maker.publicKey.toBase58(), "maker key does not match"); - assert(new PublicKey(offer.token_mint_a).toBase58() === values.mintAKeypair.publicKey.toBase58(), "wrong mint A"); - assert(new PublicKey(offer.token_mint_b).toBase58() === values.mintBKeypair.publicKey.toBase58(), "wrong mint B"); - assert(offer.token_b_wanted_amount.toString() === values.amountB.toString(), "unexpected amount B"); - assert(vaultTokenAccount.amount.toString() === values.amountA.toString(), "unexpected amount A"); - }); - - test("Take Offer", async () => { - const ix = buildTakeOffer({ - maker: values.maker.publicKey, - offer: values.offer, - vault: values.vault, - mint_a: values.mintAKeypair.publicKey, - mint_b: values.mintBKeypair.publicKey, - maker_token_b: values.makerAccountB, - taker: values.taker.publicKey, - taker_token_a: values.takerAccountA, - taker_token_b: values.takerAccountB, - payer: payer.publicKey, - programId: values.programId, - }); - - const blockhash = context.lastBlockhash; - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, values.taker); - await client.processTransaction(tx); - - const offerInfo = await client.getAccount(values.offer); - assert(offerInfo === null, "offer account not closed"); - - const vaultInfo = await client.getAccount(values.vault); - assert(vaultInfo === null, "vault account not closed"); - - const makerTokenBInfo = await client.getAccount(values.makerAccountB); - const makerTokenAccountB = AccountLayout.decode(makerTokenBInfo.data); - - const takerTokenAInfo = await client.getAccount(values.takerAccountA); - const takerTokenAccountA = AccountLayout.decode(takerTokenAInfo.data); - - assert(takerTokenAccountA.amount.toString() === values.amountA.toString(), "unexpected amount a"); - assert(makerTokenAccountB.amount.toString() === values.amountB.toString(), "unexpected amount b"); - }); -}); diff --git a/finance/escrow/native/tests/utils.ts b/finance/escrow/native/tests/utils.ts deleted file mode 100644 index 57da0134..00000000 --- a/finance/escrow/native/tests/utils.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { - ASSOCIATED_TOKEN_PROGRAM_ID, - createAssociatedTokenAccountIdempotentInstruction, - createInitializeMint2Instruction, - createMintToInstruction, - getAssociatedTokenAddressSync, - MINT_SIZE, - TOKEN_PROGRAM_ID, -} from "@solana/spl-token"; -import { Keypair, PublicKey, type Signer, SystemProgram, Transaction } from "@solana/web3.js"; -import BN from "bn.js"; -import type { ProgramTestContext } from "solana-bankrun"; - -export async function sleep(seconds: number) { - new Promise((resolve) => setTimeout(resolve, seconds * 1000)); -} - -export const expectRevert = async (promise: Promise) => { - try { - await promise; - throw new Error("Expected a revert"); - } catch { - return; - } -}; - -export const mintingTokens = async ({ - context, - holder, - mintKeypair, - mintedAmount = 100, - decimals = 6, -}: { - context: ProgramTestContext; - holder: Signer; - mintKeypair: Keypair; - mintedAmount?: number; - decimals?: number; -}) => { - async function createMint(context: ProgramTestContext, mint: Keypair, decimals: number) { - const rent = await context.banksClient.getRent(); - - const lamports = rent.minimumBalance(BigInt(MINT_SIZE)); - - const transaction = new Transaction().add( - SystemProgram.createAccount({ - fromPubkey: context.payer.publicKey, - newAccountPubkey: mint.publicKey, - space: MINT_SIZE, - lamports: new BN(lamports.toString()).toNumber(), - programId: TOKEN_PROGRAM_ID, - }), - createInitializeMint2Instruction( - mint.publicKey, - decimals, - context.payer.publicKey, - context.payer.publicKey, - TOKEN_PROGRAM_ID, - ), - ); - transaction.recentBlockhash = context.lastBlockhash; - transaction.sign(context.payer, mint); - - await context.banksClient.processTransaction(transaction); - } - - async function createAssociatedTokenAccountIfNeeded(context: ProgramTestContext, mint: PublicKey, owner: PublicKey) { - const associatedToken = getAssociatedTokenAddressSync(mint, owner, true); - - const rent = await context.banksClient.getRent(); - - rent.minimumBalance(BigInt(MINT_SIZE)); - - const transaction = new Transaction().add( - createAssociatedTokenAccountIdempotentInstruction( - context.payer.publicKey, - associatedToken, - owner, - mint, - TOKEN_PROGRAM_ID, - ASSOCIATED_TOKEN_PROGRAM_ID, - ), - ); - transaction.recentBlockhash = context.lastBlockhash; - transaction.sign(context.payer); - - await context.banksClient.processTransaction(transaction); - } - - async function mintTo(context: ProgramTestContext, mint: PublicKey, destination: PublicKey, amount: number | bigint) { - const transaction = new Transaction().add( - createMintToInstruction(mint, destination, context.payer.publicKey, amount, [], TOKEN_PROGRAM_ID), - ); - transaction.recentBlockhash = context.lastBlockhash; - transaction.sign(context.payer); - - await context.banksClient.processTransaction(transaction); - } - - // creator creates the mint - await createMint(context, mintKeypair, decimals); - - // create holder token account - await createAssociatedTokenAccountIfNeeded(context, mintKeypair.publicKey, holder.publicKey); - - // mint to holders token account - await mintTo( - context, - mintKeypair.publicKey, - getAssociatedTokenAddressSync(mintKeypair.publicKey, holder.publicKey, true), - mintedAmount * 10 ** decimals, - ); -}; - -export interface TestValues { - id: BN; - amountA: BN; - amountB: BN; - maker: Keypair; - taker: Keypair; - mintAKeypair: Keypair; - mintBKeypair: Keypair; - offer: PublicKey; - vault: PublicKey; - makerAccountA: PublicKey; - makerAccountB: PublicKey; - takerAccountA: PublicKey; - takerAccountB: PublicKey; - programId: PublicKey; -} - -type TestValuesDefaults = { - [K in keyof TestValues]+?: TestValues[K]; -}; - -export function createValues(defaults?: TestValuesDefaults): TestValues { - const programId = PublicKey.unique(); - const id = defaults?.id || new BN(0); - const maker = Keypair.generate(); - const taker = Keypair.generate(); - - // Making sure tokens are in the right order - const mintAKeypair = Keypair.generate(); - let mintBKeypair = Keypair.generate(); - while (new BN(mintBKeypair.publicKey.toBytes()).lt(new BN(mintAKeypair.publicKey.toBytes()))) { - mintBKeypair = Keypair.generate(); - } - - const offer = PublicKey.findProgramAddressSync( - [Buffer.from("offer"), maker.publicKey.toBuffer(), Buffer.from(id.toArray("le", 8))], - programId, - )[0]; - - return { - id, - maker, - taker, - mintAKeypair, - mintBKeypair, - offer, - vault: getAssociatedTokenAddressSync(mintAKeypair.publicKey, offer, true), - makerAccountA: getAssociatedTokenAddressSync(mintAKeypair.publicKey, maker.publicKey, true), - makerAccountB: getAssociatedTokenAddressSync(mintBKeypair.publicKey, maker.publicKey, true), - takerAccountA: getAssociatedTokenAddressSync(mintAKeypair.publicKey, taker.publicKey, true), - takerAccountB: getAssociatedTokenAddressSync(mintBKeypair.publicKey, taker.publicKey, true), - amountA: new BN(4 * 10 ** 6), - amountB: new BN(1 * 10 ** 6), - programId, - }; -} diff --git a/finance/escrow/native/tsconfig.json b/finance/escrow/native/tsconfig.json deleted file mode 100644 index 8c20b223..00000000 --- a/finance/escrow/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai", "node"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/tokens/token-extensions/default-account-state/native/package.json b/tokens/token-extensions/default-account-state/native/package.json index 375fa128..0f896f4b 100644 --- a/tokens/token-extensions/default-account-state/native/package.json +++ b/tokens/token-extensions/default-account-state/native/package.json @@ -1,26 +1,7 @@ { "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/hello_solana_program.so" - }, - "dependencies": { - "@metaplex-foundation/mpl-token-metadata": "^2.5.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.4.1", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5" + "deploy": "solana program deploy ./program/target/so/token_2022_default_account_state_program.so" } } diff --git a/tokens/token-extensions/default-account-state/native/pnpm-lock.yaml b/tokens/token-extensions/default-account-state/native/pnpm-lock.yaml index 8507d821..9b60ae17 100644 --- a/tokens/token-extensions/default-account-state/native/pnpm-lock.yaml +++ b/tokens/token-extensions/default-account-state/native/pnpm-lock.yaml @@ -6,1863 +6,4 @@ settings: importers: - .: - dependencies: - '@metaplex-foundation/mpl-token-metadata': - specifier: ^2.5.2 - version: 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/spl-token': - specifier: ^0.3.7 - version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.5 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.16 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.4.1 - version: 4.4.1 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@9.2.2) - typescript: - specifier: ^5 - version: 5.9.3 - -packages: - - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - - '@metaplex-foundation/beet-solana@0.4.1': - resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} - - '@metaplex-foundation/beet@0.7.2': - resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} - - '@metaplex-foundation/cusper@0.0.2': - resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} - - '@metaplex-foundation/mpl-token-metadata@2.13.0': - resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout-utils@0.2.0': - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.0.0-preview.2': - resolution: {integrity: sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-data-structures@2.0.0-preview.2': - resolution: {integrity: sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==} - - '@solana/codecs-numbers@2.0.0-preview.2': - resolution: {integrity: sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==} - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-strings@2.0.0-preview.2': - resolution: {integrity: sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - - '@solana/codecs@2.0.0-preview.2': - resolution: {integrity: sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==} - - '@solana/errors@2.0.0-preview.2': - resolution: {integrity: sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==} - hasBin: true - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/options@2.0.0-preview.2': - resolution: {integrity: sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==} - - '@solana/spl-token-metadata@0.1.4': - resolution: {integrity: sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.91.6 - - '@solana/spl-token@0.3.11': - resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.88.0 - - '@solana/spl-type-length-value@0.1.0': - resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} - engines: {node: '>=16'} - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.19': - resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.12.12': - resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} - - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - - base-x@4.0.0: - resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.5: - resolution: {integrity: sha512-4mAmr+AEhPYJ9TmDtxF3r3ZcbWy7W8kvZ4PoZYw/Xgp2J7WixjwTgiQZsoTDvch5nimmg3Ay6/0Kuh9oIvVs9A==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - solana-bankrun-darwin-arm64@0.3.0: - resolution: {integrity: sha512-+NbDncf0U6l3knuacRBiqpjZ2DSp+5lZaAU518gH7/x6qubbui/d000STaIBK+uNTPBS/AL/bCN+7PkXqmA3lA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.0: - resolution: {integrity: sha512-1/F0xdMa4qvc5o6z16FCCbZ5jbdvKvxpx5kyPcMWRiRPwyvi+zltMxciPAYMlg3wslQqGz88uFhrBEzq2eTumQ==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.0: - resolution: {integrity: sha512-U6CANjkmMl+lgNA7UH0GKs5V7LtVIUDzJBZefGGqLfqUNv3EjA/PrrToM0hAOWJgkxSwdz6zW+p5sw5FmnbXtg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.0: - resolution: {integrity: sha512-qJSkCFs0k2n4XtTnyxGMiZsuqO2TiqTYgWjQ+3mZhGNUAMys/Vq8bd7/SyBm6RR7EfVuRXRxZvh+F8oKZ77V4w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.0: - resolution: {integrity: sha512-xsS2CS2xb1Sw4ivNXM0gPz/qpW9BX0neSvt/pnok5L330Nu9xlTnKAY8FhzzqOP9P9sJlGRM787Y6d0yYwt6xQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.0: - resolution: {integrity: sha512-YkH7sa8TB/AoRPzG17CXJtYsRIQHEkEqGLz1Vwc13taXhDBkjO7z6NI5JYw7n0ybRymDHwMYTc7sd+5J40TyVQ==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - utf-8-validate@6.0.6: - resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} - engines: {node: '>=6.14.2'} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.29.2': {} - - '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bs58: 5.0.0 - debug: 4.3.4 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - - '@metaplex-foundation/beet@0.7.2': - dependencies: - ansicolors: 0.3.2 - assert: 2.1.0 - bn.js: 5.2.1 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - '@metaplex-foundation/cusper@0.0.2': {} - - '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@metaplex-foundation/cusper': 0.0.2 - '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bn.js: 5.2.1 - debug: 4.3.4 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - supports-color - - typescript - - utf-8-validate - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bigint-buffer: 1.1.5 - bignumber.js: 9.1.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.0.0-preview.2': - dependencies: - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-data-structures@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-numbers@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-strings@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - fastestsmallesttextencoderdecoder: 1.0.22 - - '@solana/codecs@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-data-structures': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/codecs-strings': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/options': 2.0.0-preview.2 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@2.0.0-preview.2': - dependencies: - chalk: 5.3.0 - commander: 12.1.0 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 5.9.3 - - '@solana/options@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - - '@solana/spl-token-metadata@0.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/spl-type-length-value': 0.1.0 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/spl-token-metadata': 0.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - '@solana/spl-type-length-value@0.1.0': - dependencies: - buffer: 6.0.3 - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@babel/runtime': 7.29.2 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.4.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) - agentkeepalive: 4.5.0 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - node-fetch: 2.7.0 - rpc-websockets: 9.3.5 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.19': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 20.12.12 - - '@types/chai@4.3.16': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.12.12 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@20.12.12': - dependencies: - undici-types: 5.26.5 - - '@types/uuid@10.0.0': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 20.12.12 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 20.12.12 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansicolors@0.3.2: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assert@2.1.0: - dependencies: - call-bind: 1.0.7 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.5 - util: 0.12.5 - - assertion-error@1.1.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - balanced-match@1.0.2: {} - - base-x@3.0.9: - dependencies: - safe-buffer: 5.2.1 - - base-x@4.0.0: {} - - base64-js@1.5.1: {} - - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - - bignumber.js@9.1.2: {} - - binary-extensions@2.3.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bn.js@5.2.1: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.9 - - bs58@5.0.0: - dependencies: - base-x: 4.0.0 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - camelcase@6.3.0: {} - - chai@4.4.1: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.3.0: {} - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@12.1.0: {} - - commander@14.0.3: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.3.4: - dependencies: - ms: 2.1.2 - - decamelize@4.0.0: {} - - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.1.2: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.4: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - file-uri-to-path@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-callable@1.2.7: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-nan@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - - jayson@4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.1: - optional: true - - normalize-path@3.0.0: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - possible-typed-array-names@1.0.0: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.3.5: - dependencies: - '@swc/helpers': 0.5.19 - '@types/uuid': 10.0.0 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.4 - uuid: 11.1.0 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - solana-bankrun-darwin-arm64@0.3.0: - optional: true - - solana-bankrun-darwin-universal@0.3.0: - optional: true - - solana-bankrun-darwin-x64@0.3.0: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.0: - optional: true - - solana-bankrun-linux-x64-musl@0.3.0: - optional: true - - solana-bankrun@0.3.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.0 - solana-bankrun-darwin-universal: 0.3.0 - solana-bankrun-darwin-x64: 0.3.0 - solana-bankrun-linux-x64-gnu: 0.3.0 - solana-bankrun-linux-x64-musl: 0.3.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.0.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.0.8: {} - - typescript@5.9.3: {} - - undici-types@5.26.5: {} - - utf-8-validate@6.0.6: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 - - uuid@11.1.0: {} - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + .: {} diff --git a/tokens/token-extensions/default-account-state/native/tests/test.ts b/tokens/token-extensions/default-account-state/native/tests/test.ts deleted file mode 100644 index 381e1494..00000000 --- a/tokens/token-extensions/default-account-state/native/tests/test.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; -import { - Keypair, - PublicKey, - SYSVAR_RENT_PUBKEY, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import * as borsh from "borsh"; -import { assert } from "chai"; -import { start } from "solana-bankrun"; - -const CreateTokenArgsSchema = { struct: { token_decimals: "u8" } }; - -function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); -} - -describe("Create Token", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start( - [ - { - name: "token_2022_default_account_state_program", - programId: PROGRAM_ID, - }, - ], - [], - ); - const client = context.banksClient; - const payer = context.payer; - - test("Create a Token-22 SPL-Token !", async () => { - const blockhash = context.lastBlockhash; - - const mintKeypair: Keypair = Keypair.generate(); - - const instructionData = borshSerialize(CreateTokenArgsSchema, { - token_decimals: 9, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: true, isWritable: true }, // Mint account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Transaction Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - ], - programId: PROGRAM_ID, - data: instructionData, - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, mintKeypair); - - const transaction = await client.processTransaction(tx); - - assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - console.log("Token Mint Address: ", mintKeypair.publicKey.toBase58()); - }); -}); diff --git a/tokens/token-extensions/default-account-state/native/tsconfig.json b/tokens/token-extensions/default-account-state/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/tokens/token-extensions/default-account-state/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/tokens/token-extensions/multiple-extensions/native/package.json b/tokens/token-extensions/multiple-extensions/native/package.json index 375fa128..cf0b1272 100644 --- a/tokens/token-extensions/multiple-extensions/native/package.json +++ b/tokens/token-extensions/multiple-extensions/native/package.json @@ -1,26 +1,7 @@ { "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/hello_solana_program.so" - }, - "dependencies": { - "@metaplex-foundation/mpl-token-metadata": "^2.5.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.4.1", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5" + "deploy": "solana program deploy ./program/target/so/token_2022_multiple_extensions_program.so" } } diff --git a/tokens/token-extensions/multiple-extensions/native/pnpm-lock.yaml b/tokens/token-extensions/multiple-extensions/native/pnpm-lock.yaml index 8507d821..9b60ae17 100644 --- a/tokens/token-extensions/multiple-extensions/native/pnpm-lock.yaml +++ b/tokens/token-extensions/multiple-extensions/native/pnpm-lock.yaml @@ -6,1863 +6,4 @@ settings: importers: - .: - dependencies: - '@metaplex-foundation/mpl-token-metadata': - specifier: ^2.5.2 - version: 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/spl-token': - specifier: ^0.3.7 - version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.5 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.16 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.4.1 - version: 4.4.1 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@9.2.2) - typescript: - specifier: ^5 - version: 5.9.3 - -packages: - - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - - '@metaplex-foundation/beet-solana@0.4.1': - resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} - - '@metaplex-foundation/beet@0.7.2': - resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} - - '@metaplex-foundation/cusper@0.0.2': - resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} - - '@metaplex-foundation/mpl-token-metadata@2.13.0': - resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout-utils@0.2.0': - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.0.0-preview.2': - resolution: {integrity: sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-data-structures@2.0.0-preview.2': - resolution: {integrity: sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==} - - '@solana/codecs-numbers@2.0.0-preview.2': - resolution: {integrity: sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==} - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-strings@2.0.0-preview.2': - resolution: {integrity: sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - - '@solana/codecs@2.0.0-preview.2': - resolution: {integrity: sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==} - - '@solana/errors@2.0.0-preview.2': - resolution: {integrity: sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==} - hasBin: true - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/options@2.0.0-preview.2': - resolution: {integrity: sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==} - - '@solana/spl-token-metadata@0.1.4': - resolution: {integrity: sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.91.6 - - '@solana/spl-token@0.3.11': - resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.88.0 - - '@solana/spl-type-length-value@0.1.0': - resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} - engines: {node: '>=16'} - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.19': - resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.12.12': - resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} - - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - - base-x@4.0.0: - resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.5: - resolution: {integrity: sha512-4mAmr+AEhPYJ9TmDtxF3r3ZcbWy7W8kvZ4PoZYw/Xgp2J7WixjwTgiQZsoTDvch5nimmg3Ay6/0Kuh9oIvVs9A==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - solana-bankrun-darwin-arm64@0.3.0: - resolution: {integrity: sha512-+NbDncf0U6l3knuacRBiqpjZ2DSp+5lZaAU518gH7/x6qubbui/d000STaIBK+uNTPBS/AL/bCN+7PkXqmA3lA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.0: - resolution: {integrity: sha512-1/F0xdMa4qvc5o6z16FCCbZ5jbdvKvxpx5kyPcMWRiRPwyvi+zltMxciPAYMlg3wslQqGz88uFhrBEzq2eTumQ==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.0: - resolution: {integrity: sha512-U6CANjkmMl+lgNA7UH0GKs5V7LtVIUDzJBZefGGqLfqUNv3EjA/PrrToM0hAOWJgkxSwdz6zW+p5sw5FmnbXtg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.0: - resolution: {integrity: sha512-qJSkCFs0k2n4XtTnyxGMiZsuqO2TiqTYgWjQ+3mZhGNUAMys/Vq8bd7/SyBm6RR7EfVuRXRxZvh+F8oKZ77V4w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.0: - resolution: {integrity: sha512-xsS2CS2xb1Sw4ivNXM0gPz/qpW9BX0neSvt/pnok5L330Nu9xlTnKAY8FhzzqOP9P9sJlGRM787Y6d0yYwt6xQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.0: - resolution: {integrity: sha512-YkH7sa8TB/AoRPzG17CXJtYsRIQHEkEqGLz1Vwc13taXhDBkjO7z6NI5JYw7n0ybRymDHwMYTc7sd+5J40TyVQ==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - utf-8-validate@6.0.6: - resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} - engines: {node: '>=6.14.2'} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.29.2': {} - - '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bs58: 5.0.0 - debug: 4.3.4 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - - '@metaplex-foundation/beet@0.7.2': - dependencies: - ansicolors: 0.3.2 - assert: 2.1.0 - bn.js: 5.2.1 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - '@metaplex-foundation/cusper@0.0.2': {} - - '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@metaplex-foundation/cusper': 0.0.2 - '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bn.js: 5.2.1 - debug: 4.3.4 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - supports-color - - typescript - - utf-8-validate - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bigint-buffer: 1.1.5 - bignumber.js: 9.1.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.0.0-preview.2': - dependencies: - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-data-structures@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-numbers@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-strings@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - fastestsmallesttextencoderdecoder: 1.0.22 - - '@solana/codecs@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-data-structures': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/codecs-strings': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/options': 2.0.0-preview.2 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@2.0.0-preview.2': - dependencies: - chalk: 5.3.0 - commander: 12.1.0 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 5.9.3 - - '@solana/options@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - - '@solana/spl-token-metadata@0.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/spl-type-length-value': 0.1.0 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/spl-token-metadata': 0.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - '@solana/spl-type-length-value@0.1.0': - dependencies: - buffer: 6.0.3 - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@babel/runtime': 7.29.2 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.4.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) - agentkeepalive: 4.5.0 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - node-fetch: 2.7.0 - rpc-websockets: 9.3.5 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.19': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 20.12.12 - - '@types/chai@4.3.16': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.12.12 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@20.12.12': - dependencies: - undici-types: 5.26.5 - - '@types/uuid@10.0.0': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 20.12.12 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 20.12.12 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansicolors@0.3.2: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assert@2.1.0: - dependencies: - call-bind: 1.0.7 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.5 - util: 0.12.5 - - assertion-error@1.1.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - balanced-match@1.0.2: {} - - base-x@3.0.9: - dependencies: - safe-buffer: 5.2.1 - - base-x@4.0.0: {} - - base64-js@1.5.1: {} - - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - - bignumber.js@9.1.2: {} - - binary-extensions@2.3.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bn.js@5.2.1: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.9 - - bs58@5.0.0: - dependencies: - base-x: 4.0.0 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - camelcase@6.3.0: {} - - chai@4.4.1: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.3.0: {} - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@12.1.0: {} - - commander@14.0.3: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.3.4: - dependencies: - ms: 2.1.2 - - decamelize@4.0.0: {} - - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.1.2: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.4: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - file-uri-to-path@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-callable@1.2.7: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-nan@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - - jayson@4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.1: - optional: true - - normalize-path@3.0.0: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - possible-typed-array-names@1.0.0: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.3.5: - dependencies: - '@swc/helpers': 0.5.19 - '@types/uuid': 10.0.0 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.4 - uuid: 11.1.0 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - solana-bankrun-darwin-arm64@0.3.0: - optional: true - - solana-bankrun-darwin-universal@0.3.0: - optional: true - - solana-bankrun-darwin-x64@0.3.0: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.0: - optional: true - - solana-bankrun-linux-x64-musl@0.3.0: - optional: true - - solana-bankrun@0.3.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.0 - solana-bankrun-darwin-universal: 0.3.0 - solana-bankrun-darwin-x64: 0.3.0 - solana-bankrun-linux-x64-gnu: 0.3.0 - solana-bankrun-linux-x64-musl: 0.3.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.0.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.0.8: {} - - typescript@5.9.3: {} - - undici-types@5.26.5: {} - - utf-8-validate@6.0.6: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 - - uuid@11.1.0: {} - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + .: {} diff --git a/tokens/token-extensions/multiple-extensions/native/tests/test.ts b/tokens/token-extensions/multiple-extensions/native/tests/test.ts deleted file mode 100644 index f5b16579..00000000 --- a/tokens/token-extensions/multiple-extensions/native/tests/test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; -import { - Keypair, - PublicKey, - SYSVAR_RENT_PUBKEY, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import * as borsh from "borsh"; -import { assert } from "chai"; -import { start } from "solana-bankrun"; - -const CreateTokenArgsSchema = { struct: { token_decimals: "u8" } }; - -function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); -} - -describe("Create Token", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "token_2022_multiple_extensions_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - test("Create a Token-22 SPL-Token !", async () => { - const blockhash = context.lastBlockhash; - const mintKeypair: Keypair = Keypair.generate(); - - const instructionData = borshSerialize(CreateTokenArgsSchema, { - token_decimals: 9, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: true, isWritable: true }, // Mint account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint close authority account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Transaction Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - ], - programId: PROGRAM_ID, - data: instructionData, - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, mintKeypair); - - const transaction = await client.processTransaction(tx); - - assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - console.log("Token Mint Address: ", mintKeypair.publicKey.toBase58()); - }); -}); diff --git a/tokens/token-extensions/multiple-extensions/native/tsconfig.json b/tokens/token-extensions/multiple-extensions/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/tokens/token-extensions/multiple-extensions/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} From e8f230c11667373d5cecfff881d1b096a840aab4 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 14:38:58 +0000 Subject: [PATCH 014/138] test(token-extensions): add LiteSVM tests and re-enable 3 more native examples mint-close-authority, transfer-fee, and non-transferable native were excluded in .ghaignore: their only tests were TypeScript suites that import from `node:test` but run under `ts-mocha`, executing zero tests (false green), so they had no real coverage. Add LiteSVM Rust integration tests (same pattern as the multiple-extensions and default-account-state examples) asserting each Token-2022 mint is created with the expected extension: - mint-close-authority: MintCloseAuthority present with the right authority - non-transferable: NonTransferable present - transfer-fee: TransferFeeConfig present with the expected authorities and the 10% / 5-token newer fee the program sets Remove the false-green TypeScript suites and their JS tooling, rewire build-and-test to just build the program .so into tests/fixtures (consumed by the LiteSVM cargo test), and drop all three from .github/.ghaignore so CI builds and tests them. --- .github/.ghaignore | 6 +- Cargo.lock | 18 + .../mint-close-authority/native/package.json | 23 +- .../native/pnpm-lock.yaml | 1861 +---------------- .../native/program/Cargo.toml | 8 + .../native/program/tests/test.rs | 73 + .../mint-close-authority/native/tests/test.ts | 67 - .../mint-close-authority/native/tsconfig.json | 10 - .../non-transferable/native/package.json | 23 +- .../non-transferable/native/pnpm-lock.yaml | 1861 +---------------- .../native/program/Cargo.toml | 8 + .../native/program/tests/test.rs | 72 + .../non-transferable/native/tests/test.ts | 58 - .../non-transferable/native/tsconfig.json | 10 - .../transfer-fee/native/package.json | 23 +- .../transfer-fee/native/pnpm-lock.yaml | 1861 +---------------- .../transfer-fee/native/program/Cargo.toml | 8 + .../transfer-fee/native/program/tests/test.rs | 85 + .../transfer-fee/native/tests/test.ts | 58 - .../transfer-fee/native/tsconfig.json | 10 - 20 files changed, 282 insertions(+), 5861 deletions(-) create mode 100644 tokens/token-extensions/mint-close-authority/native/program/tests/test.rs delete mode 100644 tokens/token-extensions/mint-close-authority/native/tests/test.ts delete mode 100644 tokens/token-extensions/mint-close-authority/native/tsconfig.json create mode 100644 tokens/token-extensions/non-transferable/native/program/tests/test.rs delete mode 100644 tokens/token-extensions/non-transferable/native/tests/test.ts delete mode 100644 tokens/token-extensions/non-transferable/native/tsconfig.json create mode 100644 tokens/token-extensions/transfer-fee/native/program/tests/test.rs delete mode 100644 tokens/token-extensions/transfer-fee/native/tests/test.ts delete mode 100644 tokens/token-extensions/transfer-fee/native/tsconfig.json diff --git a/.github/.ghaignore b/.github/.ghaignore index ab3226b8..5808bd86 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -35,8 +35,4 @@ basics/cross-program-invocation/quasar tokens/token-extensions/metadata/anchor # dependency issues -tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor - -tokens/token-extensions/mint-close-authority/native -tokens/token-extensions/transfer-fee/native -tokens/token-extensions/non-transferable/native \ No newline at end of file +tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index c043d3e0..f9a656eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5295,8 +5295,14 @@ version = "0.1.0" dependencies = [ "borsh", "borsh-derive 1.6.1", + "litesvm", + "solana-instruction", + "solana-keypair", + "solana-native-token", "solana-program 4.0.0", + "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", + "solana-transaction 3.1.0", "spl-token-2022-interface", ] @@ -5323,8 +5329,14 @@ version = "0.1.0" dependencies = [ "borsh", "borsh-derive 1.6.1", + "litesvm", + "solana-instruction", + "solana-keypair", + "solana-native-token", "solana-program 4.0.0", + "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", + "solana-transaction 3.1.0", "spl-token-2022-interface", ] @@ -5334,8 +5346,14 @@ version = "0.1.0" dependencies = [ "borsh", "borsh-derive 1.6.1", + "litesvm", + "solana-instruction", + "solana-keypair", + "solana-native-token", "solana-program 4.0.0", + "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", + "solana-transaction 3.1.0", "spl-token-2022-interface", ] diff --git a/tokens/token-extensions/mint-close-authority/native/package.json b/tokens/token-extensions/mint-close-authority/native/package.json index 675c9749..8b1c7233 100644 --- a/tokens/token-extensions/mint-close-authority/native/package.json +++ b/tokens/token-extensions/mint-close-authority/native/package.json @@ -1,26 +1,7 @@ { "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@metaplex-foundation/mpl-token-metadata": "^2.5.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.4.1", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5" + "deploy": "solana program deploy ./program/target/so/token_2022_mint_close_authority_program.so" } } diff --git a/tokens/token-extensions/mint-close-authority/native/pnpm-lock.yaml b/tokens/token-extensions/mint-close-authority/native/pnpm-lock.yaml index 8507d821..9b60ae17 100644 --- a/tokens/token-extensions/mint-close-authority/native/pnpm-lock.yaml +++ b/tokens/token-extensions/mint-close-authority/native/pnpm-lock.yaml @@ -6,1863 +6,4 @@ settings: importers: - .: - dependencies: - '@metaplex-foundation/mpl-token-metadata': - specifier: ^2.5.2 - version: 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/spl-token': - specifier: ^0.3.7 - version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.5 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.16 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.4.1 - version: 4.4.1 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@9.2.2) - typescript: - specifier: ^5 - version: 5.9.3 - -packages: - - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - - '@metaplex-foundation/beet-solana@0.4.1': - resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} - - '@metaplex-foundation/beet@0.7.2': - resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} - - '@metaplex-foundation/cusper@0.0.2': - resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} - - '@metaplex-foundation/mpl-token-metadata@2.13.0': - resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout-utils@0.2.0': - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.0.0-preview.2': - resolution: {integrity: sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-data-structures@2.0.0-preview.2': - resolution: {integrity: sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==} - - '@solana/codecs-numbers@2.0.0-preview.2': - resolution: {integrity: sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==} - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-strings@2.0.0-preview.2': - resolution: {integrity: sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - - '@solana/codecs@2.0.0-preview.2': - resolution: {integrity: sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==} - - '@solana/errors@2.0.0-preview.2': - resolution: {integrity: sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==} - hasBin: true - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/options@2.0.0-preview.2': - resolution: {integrity: sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==} - - '@solana/spl-token-metadata@0.1.4': - resolution: {integrity: sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.91.6 - - '@solana/spl-token@0.3.11': - resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.88.0 - - '@solana/spl-type-length-value@0.1.0': - resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} - engines: {node: '>=16'} - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.19': - resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.12.12': - resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} - - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - - base-x@4.0.0: - resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.5: - resolution: {integrity: sha512-4mAmr+AEhPYJ9TmDtxF3r3ZcbWy7W8kvZ4PoZYw/Xgp2J7WixjwTgiQZsoTDvch5nimmg3Ay6/0Kuh9oIvVs9A==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - solana-bankrun-darwin-arm64@0.3.0: - resolution: {integrity: sha512-+NbDncf0U6l3knuacRBiqpjZ2DSp+5lZaAU518gH7/x6qubbui/d000STaIBK+uNTPBS/AL/bCN+7PkXqmA3lA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.0: - resolution: {integrity: sha512-1/F0xdMa4qvc5o6z16FCCbZ5jbdvKvxpx5kyPcMWRiRPwyvi+zltMxciPAYMlg3wslQqGz88uFhrBEzq2eTumQ==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.0: - resolution: {integrity: sha512-U6CANjkmMl+lgNA7UH0GKs5V7LtVIUDzJBZefGGqLfqUNv3EjA/PrrToM0hAOWJgkxSwdz6zW+p5sw5FmnbXtg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.0: - resolution: {integrity: sha512-qJSkCFs0k2n4XtTnyxGMiZsuqO2TiqTYgWjQ+3mZhGNUAMys/Vq8bd7/SyBm6RR7EfVuRXRxZvh+F8oKZ77V4w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.0: - resolution: {integrity: sha512-xsS2CS2xb1Sw4ivNXM0gPz/qpW9BX0neSvt/pnok5L330Nu9xlTnKAY8FhzzqOP9P9sJlGRM787Y6d0yYwt6xQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.0: - resolution: {integrity: sha512-YkH7sa8TB/AoRPzG17CXJtYsRIQHEkEqGLz1Vwc13taXhDBkjO7z6NI5JYw7n0ybRymDHwMYTc7sd+5J40TyVQ==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - utf-8-validate@6.0.6: - resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} - engines: {node: '>=6.14.2'} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.29.2': {} - - '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bs58: 5.0.0 - debug: 4.3.4 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - - '@metaplex-foundation/beet@0.7.2': - dependencies: - ansicolors: 0.3.2 - assert: 2.1.0 - bn.js: 5.2.1 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - '@metaplex-foundation/cusper@0.0.2': {} - - '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@metaplex-foundation/cusper': 0.0.2 - '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bn.js: 5.2.1 - debug: 4.3.4 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - supports-color - - typescript - - utf-8-validate - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bigint-buffer: 1.1.5 - bignumber.js: 9.1.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.0.0-preview.2': - dependencies: - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-data-structures@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-numbers@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-strings@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - fastestsmallesttextencoderdecoder: 1.0.22 - - '@solana/codecs@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-data-structures': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/codecs-strings': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/options': 2.0.0-preview.2 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@2.0.0-preview.2': - dependencies: - chalk: 5.3.0 - commander: 12.1.0 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 5.9.3 - - '@solana/options@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - - '@solana/spl-token-metadata@0.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/spl-type-length-value': 0.1.0 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/spl-token-metadata': 0.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - '@solana/spl-type-length-value@0.1.0': - dependencies: - buffer: 6.0.3 - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@babel/runtime': 7.29.2 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.4.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) - agentkeepalive: 4.5.0 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - node-fetch: 2.7.0 - rpc-websockets: 9.3.5 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.19': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 20.12.12 - - '@types/chai@4.3.16': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.12.12 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@20.12.12': - dependencies: - undici-types: 5.26.5 - - '@types/uuid@10.0.0': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 20.12.12 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 20.12.12 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansicolors@0.3.2: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assert@2.1.0: - dependencies: - call-bind: 1.0.7 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.5 - util: 0.12.5 - - assertion-error@1.1.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - balanced-match@1.0.2: {} - - base-x@3.0.9: - dependencies: - safe-buffer: 5.2.1 - - base-x@4.0.0: {} - - base64-js@1.5.1: {} - - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - - bignumber.js@9.1.2: {} - - binary-extensions@2.3.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bn.js@5.2.1: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.9 - - bs58@5.0.0: - dependencies: - base-x: 4.0.0 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - camelcase@6.3.0: {} - - chai@4.4.1: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.3.0: {} - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@12.1.0: {} - - commander@14.0.3: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.3.4: - dependencies: - ms: 2.1.2 - - decamelize@4.0.0: {} - - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.1.2: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.4: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - file-uri-to-path@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-callable@1.2.7: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-nan@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - - jayson@4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.1: - optional: true - - normalize-path@3.0.0: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - possible-typed-array-names@1.0.0: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.3.5: - dependencies: - '@swc/helpers': 0.5.19 - '@types/uuid': 10.0.0 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.4 - uuid: 11.1.0 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - solana-bankrun-darwin-arm64@0.3.0: - optional: true - - solana-bankrun-darwin-universal@0.3.0: - optional: true - - solana-bankrun-darwin-x64@0.3.0: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.0: - optional: true - - solana-bankrun-linux-x64-musl@0.3.0: - optional: true - - solana-bankrun@0.3.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.0 - solana-bankrun-darwin-universal: 0.3.0 - solana-bankrun-darwin-x64: 0.3.0 - solana-bankrun-linux-x64-gnu: 0.3.0 - solana-bankrun-linux-x64-musl: 0.3.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.0.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.0.8: {} - - typescript@5.9.3: {} - - undici-types@5.26.5: {} - - utf-8-validate@6.0.6: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 - - uuid@11.1.0: {} - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + .: {} diff --git a/tokens/token-extensions/mint-close-authority/native/program/Cargo.toml b/tokens/token-extensions/mint-close-authority/native/program/Cargo.toml index 79a3314e..5de15c59 100644 --- a/tokens/token-extensions/mint-close-authority/native/program/Cargo.toml +++ b/tokens/token-extensions/mint-close-authority/native/program/Cargo.toml @@ -19,3 +19,11 @@ custom-panic = [] [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm.workspace = true +solana-instruction.workspace = true +solana-keypair.workspace = true +solana-native-token.workspace = true +solana-pubkey.workspace = true +solana-transaction.workspace = true diff --git a/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs b/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs new file mode 100644 index 00000000..69796994 --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs @@ -0,0 +1,73 @@ +use { + litesvm::LiteSVM, + solana_instruction::{AccountMeta, Instruction}, + solana_keypair::{Keypair, Signer}, + solana_native_token::LAMPORTS_PER_SOL, + solana_pubkey::{pubkey, Pubkey}, + solana_transaction::Transaction, + spl_token_2022_interface::{ + extension::{ + mint_close_authority::MintCloseAuthority, BaseStateWithExtensions, StateWithExtensions, + }, + state::Mint, + }, + token_2022_mint_close_authority_program::CreateTokenArgs, +}; + +const RENT_SYSVAR_ID: Pubkey = pubkey!("SysvarRent111111111111111111111111111111111"); + +#[test] +fn test_create_token_with_mint_close_authority() { + let mut svm = LiteSVM::new(); + + let program_id = Pubkey::new_unique(); + let program_bytes = + include_bytes!("../../tests/fixtures/token_2022_mint_close_authority_program.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + // litesvm bundles the SPL Token-2022 program by default. + let token_program_id = spl_token_2022_interface::id(); + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + let mint = Keypair::new(); + + let data = borsh::to_vec(&CreateTokenArgs { token_decimals: 9 }).unwrap(); + + let ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), true), // mint account + AccountMeta::new(payer.pubkey(), false), // mint authority + AccountMeta::new(payer.pubkey(), false), // close authority + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new_readonly(RENT_SYSVAR_ID, false), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), + AccountMeta::new_readonly(token_program_id, false), + ], + data, + }; + + let tx = Transaction::new_signed_with_payer( + &[ix], + Some(&payer.pubkey()), + &[&payer, &mint], + svm.latest_blockhash(), + ); + + svm.send_transaction(tx).unwrap(); + + // The mint should be owned by Token-2022 and carry the MintCloseAuthority + // extension pointing at the payer. + let mint_account = svm.get_account(&mint.pubkey()).unwrap(); + assert_eq!(mint_account.owner, token_program_id); + + let state = StateWithExtensions::::unpack(&mint_account.data).unwrap(); + assert_eq!(state.base.decimals, 9); + assert!(state.base.is_initialized); + + let close_authority = state.get_extension::().unwrap(); + let close_authority_key: Option = close_authority.close_authority.into(); + assert_eq!(close_authority_key, Some(payer.pubkey())); +} diff --git a/tokens/token-extensions/mint-close-authority/native/tests/test.ts b/tokens/token-extensions/mint-close-authority/native/tests/test.ts deleted file mode 100644 index 822c359d..00000000 --- a/tokens/token-extensions/mint-close-authority/native/tests/test.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; -import { - Keypair, - PublicKey, - SYSVAR_RENT_PUBKEY, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import * as borsh from "borsh"; -import { assert } from "chai"; -import { start } from "solana-bankrun"; - -const CreateTokenArgsSchema = { struct: { token_decimals: "u8" } }; - -function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); -} - -describe("Create Token", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start( - [ - { - name: "token_2022_mint_close_authority_program", - programId: PROGRAM_ID, - }, - ], - [], - ); - const client = context.banksClient; - const payer = context.payer; - - test("Create a Token-22 SPL-Token !", async () => { - const mintKeypair: Keypair = Keypair.generate(); - - const instructionData = borshSerialize(CreateTokenArgsSchema, { - token_decimals: 9, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: true, isWritable: true }, // Mint account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint close authority account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Transaction Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - ], - programId: PROGRAM_ID, - data: instructionData, - }); - const blockhash = context.lastBlockhash; - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, mintKeypair); - - const transaction = await client.processTransaction(tx); - - assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - console.log("Token Mint Address: ", mintKeypair.publicKey.toBase58()); - }); -}); diff --git a/tokens/token-extensions/mint-close-authority/native/tsconfig.json b/tokens/token-extensions/mint-close-authority/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/tokens/token-extensions/mint-close-authority/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/tokens/token-extensions/non-transferable/native/package.json b/tokens/token-extensions/non-transferable/native/package.json index 375fa128..2591e476 100644 --- a/tokens/token-extensions/non-transferable/native/package.json +++ b/tokens/token-extensions/non-transferable/native/package.json @@ -1,26 +1,7 @@ { "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/hello_solana_program.so" - }, - "dependencies": { - "@metaplex-foundation/mpl-token-metadata": "^2.5.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.4.1", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5" + "deploy": "solana program deploy ./program/target/so/token_2022_non_transferable_program.so" } } diff --git a/tokens/token-extensions/non-transferable/native/pnpm-lock.yaml b/tokens/token-extensions/non-transferable/native/pnpm-lock.yaml index 8507d821..9b60ae17 100644 --- a/tokens/token-extensions/non-transferable/native/pnpm-lock.yaml +++ b/tokens/token-extensions/non-transferable/native/pnpm-lock.yaml @@ -6,1863 +6,4 @@ settings: importers: - .: - dependencies: - '@metaplex-foundation/mpl-token-metadata': - specifier: ^2.5.2 - version: 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/spl-token': - specifier: ^0.3.7 - version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.5 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.16 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.4.1 - version: 4.4.1 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@9.2.2) - typescript: - specifier: ^5 - version: 5.9.3 - -packages: - - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - - '@metaplex-foundation/beet-solana@0.4.1': - resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} - - '@metaplex-foundation/beet@0.7.2': - resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} - - '@metaplex-foundation/cusper@0.0.2': - resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} - - '@metaplex-foundation/mpl-token-metadata@2.13.0': - resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout-utils@0.2.0': - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.0.0-preview.2': - resolution: {integrity: sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-data-structures@2.0.0-preview.2': - resolution: {integrity: sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==} - - '@solana/codecs-numbers@2.0.0-preview.2': - resolution: {integrity: sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==} - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-strings@2.0.0-preview.2': - resolution: {integrity: sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - - '@solana/codecs@2.0.0-preview.2': - resolution: {integrity: sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==} - - '@solana/errors@2.0.0-preview.2': - resolution: {integrity: sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==} - hasBin: true - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/options@2.0.0-preview.2': - resolution: {integrity: sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==} - - '@solana/spl-token-metadata@0.1.4': - resolution: {integrity: sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.91.6 - - '@solana/spl-token@0.3.11': - resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.88.0 - - '@solana/spl-type-length-value@0.1.0': - resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} - engines: {node: '>=16'} - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.19': - resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.12.12': - resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} - - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - - base-x@4.0.0: - resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.5: - resolution: {integrity: sha512-4mAmr+AEhPYJ9TmDtxF3r3ZcbWy7W8kvZ4PoZYw/Xgp2J7WixjwTgiQZsoTDvch5nimmg3Ay6/0Kuh9oIvVs9A==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - solana-bankrun-darwin-arm64@0.3.0: - resolution: {integrity: sha512-+NbDncf0U6l3knuacRBiqpjZ2DSp+5lZaAU518gH7/x6qubbui/d000STaIBK+uNTPBS/AL/bCN+7PkXqmA3lA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.0: - resolution: {integrity: sha512-1/F0xdMa4qvc5o6z16FCCbZ5jbdvKvxpx5kyPcMWRiRPwyvi+zltMxciPAYMlg3wslQqGz88uFhrBEzq2eTumQ==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.0: - resolution: {integrity: sha512-U6CANjkmMl+lgNA7UH0GKs5V7LtVIUDzJBZefGGqLfqUNv3EjA/PrrToM0hAOWJgkxSwdz6zW+p5sw5FmnbXtg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.0: - resolution: {integrity: sha512-qJSkCFs0k2n4XtTnyxGMiZsuqO2TiqTYgWjQ+3mZhGNUAMys/Vq8bd7/SyBm6RR7EfVuRXRxZvh+F8oKZ77V4w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.0: - resolution: {integrity: sha512-xsS2CS2xb1Sw4ivNXM0gPz/qpW9BX0neSvt/pnok5L330Nu9xlTnKAY8FhzzqOP9P9sJlGRM787Y6d0yYwt6xQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.0: - resolution: {integrity: sha512-YkH7sa8TB/AoRPzG17CXJtYsRIQHEkEqGLz1Vwc13taXhDBkjO7z6NI5JYw7n0ybRymDHwMYTc7sd+5J40TyVQ==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - utf-8-validate@6.0.6: - resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} - engines: {node: '>=6.14.2'} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.29.2': {} - - '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bs58: 5.0.0 - debug: 4.3.4 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - - '@metaplex-foundation/beet@0.7.2': - dependencies: - ansicolors: 0.3.2 - assert: 2.1.0 - bn.js: 5.2.1 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - '@metaplex-foundation/cusper@0.0.2': {} - - '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@metaplex-foundation/cusper': 0.0.2 - '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bn.js: 5.2.1 - debug: 4.3.4 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - supports-color - - typescript - - utf-8-validate - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bigint-buffer: 1.1.5 - bignumber.js: 9.1.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.0.0-preview.2': - dependencies: - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-data-structures@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-numbers@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-strings@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - fastestsmallesttextencoderdecoder: 1.0.22 - - '@solana/codecs@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-data-structures': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/codecs-strings': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/options': 2.0.0-preview.2 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@2.0.0-preview.2': - dependencies: - chalk: 5.3.0 - commander: 12.1.0 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 5.9.3 - - '@solana/options@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - - '@solana/spl-token-metadata@0.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/spl-type-length-value': 0.1.0 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/spl-token-metadata': 0.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - '@solana/spl-type-length-value@0.1.0': - dependencies: - buffer: 6.0.3 - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@babel/runtime': 7.29.2 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.4.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) - agentkeepalive: 4.5.0 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - node-fetch: 2.7.0 - rpc-websockets: 9.3.5 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.19': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 20.12.12 - - '@types/chai@4.3.16': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.12.12 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@20.12.12': - dependencies: - undici-types: 5.26.5 - - '@types/uuid@10.0.0': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 20.12.12 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 20.12.12 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansicolors@0.3.2: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assert@2.1.0: - dependencies: - call-bind: 1.0.7 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.5 - util: 0.12.5 - - assertion-error@1.1.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - balanced-match@1.0.2: {} - - base-x@3.0.9: - dependencies: - safe-buffer: 5.2.1 - - base-x@4.0.0: {} - - base64-js@1.5.1: {} - - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - - bignumber.js@9.1.2: {} - - binary-extensions@2.3.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bn.js@5.2.1: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.9 - - bs58@5.0.0: - dependencies: - base-x: 4.0.0 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - camelcase@6.3.0: {} - - chai@4.4.1: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.3.0: {} - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@12.1.0: {} - - commander@14.0.3: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.3.4: - dependencies: - ms: 2.1.2 - - decamelize@4.0.0: {} - - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.1.2: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.4: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - file-uri-to-path@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-callable@1.2.7: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-nan@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - - jayson@4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.1: - optional: true - - normalize-path@3.0.0: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - possible-typed-array-names@1.0.0: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.3.5: - dependencies: - '@swc/helpers': 0.5.19 - '@types/uuid': 10.0.0 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.4 - uuid: 11.1.0 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - solana-bankrun-darwin-arm64@0.3.0: - optional: true - - solana-bankrun-darwin-universal@0.3.0: - optional: true - - solana-bankrun-darwin-x64@0.3.0: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.0: - optional: true - - solana-bankrun-linux-x64-musl@0.3.0: - optional: true - - solana-bankrun@0.3.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.0 - solana-bankrun-darwin-universal: 0.3.0 - solana-bankrun-darwin-x64: 0.3.0 - solana-bankrun-linux-x64-gnu: 0.3.0 - solana-bankrun-linux-x64-musl: 0.3.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.0.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.0.8: {} - - typescript@5.9.3: {} - - undici-types@5.26.5: {} - - utf-8-validate@6.0.6: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 - - uuid@11.1.0: {} - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + .: {} diff --git a/tokens/token-extensions/non-transferable/native/program/Cargo.toml b/tokens/token-extensions/non-transferable/native/program/Cargo.toml index e9b2e245..c3a3b0ed 100644 --- a/tokens/token-extensions/non-transferable/native/program/Cargo.toml +++ b/tokens/token-extensions/non-transferable/native/program/Cargo.toml @@ -19,3 +19,11 @@ custom-panic = [] [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm.workspace = true +solana-instruction.workspace = true +solana-keypair.workspace = true +solana-native-token.workspace = true +solana-pubkey.workspace = true +solana-transaction.workspace = true diff --git a/tokens/token-extensions/non-transferable/native/program/tests/test.rs b/tokens/token-extensions/non-transferable/native/program/tests/test.rs new file mode 100644 index 00000000..27458358 --- /dev/null +++ b/tokens/token-extensions/non-transferable/native/program/tests/test.rs @@ -0,0 +1,72 @@ +use { + litesvm::LiteSVM, + solana_instruction::{AccountMeta, Instruction}, + solana_keypair::{Keypair, Signer}, + solana_native_token::LAMPORTS_PER_SOL, + solana_pubkey::{pubkey, Pubkey}, + solana_transaction::Transaction, + spl_token_2022_interface::{ + extension::{ + non_transferable::NonTransferable, BaseStateWithExtensions, StateWithExtensions, + }, + state::Mint, + }, + token_2022_non_transferable_program::CreateTokenArgs, +}; + +const RENT_SYSVAR_ID: Pubkey = pubkey!("SysvarRent111111111111111111111111111111111"); + +#[test] +fn test_create_non_transferable_token() { + let mut svm = LiteSVM::new(); + + let program_id = Pubkey::new_unique(); + let program_bytes = + include_bytes!("../../tests/fixtures/token_2022_non_transferable_program.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + // litesvm bundles the SPL Token-2022 program by default. + let token_program_id = spl_token_2022_interface::id(); + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + let mint = Keypair::new(); + + let data = borsh::to_vec(&CreateTokenArgs { token_decimals: 9 }).unwrap(); + + let ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), true), // mint account + AccountMeta::new(payer.pubkey(), false), // mint authority + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new_readonly(RENT_SYSVAR_ID, false), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), + AccountMeta::new_readonly(token_program_id, false), + ], + data, + }; + + let tx = Transaction::new_signed_with_payer( + &[ix], + Some(&payer.pubkey()), + &[&payer, &mint], + svm.latest_blockhash(), + ); + + svm.send_transaction(tx).unwrap(); + + // The mint should be owned by Token-2022 and carry the NonTransferable + // extension (it has no fields; presence is what we assert). + let mint_account = svm.get_account(&mint.pubkey()).unwrap(); + assert_eq!(mint_account.owner, token_program_id); + + let state = StateWithExtensions::::unpack(&mint_account.data).unwrap(); + assert_eq!(state.base.decimals, 9); + assert!(state.base.is_initialized); + + state + .get_extension::() + .expect("NonTransferable extension should be present"); +} diff --git a/tokens/token-extensions/non-transferable/native/tests/test.ts b/tokens/token-extensions/non-transferable/native/tests/test.ts deleted file mode 100644 index c9c0fc87..00000000 --- a/tokens/token-extensions/non-transferable/native/tests/test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; -import { - Keypair, - PublicKey, - SYSVAR_RENT_PUBKEY, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import * as borsh from "borsh"; -import { assert } from "chai"; -import { start } from "solana-bankrun"; - -const CreateTokenArgsSchema = { struct: { token_decimals: "u8" } }; - -function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); -} - -describe("Create Token", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "token_2022_non_transferable_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - test("Create a Token-22 SPL-Token !", async () => { - const blockhash = context.lastBlockhash; - const mintKeypair: Keypair = Keypair.generate(); - - const instructionData = borshSerialize(CreateTokenArgsSchema, { - token_decimals: 9, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: true, isWritable: true }, // Mint account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Transaction Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - ], - programId: PROGRAM_ID, - data: instructionData, - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, mintKeypair); - - const transaction = await client.processTransaction(tx); - - assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - console.log("Token Mint Address: ", mintKeypair.publicKey.toBase58()); - }); -}); diff --git a/tokens/token-extensions/non-transferable/native/tsconfig.json b/tokens/token-extensions/non-transferable/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/tokens/token-extensions/non-transferable/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/tokens/token-extensions/transfer-fee/native/package.json b/tokens/token-extensions/transfer-fee/native/package.json index 375fa128..e7ece874 100644 --- a/tokens/token-extensions/transfer-fee/native/package.json +++ b/tokens/token-extensions/transfer-fee/native/package.json @@ -1,26 +1,7 @@ { "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/hello_solana_program.so" - }, - "dependencies": { - "@metaplex-foundation/mpl-token-metadata": "^2.5.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.4.1", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5" + "deploy": "solana program deploy ./program/target/so/token_2022_transfer_fees_program.so" } } diff --git a/tokens/token-extensions/transfer-fee/native/pnpm-lock.yaml b/tokens/token-extensions/transfer-fee/native/pnpm-lock.yaml index 8507d821..9b60ae17 100644 --- a/tokens/token-extensions/transfer-fee/native/pnpm-lock.yaml +++ b/tokens/token-extensions/transfer-fee/native/pnpm-lock.yaml @@ -6,1863 +6,4 @@ settings: importers: - .: - dependencies: - '@metaplex-foundation/mpl-token-metadata': - specifier: ^2.5.2 - version: 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/spl-token': - specifier: ^0.3.7 - version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.5 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.16 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.4.1 - version: 4.4.1 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@9.2.2) - typescript: - specifier: ^5 - version: 5.9.3 - -packages: - - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - - '@metaplex-foundation/beet-solana@0.4.1': - resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} - - '@metaplex-foundation/beet@0.7.2': - resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} - - '@metaplex-foundation/cusper@0.0.2': - resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} - - '@metaplex-foundation/mpl-token-metadata@2.13.0': - resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout-utils@0.2.0': - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.0.0-preview.2': - resolution: {integrity: sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-data-structures@2.0.0-preview.2': - resolution: {integrity: sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==} - - '@solana/codecs-numbers@2.0.0-preview.2': - resolution: {integrity: sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==} - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-strings@2.0.0-preview.2': - resolution: {integrity: sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - - '@solana/codecs@2.0.0-preview.2': - resolution: {integrity: sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==} - - '@solana/errors@2.0.0-preview.2': - resolution: {integrity: sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==} - hasBin: true - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/options@2.0.0-preview.2': - resolution: {integrity: sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==} - - '@solana/spl-token-metadata@0.1.4': - resolution: {integrity: sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.91.6 - - '@solana/spl-token@0.3.11': - resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.88.0 - - '@solana/spl-type-length-value@0.1.0': - resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} - engines: {node: '>=16'} - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.19': - resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.12.12': - resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} - - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - - base-x@4.0.0: - resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.5: - resolution: {integrity: sha512-4mAmr+AEhPYJ9TmDtxF3r3ZcbWy7W8kvZ4PoZYw/Xgp2J7WixjwTgiQZsoTDvch5nimmg3Ay6/0Kuh9oIvVs9A==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - solana-bankrun-darwin-arm64@0.3.0: - resolution: {integrity: sha512-+NbDncf0U6l3knuacRBiqpjZ2DSp+5lZaAU518gH7/x6qubbui/d000STaIBK+uNTPBS/AL/bCN+7PkXqmA3lA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.0: - resolution: {integrity: sha512-1/F0xdMa4qvc5o6z16FCCbZ5jbdvKvxpx5kyPcMWRiRPwyvi+zltMxciPAYMlg3wslQqGz88uFhrBEzq2eTumQ==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.0: - resolution: {integrity: sha512-U6CANjkmMl+lgNA7UH0GKs5V7LtVIUDzJBZefGGqLfqUNv3EjA/PrrToM0hAOWJgkxSwdz6zW+p5sw5FmnbXtg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.0: - resolution: {integrity: sha512-qJSkCFs0k2n4XtTnyxGMiZsuqO2TiqTYgWjQ+3mZhGNUAMys/Vq8bd7/SyBm6RR7EfVuRXRxZvh+F8oKZ77V4w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.0: - resolution: {integrity: sha512-xsS2CS2xb1Sw4ivNXM0gPz/qpW9BX0neSvt/pnok5L330Nu9xlTnKAY8FhzzqOP9P9sJlGRM787Y6d0yYwt6xQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.0: - resolution: {integrity: sha512-YkH7sa8TB/AoRPzG17CXJtYsRIQHEkEqGLz1Vwc13taXhDBkjO7z6NI5JYw7n0ybRymDHwMYTc7sd+5J40TyVQ==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - utf-8-validate@6.0.6: - resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} - engines: {node: '>=6.14.2'} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.29.2': {} - - '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bs58: 5.0.0 - debug: 4.3.4 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - - '@metaplex-foundation/beet@0.7.2': - dependencies: - ansicolors: 0.3.2 - assert: 2.1.0 - bn.js: 5.2.1 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - '@metaplex-foundation/cusper@0.0.2': {} - - '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@metaplex-foundation/cusper': 0.0.2 - '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bn.js: 5.2.1 - debug: 4.3.4 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - supports-color - - typescript - - utf-8-validate - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bigint-buffer: 1.1.5 - bignumber.js: 9.1.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.0.0-preview.2': - dependencies: - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-data-structures@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-numbers@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-strings@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - fastestsmallesttextencoderdecoder: 1.0.22 - - '@solana/codecs@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-data-structures': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/codecs-strings': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/options': 2.0.0-preview.2 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@2.0.0-preview.2': - dependencies: - chalk: 5.3.0 - commander: 12.1.0 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 5.9.3 - - '@solana/options@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - - '@solana/spl-token-metadata@0.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/spl-type-length-value': 0.1.0 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/spl-token-metadata': 0.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - '@solana/spl-type-length-value@0.1.0': - dependencies: - buffer: 6.0.3 - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@babel/runtime': 7.29.2 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.4.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) - agentkeepalive: 4.5.0 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - node-fetch: 2.7.0 - rpc-websockets: 9.3.5 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.19': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 20.12.12 - - '@types/chai@4.3.16': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.12.12 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@20.12.12': - dependencies: - undici-types: 5.26.5 - - '@types/uuid@10.0.0': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 20.12.12 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 20.12.12 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansicolors@0.3.2: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assert@2.1.0: - dependencies: - call-bind: 1.0.7 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.5 - util: 0.12.5 - - assertion-error@1.1.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - balanced-match@1.0.2: {} - - base-x@3.0.9: - dependencies: - safe-buffer: 5.2.1 - - base-x@4.0.0: {} - - base64-js@1.5.1: {} - - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - - bignumber.js@9.1.2: {} - - binary-extensions@2.3.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bn.js@5.2.1: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.9 - - bs58@5.0.0: - dependencies: - base-x: 4.0.0 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - camelcase@6.3.0: {} - - chai@4.4.1: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.3.0: {} - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@12.1.0: {} - - commander@14.0.3: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.3.4: - dependencies: - ms: 2.1.2 - - decamelize@4.0.0: {} - - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.1.2: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.4: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - file-uri-to-path@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-callable@1.2.7: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-nan@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - - jayson@4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.1: - optional: true - - normalize-path@3.0.0: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - possible-typed-array-names@1.0.0: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.3.5: - dependencies: - '@swc/helpers': 0.5.19 - '@types/uuid': 10.0.0 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.4 - uuid: 11.1.0 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - solana-bankrun-darwin-arm64@0.3.0: - optional: true - - solana-bankrun-darwin-universal@0.3.0: - optional: true - - solana-bankrun-darwin-x64@0.3.0: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.0: - optional: true - - solana-bankrun-linux-x64-musl@0.3.0: - optional: true - - solana-bankrun@0.3.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.0 - solana-bankrun-darwin-universal: 0.3.0 - solana-bankrun-darwin-x64: 0.3.0 - solana-bankrun-linux-x64-gnu: 0.3.0 - solana-bankrun-linux-x64-musl: 0.3.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.0.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.0.8: {} - - typescript@5.9.3: {} - - undici-types@5.26.5: {} - - utf-8-validate@6.0.6: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 - - uuid@11.1.0: {} - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + .: {} diff --git a/tokens/token-extensions/transfer-fee/native/program/Cargo.toml b/tokens/token-extensions/transfer-fee/native/program/Cargo.toml index 12df149e..2976315c 100644 --- a/tokens/token-extensions/transfer-fee/native/program/Cargo.toml +++ b/tokens/token-extensions/transfer-fee/native/program/Cargo.toml @@ -19,3 +19,11 @@ custom-panic = [] [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm.workspace = true +solana-instruction.workspace = true +solana-keypair.workspace = true +solana-native-token.workspace = true +solana-pubkey.workspace = true +solana-transaction.workspace = true diff --git a/tokens/token-extensions/transfer-fee/native/program/tests/test.rs b/tokens/token-extensions/transfer-fee/native/program/tests/test.rs new file mode 100644 index 00000000..ff75cf1d --- /dev/null +++ b/tokens/token-extensions/transfer-fee/native/program/tests/test.rs @@ -0,0 +1,85 @@ +use { + litesvm::LiteSVM, + solana_instruction::{AccountMeta, Instruction}, + solana_keypair::{Keypair, Signer}, + solana_native_token::LAMPORTS_PER_SOL, + solana_pubkey::{pubkey, Pubkey}, + solana_transaction::Transaction, + spl_token_2022_interface::{ + extension::{ + transfer_fee::TransferFeeConfig, BaseStateWithExtensions, StateWithExtensions, + }, + state::Mint, + }, + token_2022_transfer_fees_program::CreateTokenArgs, +}; + +const RENT_SYSVAR_ID: Pubkey = pubkey!("SysvarRent111111111111111111111111111111111"); + +#[test] +fn test_create_token_with_transfer_fee() { + let mut svm = LiteSVM::new(); + + let program_id = Pubkey::new_unique(); + let program_bytes = include_bytes!("../../tests/fixtures/token_2022_transfer_fees_program.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + // litesvm bundles the SPL Token-2022 program by default. + let token_program_id = spl_token_2022_interface::id(); + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + let mint = Keypair::new(); + + let decimals = 9u8; + let data = borsh::to_vec(&CreateTokenArgs { + token_decimals: decimals, + }) + .unwrap(); + + let ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), true), // mint account + AccountMeta::new(payer.pubkey(), false), // mint authority + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new_readonly(RENT_SYSVAR_ID, false), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), + AccountMeta::new_readonly(token_program_id, false), + ], + data, + }; + + let tx = Transaction::new_signed_with_payer( + &[ix], + Some(&payer.pubkey()), + &[&payer, &mint], + svm.latest_blockhash(), + ); + + svm.send_transaction(tx).unwrap(); + + // The mint should be owned by Token-2022 and carry the TransferFeeConfig + // extension. The program initializes a 1% fee, then sets the newer fee to + // 10% (1000 bps) with a max fee of 5 tokens. + let mint_account = svm.get_account(&mint.pubkey()).unwrap(); + assert_eq!(mint_account.owner, token_program_id); + + let state = StateWithExtensions::::unpack(&mint_account.data).unwrap(); + assert_eq!(state.base.decimals, decimals); + assert!(state.base.is_initialized); + + let config = state.get_extension::().unwrap(); + let fee_authority: Option = config.transfer_fee_config_authority.into(); + let withdraw_authority: Option = config.withdraw_withheld_authority.into(); + assert_eq!(fee_authority, Some(payer.pubkey())); + assert_eq!(withdraw_authority, Some(payer.pubkey())); + + let max_fee = 5 * 10u64.pow(decimals as u32); + assert_eq!( + u16::from(config.newer_transfer_fee.transfer_fee_basis_points), + 1000 + ); + assert_eq!(u64::from(config.newer_transfer_fee.maximum_fee), max_fee); +} diff --git a/tokens/token-extensions/transfer-fee/native/tests/test.ts b/tokens/token-extensions/transfer-fee/native/tests/test.ts deleted file mode 100644 index e6cde252..00000000 --- a/tokens/token-extensions/transfer-fee/native/tests/test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; -import { - Keypair, - PublicKey, - SYSVAR_RENT_PUBKEY, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import * as borsh from "borsh"; -import { assert } from "chai"; -import { start } from "solana-bankrun"; - -const CreateTokenArgsSchema = { struct: { token_decimals: "u8" } }; - -function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); -} - -describe("Create Token", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "token_2022_transfer_fees_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - test("Create a Token-22 SPL-Token !", async () => { - const blockhash = context.lastBlockhash; - const mintKeypair: Keypair = Keypair.generate(); - - const instructionData = borshSerialize(CreateTokenArgsSchema, { - token_decimals: 9, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: true, isWritable: true }, // Mint account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Transaction Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - ], - programId: PROGRAM_ID, - data: instructionData, - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, mintKeypair); - - const transaction = await client.processTransaction(tx); - - assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - console.log("Token Mint Address: ", mintKeypair.publicKey.toBase58()); - }); -}); diff --git a/tokens/token-extensions/transfer-fee/native/tsconfig.json b/tokens/token-extensions/transfer-fee/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/tokens/token-extensions/transfer-fee/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} From c8873f8be3a79fef0ee9019ca7f0d8912f555a1b Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 15:03:01 +0000 Subject: [PATCH 015/138] test(basics): fix and re-enable realloc and cross-program-invocation native MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both native examples were excluded in .ghaignore as "build and test error". The real cause was the LiteSVM Rust tests pointing include_bytes!() at target/deploy/.so, but build-and-test compiles the program .so into tests/fixtures/ โ€” so cargo test failed to compile (file not found). - realloc: fix the include_bytes!() path to tests/fixtures/realloc_program.so. - cross-program-invocation: fix both include_bytes!() paths to tests/fixtures/. Additionally, `hand` depends on `lever` with the `cpi` (= `no-entrypoint`) feature, so building the whole workspace at once unified that feature onto `lever` and produced an entrypoint-less lever.so (896 bytes) that LiteSVM rejected with InvalidAccountData. build-and-test now builds each program separately so lever.so keeps its entrypoint. Also remove the false-green / localnet-only TypeScript suites (realloc's node:test-under-ts-mocha suite plus its now-unused ts/ client helpers, and cpi's localnet test), strip their JS tooling, and drop both examples from .github/.ghaignore so CI builds and tests them via the LiteSVM cargo tests. --- .github/.ghaignore | 4 - .../native/package.json | 21 +- .../native/pnpm-lock.yaml | 1287 +--------------- .../native/programs/hand/tests/test.rs | 4 +- .../native/tests/test.ts | 70 - .../native/tsconfig.json | 10 - basics/realloc/native/package.json | 19 +- basics/realloc/native/pnpm-lock.yaml | 1345 +---------------- basics/realloc/native/program/tests/test.rs | 2 +- basics/realloc/native/tests/realloc.test.ts | 123 -- .../realloc/native/tests/tsconfig.test.json | 10 - basics/realloc/native/ts/index.ts | 7 - .../realloc/native/ts/instructions/create.ts | 80 - .../realloc/native/ts/instructions/index.ts | 3 - .../native/ts/instructions/instruction.ts | 5 - .../native/ts/instructions/reallocate.ts | 140 -- .../realloc/native/ts/state/address-info.ts | 48 - .../native/ts/state/enhanced-address-info.ts | 56 - basics/realloc/native/ts/state/index.ts | 3 - basics/realloc/native/ts/state/work-info.ts | 48 - basics/realloc/native/ts/util/index.ts | 1 - basics/realloc/native/ts/util/util.ts | 5 - 22 files changed, 9 insertions(+), 3282 deletions(-) delete mode 100644 basics/cross-program-invocation/native/tests/test.ts delete mode 100644 basics/cross-program-invocation/native/tsconfig.json delete mode 100644 basics/realloc/native/tests/realloc.test.ts delete mode 100644 basics/realloc/native/tests/tsconfig.test.json delete mode 100644 basics/realloc/native/ts/index.ts delete mode 100644 basics/realloc/native/ts/instructions/create.ts delete mode 100644 basics/realloc/native/ts/instructions/index.ts delete mode 100644 basics/realloc/native/ts/instructions/instruction.ts delete mode 100644 basics/realloc/native/ts/instructions/reallocate.ts delete mode 100644 basics/realloc/native/ts/state/address-info.ts delete mode 100644 basics/realloc/native/ts/state/enhanced-address-info.ts delete mode 100644 basics/realloc/native/ts/state/index.ts delete mode 100644 basics/realloc/native/ts/state/work-info.ts delete mode 100644 basics/realloc/native/ts/util/index.ts delete mode 100644 basics/realloc/native/ts/util/util.ts diff --git a/.github/.ghaignore b/.github/.ghaignore index ab3226b8..6c402aa5 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -1,7 +1,3 @@ -# build and test error -basics/realloc/native -basics/cross-program-invocation/native - # uses generated client from shank, can't rewrite to solana-bankrun tools/shank-and-solita/native diff --git a/basics/cross-program-invocation/native/package.json b/basics/cross-program-invocation/native/package.json index a6cdf69c..91456108 100644 --- a/basics/cross-program-invocation/native/package.json +++ b/basics/cross-program-invocation/native/package.json @@ -1,24 +1,7 @@ { "type": "module", "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" + "build-and-test": "cargo build-sbf --manifest-path=./programs/lever/Cargo.toml --sbf-out-dir=./tests/fixtures && cargo build-sbf --manifest-path=./programs/hand/Cargo.toml --sbf-out-dir=./tests/fixtures", + "build": "cargo build-sbf --manifest-path=./programs/lever/Cargo.toml && cargo build-sbf --manifest-path=./programs/hand/Cargo.toml" } } diff --git a/basics/cross-program-invocation/native/pnpm-lock.yaml b/basics/cross-program-invocation/native/pnpm-lock.yaml index 6206710d..9b60ae17 100644 --- a/basics/cross-program-invocation/native/pnpm-lock.yaml +++ b/basics/cross-program-invocation/native/pnpm-lock.yaml @@ -6,1289 +6,4 @@ settings: importers: - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + .: {} diff --git a/basics/cross-program-invocation/native/programs/hand/tests/test.rs b/basics/cross-program-invocation/native/programs/hand/tests/test.rs index 9014535a..d36e03ac 100644 --- a/basics/cross-program-invocation/native/programs/hand/tests/test.rs +++ b/basics/cross-program-invocation/native/programs/hand/tests/test.rs @@ -11,9 +11,9 @@ fn test_cpi() { let hand_program_id = Pubkey::new_unique(); let lever_program_id = Pubkey::new_unique(); let hand_program_bytes = - include_bytes!("../../../target/deploy/cross_program_invocatio_native_hand.so"); + include_bytes!("../../../tests/fixtures/cross_program_invocatio_native_hand.so"); let lever_program_bytes = - include_bytes!("../../../target/deploy/cross_program_invocatio_native_lever.so"); + include_bytes!("../../../tests/fixtures/cross_program_invocatio_native_lever.so"); let payer = Keypair::new(); let power_account = Keypair::new(); diff --git a/basics/cross-program-invocation/native/tests/test.ts b/basics/cross-program-invocation/native/tests/test.ts deleted file mode 100644 index c9dc4249..00000000 --- a/basics/cross-program-invocation/native/tests/test.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Buffer } from "node:buffer"; -import { - Connection, - Keypair, - SystemProgram, - sendAndConfirmTransaction, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import * as borsh from "borsh"; - -function createKeypairFromFile(path: string): Keypair { - return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(require("node:fs").readFileSync(path, "utf-8")))); -} - -describe("CPI Example", () => { - const connection = new Connection("http://localhost:8899", "confirmed"); - const payer = createKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); - const hand = createKeypairFromFile("./target/so/hand-keypair.json"); - const lever = createKeypairFromFile("./target/so/lever-keypair.json"); - - const PowerStatusSchema = { struct: { is_on: "u8" } }; - const SetPowerStatusSchema = { struct: { name: "string" } }; - - function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); - } - - const powerAccount = Keypair.generate(); - - it("Initialize the lever!", async () => { - const ix = new TransactionInstruction({ - keys: [ - { pubkey: powerAccount.publicKey, isSigner: true, isWritable: true }, - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: lever.publicKey, - data: borshSerialize(PowerStatusSchema, { is_on: true }), - }); - - await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, powerAccount]); - }); - - it("Pull the lever!", async () => { - const ix = new TransactionInstruction({ - keys: [ - { pubkey: powerAccount.publicKey, isSigner: false, isWritable: true }, - { pubkey: lever.publicKey, isSigner: false, isWritable: false }, - ], - programId: hand.publicKey, - data: borshSerialize(SetPowerStatusSchema, { name: "Chris" }), - }); - - await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - }); - - it("Pull it again!", async () => { - const ix = new TransactionInstruction({ - keys: [ - { pubkey: powerAccount.publicKey, isSigner: false, isWritable: true }, - { pubkey: lever.publicKey, isSigner: false, isWritable: false }, - ], - programId: hand.publicKey, - data: borshSerialize(SetPowerStatusSchema, { name: "Ashley" }), - }); - - await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - }); -}); diff --git a/basics/cross-program-invocation/native/tsconfig.json b/basics/cross-program-invocation/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/cross-program-invocation/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/realloc/native/package.json b/basics/realloc/native/package.json index c01413a5..8419fce3 100644 --- a/basics/realloc/native/package.json +++ b/basics/realloc/native/package.json @@ -1,23 +1,8 @@ { "type": "module", "scripts": { - "test": "pnpm ts-mocha -p ./tests/tsconfig.test.json -t 1000000 ./tests/realloc.test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" + "deploy": "solana program deploy ./program/target/so/realloc_program.so" } } diff --git a/basics/realloc/native/pnpm-lock.yaml b/basics/realloc/native/pnpm-lock.yaml index a79f68d4..9b60ae17 100644 --- a/basics/realloc/native/pnpm-lock.yaml +++ b/basics/realloc/native/pnpm-lock.yaml @@ -6,1347 +6,4 @@ settings: importers: - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + .: {} diff --git a/basics/realloc/native/program/tests/test.rs b/basics/realloc/native/program/tests/test.rs index 0b70fd86..6ee052a8 100644 --- a/basics/realloc/native/program/tests/test.rs +++ b/basics/realloc/native/program/tests/test.rs @@ -12,7 +12,7 @@ fn test_realloc() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../../../../target/deploy/realloc_program.so"); + let program_bytes = include_bytes!("../../tests/fixtures/realloc_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/realloc/native/tests/realloc.test.ts b/basics/realloc/native/tests/realloc.test.ts deleted file mode 100644 index 53ef0b78..00000000 --- a/basics/realloc/native/tests/realloc.test.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { describe, test } from "node:test"; -import { Keypair, PublicKey, Transaction } from "@solana/web3.js"; -import { start } from "solana-bankrun"; -import { - AddressInfo, - createCreateInstruction, - createReallocateWithoutZeroInitInstruction, - createReallocateZeroInitInstruction, - EnhancedAddressInfo, - WorkInfo, -} from "../ts"; - -describe("Realloc!", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "realloc_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - const testAccount = Keypair.generate(); - - test("Create the account with data", async () => { - console.log(`${testAccount.publicKey}`); - const ix = createCreateInstruction( - testAccount.publicKey, - payer.publicKey, - PROGRAM_ID, - "Jacob", - 123, - "Main St.", - "Chicago", - ); - - const tx = new Transaction(); - tx.recentBlockhash = context.lastBlockhash; - tx.add(ix).sign(payer, testAccount); - await client.processTransaction(tx); - - await printAddressInfo(testAccount.publicKey); - }); - - test("Reallocate WITHOUT zero init", async () => { - const ix = createReallocateWithoutZeroInitInstruction( - testAccount.publicKey, - payer.publicKey, - PROGRAM_ID, - "Illinois", - 12345, - ); - const tx = new Transaction(); - const [blockHash, _blockHeight] = await client.getLatestBlockhash(); - tx.recentBlockhash = blockHash; - tx.add(ix).sign(payer); - await client.processTransaction(tx); - - await printEnhancedAddressInfo(testAccount.publicKey); - }); - - test("Reallocate WITH zero init", async () => { - const ix = createReallocateZeroInitInstruction( - testAccount.publicKey, - payer.publicKey, - PROGRAM_ID, - "Pete", - "Engineer", - "Solana Labs", - 2, - ); - const tx = new Transaction(); - const [blockHash, _blockHeight] = await client.getLatestBlockhash(); - tx.recentBlockhash = blockHash; - tx.add(ix).sign(payer); - await client.processTransaction(tx); - - await printEnhancedAddressInfo(testAccount.publicKey); - await printWorkInfo(testAccount.publicKey); - }); - - async function printAddressInfo(pubkey: PublicKey): Promise { - await sleep(2); - const data = (await client.getAccount(pubkey))?.data; - if (data) { - const addressInfo = AddressInfo.fromBuffer(Buffer.from(data)); - console.log("Address info:"); - console.log(` Name: ${addressInfo.name}`); - console.log(` House Num: ${addressInfo.house_number}`); - console.log(` Street: ${addressInfo.street}`); - console.log(` City: ${addressInfo.city}`); - } - } - - async function printEnhancedAddressInfo(pubkey: PublicKey): Promise { - await sleep(2); - const data = (await client.getAccount(pubkey))?.data; - if (data) { - const enhancedAddressInfo = EnhancedAddressInfo.fromBuffer(Buffer.from(data)); - console.log("Enhanced Address info:"); - console.log(` Name: ${enhancedAddressInfo.name}`); - console.log(` House Num: ${enhancedAddressInfo.house_number}`); - console.log(` Street: ${enhancedAddressInfo.street}`); - console.log(` City: ${enhancedAddressInfo.city}`); - console.log(` State: ${enhancedAddressInfo.state}`); - console.log(` Zip: ${enhancedAddressInfo.zip}`); - } - } - - async function printWorkInfo(pubkey: PublicKey): Promise { - await sleep(2); - const data = (await client.getAccount(pubkey))?.data; - if (data) { - const workInfo = WorkInfo.fromBuffer(Buffer.from(data)); - console.log("Work info:"); - console.log(` Name: ${workInfo.name}`); - console.log(` Position: ${workInfo.position}`); - console.log(` Company: ${workInfo.company}`); - console.log(` Years: ${workInfo.years_employed}`); - } - } - - function sleep(s: number) { - const SECONDS = 1000; - return new Promise((resolve) => setTimeout(resolve, s * SECONDS)); - } -}); diff --git a/basics/realloc/native/tests/tsconfig.test.json b/basics/realloc/native/tests/tsconfig.test.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/realloc/native/tests/tsconfig.test.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/realloc/native/ts/index.ts b/basics/realloc/native/ts/index.ts deleted file mode 100644 index 9cfd6848..00000000 --- a/basics/realloc/native/ts/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./instructions/create"; -export * from "./instructions/instruction"; -export * from "./instructions/reallocate"; -export * from "./state/address-info"; -export * from "./state/enhanced-address-info"; -export * from "./state/work-info"; -export * from "./util/util"; diff --git a/basics/realloc/native/ts/instructions/create.ts b/basics/realloc/native/ts/instructions/create.ts deleted file mode 100644 index 3fbc6a84..00000000 --- a/basics/realloc/native/ts/instructions/create.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Buffer } from "node:buffer"; -import { type PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; -import * as borsh from "borsh"; -import { ReallocInstruction } from "./instruction"; - -export class Create { - instruction: ReallocInstruction; - name: string; - house_number: number; - street: string; - city: string; - - constructor(props: { - instruction: ReallocInstruction; - name: string; - house_number: number; - street: string; - city: string; - }) { - this.instruction = props.instruction; - this.name = props.name; - this.house_number = props.house_number; - this.street = props.street; - this.city = props.city; - } - - toBuffer() { - return Buffer.from(borsh.serialize(CreateSchema, this)); - } - - static fromBuffer(buffer: Buffer) { - return borsh.deserialize(CreateSchema, Create, buffer); - } -} - -export const CreateSchema = new Map([ - [ - Create, - { - kind: "struct", - fields: [ - ["instruction", "u8"], - ["name", "string"], - ["house_number", "u8"], - ["street", "string"], - ["city", "string"], - ], - }, - ], -]); - -export function createCreateInstruction( - target: PublicKey, - payer: PublicKey, - programId: PublicKey, - name: string, - house_number: number, - street: string, - city: string, -): TransactionInstruction { - const instructionObject = new Create({ - instruction: ReallocInstruction.Create, - name, - house_number, - street, - city, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: target, isSigner: false, isWritable: true }, - { pubkey: payer, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: programId, - data: instructionObject.toBuffer(), - }); - - return ix; -} diff --git a/basics/realloc/native/ts/instructions/index.ts b/basics/realloc/native/ts/instructions/index.ts deleted file mode 100644 index dba00c45..00000000 --- a/basics/realloc/native/ts/instructions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./create"; -export * from "./instruction"; -export * from "./reallocate"; diff --git a/basics/realloc/native/ts/instructions/instruction.ts b/basics/realloc/native/ts/instructions/instruction.ts deleted file mode 100644 index 31121a6f..00000000 --- a/basics/realloc/native/ts/instructions/instruction.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum ReallocInstruction { - Create = 0, - ReallocateWithoutZeroInit = 1, - ReallocateZeroInit = 2, -} diff --git a/basics/realloc/native/ts/instructions/reallocate.ts b/basics/realloc/native/ts/instructions/reallocate.ts deleted file mode 100644 index 197e711d..00000000 --- a/basics/realloc/native/ts/instructions/reallocate.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { Buffer } from "node:buffer"; -import { type PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; -import * as borsh from "borsh"; -import { ReallocInstruction } from "./instruction"; - -export class ReallocateWithoutZeroInit { - instruction: ReallocInstruction; - state: string; - zip: number; - - constructor(props: { - instruction: ReallocInstruction; - state: string; - zip: number; - }) { - this.instruction = props.instruction; - this.state = props.state; - this.zip = props.zip; - } - - toBuffer() { - return Buffer.from(borsh.serialize(ReallocateWithoutZeroInitSchema, this)); - } - - static fromBuffer(buffer: Buffer) { - return borsh.deserialize(ReallocateWithoutZeroInitSchema, ReallocateWithoutZeroInit, buffer); - } -} - -export const ReallocateWithoutZeroInitSchema = new Map([ - [ - ReallocateWithoutZeroInit, - { - kind: "struct", - fields: [ - ["instruction", "u8"], - ["state", "string"], - ["zip", "u32"], - ], - }, - ], -]); - -export function createReallocateWithoutZeroInitInstruction( - target: PublicKey, - payer: PublicKey, - programId: PublicKey, - state: string, - zip: number, -): TransactionInstruction { - const instructionObject = new ReallocateWithoutZeroInit({ - instruction: ReallocInstruction.ReallocateWithoutZeroInit, - state, - zip, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: target, isSigner: false, isWritable: true }, - { pubkey: payer, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: programId, - data: instructionObject.toBuffer(), - }); - - return ix; -} - -export class ReallocateZeroInit { - instruction: ReallocInstruction; - name: string; - position: string; - company: string; - years_employed: number; - - constructor(props: { - instruction: ReallocInstruction; - name: string; - position: string; - company: string; - years_employed: number; - }) { - this.instruction = props.instruction; - this.name = props.name; - this.position = props.position; - this.company = props.company; - this.years_employed = props.years_employed; - } - - toBuffer() { - return Buffer.from(borsh.serialize(ReallocateZeroInitSchema, this)); - } - - static fromBuffer(buffer: Buffer) { - return borsh.deserialize(ReallocateZeroInitSchema, ReallocateZeroInit, buffer); - } -} - -export const ReallocateZeroInitSchema = new Map([ - [ - ReallocateZeroInit, - { - kind: "struct", - fields: [ - ["instruction", "u8"], - ["name", "string"], - ["position", "string"], - ["company", "string"], - ["years_employed", "u8"], - ], - }, - ], -]); - -export function createReallocateZeroInitInstruction( - target: PublicKey, - _payer: PublicKey, - programId: PublicKey, - name: string, - position: string, - company: string, - years_employed: number, -): TransactionInstruction { - const instructionObject = new ReallocateZeroInit({ - instruction: ReallocInstruction.ReallocateZeroInit, - name, - position, - company, - years_employed, - }); - - const ix = new TransactionInstruction({ - keys: [{ pubkey: target, isSigner: false, isWritable: true }], - programId: programId, - data: instructionObject.toBuffer(), - }); - - return ix; -} diff --git a/basics/realloc/native/ts/state/address-info.ts b/basics/realloc/native/ts/state/address-info.ts deleted file mode 100644 index 6acf96c8..00000000 --- a/basics/realloc/native/ts/state/address-info.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Buffer } from "node:buffer"; -import * as borsh from "borsh"; - -export class AddressInfo { - name: string; - house_number: number; - street: string; - city: string; - - constructor(props: { - name: string; - house_number: number; - street: string; - city: string; - }) { - this.name = props.name; - this.house_number = props.house_number; - this.street = props.street; - this.city = props.city; - } - - toBase58() { - return borsh.serialize(AddressInfoSchema, this).toString(); - } - - toBuffer() { - return Buffer.from(borsh.serialize(AddressInfoSchema, this)); - } - - static fromBuffer(buffer: Buffer) { - return borsh.deserialize(AddressInfoSchema, AddressInfo, buffer); - } -} - -export const AddressInfoSchema = new Map([ - [ - AddressInfo, - { - kind: "struct", - fields: [ - ["name", "string"], - ["house_number", "u8"], - ["street", "string"], - ["city", "string"], - ], - }, - ], -]); diff --git a/basics/realloc/native/ts/state/enhanced-address-info.ts b/basics/realloc/native/ts/state/enhanced-address-info.ts deleted file mode 100644 index edbda778..00000000 --- a/basics/realloc/native/ts/state/enhanced-address-info.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Buffer } from "node:buffer"; -import * as borsh from "borsh"; - -export class EnhancedAddressInfo { - name: string; - house_number: number; - street: string; - city: string; - state: string; - zip: number; - - constructor(props: { - name: string; - house_number: number; - street: string; - city: string; - state: string; - zip: number; - }) { - this.name = props.name; - this.house_number = props.house_number; - this.street = props.street; - this.city = props.city; - this.state = props.state; - this.zip = props.zip; - } - - toBase58() { - return borsh.serialize(EnhancedAddressInfoSchema, this).toString(); - } - - toBuffer() { - return Buffer.from(borsh.serialize(EnhancedAddressInfoSchema, this)); - } - - static fromBuffer(buffer: Buffer) { - return borsh.deserialize(EnhancedAddressInfoSchema, EnhancedAddressInfo, buffer); - } -} - -export const EnhancedAddressInfoSchema = new Map([ - [ - EnhancedAddressInfo, - { - kind: "struct", - fields: [ - ["name", "string"], - ["house_number", "u8"], - ["street", "string"], - ["city", "string"], - ["state", "string"], - ["zip", "u32"], - ], - }, - ], -]); diff --git a/basics/realloc/native/ts/state/index.ts b/basics/realloc/native/ts/state/index.ts deleted file mode 100644 index 2cc8c658..00000000 --- a/basics/realloc/native/ts/state/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./address-info"; -export * from "./enhanced-address-info"; -export * from "./work-info"; diff --git a/basics/realloc/native/ts/state/work-info.ts b/basics/realloc/native/ts/state/work-info.ts deleted file mode 100644 index 26a89ebe..00000000 --- a/basics/realloc/native/ts/state/work-info.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Buffer } from "node:buffer"; -import * as borsh from "borsh"; - -export class WorkInfo { - name: string; - position: string; - company: string; - years_employed: number; - - constructor(props: { - name: string; - position: string; - company: string; - years_employed: number; - }) { - this.name = props.name; - this.position = props.position; - this.company = props.company; - this.years_employed = props.years_employed; - } - - toBase58() { - return borsh.serialize(WorkInfoSchema, this).toString(); - } - - toBuffer() { - return Buffer.from(borsh.serialize(WorkInfoSchema, this)); - } - - static fromBuffer(buffer: Buffer) { - return borsh.deserialize(WorkInfoSchema, WorkInfo, buffer); - } -} - -export const WorkInfoSchema = new Map([ - [ - WorkInfo, - { - kind: "struct", - fields: [ - ["name", "string"], - ["position", "string"], - ["company", "string"], - ["years_employed", "u8"], - ], - }, - ], -]); diff --git a/basics/realloc/native/ts/util/index.ts b/basics/realloc/native/ts/util/index.ts deleted file mode 100644 index 181e76f2..00000000 --- a/basics/realloc/native/ts/util/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./util"; diff --git a/basics/realloc/native/ts/util/util.ts b/basics/realloc/native/ts/util/util.ts deleted file mode 100644 index 7e72414f..00000000 --- a/basics/realloc/native/ts/util/util.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Keypair } from "@solana/web3.js"; - -export function createKeypairFromFile(path: string): Keypair { - return Keypair.fromSecretKey(Buffer.from(JSON.parse(require("node:fs").readFileSync(path, "utf-8")))); -} From df95cf703064f1a775036799853c6287d78defaa Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 15:03:53 +0000 Subject: [PATCH 016/138] Remove stray token-2022 quasar READMEs that broke CI These README files created empty quasar/ directories with no Quasar.toml. The Quasar workflow discovers projects via 'find -type d -name quasar' and ran 'quasar build' on them, failing with 'Quasar.toml not found'. --- tokens/token-2022/default-account-state/quasar/README.md | 3 --- tokens/token-2022/metadata/quasar/README.md | 3 --- 2 files changed, 6 deletions(-) delete mode 100644 tokens/token-2022/default-account-state/quasar/README.md delete mode 100644 tokens/token-2022/metadata/quasar/README.md diff --git a/tokens/token-2022/default-account-state/quasar/README.md b/tokens/token-2022/default-account-state/quasar/README.md deleted file mode 100644 index ca74b447..00000000 --- a/tokens/token-2022/default-account-state/quasar/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Deprecated path - -This tree is a leftover `token-2022` path. Use [`tokens/token-extensions/default-account-state/quasar`](../../../token-extensions/default-account-state/quasar/README.md) instead. diff --git a/tokens/token-2022/metadata/quasar/README.md b/tokens/token-2022/metadata/quasar/README.md deleted file mode 100644 index a01ef4b3..00000000 --- a/tokens/token-2022/metadata/quasar/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Deprecated path - -This tree is a leftover `token-2022` path. Use [`tokens/token-extensions/metadata/anchor`](../../../token-extensions/metadata/anchor/README.md) instead. From 21b7d7cb851779a488baeef78ca32a4a1ac46ee4 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 17:39:39 +0000 Subject: [PATCH 017/138] fix(token-extensions/group): re-enable group anchor + quasar examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both were excluded as "not live", but the real blockers were build/code bugs: - group/anchor: a dead `spl-token-group-interface = "0.2.5"` dependency (never imported in code โ€” the GroupPointer types come from anchor_spl::token_2022) transitively pinned an old solana-zk-token-sdk that conflicts with ed25519-dalek 2 on `zeroize`, breaking `cargo build-sbf`. Removed the dep; the program now builds and its LiteSVM test passes. - group/quasar: three bugs in src/lib.rs โ€” `Program` should be `Program` (compile error); the GroupPointer extension opcode was 41 (that's GroupMemberPointer) instead of 40; and the mint account was allocated 250 bytes instead of 234 (base 82 padded to 165 + 1 account-type byte + GroupPointer TLV of 2+2+64), which made InitializeMint2 fail with InvalidAccountData. Fixed all three; builds and both tests pass. Drop both from .github/.ghaignore so CI builds and tests them. --- .github/.ghaignore | 4 ---- .../group/anchor/programs/group/Cargo.toml | 1 - tokens/token-extensions/group/quasar/src/lib.rs | 14 ++++++++------ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.github/.ghaignore b/.github/.ghaignore index a04a034f..034781a7 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -19,10 +19,6 @@ compression/cnft-vault/anchor # builds but need to test on localhost compression/cnft-burn/anchor -# not live -tokens/token-extensions/group/anchor -tokens/token-extensions/group/quasar - # CPI quasar project uses subdirectories (hand/ and lever/) instead of a root Quasar.toml basics/cross-program-invocation/quasar diff --git a/tokens/token-extensions/group/anchor/programs/group/Cargo.toml b/tokens/token-extensions/group/anchor/programs/group/Cargo.toml index fe19b3a1..1253a994 100644 --- a/tokens/token-extensions/group/anchor/programs/group/Cargo.toml +++ b/tokens/token-extensions/group/anchor/programs/group/Cargo.toml @@ -22,7 +22,6 @@ custom-panic = [] [dependencies] anchor-lang = "1.0.0" anchor-spl = "1.0.0" -spl-token-group-interface = "0.2.5" [dev-dependencies] litesvm = "0.11.0" diff --git a/tokens/token-extensions/group/quasar/src/lib.rs b/tokens/token-extensions/group/quasar/src/lib.rs index 3f65707c..d9c4fad4 100644 --- a/tokens/token-extensions/group/quasar/src/lib.rs +++ b/tokens/token-extensions/group/quasar/src/lib.rs @@ -42,13 +42,14 @@ pub struct InitializeGroup { #[account(mut)] pub mint_account: Signer, pub token_program: Program, - pub system_program: Program, + pub system_program: Program, } #[inline(always)] fn handle_initialize_group(accounts: &mut InitializeGroup) -> Result<(), ProgramError> { - // Mint + GroupPointer extension = 250 bytes - let mint_size: u64 = 250; + // Mint + GroupPointer extension = 234 bytes + // (base mint padded to 165 + account_type byte + GroupPointer TLV [2 type + 2 len + 64 data]) + let mint_size: u64 = 234; let lamports = Rent::get()?.try_minimum_balance(mint_size as usize)?; accounts @@ -62,10 +63,11 @@ fn handle_initialize_group(accounts: &mut InitializeGroup) -> Result<(), Program ) .invoke()?; - // InitializeGroupPointer: opcode 41, sub-opcode 0 - // Data: [41, 0, authority (32 bytes), group_address (32 bytes)] + // InitializeGroupPointer: opcode 40, sub-opcode 0 + // (opcode 41 is GroupMemberPointer, not GroupPointer) + // Data: [40, 0, authority (32 bytes), group_address (32 bytes)] let mut ext_data = [0u8; 66]; - ext_data[0] = 41; + ext_data[0] = 40; ext_data[1] = 0; // authority = mint itself (self-referential PDA pattern) ext_data[2..34].copy_from_slice(accounts.mint_account.to_account_view().address().as_ref()); From 3bd06fb002b865fc6aa3e50cabb7832ab419bf95 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 17:37:59 +0000 Subject: [PATCH 018/138] test(create-token): migrate to mpl-token-metadata 5.x and add LiteSVM test create-token/native was excluded (devnet-only TypeScript test). Its program also no longer compiled: the code used the old `mpl_token_metadata::instruction` API while the dep had been bumped to 5.1.1. - Migrate to the mpl-token-metadata 5.x instruction builders (CreateMetadataAccountV3), solana-system-interface for the system program, and spl-token-interface for the Mint. mpl 5.x rides an older solana-program, so a small bridge converts its returned Instruction to this program's type. - Add a LiteSVM test that loads the program plus the Token-Metadata program (from a committed mpl_token_metadata.so fixture, since LiteSVM does not bundle it) and asserts the mint and metadata accounts are created. - Add the program to the workspace, remove the devnet TS test/tooling, rewire build-and-test to build the fixture the LiteSVM cargo test consumes, and drop create-token/native from .github/.ghaignore. --- .github/.ghaignore | 1 - Cargo.lock | 1947 ++++++++++++----- Cargo.toml | 1 + tokens/create-token/native/package.json | 25 +- tokens/create-token/native/pnpm-lock.yaml | 1874 +--------------- tokens/create-token/native/program/Cargo.toml | 17 +- tokens/create-token/native/program/src/lib.rs | 77 +- .../create-token/native/program/tests/test.rs | 92 + .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes tokens/create-token/native/tests/test.ts | 126 -- tokens/create-token/native/tsconfig.json | 10 - 11 files changed, 1601 insertions(+), 2569 deletions(-) create mode 100644 tokens/create-token/native/program/tests/test.rs create mode 100644 tokens/create-token/native/tests/fixtures/mpl_token_metadata.so delete mode 100644 tokens/create-token/native/tests/test.ts delete mode 100644 tokens/create-token/native/tsconfig.json diff --git a/.github/.ghaignore b/.github/.ghaignore index 034781a7..ae4a2717 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -6,7 +6,6 @@ tokens/pda-mint-authority/native tokens/nft-minter/native tokens/transfer-tokens/native tokens/token-minter/native -tokens/create-token/native # not building: pyth-solana-receiver-sdk 1.1.0 pulls a borsh version that # conflicts with Anchor 1.0 / Solana 3.x (PriceUpdateV2 fails BorshDeserialize). diff --git a/Cargo.lock b/Cargo.lock index f9a656eb..707ad832 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,7 +7,7 @@ name = "account-data-anchor-program" version = "0.1.0" dependencies = [ "anchor-lang", - "borsh", + "borsh 1.6.1", "litesvm", "solana-keypair", "solana-kite", @@ -18,12 +18,12 @@ dependencies = [ name = "account-data-native-program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", "solana-keypair", "solana-message 4.0.0", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-signer", @@ -41,7 +41,7 @@ dependencies = [ "pinocchio-system", "solana-keypair", "solana-message 4.0.0", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-signer", "solana-system-interface 2.0.0", @@ -91,10 +91,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e631ba26aeffe98dee3db0b8612fc7c67cda71bc57b0f82f28dc48231df6bc8" dependencies = [ "ahash", - "solana-epoch-schedule", + "solana-epoch-schedule 3.0.0", "solana-hash 3.1.0", "solana-pubkey 3.0.0", - "solana-sha256-hasher", + "solana-sha256-hasher 3.1.0", "solana-svm-feature-set", ] @@ -106,7 +106,7 @@ checksum = "d062865aedfbdc7511726d47e472687db0db4fb08e3c3ab2ac68570106c2f1b6" dependencies = [ "agave-feature-set", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", ] [[package]] @@ -119,27 +119,27 @@ dependencies = [ "libsecp256k1", "num-traits", "solana-account 3.4.0", - "solana-account-info", - "solana-big-mod-exp", - "solana-blake3-hasher", + "solana-account-info 3.1.1", + "solana-big-mod-exp 3.0.0", + "solana-blake3-hasher 3.1.0", "solana-bn254", - "solana-clock", - "solana-cpi", + "solana-clock 3.0.1", + "solana-cpi 3.1.0", "solana-curve25519", "solana-hash 3.1.0", - "solana-instruction", - "solana-keccak-hasher", - "solana-loader-v3-interface", + "solana-instruction 3.3.0", + "solana-keccak-hasher 3.1.0", + "solana-loader-v3-interface 6.1.0", "solana-poseidon", - "solana-program-entrypoint", + "solana-program-entrypoint 3.1.1", "solana-program-runtime", "solana-pubkey 3.0.0", "solana-sbpf", - "solana-sdk-ids", - "solana-secp256k1-recover", - "solana-sha256-hasher", - "solana-stable-layout", - "solana-stake-interface", + "solana-sdk-ids 3.1.0", + "solana-secp256k1-recover 3.1.1", + "solana-sha256-hasher 3.1.0", + "solana-stable-layout 3.0.1", + "solana-stake-interface 2.0.2", "solana-svm-callback", "solana-svm-feature-set", "solana-svm-log-collector", @@ -147,7 +147,7 @@ dependencies = [ "solana-svm-timings", "solana-svm-type-overrides", "solana-sysvar 3.1.1", - "solana-sysvar-id", + "solana-sysvar-id 3.1.0", "solana-transaction-context", "thiserror 2.0.18", ] @@ -305,30 +305,30 @@ dependencies = [ "anchor-lang-idl", "base64 0.21.7", "bincode", - "borsh", + "borsh 1.6.1", "bytemuck", "const-crypto", - "solana-account-info", - "solana-clock", - "solana-cpi", + "solana-account-info 3.1.1", + "solana-clock 3.0.1", + "solana-cpi 3.1.0", "solana-define-syscall 3.0.0", - "solana-feature-gate-interface", - "solana-instruction", - "solana-instructions-sysvar", + "solana-feature-gate-interface 3.1.0", + "solana-instruction 3.3.0", + "solana-instructions-sysvar 3.0.0", "solana-invoke", - "solana-loader-v3-interface", - "solana-msg", - "solana-program-entrypoint", - "solana-program-error", - "solana-program-memory", - "solana-program-option", - "solana-program-pack", + "solana-loader-v3-interface 6.1.0", + "solana-msg 3.1.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-sdk-ids", - "solana-stake-interface", + "solana-sdk-ids 3.1.0", + "solana-stake-interface 2.0.2", "solana-system-interface 2.0.0", "solana-sysvar 3.1.1", - "solana-sysvar-id", + "solana-sysvar-id 3.1.0", "thiserror 1.0.69", ] @@ -362,7 +362,7 @@ name = "anchor-realloc" version = "0.1.0" dependencies = [ "anchor-lang", - "borsh", + "borsh 1.6.1", "litesvm", "solana-keypair", "solana-kite", @@ -682,9 +682,9 @@ version = "0.1.0" dependencies = [ "litesvm", "solana-address 2.6.0", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", "solana-transaction 3.1.0", @@ -774,6 +774,16 @@ 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.6.1" @@ -791,8 +801,21 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", + "borsh-derive-internal 0.9.3", + "borsh-schema-derive-internal 0.9.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" +dependencies = [ + "borsh-derive-internal 0.10.4", + "borsh-schema-derive-internal 0.10.4", "proc-macro-crate 0.1.5", "proc-macro2", "syn 1.0.109", @@ -822,6 +845,17 @@ dependencies = [ "syn 1.0.109", ] +[[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.9.3" @@ -833,6 +867,17 @@ dependencies = [ "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" @@ -949,13 +994,13 @@ name = "checking-account-asm-program" version = "0.1.0" dependencies = [ "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", "solana-transaction 3.1.0", - "solana-transaction-error", + "solana-transaction-error 3.1.0", ] [[package]] @@ -963,7 +1008,7 @@ name = "checking-accounts-anchor-program-example" version = "0.1.0" dependencies = [ "anchor-lang", - "borsh", + "borsh 1.6.1", "litesvm", "solana-keypair", "solana-kite", @@ -976,7 +1021,7 @@ version = "0.1.0" dependencies = [ "litesvm", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-sdk", @@ -993,7 +1038,7 @@ dependencies = [ "pinocchio-log", "pinocchio-system", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-sdk", "solana-system-interface 2.0.0", @@ -1014,12 +1059,12 @@ dependencies = [ name = "close-account-native-program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", @@ -1035,10 +1080,10 @@ dependencies = [ "pinocchio-log", "pinocchio-pubkey", "pinocchio-system", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", "solana-message 4.0.0", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-signer", "solana-system-interface 2.0.0", @@ -1069,6 +1114,26 @@ dependencies = [ "unreachable", ] +[[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" @@ -1095,7 +1160,7 @@ checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" name = "counter-mpl-stack" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "shank", "solana-program 4.0.0", ] @@ -1104,12 +1169,12 @@ dependencies = [ name = "counter-solana-native" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-rent 4.1.0", @@ -1125,9 +1190,9 @@ dependencies = [ "pinocchio 0.10.2", "pinocchio-log", "pinocchio-pubkey", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-rent 4.1.0", "solana-system-interface 2.0.0", @@ -1139,7 +1204,7 @@ name = "counter_anchor" version = "0.1.0" dependencies = [ "anchor-lang", - "borsh", + "borsh 1.6.1", "litesvm", "solana-keypair", "solana-kite", @@ -1160,9 +1225,9 @@ name = "create-account-asm-program" version = "0.1.0" dependencies = [ "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", "solana-transaction 3.1.0", @@ -1177,9 +1242,9 @@ dependencies = [ "pinocchio-log", "pinocchio-pubkey", "pinocchio-system", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", "solana-transaction 3.1.0", @@ -1190,9 +1255,9 @@ name = "create-account-program" version = "0.1.0" dependencies = [ "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", @@ -1210,6 +1275,25 @@ dependencies = [ "solana-signer", ] +[[package]] +name = "create-token-program" +version = "0.1.0" +dependencies = [ + "borsh 1.6.1", + "borsh-derive 1.6.1", + "litesvm", + "mpl-token-metadata", + "solana-instruction 3.3.0", + "solana-keypair", + "solana-native-token 3.0.0", + "solana-program 2.3.0", + "solana-program 4.0.0", + "solana-pubkey 3.0.0", + "solana-system-interface 2.0.0", + "solana-transaction 3.1.0", + "spl-token-interface", +] + [[package]] name = "crunchy" version = "0.2.4" @@ -1538,12 +1622,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" name = "favorites-native" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", @@ -1559,9 +1643,9 @@ dependencies = [ "pinocchio-log", "pinocchio-pubkey", "pinocchio-system", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", "solana-transaction 3.1.0", @@ -1595,6 +1679,15 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "five8" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75b8549488b4715defcb0d8a8a1c1c76a80661b5fa106b4ca0e7fce59d7d875" +dependencies = [ + "five8_core 0.1.2", +] + [[package]] name = "five8" version = "1.0.0" @@ -1766,9 +1859,9 @@ name = "hello-solana-asm-program" version = "0.1.0" dependencies = [ "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", "solana-transaction 3.1.0", @@ -1779,9 +1872,9 @@ name = "hello-solana-program" version = "0.1.0" dependencies = [ "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-transaction 3.1.0", @@ -2020,39 +2113,39 @@ dependencies = [ "serde", "solana-account 3.4.0", "solana-address 2.6.0", - "solana-address-lookup-table-interface", + "solana-address-lookup-table-interface 3.0.1", "solana-bpf-loader-program", "solana-builtins", - "solana-clock", + "solana-clock 3.0.1", "solana-compute-budget", "solana-compute-budget-instruction", - "solana-epoch-rewards", - "solana-epoch-schedule", - "solana-feature-gate-interface", + "solana-epoch-rewards 3.0.1", + "solana-epoch-schedule 3.0.0", + "solana-feature-gate-interface 3.1.0", "solana-fee", "solana-fee-structure", "solana-hash 3.1.0", - "solana-instruction", - "solana-instructions-sysvar", + "solana-instruction 3.3.0", + "solana-instructions-sysvar 3.0.0", "solana-keypair", - "solana-last-restart-slot", - "solana-loader-v3-interface", - "solana-loader-v4-interface", + "solana-last-restart-slot 3.0.0", + "solana-loader-v3-interface 6.1.0", + "solana-loader-v4-interface 3.1.0", "solana-message 3.1.0", - "solana-native-token", - "solana-nonce", + "solana-native-token 3.0.0", + "solana-nonce 3.1.0", "solana-nonce-account", "solana-precompile-error", - "solana-program-error", + "solana-program-error 3.0.1", "solana-program-runtime", "solana-rent 3.1.0", - "solana-sdk-ids", - "solana-sha256-hasher", + "solana-sdk-ids 3.1.0", + "solana-sha256-hasher 3.1.0", "solana-signature", "solana-signer", - "solana-slot-hashes", - "solana-slot-history", - "solana-stake-interface", + "solana-slot-hashes 3.0.1", + "solana-slot-history 3.0.0", + "solana-stake-interface 2.0.2", "solana-svm-callback", "solana-svm-log-collector", "solana-svm-timings", @@ -2060,10 +2153,10 @@ dependencies = [ "solana-system-interface 2.0.0", "solana-system-program", "solana-sysvar 3.1.1", - "solana-sysvar-id", + "solana-sysvar-id 3.1.0", "solana-transaction 3.1.0", "solana-transaction-context", - "solana-transaction-error", + "solana-transaction-error 3.1.0", "thiserror 2.0.18", ] @@ -2115,13 +2208,26 @@ version = "0.1.0" dependencies = [ "anchor-lang", "anchor-spl", - "borsh", + "borsh 1.6.1", "litesvm", "solana-keypair", "solana-kite", "solana-signer", ] +[[package]] +name = "mpl-token-metadata" +version = "5.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046f0779684ec348e2759661361c8798d79021707b1392cb49f3b5eb911340ff" +dependencies = [ + "borsh 0.10.4", + "num-derive 0.3.3", + "num-traits", + "solana-program 2.3.0", + "thiserror 1.0.69", +] + [[package]] name = "num" version = "0.2.1" @@ -2167,6 +2273,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num-derive" version = "0.4.2" @@ -2317,9 +2434,9 @@ dependencies = [ "pinocchio-log", "pinocchio-pubkey", "pinocchio-system", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", "solana-transaction 3.1.0", @@ -2329,12 +2446,12 @@ dependencies = [ name = "pda-rent-payer-program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", @@ -2372,7 +2489,7 @@ dependencies = [ "solana-address 2.6.0", "solana-define-syscall 4.0.1", "solana-instruction-view", - "solana-program-error", + "solana-program-error 3.0.1", ] [[package]] @@ -2492,9 +2609,9 @@ dependencies = [ "litesvm", "pinocchio 0.10.2", "pinocchio-log", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-transaction 3.1.0", ] @@ -2503,12 +2620,12 @@ dependencies = [ name = "processing-instructions-program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-transaction 3.1.0", @@ -2518,12 +2635,12 @@ dependencies = [ name = "program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-rent 4.1.0", @@ -2535,12 +2652,12 @@ dependencies = [ name = "program-derived-addresses-native-program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-rent 4.1.0", @@ -2555,9 +2672,9 @@ dependencies = [ "litesvm", "pinocchio 0.10.2", "pinocchio-system", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-rent 4.1.0", "solana-system-interface 2.0.0", @@ -2569,7 +2686,7 @@ name = "program-derived-addresses-program" version = "0.1.0" dependencies = [ "anchor-lang", - "borsh", + "borsh 1.6.1", "litesvm", "solana-keypair", "solana-kite", @@ -2719,9 +2836,9 @@ dependencies = [ "pinocchio 0.10.2", "pinocchio-log", "pinocchio-system", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", "solana-transaction 3.1.0", @@ -2731,12 +2848,12 @@ dependencies = [ name = "realloc-program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", @@ -2786,7 +2903,7 @@ name = "rent-example" version = "0.1.0" dependencies = [ "anchor-lang", - "borsh", + "borsh 1.6.1", "litesvm", "solana-keypair", "solana-kite", @@ -2801,9 +2918,9 @@ dependencies = [ "pinocchio 0.10.2", "pinocchio-log", "pinocchio-system", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-rent 4.1.0", "solana-system-interface 2.0.0", @@ -2814,12 +2931,12 @@ dependencies = [ name = "repository-layout-program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 0.9.3", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-transaction 3.1.0", @@ -3089,6 +3206,19 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[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.3", + "solana-instruction 2.3.3", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", +] + [[package]] name = "solana-account" version = "3.4.0" @@ -3099,11 +3229,11 @@ dependencies = [ "serde", "serde_bytes", "serde_derive", - "solana-account-info", - "solana-clock", + "solana-account-info 3.1.1", + "solana-clock 3.0.1", "solana-instruction-error", "solana-pubkey 4.1.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-sysvar 3.1.1", ] @@ -3117,14 +3247,27 @@ dependencies = [ "serde", "serde_bytes", "serde_derive", - "solana-account-info", - "solana-clock", + "solana-account-info 3.1.1", + "solana-clock 3.0.1", "solana-instruction-error", "solana-pubkey 4.1.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-sysvar 4.0.0", ] +[[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.2", + "solana-program-memory 2.3.1", + "solana-pubkey 2.4.0", +] + [[package]] name = "solana-account-info" version = "3.1.1" @@ -3134,8 +3277,8 @@ dependencies = [ "bincode", "serde_core", "solana-address 2.6.0", - "solana-program-error", - "solana-program-memory", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", ] [[package]] @@ -3145,7 +3288,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37ca34c37f92ee341b73d5ce7c8ef5bb38e9a87955b4bd343c63fa18b149215" dependencies = [ "solana-address 2.6.0", - "solana-program-error", + "solana-program-error 3.0.1", ] [[package]] @@ -3163,25 +3306,42 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1384b52c435a750cc9c538760fc7bb472fd78e65a9900a2d07312c5bb335b72" dependencies = [ - "borsh", + "borsh 1.6.1", "bytemuck", "bytemuck_derive", "curve25519-dalek", - "five8", + "five8 1.0.0", "five8_const 1.0.0", "rand 0.9.2", "serde", "serde_derive", "sha2-const-stable", - "solana-atomic-u64", + "solana-atomic-u64 3.0.1", "solana-define-syscall 5.0.0", "solana-nullable", - "solana-program-error", - "solana-sanitize", - "solana-sha256-hasher", + "solana-program-error 3.0.1", + "solana-sanitize 3.0.1", + "solana-sha256-hasher 3.1.0", "wincode 0.5.3", ] +[[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.3", + "solana-instruction 2.3.3", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-slot-hashes 2.2.1", +] + [[package]] name = "solana-address-lookup-table-interface" version = "3.0.1" @@ -3192,12 +3352,21 @@ dependencies = [ "bytemuck", "serde", "serde_derive", - "solana-clock", - "solana-instruction", + "solana-clock 3.0.1", + "solana-instruction 3.3.0", "solana-instruction-error", "solana-pubkey 4.1.0", - "solana-sdk-ids", - "solana-slot-hashes", + "solana-sdk-ids 3.1.0", + "solana-slot-hashes 3.0.1", +] + +[[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]] @@ -3209,6 +3378,17 @@ 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 0.4.6", + "num-traits", + "solana-define-syscall 2.3.0", +] + [[package]] name = "solana-big-mod-exp" version = "3.0.0" @@ -3220,6 +3400,17 @@ dependencies = [ "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.3.3", +] + [[package]] name = "solana-bincode" version = "3.1.0" @@ -3231,6 +3422,18 @@ dependencies = [ "solana-instruction-error", ] +[[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.3.0", + "solana-hash 2.3.0", + "solana-sanitize 2.2.1", +] + [[package]] name = "solana-blake3-hasher" version = "3.1.0" @@ -3257,13 +3460,23 @@ dependencies = [ "thiserror 2.0.18", ] +[[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.6.1", +] + [[package]] name = "solana-borsh" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c04abbae16f57178a163125805637b8a076175bb5c0002fb04f4792bea901cf7" dependencies = [ - "borsh", + "borsh 1.6.1", ] [[package]] @@ -3276,17 +3489,17 @@ dependencies = [ "bincode", "qualifier_attr", "solana-account 3.4.0", - "solana-bincode", - "solana-clock", - "solana-instruction", - "solana-loader-v3-interface", - "solana-loader-v4-interface", + "solana-bincode 3.1.0", + "solana-clock 3.0.1", + "solana-instruction 3.3.0", + "solana-loader-v3-interface 6.1.0", + "solana-loader-v4-interface 3.1.0", "solana-packet", - "solana-program-entrypoint", + "solana-program-entrypoint 3.1.1", "solana-program-runtime", "solana-pubkey 3.0.0", "solana-sbpf", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-svm-feature-set", "solana-svm-log-collector", "solana-svm-measure", @@ -3308,7 +3521,7 @@ dependencies = [ "solana-loader-v4-program", "solana-program-runtime", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-system-program", "solana-vote-program", "solana-zk-elgamal-proof-program", @@ -3328,11 +3541,24 @@ dependencies = [ "solana-compute-budget-program", "solana-loader-v4-program", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-system-program", "solana-vote-program", ] +[[package]] +name = "solana-clock" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8584296123df8fe229b95e2ebfd37ae637fe9db9b7d4dd677ac5a78e80dbfce" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", +] + [[package]] name = "solana-clock" version = "3.0.1" @@ -3341,9 +3567,9 @@ checksum = "95cf11109c3b6115cc510f1e31f06fdd52f504271bc24ef5f1249fbbcae5f9f3" dependencies = [ "serde", "serde_derive", - "solana-sdk-ids", - "solana-sdk-macro", - "solana-sysvar-id", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", ] [[package]] @@ -3364,16 +3590,16 @@ checksum = "3eb3ea80152fc745fa95d9cd2fc019c3591cdc7598cb4d85a6acdea7a40938f0" dependencies = [ "agave-feature-set", "log", - "solana-borsh", + "solana-borsh 3.0.2", "solana-builtins-default-costs", "solana-compute-budget", "solana-compute-budget-interface", - "solana-instruction", + "solana-instruction 3.3.0", "solana-packet", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-svm-transaction", - "solana-transaction-error", + "solana-transaction-error 3.1.0", "thiserror 2.0.18", ] @@ -3383,9 +3609,9 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8292c436b269ad23cecc8b24f7da3ab07ca111661e25e00ce0e1d22771951ab9" dependencies = [ - "borsh", - "solana-instruction", - "solana-sdk-ids", + "borsh 1.6.1", + "solana-instruction 3.3.0", + "solana-sdk-ids 3.1.0", ] [[package]] @@ -3397,18 +3623,32 @@ dependencies = [ "solana-program-runtime", ] +[[package]] +name = "solana-cpi" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc71126edddc2ba014622fc32d0f5e2e78ec6c5a1e0eb511b85618c09e9ea11" +dependencies = [ + "solana-account-info 2.3.0", + "solana-define-syscall 2.3.0", + "solana-instruction 2.3.3", + "solana-program-error 2.2.2", + "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", + "solana-account-info 3.1.1", "solana-define-syscall 4.0.1", - "solana-instruction", - "solana-program-error", + "solana-instruction 3.3.0", + "solana-program-error 3.0.1", "solana-pubkey 4.1.0", - "solana-stable-layout", + "solana-stable-layout 3.0.1", ] [[package]] @@ -3425,6 +3665,21 @@ dependencies = [ "thiserror 2.0.18", ] +[[package]] +name = "solana-decode-error" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c781686a18db2f942e70913f7ca15dc120ec38dcab42ff7557db2c70c625a35" +dependencies = [ + "num-traits", +] + +[[package]] +name = "solana-define-syscall" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ae3e2abcf541c8122eafe9a625d4d194b4023c20adde1e251f94e056bb1aee2" + [[package]] name = "solana-define-syscall" version = "3.0.0" @@ -3464,6 +3719,20 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "solana-epoch-rewards" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b575d3dd323b9ea10bb6fe89bf6bf93e249b215ba8ed7f68f1a3633f384db7" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 2.3.0", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", +] + [[package]] name = "solana-epoch-rewards" version = "3.0.1" @@ -3473,9 +3742,9 @@ dependencies = [ "serde", "serde_derive", "solana-hash 4.2.0", - "solana-sdk-ids", - "solana-sdk-macro", - "solana-sysvar-id", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", ] [[package]] @@ -3489,6 +3758,19 @@ dependencies = [ "solana-hash 4.2.0", ] +[[package]] +name = "solana-epoch-schedule" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fce071fbddecc55d727b1d7ed16a629afe4f6e4c217bc8d00af3b785f6f67ed" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-sysvar-id 2.2.1", +] + [[package]] name = "solana-epoch-schedule" version = "3.0.0" @@ -3497,9 +3779,9 @@ checksum = "6e5481e72cc4d52c169db73e4c0cd16de8bc943078aac587ec4817a75cc6388f" dependencies = [ "serde", "serde_derive", - "solana-sdk-ids", - "solana-sdk-macro", - "solana-sysvar-id", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", ] [[package]] @@ -3512,6 +3794,27 @@ dependencies = [ "solana-pubkey 4.1.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.3", + "solana-hash 2.3.0", + "solana-instruction 2.3.3", + "solana-keccak-hasher 2.2.1", + "solana-message 2.4.0", + "solana-nonce 2.2.1", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-system-interface 1.0.0", + "thiserror 2.0.18", +] + [[package]] name = "solana-example-mocks" version = "3.0.0" @@ -3520,15 +3823,15 @@ checksum = "978855d164845c1b0235d4b4d101cadc55373fffaf0b5b6cfa2194d25b2ed658" dependencies = [ "serde", "serde_derive", - "solana-address-lookup-table-interface", - "solana-clock", + "solana-address-lookup-table-interface 3.0.1", + "solana-clock 3.0.1", "solana-hash 3.1.0", - "solana-instruction", - "solana-keccak-hasher", + "solana-instruction 3.3.0", + "solana-keccak-hasher 3.1.0", "solana-message 3.1.0", - "solana-nonce", + "solana-nonce 3.1.0", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-system-interface 2.0.0", "thiserror 2.0.18", ] @@ -3542,14 +3845,33 @@ dependencies = [ "serde", "serde_derive", "solana-hash 4.2.0", - "solana-instruction", - "solana-nonce", + "solana-instruction 3.3.0", + "solana-nonce 3.1.0", "solana-pubkey 4.1.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-system-interface 3.1.0", "thiserror 2.0.18", ] +[[package]] +name = "solana-feature-gate-interface" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f5c5382b449e8e4e3016fb05e418c53d57782d8b5c30aa372fc265654b956d" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-account 2.2.1", + "solana-account-info 2.3.0", + "solana-instruction 2.3.3", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-system-interface 1.0.0", +] + [[package]] name = "solana-feature-gate-interface" version = "3.1.0" @@ -3560,12 +3882,12 @@ dependencies = [ "serde", "serde_derive", "solana-account 3.4.0", - "solana-account-info", - "solana-instruction", - "solana-program-error", + "solana-account-info 3.1.1", + "solana-instruction 3.3.0", + "solana-program-error 3.0.1", "solana-pubkey 4.1.0", "solana-rent 4.1.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-system-interface 3.1.0", ] @@ -3580,6 +3902,17 @@ dependencies = [ "solana-svm-transaction", ] +[[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.1.0" @@ -3607,6 +3940,24 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50c19418921b9369092a9583120dbbccbcc2d92bd0c6bf5adb5f80ffd4ea4c69" +[[package]] +name = "solana-hash" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b96e9f0300fa287b545613f007dfe20043d7812bee255f418c1eb649c93b63" +dependencies = [ + "borsh 1.6.1", + "bytemuck", + "bytemuck_derive", + "five8 0.2.1", + "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" @@ -3622,14 +3973,14 @@ version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8064ea1d591ec791be95245058ca40f4f5345d390c200069d0f79bbf55bfae55" dependencies = [ - "borsh", + "borsh 1.6.1", "bytemuck", "bytemuck_derive", - "five8", + "five8 1.0.0", "serde", "serde_derive", - "solana-atomic-u64", - "solana-sanitize", + "solana-atomic-u64 3.0.1", + "solana-sanitize 3.0.1", "wincode 0.4.8", ] @@ -3643,6 +3994,25 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "solana-instruction" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab5682934bd1f65f8d2c16f21cb532526fcc1a09f796e2cacdb091eee5774ad" +dependencies = [ + "bincode", + "borsh 1.6.1", + "getrandom 0.2.17", + "js-sys", + "num-traits", + "serde", + "serde_derive", + "serde_json", + "solana-define-syscall 2.3.0", + "solana-pubkey 2.4.0", + "wasm-bindgen", +] + [[package]] name = "solana-instruction" version = "3.3.0" @@ -3650,7 +4020,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a97881335fc698deb46c6571945969aae6d93a14e2fff792a368b4fac872f116" dependencies = [ "bincode", - "borsh", + "borsh 1.6.1", "serde", "serde_derive", "solana-define-syscall 5.0.0", @@ -3667,7 +4037,7 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "solana-program-error", + "solana-program-error 3.0.1", ] [[package]] @@ -3679,7 +4049,24 @@ dependencies = [ "solana-account-view", "solana-address 2.6.0", "solana-define-syscall 4.0.1", - "solana-program-error", + "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.3.3", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-sanitize 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-serialize-utils 2.2.1", + "solana-sysvar-id 2.2.1", ] [[package]] @@ -3689,15 +4076,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ddf67876c541aa1e21ee1acae35c95c6fbc61119814bfef70579317a5e26955" dependencies = [ "bitflags", - "solana-account-info", - "solana-instruction", + "solana-account-info 3.1.1", + "solana-instruction 3.3.0", "solana-instruction-error", - "solana-program-error", + "solana-program-error 3.0.1", "solana-pubkey 3.0.0", - "solana-sanitize", - "solana-sdk-ids", - "solana-serialize-utils", - "solana-sysvar-id", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-serialize-utils 3.1.1", + "solana-sysvar-id 3.1.0", ] [[package]] @@ -3706,22 +4093,34 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4065031f5c7dd29ef5f5003c1a353011eeabbafa6c5a5033da0cedbfca824b94" dependencies = [ - "solana-account-info", + "solana-account-info 3.1.1", "solana-define-syscall 3.0.0", - "solana-instruction", - "solana-program-entrypoint", - "solana-stable-layout", + "solana-instruction 3.3.0", + "solana-program-entrypoint 3.1.1", + "solana-stable-layout 3.0.1", ] [[package]] name = "solana-keccak-hasher" -version = "3.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed1c0d16d6fdeba12291a1f068cdf0d479d9bff1141bf44afd7aa9d485f65ef8" +checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" dependencies = [ "sha3", - "solana-define-syscall 4.0.1", - "solana-hash 4.2.0", + "solana-define-syscall 2.3.0", + "solana-hash 2.3.0", + "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.2.0", ] [[package]] @@ -3732,7 +4131,7 @@ checksum = "263d614c12aa267a3278703175fd6440552ca61bc960b5a02a4482720c53438b" dependencies = [ "ed25519-dalek", "ed25519-dalek-bip32", - "five8", + "five8 1.0.0", "five8_core 1.0.0", "rand 0.9.2", "solana-address 2.6.0", @@ -3751,7 +4150,7 @@ checksum = "92c6774af93647a15b51e266bc76f558fba11fbfbe30131b50664e665a8fea55" dependencies = [ "litesvm", "solana-account 3.4.0", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", "solana-message 3.1.0", "solana-program 3.0.0", @@ -3762,6 +4161,19 @@ dependencies = [ "spl-token", ] +[[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.0" @@ -3770,9 +4182,38 @@ checksum = "dcda154ec827f5fc1e4da0af3417951b7e9b8157540f81f936c4a8b1156134d0" dependencies = [ "serde", "serde_derive", - "solana-sdk-ids", - "solana-sdk-macro", - "solana-sysvar-id", + "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.3.3", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", +] + +[[package]] +name = "solana-loader-v3-interface" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f7162a05b8b0773156b443bccd674ea78bb9aa406325b467ea78c06c99a63a2" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction 2.3.3", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-system-interface 1.0.0", ] [[package]] @@ -3784,12 +4225,27 @@ dependencies = [ "serde", "serde_bytes", "serde_derive", - "solana-instruction", + "solana-instruction 3.3.0", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-system-interface 2.0.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.3.3", + "solana-pubkey 2.4.0", + "solana-sdk-ids 2.2.1", + "solana-system-interface 1.0.0", +] + [[package]] name = "solana-loader-v4-interface" version = "3.1.0" @@ -3799,9 +4255,9 @@ dependencies = [ "serde", "serde_bytes", "serde_derive", - "solana-instruction", + "solana-instruction 3.3.0", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-system-interface 2.0.0", ] @@ -3813,22 +4269,45 @@ checksum = "9b79ecebf56ff8acf46d5c0d77a11e1cb9a0f8eeb6dd1a69d739f3bf8ea8570e" dependencies = [ "log", "solana-account 3.4.0", - "solana-bincode", + "solana-bincode 3.1.0", "solana-bpf-loader-program", - "solana-instruction", - "solana-loader-v3-interface", - "solana-loader-v4-interface", + "solana-instruction 3.3.0", + "solana-loader-v3-interface 6.1.0", + "solana-loader-v4-interface 3.1.0", "solana-packet", "solana-program-runtime", "solana-pubkey 3.0.0", "solana-sbpf", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-svm-log-collector", "solana-svm-measure", "solana-svm-type-overrides", "solana-transaction-context", ] +[[package]] +name = "solana-message" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1796aabce376ff74bf89b78d268fa5e683d7d7a96a0a4e4813ec34de49d5314b" +dependencies = [ + "bincode", + "blake3", + "lazy_static", + "serde", + "serde_derive", + "solana-bincode 2.2.1", + "solana-hash 2.3.0", + "solana-instruction 2.3.3", + "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" @@ -3842,11 +4321,11 @@ dependencies = [ "serde_derive", "solana-address 2.6.0", "solana-hash 4.2.0", - "solana-instruction", - "solana-sanitize", - "solana-sdk-ids", - "solana-short-vec", - "solana-transaction-error", + "solana-instruction 3.3.0", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-short-vec 3.2.0", + "solana-transaction-error 3.1.0", ] [[package]] @@ -3861,14 +4340,23 @@ dependencies = [ "serde_derive", "solana-address 2.6.0", "solana-hash 4.2.0", - "solana-instruction", - "solana-sanitize", - "solana-sdk-ids", - "solana-short-vec", - "solana-transaction-error", + "solana-instruction 3.3.0", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-short-vec 3.2.0", + "solana-transaction-error 3.1.0", "wincode 0.4.8", ] +[[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.3.0", +] + [[package]] name = "solana-msg" version = "3.1.0" @@ -3878,12 +4366,32 @@ dependencies = [ "solana-define-syscall 5.0.0", ] +[[package]] +name = "solana-native-token" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61515b880c36974053dd499c0510066783f0cc6ac17def0c7ef2a244874cf4a9" + [[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.3.0", + "solana-pubkey 2.4.0", + "solana-sha256-hasher 2.3.0", +] + [[package]] name = "solana-nonce" version = "3.1.0" @@ -3892,10 +4400,10 @@ checksum = "cbc469152a63284ef959b80c59cda015262a021da55d3b8fe42171d89c4b64f8" dependencies = [ "serde", "serde_derive", - "solana-fee-calculator", + "solana-fee-calculator 3.1.0", "solana-hash 4.2.0", "solana-pubkey 4.1.0", - "solana-sha256-hasher", + "solana-sha256-hasher 3.1.0", ] [[package]] @@ -3906,8 +4414,8 @@ checksum = "805fd25b29e5a1a0e6c3dd6320c9da80f275fbe4ff6e392617c303a2085c435e" dependencies = [ "solana-account 3.4.0", "solana-hash 3.1.0", - "solana-nonce", - "solana-sdk-ids", + "solana-nonce 3.1.0", + "solana-sdk-ids 3.1.0", ] [[package]] @@ -3929,8 +4437,8 @@ dependencies = [ "solana-hash 3.1.0", "solana-packet", "solana-pubkey 3.0.0", - "solana-sanitize", - "solana-sha256-hasher", + "solana-sanitize 3.0.1", + "solana-sha256-hasher 3.1.0", "solana-signature", "solana-signer", ] @@ -3978,6 +4486,86 @@ dependencies = [ "solana-signer", ] +[[package]] +name = "solana-program" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98eca145bd3545e2fbb07166e895370576e47a00a7d824e325390d33bf467210" +dependencies = [ + "bincode", + "blake3", + "borsh 0.10.4", + "borsh 1.6.1", + "bs58", + "bytemuck", + "console_error_panic_hook", + "console_log", + "getrandom 0.2.17", + "lazy_static", + "log", + "memoffset", + "num-bigint 0.4.6", + "num-derive 0.4.2", + "num-traits", + "rand 0.8.5", + "serde", + "serde_bytes", + "serde_derive", + "solana-account-info 2.3.0", + "solana-address-lookup-table-interface 2.2.2", + "solana-atomic-u64 2.2.1", + "solana-big-mod-exp 2.2.1", + "solana-bincode 2.2.1", + "solana-blake3-hasher 2.2.1", + "solana-borsh 2.2.1", + "solana-clock 2.2.3", + "solana-cpi 2.2.1", + "solana-decode-error", + "solana-define-syscall 2.3.0", + "solana-epoch-rewards 2.2.1", + "solana-epoch-schedule 2.2.1", + "solana-example-mocks 2.2.1", + "solana-feature-gate-interface 2.2.2", + "solana-fee-calculator 2.2.1", + "solana-hash 2.3.0", + "solana-instruction 2.3.3", + "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 5.0.0", + "solana-loader-v4-interface 2.2.1", + "solana-message 2.4.0", + "solana-msg 2.2.1", + "solana-native-token 2.3.0", + "solana-nonce 2.2.1", + "solana-program-entrypoint 2.3.0", + "solana-program-error 2.2.2", + "solana-program-memory 2.3.1", + "solana-program-option 2.2.1", + "solana-program-pack 2.2.1", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sanitize 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-secp256k1-recover 2.2.1", + "solana-serde-varint 2.2.2", + "solana-serialize-utils 2.2.1", + "solana-sha256-hasher 2.3.0", + "solana-short-vec 2.2.1", + "solana-slot-hashes 2.2.1", + "solana-slot-history 2.2.1", + "solana-stable-layout 2.2.1", + "solana-stake-interface 1.2.1", + "solana-system-interface 1.0.0", + "solana-sysvar 2.3.0", + "solana-sysvar-id 2.2.1", + "solana-vote-interface 2.2.6", + "thiserror 2.0.18", + "wasm-bindgen", +] + [[package]] name = "solana-program" version = "3.0.0" @@ -3985,44 +4573,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91b12305dd81045d705f427acd0435a2e46444b65367d7179d7bdcfc3bc5f5eb" dependencies = [ "memoffset", - "solana-account-info", - "solana-big-mod-exp", - "solana-blake3-hasher", - "solana-borsh", - "solana-clock", - "solana-cpi", + "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.0.1", + "solana-cpi 3.1.0", "solana-define-syscall 3.0.0", - "solana-epoch-rewards", - "solana-epoch-schedule", + "solana-epoch-rewards 3.0.1", + "solana-epoch-schedule 3.0.0", "solana-epoch-stake", "solana-example-mocks 3.0.0", - "solana-fee-calculator", + "solana-fee-calculator 3.1.0", "solana-hash 3.1.0", - "solana-instruction", + "solana-instruction 3.3.0", "solana-instruction-error", - "solana-instructions-sysvar", - "solana-keccak-hasher", - "solana-last-restart-slot", - "solana-msg", - "solana-native-token", - "solana-program-entrypoint", - "solana-program-error", - "solana-program-memory", - "solana-program-option", - "solana-program-pack", + "solana-instructions-sysvar 3.0.0", + "solana-keccak-hasher 3.1.0", + "solana-last-restart-slot 3.0.0", + "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", - "solana-secp256k1-recover", - "solana-serde-varint", - "solana-serialize-utils", - "solana-sha256-hasher", - "solana-short-vec", - "solana-slot-hashes", - "solana-slot-history", - "solana-stable-layout", + "solana-sdk-ids 3.1.0", + "solana-secp256k1-recover 3.1.1", + "solana-serde-varint 3.0.1", + "solana-serialize-utils 3.1.1", + "solana-sha256-hasher 3.1.0", + "solana-short-vec 3.2.0", + "solana-slot-hashes 3.0.1", + "solana-slot-history 3.0.0", + "solana-stable-layout 3.0.1", "solana-sysvar 3.1.1", - "solana-sysvar-id", + "solana-sysvar-id 3.1.0", ] [[package]] @@ -4032,44 +4620,56 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "778f08fb0eaf52c9a3bef2978247f7fab0ccfddc44cfddb936d5ad9f98ede886" dependencies = [ "memoffset", - "solana-account-info", - "solana-big-mod-exp", - "solana-blake3-hasher", - "solana-borsh", - "solana-clock", - "solana-cpi", + "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.0.1", + "solana-cpi 3.1.0", "solana-define-syscall 5.0.0", - "solana-epoch-rewards", - "solana-epoch-schedule", + "solana-epoch-rewards 3.0.1", + "solana-epoch-schedule 3.0.0", "solana-epoch-stake", "solana-example-mocks 4.0.0", - "solana-fee-calculator", + "solana-fee-calculator 3.1.0", "solana-hash 4.2.0", - "solana-instruction", + "solana-instruction 3.3.0", "solana-instruction-error", - "solana-instructions-sysvar", - "solana-keccak-hasher", - "solana-last-restart-slot", - "solana-msg", - "solana-native-token", - "solana-program-entrypoint", - "solana-program-error", - "solana-program-memory", - "solana-program-option", - "solana-program-pack", + "solana-instructions-sysvar 3.0.0", + "solana-keccak-hasher 3.1.0", + "solana-last-restart-slot 3.0.0", + "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 4.1.0", "solana-rent 4.1.0", - "solana-sdk-ids", - "solana-secp256k1-recover", - "solana-serde-varint", - "solana-serialize-utils", - "solana-sha256-hasher", - "solana-short-vec", - "solana-slot-hashes", - "solana-slot-history", - "solana-stable-layout", + "solana-sdk-ids 3.1.0", + "solana-secp256k1-recover 3.1.1", + "solana-serde-varint 3.0.1", + "solana-serialize-utils 3.1.1", + "solana-sha256-hasher 3.1.0", + "solana-short-vec 3.2.0", + "solana-slot-hashes 3.0.1", + "solana-slot-history 3.0.0", + "solana-stable-layout 3.0.1", "solana-sysvar 4.0.0", - "solana-sysvar-id", + "solana-sysvar-id 3.1.0", +] + +[[package]] +name = "solana-program-entrypoint" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32ce041b1a0ed275290a5008ee1a4a6c48f5054c8a3d78d313c08958a06aedbd" +dependencies = [ + "solana-account-info 2.3.0", + "solana-msg 2.2.1", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", ] [[package]] @@ -4078,23 +4678,48 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84c9b0a1ff494e05f503a08b3d51150b73aa639544631e510279d6375f290997" dependencies = [ - "solana-account-info", + "solana-account-info 3.1.1", "solana-define-syscall 4.0.1", - "solana-program-error", + "solana-program-error 3.0.1", "solana-pubkey 4.1.0", ] +[[package]] +name = "solana-program-error" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee2e0217d642e2ea4bee237f37bd61bb02aec60da3647c48ff88f6556ade775" +dependencies = [ + "borsh 1.6.1", + "num-traits", + "serde", + "serde_derive", + "solana-decode-error", + "solana-instruction 2.3.3", + "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", + "borsh 1.6.1", "serde", "serde_derive", ] +[[package]] +name = "solana-program-memory" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a5426090c6f3fd6cfdc10685322fede9ca8e5af43cd6a59e98bfe4e91671712" +dependencies = [ + "solana-define-syscall 2.3.0", +] + [[package]] name = "solana-program-memory" version = "3.1.0" @@ -4104,19 +4729,34 @@ 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.2", +] + [[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", + "solana-program-error 3.0.1", ] [[package]] @@ -4133,23 +4773,23 @@ dependencies = [ "rand 0.8.5", "serde", "solana-account 3.4.0", - "solana-account-info", - "solana-clock", - "solana-epoch-rewards", - "solana-epoch-schedule", + "solana-account-info 3.1.1", + "solana-clock 3.0.1", + "solana-epoch-rewards 3.0.1", + "solana-epoch-schedule 3.0.0", "solana-fee-structure", "solana-hash 3.1.0", - "solana-instruction", - "solana-last-restart-slot", - "solana-loader-v3-interface", - "solana-program-entrypoint", + "solana-instruction 3.3.0", + "solana-last-restart-slot 3.0.0", + "solana-loader-v3-interface 6.1.0", + "solana-program-entrypoint 3.1.1", "solana-pubkey 3.0.0", "solana-rent 3.1.0", "solana-sbpf", - "solana-sdk-ids", - "solana-slot-hashes", - "solana-stable-layout", - "solana-stake-interface", + "solana-sdk-ids 3.1.0", + "solana-slot-hashes 3.0.1", + "solana-stable-layout 3.0.1", + "solana-stake-interface 2.0.2", "solana-svm-callback", "solana-svm-feature-set", "solana-svm-log-collector", @@ -4159,11 +4799,37 @@ dependencies = [ "solana-svm-type-overrides", "solana-system-interface 2.0.0", "solana-sysvar 3.1.1", - "solana-sysvar-id", + "solana-sysvar-id 3.1.0", "solana-transaction-context", "thiserror 2.0.18", ] +[[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.6.1", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "five8 0.2.1", + "five8_const 0.1.4", + "getrandom 0.2.17", + "js-sys", + "num-traits", + "serde", + "serde_derive", + "solana-atomic-u64 2.2.1", + "solana-decode-error", + "solana-define-syscall 2.3.0", + "solana-sanitize 2.2.1", + "solana-sha256-hasher 2.3.0", + "wasm-bindgen", +] + [[package]] name = "solana-pubkey" version = "3.0.0" @@ -4183,6 +4849,19 @@ 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" @@ -4191,9 +4870,9 @@ checksum = "e860d5499a705369778647e97d760f7670adfb6fc8419dd3d568deccd46d5487" dependencies = [ "serde", "serde_derive", - "solana-sdk-ids", - "solana-sdk-macro", - "solana-sysvar-id", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-sysvar-id 3.1.0", ] [[package]] @@ -4204,11 +4883,17 @@ checksum = "a1771d726d4854f1818c750e14aff40b19d84720d0b1b6d53e50e8f16cb6bd62" dependencies = [ "serde", "serde_derive", - "solana-sdk-ids", - "solana-sdk-macro", - "solana-sysvar-id", + "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" @@ -4251,25 +4936,34 @@ dependencies = [ "solana-offchain-message", "solana-presigner", "solana-program 4.0.0", - "solana-program-memory", + "solana-program-memory 3.1.0", "solana-pubkey 4.1.0", - "solana-sanitize", - "solana-sdk-ids", - "solana-sdk-macro", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", "solana-seed-derivable", "solana-seed-phrase", "solana-serde", - "solana-serde-varint", - "solana-short-vec", + "solana-serde-varint 3.0.1", + "solana-short-vec 3.2.0", "solana-shred-version", "solana-signature", "solana-signer", "solana-time-utils", "solana-transaction 4.0.0", - "solana-transaction-error", + "solana-transaction-error 3.1.0", "thiserror 2.0.18", ] +[[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" @@ -4279,6 +4973,18 @@ 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" @@ -4291,6 +4997,17 @@ dependencies = [ "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.3.0", + "thiserror 2.0.18", +] + [[package]] name = "solana-secp256k1-recover" version = "3.1.1" @@ -4331,6 +5048,15 @@ dependencies = [ "serde", ] +[[package]] +name = "solana-serde-varint" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a7e155eba458ecfb0107b98236088c3764a09ddf0201ec29e52a0be40857113" +dependencies = [ + "serde", +] + [[package]] name = "solana-serde-varint" version = "3.0.1" @@ -4340,6 +5066,17 @@ dependencies = [ "serde", ] +[[package]] +name = "solana-serialize-utils" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "817a284b63197d2b27afdba829c5ab34231da4a9b4e763466a003c40ca4f535e" +dependencies = [ + "solana-instruction 2.3.3", + "solana-pubkey 2.4.0", + "solana-sanitize 2.2.1", +] + [[package]] name = "solana-serialize-utils" version = "3.1.1" @@ -4348,7 +5085,18 @@ checksum = "5d7cc401931d178472358e6b78dc72d031dc08f752d7410f0e8bd259dd6f02fa" dependencies = [ "solana-instruction-error", "solana-pubkey 4.1.0", - "solana-sanitize", + "solana-sanitize 3.0.1", +] + +[[package]] +name = "solana-sha256-hasher" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa3feb32c28765f6aa1ce8f3feac30936f16c5c3f7eb73d63a5b8f6f8ecdc44" +dependencies = [ + "sha2 0.10.9", + "solana-define-syscall 2.3.0", + "solana-hash 2.3.0", ] [[package]] @@ -4362,6 +5110,15 @@ dependencies = [ "solana-hash 4.2.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.0" @@ -4379,7 +5136,7 @@ checksum = "d6c79722e299d957958bf33695f7cd1ef6724ff55563c60fd9e3e24487cccde2" dependencies = [ "solana-hard-forks", "solana-hash 4.2.0", - "solana-sha256-hasher", + "solana-sha256-hasher 3.1.0", ] [[package]] @@ -4389,12 +5146,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "132a93134f1262aa832f1849b83bec6c9945669b866da18661a427943b9e801e" dependencies = [ "ed25519-dalek", - "five8", + "five8 1.0.0", "rand 0.9.2", "serde", "serde-big-array", "serde_derive", - "solana-sanitize", + "solana-sanitize 3.0.1", "wincode 0.4.8", ] @@ -4406,7 +5163,20 @@ checksum = "5bfea97951fee8bae0d6038f39a5efcb6230ecdfe33425ac75196d1a1e3e3235" dependencies = [ "solana-pubkey 3.0.0", "solana-signature", - "solana-transaction-error", + "solana-transaction-error 3.1.0", +] + +[[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.3.0", + "solana-sdk-ids 2.2.1", + "solana-sysvar-id 2.2.1", ] [[package]] @@ -4418,8 +5188,21 @@ dependencies = [ "serde", "serde_derive", "solana-hash 4.2.0", - "solana-sdk-ids", - "solana-sysvar-id", + "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]] @@ -4431,8 +5214,18 @@ dependencies = [ "bv", "serde", "serde_derive", - "solana-sdk-ids", - "solana-sysvar-id", + "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.3.3", + "solana-pubkey 2.4.0", ] [[package]] @@ -4441,10 +5234,31 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9f6a291ba063a37780af29e7db14bdd3dc447584d8ba5b3fc4b88e2bbc982fa" dependencies = [ - "solana-instruction", + "solana-instruction 3.3.0", "solana-pubkey 4.1.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.6.1", + "num-traits", + "serde", + "serde_derive", + "solana-clock 2.2.3", + "solana-cpi 2.2.1", + "solana-decode-error", + "solana-instruction 2.3.3", + "solana-program-error 2.2.2", + "solana-pubkey 2.4.0", + "solana-system-interface 1.0.0", + "solana-sysvar-id 2.2.1", +] + [[package]] name = "solana-stake-interface" version = "2.0.2" @@ -4454,14 +5268,14 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "solana-clock", - "solana-cpi", - "solana-instruction", - "solana-program-error", + "solana-clock 3.0.1", + "solana-cpi 3.1.0", + "solana-instruction 3.3.0", + "solana-program-error 3.0.1", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", "solana-sysvar 3.1.1", - "solana-sysvar-id", + "solana-sysvar-id 3.1.0", ] [[package]] @@ -4471,7 +5285,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c895f1add5c9ceff634f485554ddbcbceb88cba71b2f753c4caaba461690d2c6" dependencies = [ "solana-account 3.4.0", - "solana-clock", + "solana-clock 3.0.1", "solana-precompile-error", "solana-pubkey 3.0.0", ] @@ -4517,7 +5331,7 @@ dependencies = [ "solana-hash 3.1.0", "solana-message 3.1.0", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-signature", "solana-transaction 3.1.0", ] @@ -4531,6 +5345,22 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "solana-system-interface" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94d7c18cb1a91c6be5f5a8ac9276a1d7c737e39a21beba9ea710ab4b9c63bc90" +dependencies = [ + "js-sys", + "num-traits", + "serde", + "serde_derive", + "solana-decode-error", + "solana-instruction 2.3.3", + "solana-pubkey 2.4.0", + "wasm-bindgen", +] + [[package]] name = "solana-system-interface" version = "2.0.0" @@ -4540,9 +5370,9 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "solana-instruction", - "solana-msg", - "solana-program-error", + "solana-instruction 3.3.0", + "solana-msg 3.1.0", + "solana-program-error 3.0.1", "solana-pubkey 3.0.0", ] @@ -4556,9 +5386,9 @@ dependencies = [ "serde", "serde_derive", "solana-address 2.6.0", - "solana-instruction", - "solana-msg", - "solana-program-error", + "solana-instruction 3.3.0", + "solana-msg 3.1.0", + "solana-program-error 3.0.1", ] [[package]] @@ -4571,15 +5401,15 @@ dependencies = [ "log", "serde", "solana-account 3.4.0", - "solana-bincode", - "solana-fee-calculator", - "solana-instruction", - "solana-nonce", + "solana-bincode 3.1.0", + "solana-fee-calculator 3.1.0", + "solana-instruction 3.3.0", + "solana-nonce 3.1.0", "solana-nonce-account", "solana-packet", "solana-program-runtime", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-svm-log-collector", "solana-svm-type-overrides", "solana-system-interface 2.0.0", @@ -4587,6 +5417,43 @@ dependencies = [ "solana-transaction-context", ] +[[package]] +name = "solana-sysvar" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8c3595f95069f3d90f275bb9bd235a1973c4d059028b0a7f81baca2703815db" +dependencies = [ + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info 2.3.0", + "solana-clock 2.2.3", + "solana-define-syscall 2.3.0", + "solana-epoch-rewards 2.2.1", + "solana-epoch-schedule 2.2.1", + "solana-fee-calculator 2.2.1", + "solana-hash 2.3.0", + "solana-instruction 2.3.3", + "solana-instructions-sysvar 2.2.2", + "solana-last-restart-slot 2.2.1", + "solana-program-entrypoint 2.3.0", + "solana-program-error 2.2.2", + "solana-program-memory 2.3.1", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sanitize 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-sdk-macro 2.2.1", + "solana-slot-hashes 2.2.1", + "solana-slot-history 2.2.1", + "solana-stake-interface 1.2.1", + "solana-sysvar-id 2.2.1", +] + [[package]] name = "solana-sysvar" version = "3.1.1" @@ -4600,25 +5467,25 @@ dependencies = [ "lazy_static", "serde", "serde_derive", - "solana-account-info", - "solana-clock", + "solana-account-info 3.1.1", + "solana-clock 3.0.1", "solana-define-syscall 4.0.1", - "solana-epoch-rewards", - "solana-epoch-schedule", - "solana-fee-calculator", + "solana-epoch-rewards 3.0.1", + "solana-epoch-schedule 3.0.0", + "solana-fee-calculator 3.1.0", "solana-hash 4.2.0", - "solana-instruction", - "solana-last-restart-slot", - "solana-program-entrypoint", - "solana-program-error", - "solana-program-memory", + "solana-instruction 3.3.0", + "solana-last-restart-slot 3.0.0", + "solana-program-entrypoint 3.1.1", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", "solana-pubkey 4.1.0", "solana-rent 3.1.0", - "solana-sdk-ids", - "solana-sdk-macro", - "solana-slot-hashes", - "solana-slot-history", - "solana-sysvar-id", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-slot-hashes 3.0.1", + "solana-slot-history 3.0.0", + "solana-sysvar-id 3.1.0", ] [[package]] @@ -4634,25 +5501,35 @@ dependencies = [ "lazy_static", "serde", "serde_derive", - "solana-account-info", - "solana-clock", + "solana-account-info 3.1.1", + "solana-clock 3.0.1", "solana-define-syscall 5.0.0", - "solana-epoch-rewards", - "solana-epoch-schedule", - "solana-fee-calculator", + "solana-epoch-rewards 3.0.1", + "solana-epoch-schedule 3.0.0", + "solana-fee-calculator 3.1.0", "solana-hash 4.2.0", - "solana-instruction", - "solana-last-restart-slot", - "solana-program-entrypoint", - "solana-program-error", - "solana-program-memory", + "solana-instruction 3.3.0", + "solana-last-restart-slot 3.0.0", + "solana-program-entrypoint 3.1.1", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", "solana-pubkey 4.1.0", "solana-rent 4.1.0", - "solana-sdk-ids", - "solana-sdk-macro", - "solana-slot-hashes", - "solana-slot-history", - "solana-sysvar-id", + "solana-sdk-ids 3.1.0", + "solana-sdk-macro 3.0.1", + "solana-slot-hashes 3.0.1", + "solana-slot-history 3.0.0", + "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]] @@ -4662,7 +5539,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" dependencies = [ "solana-address 2.6.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", ] [[package]] @@ -4682,15 +5559,15 @@ dependencies = [ "serde_derive", "solana-address 2.6.0", "solana-hash 4.2.0", - "solana-instruction", + "solana-instruction 3.3.0", "solana-instruction-error", "solana-message 3.1.0", - "solana-sanitize", - "solana-sdk-ids", - "solana-short-vec", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-short-vec 3.2.0", "solana-signature", "solana-signer", - "solana-transaction-error", + "solana-transaction-error 3.1.0", ] [[package]] @@ -4703,15 +5580,15 @@ dependencies = [ "serde_derive", "solana-address 2.6.0", "solana-hash 4.2.0", - "solana-instruction", + "solana-instruction 3.3.0", "solana-instruction-error", "solana-message 4.0.0", - "solana-sanitize", - "solana-sdk-ids", - "solana-short-vec", + "solana-sanitize 3.0.1", + "solana-sdk-ids 3.1.0", + "solana-short-vec 3.2.0", "solana-signature", "solana-signer", - "solana-transaction-error", + "solana-transaction-error 3.1.0", "wincode 0.4.8", ] @@ -4724,12 +5601,22 @@ dependencies = [ "bincode", "serde", "solana-account 3.4.0", - "solana-instruction", - "solana-instructions-sysvar", + "solana-instruction 3.3.0", + "solana-instructions-sysvar 3.0.0", "solana-pubkey 3.0.0", "solana-rent 3.1.0", "solana-sbpf", - "solana-sdk-ids", + "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.3.3", + "solana-sanitize 2.2.1", ] [[package]] @@ -4741,7 +5628,31 @@ dependencies = [ "serde", "serde_derive", "solana-instruction-error", - "solana-sanitize", + "solana-sanitize 3.0.1", +] + +[[package]] +name = "solana-vote-interface" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b80d57478d6599d30acc31cc5ae7f93ec2361a06aefe8ea79bc81739a08af4c3" +dependencies = [ + "bincode", + "num-derive 0.4.2", + "num-traits", + "serde", + "serde_derive", + "solana-clock 2.2.3", + "solana-decode-error", + "solana-hash 2.3.0", + "solana-instruction 2.3.3", + "solana-pubkey 2.4.0", + "solana-rent 2.2.1", + "solana-sdk-ids 2.2.1", + "solana-serde-varint 2.2.2", + "solana-serialize-utils 2.2.1", + "solana-short-vec 2.2.1", + "solana-system-interface 1.0.0", ] [[package]] @@ -4752,21 +5663,21 @@ checksum = "db6e123e16bfdd7a81d71b4c4699e0b29580b619f4cd2ef5b6aae1eb85e8979f" dependencies = [ "bincode", "cfg_eval", - "num-derive", + "num-derive 0.4.2", "num-traits", "serde", "serde_derive", "serde_with", - "solana-clock", + "solana-clock 3.0.1", "solana-hash 3.1.0", - "solana-instruction", + "solana-instruction 3.3.0", "solana-instruction-error", "solana-pubkey 3.0.0", "solana-rent 3.1.0", - "solana-sdk-ids", - "solana-serde-varint", - "solana-serialize-utils", - "solana-short-vec", + "solana-sdk-ids 3.1.0", + "solana-serde-varint 3.0.1", + "solana-serialize-utils 3.1.1", + "solana-short-vec 3.2.0", "solana-system-interface 2.0.0", ] @@ -4779,26 +5690,26 @@ dependencies = [ "agave-feature-set", "bincode", "log", - "num-derive", + "num-derive 0.4.2", "num-traits", "serde", "solana-account 3.4.0", - "solana-bincode", - "solana-clock", - "solana-epoch-schedule", + "solana-bincode 3.1.0", + "solana-clock 3.0.1", + "solana-epoch-schedule 3.0.0", "solana-hash 3.1.0", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", "solana-packet", "solana-program-runtime", "solana-pubkey 3.0.0", "solana-rent 3.1.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-signer", - "solana-slot-hashes", + "solana-slot-hashes 3.0.1", "solana-transaction 3.1.0", "solana-transaction-context", - "solana-vote-interface", + "solana-vote-interface 4.0.4", "thiserror 2.0.18", ] @@ -4820,11 +5731,11 @@ checksum = "98ebd77845de672972a32c357d7a68f2cc16c1037cc0ebf550ebba167827c10c" dependencies = [ "agave-feature-set", "bytemuck", - "num-derive", + "num-derive 0.4.2", "num-traits", - "solana-instruction", + "solana-instruction 3.3.0", "solana-program-runtime", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-svm-log-collector", "solana-zk-sdk", ] @@ -4845,7 +5756,7 @@ dependencies = [ "itertools 0.12.1", "js-sys", "merlin", - "num-derive", + "num-derive 0.4.2", "num-traits", "rand 0.8.5", "serde", @@ -4853,9 +5764,9 @@ dependencies = [ "serde_json", "sha3", "solana-derivation-path", - "solana-instruction", + "solana-instruction 3.3.0", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-seed-derivable", "solana-seed-phrase", "solana-signature", @@ -4874,11 +5785,11 @@ checksum = "2c13a05831857b4e3320d98cdd77a3f7b645566508d8f66a07c9168ac1e8bc68" dependencies = [ "agave-feature-set", "bytemuck", - "num-derive", + "num-derive 0.4.2", "num-traits", - "solana-instruction", + "solana-instruction 3.3.0", "solana-program-runtime", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-svm-log-collector", "solana-zk-token-sdk", ] @@ -4897,7 +5808,7 @@ dependencies = [ "curve25519-dalek", "itertools 0.12.1", "merlin", - "num-derive", + "num-derive 0.4.2", "num-traits", "rand 0.8.5", "serde", @@ -4905,9 +5816,9 @@ dependencies = [ "sha3", "solana-curve25519", "solana-derivation-path", - "solana-instruction", + "solana-instruction 3.3.0", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-seed-derivable", "solana-seed-phrase", "solana-signature", @@ -4933,18 +5844,18 @@ version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0242277e290c023de8826f504abcf9206b3cd4e18d9ace4ec59a698b2828e88b" dependencies = [ - "borsh", - "num-derive", + "borsh 1.6.1", + "num-derive 0.4.2", "num-traits", - "solana-account-info", - "solana-cpi", - "solana-instruction", - "solana-msg", - "solana-program-entrypoint", - "solana-program-error", + "solana-account-info 3.1.1", + "solana-cpi 3.1.0", + "solana-instruction 3.3.0", + "solana-msg 3.1.0", + "solana-program-entrypoint 3.1.1", + "solana-program-error 3.0.1", "solana-pubkey 3.0.0", "solana-rent 3.1.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-system-interface 2.0.0", "solana-sysvar 3.1.1", "spl-associated-token-account-interface", @@ -4959,8 +5870,8 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6433917b60441d68d99a17e121d9db0ea15a9a69c0e5afa34649cf5ba12612f" dependencies = [ - "borsh", - "solana-instruction", + "borsh 1.6.1", + "solana-instruction 3.3.0", "solana-pubkey 3.0.0", ] @@ -4971,8 +5882,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e597c5ff9ed7c74a54dbc47bae2f06e4db8c98f4356ad280200dc11878266db1" dependencies = [ "bytemuck", - "solana-program-error", - "solana-sha256-hasher", + "solana-program-error 3.0.1", + "solana-sha256-hasher 3.1.0", "spl-discriminator-derive", ] @@ -5006,14 +5917,14 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f3df240f67bea453d4bc5749761e45436d14b9457ed667e0300555d5c271f3" dependencies = [ - "borsh", + "borsh 1.6.1", "bytemuck", "bytemuck_derive", - "num-derive", + "num-derive 0.4.2", "num-traits", "num_enum", - "solana-program-error", - "solana-program-option", + "solana-program-error 3.0.1", + "solana-program-option 3.1.0", "solana-pubkey 3.0.0", "solana-zk-sdk", "thiserror 2.0.18", @@ -5027,21 +5938,21 @@ checksum = "878b0183d51fcd8a53e1604f4c13321894cf53227e6773c529b0d03d499a8dfd" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.4.2", "num-traits", "num_enum", - "solana-account-info", - "solana-cpi", - "solana-instruction", - "solana-msg", - "solana-program-entrypoint", - "solana-program-error", - "solana-program-memory", - "solana-program-option", - "solana-program-pack", + "solana-account-info 3.1.1", + "solana-cpi 3.1.0", + "solana-instruction 3.3.0", + "solana-msg 3.1.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", + "solana-sdk-ids 3.1.0", "solana-sysvar 3.1.1", "spl-token-interface", "thiserror 2.0.18", @@ -5055,16 +5966,16 @@ checksum = "2fcd81188211f4b3c8a5eba7fd534c7142f9dd026123b3472492782cc72f4dc6" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.4.2", "num-traits", "num_enum", - "solana-account-info", - "solana-instruction", - "solana-program-error", - "solana-program-option", - "solana-program-pack", + "solana-account-info 3.1.1", + "solana-instruction 3.3.0", + "solana-program-error 3.0.1", + "solana-program-option 3.1.0", + "solana-program-pack 3.1.0", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-zk-sdk", "spl-pod", "spl-token-confidential-transfer-proof-extraction", @@ -5082,14 +5993,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879a9ebad0d77383d3ea71e7de50503554961ff0f4ef6cbca39ad126e6f6da3a" dependencies = [ "bytemuck", - "solana-account-info", + "solana-account-info 3.1.1", "solana-curve25519", - "solana-instruction", - "solana-instructions-sysvar", - "solana-msg", - "solana-program-error", + "solana-instruction 3.3.0", + "solana-instructions-sysvar 3.0.0", + "solana-msg 3.1.0", + "solana-program-error 3.0.1", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "solana-zk-sdk", "spl-pod", "thiserror 2.0.18", @@ -5113,13 +6024,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841cbd6f2322d02719be4da1affedbe6495b1048b7b985ec9796032564026e22" dependencies = [ "bytemuck", - "num-derive", + "num-derive 0.4.2", "num-traits", "num_enum", "solana-address 2.6.0", - "solana-instruction", + "solana-instruction 3.3.0", "solana-nullable", - "solana-program-error", + "solana-program-error 3.0.1", "solana-zero-copy", "spl-discriminator", "thiserror 2.0.18", @@ -5133,15 +6044,15 @@ checksum = "8c564ac05a7c8d8b12e988a37d82695b5ba4db376d07ea98bc4882c81f96c7f3" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.4.2", "num-traits", "num_enum", - "solana-instruction", - "solana-program-error", - "solana-program-option", - "solana-program-pack", + "solana-instruction 3.3.0", + "solana-program-error 3.0.1", + "solana-program-option 3.1.0", + "solana-program-pack 3.1.0", "solana-pubkey 3.0.0", - "solana-sdk-ids", + "solana-sdk-ids 3.1.0", "thiserror 2.0.18", ] @@ -5151,12 +6062,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c467c7c3bd056f8fe60119e7ec34ddd6f23052c2fa8f1f51999098063b72676" dependencies = [ - "borsh", - "num-derive", + "borsh 1.6.1", + "num-derive 0.4.2", "num-traits", - "solana-borsh", - "solana-instruction", - "solana-program-error", + "solana-borsh 3.0.2", + "solana-instruction 3.3.0", + "solana-program-error 3.0.1", "solana-pubkey 3.0.0", "spl-discriminator", "spl-pod", @@ -5171,11 +6082,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2504631748c48d2a937414d64a12dcac4588d34bd07d355d648619c189d29435" dependencies = [ "bytemuck", - "num-derive", + "num-derive 0.4.2", "num-traits", "num_enum", - "solana-account-info", - "solana-program-error", + "solana-account-info 3.1.1", + "solana-program-error 3.0.1", "solana-zero-copy", "spl-discriminator", "thiserror 2.0.18", @@ -5274,12 +6185,12 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" name = "token-2022-default-account-state-program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", @@ -5293,12 +6204,12 @@ dependencies = [ name = "token-2022-mint-close-authority-program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", @@ -5310,12 +6221,12 @@ dependencies = [ name = "token-2022-multiple-extensions-program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", @@ -5327,12 +6238,12 @@ dependencies = [ name = "token-2022-non-transferable-program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", @@ -5344,12 +6255,12 @@ dependencies = [ name = "token-2022-transfer-fees-program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", @@ -5455,9 +6366,9 @@ dependencies = [ "litesvm", "pinocchio 0.10.2", "pinocchio-system", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", "solana-transaction 3.1.0", @@ -5467,12 +6378,12 @@ dependencies = [ name = "transfer-sol-program" version = "0.1.0" dependencies = [ - "borsh", + "borsh 1.6.1", "borsh-derive 1.6.1", "litesvm", - "solana-instruction", + "solana-instruction 3.3.0", "solana-keypair", - "solana-native-token", + "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", @@ -5532,7 +6443,7 @@ version = "0.1.0" dependencies = [ "anchor-lang", "anchor-spl", - "borsh", + "borsh 1.6.1", "litesvm", "mock-swap-router", "solana-account 3.4.0", @@ -5619,6 +6530,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "web-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "winapi" version = "0.3.9" @@ -5650,7 +6571,7 @@ dependencies = [ "pastey", "proc-macro2", "quote", - "solana-short-vec", + "solana-short-vec 3.2.0", "thiserror 2.0.18", "wincode-derive", ] diff --git a/Cargo.toml b/Cargo.toml index 8c0a4aa3..bbf919a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,6 +58,7 @@ members = [ "tokens/token-extensions/default-account-state/native/program", "tokens/token-extensions/transfer-fee/native/program", "tokens/token-extensions/multiple-extensions/native/program", + "tokens/create-token/native/program", ] resolver = "2" diff --git a/tokens/create-token/native/package.json b/tokens/create-token/native/package.json index 192560ab..efd0e67d 100644 --- a/tokens/create-token/native/package.json +++ b/tokens/create-token/native/package.json @@ -1,26 +1,7 @@ { "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/hello_solana_program.so" - }, - "dependencies": { - "@metaplex-foundation/mpl-token-metadata": "^2.5.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5" - }, - "type": "module" + "deploy": "solana program deploy ./program/target/so/create_token_program.so" + } } diff --git a/tokens/create-token/native/pnpm-lock.yaml b/tokens/create-token/native/pnpm-lock.yaml index f7f834f8..9b60ae17 100644 --- a/tokens/create-token/native/pnpm-lock.yaml +++ b/tokens/create-token/native/pnpm-lock.yaml @@ -6,1876 +6,4 @@ settings: importers: - .: - dependencies: - '@metaplex-foundation/mpl-token-metadata': - specifier: ^2.5.2 - version: 2.13.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/spl-token': - specifier: ^0.3.7 - version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.2.0 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^5 - version: 5.9.3 - -packages: - - '@babel/runtime@7.28.4': - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} - engines: {node: '>=6.9.0'} - - '@metaplex-foundation/beet-solana@0.4.1': - resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} - - '@metaplex-foundation/beet@0.7.2': - resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} - - '@metaplex-foundation/cusper@0.0.2': - resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} - - '@metaplex-foundation/mpl-token-metadata@2.13.0': - resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout-utils@0.2.0': - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.0.0-rc.1': - resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-data-structures@2.0.0-rc.1': - resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.0.0-rc.1': - resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-strings@2.0.0-rc.1': - resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - typescript: '>=5' - - '@solana/codecs@2.0.0-rc.1': - resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.0.0-rc.1': - resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} - hasBin: true - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/options@2.0.0-rc.1': - resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} - peerDependencies: - typescript: '>=5' - - '@solana/spl-token-metadata@0.1.6': - resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.95.3 - - '@solana/spl-token@0.3.11': - resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.88.0 - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.2.0': - resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@24.9.1': - resolution: {integrity: sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base-x@4.0.1: - resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@14.0.1: - resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.2.0: - resolution: {integrity: sha512-DS/XHdPxplQTtNRKiBCRWGBJfjOk56W7fyFUpiYi9fSTWTzoEMbUkn3J4gB0IMniIEVeAGR1/rzFQogzD5MxvQ==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.28.4': {} - - '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - bs58: 5.0.0 - debug: 4.4.3 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - - '@metaplex-foundation/beet@0.7.2': - dependencies: - ansicolors: 0.3.2 - assert: 2.1.0 - bn.js: 5.2.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@metaplex-foundation/cusper@0.0.2': {} - - '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@metaplex-foundation/cusper': 0.0.2 - '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - debug: 4.4.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - supports-color - - typescript - - utf-8-validate - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - bigint-buffer: 1.1.5 - bignumber.js: 9.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - fastestsmallesttextencoderdecoder: 1.0.22 - typescript: 5.9.3 - - '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 12.1.0 - typescript: 5.9.3 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.1 - typescript: 5.9.3 - - '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.28.4 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.2.0 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.2.0': - dependencies: - '@types/node': 24.9.1 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 24.9.1 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@24.9.1': - dependencies: - undici-types: 7.16.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 24.9.1 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 24.9.1 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansicolors@0.3.2: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assert@2.1.0: - dependencies: - call-bind: 1.0.8 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.7 - util: 0.12.5 - - assertion-error@1.1.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base-x@4.0.1: {} - - base64-js@1.5.1: {} - - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - - bignumber.js@9.3.1: {} - - binary-extensions@2.3.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.12: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - bs58@5.0.0: - dependencies: - base-x: 4.0.1 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@12.1.0: {} - - commander@14.0.1: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - emoji-regex@8.0.0: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - file-uri-to-path@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - generator-function@2.0.1: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - gopd@1.2.0: {} - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-callable@1.2.7: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.1.2: - dependencies: - call-bound: 1.0.4 - generator-function: 2.0.1 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-nan@1.3.2: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.19 - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - math-intrinsics@1.1.0: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.12 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.12 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - possible-typed-array-names@1.1.0: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.2.0: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@5.9.3: {} - - undici-types@7.16.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.2 - is-typed-array: 1.1.15 - which-typed-array: 1.1.19 - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + .: {} diff --git a/tokens/create-token/native/program/Cargo.toml b/tokens/create-token/native/program/Cargo.toml index d34414af..2b53090a 100644 --- a/tokens/create-token/native/program/Cargo.toml +++ b/tokens/create-token/native/program/Cargo.toml @@ -7,9 +7,12 @@ edition = "2021" borsh.workspace = true borsh-derive.workspace = true solana-program.workspace = true -spl-token = { version = "8.0.0", features = [ "no-entrypoint" ] } -spl-associated-token-account = { version = "7.0.0", features = [ "no-entrypoint" ] } -mpl-token-metadata = { version = "5.1.1", features = [ "no-entrypoint" ] } +solana-system-interface = { version = "2.0.0", features = ["bincode"] } +spl-token-interface = "2.0.0" +mpl-token-metadata = "5.1.1" +# Alias for the (older) solana-program version mpl-token-metadata's instruction +# builders return, so we can name that Instruction/Pubkey type when bridging. +mpl-solana-program = { package = "solana-program", version = "2.3" } [lib] crate-type = ["cdylib", "lib"] @@ -20,3 +23,11 @@ custom-panic = [] [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-native-token = "3.0.0" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.1" diff --git a/tokens/create-token/native/program/src/lib.rs b/tokens/create-token/native/program/src/lib.rs index e7788f43..93e8da6c 100644 --- a/tokens/create-token/native/program/src/lib.rs +++ b/tokens/create-token/native/program/src/lib.rs @@ -1,19 +1,23 @@ use { borsh::{BorshDeserialize, BorshSerialize}, - mpl_token_metadata::instruction as mpl_instruction, + mpl_token_metadata::{ + instructions::{CreateMetadataAccountV3, CreateMetadataAccountV3InstructionArgs}, + types::DataV2, + }, solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint, entrypoint::ProgramResult, + instruction::{AccountMeta, Instruction}, msg, program::invoke, program_pack::Pack, pubkey::Pubkey, rent::Rent, - system_instruction, sysvar::Sysvar, }, - spl_token::{instruction as token_instruction, state::Mint}, + solana_system_interface::instruction as system_instruction, + spl_token_interface::{instruction as token_instruction, state::Mint}, }; #[derive(BorshSerialize, BorshDeserialize, Debug)] @@ -24,6 +28,32 @@ pub struct CreateTokenArgs { pub token_decimals: u8, } +// `mpl-token-metadata` 5.x is built against an older `solana-program`, so its +// instruction builders return that crate's `Instruction`/`Pubkey` types. These +// helpers bridge them to the `solana-program` version this program is compiled +// with. (Both `Pubkey`s are 32-byte arrays, so the conversion is a byte copy.) +type MplPubkey = mpl_solana_program::pubkey::Pubkey; + +fn to_mpl(key: &Pubkey) -> MplPubkey { + MplPubkey::new_from_array(key.to_bytes()) +} + +fn bridge_instruction(ix: mpl_solana_program::instruction::Instruction) -> Instruction { + Instruction { + program_id: Pubkey::new_from_array(ix.program_id.to_bytes()), + accounts: ix + .accounts + .into_iter() + .map(|meta| AccountMeta { + pubkey: Pubkey::new_from_array(meta.pubkey.to_bytes()), + is_signer: meta.is_signer, + is_writable: meta.is_writable, + }) + .collect(), + data: ix.data, + } +} + entrypoint!(process_instruction); fn process_instruction( @@ -88,25 +118,30 @@ fn process_instruction( // msg!("Creating metadata account..."); msg!("Metadata account address: {}", metadata_account.key); + let create_metadata_ix = CreateMetadataAccountV3 { + metadata: to_mpl(metadata_account.key), + mint: to_mpl(mint_account.key), + mint_authority: to_mpl(mint_authority.key), + payer: to_mpl(payer.key), + update_authority: (to_mpl(mint_authority.key), true), + system_program: to_mpl(system_program.key), + rent: Some(to_mpl(rent.key)), + } + .instruction(CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name: args.token_title, + symbol: args.token_symbol, + uri: args.token_uri, + seller_fee_basis_points: 0, + creators: None, + collection: None, + uses: None, + }, + is_mutable: true, + collection_details: None, + }); invoke( - &mpl_instruction::create_metadata_accounts_v3( - *token_metadata_program.key, - *metadata_account.key, - *mint_account.key, - *mint_authority.key, - *payer.key, - *mint_authority.key, - args.token_title, - args.token_symbol, - args.token_uri, - None, - 0, - true, - false, - None, - None, - None, - ), + &bridge_instruction(create_metadata_ix), &[ metadata_account.clone(), mint_account.clone(), diff --git a/tokens/create-token/native/program/tests/test.rs b/tokens/create-token/native/program/tests/test.rs new file mode 100644 index 00000000..874ed008 --- /dev/null +++ b/tokens/create-token/native/program/tests/test.rs @@ -0,0 +1,92 @@ +use { + litesvm::LiteSVM, + solana_instruction::{AccountMeta, Instruction}, + solana_keypair::{Keypair, Signer}, + solana_native_token::LAMPORTS_PER_SOL, + solana_pubkey::{pubkey, Pubkey}, + solana_transaction::Transaction, + spl_token_interface::state::Mint, + {create_token_program::CreateTokenArgs, solana_program::program_pack::Pack}, +}; + +// SPL Token-Metadata program id (the program loaded from the fixture .so). +const TOKEN_METADATA_PROGRAM_ID: Pubkey = pubkey!("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); +const RENT_SYSVAR_ID: Pubkey = pubkey!("SysvarRent111111111111111111111111111111111"); + +#[test] +fn test_create_token_with_metadata() { + let mut svm = LiteSVM::new(); + + let program_id = Pubkey::new_unique(); + svm.add_program( + program_id, + include_bytes!("../../tests/fixtures/create_token_program.so"), + ) + .unwrap(); + + // litesvm bundles SPL Token but not Token-Metadata, so load it from the + // fixture .so at its canonical address. + svm.add_program( + TOKEN_METADATA_PROGRAM_ID, + include_bytes!("../../tests/fixtures/mpl_token_metadata.so"), + ) + .unwrap(); + + let token_program_id = spl_token_interface::id(); + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + let mint = Keypair::new(); + let (metadata, _bump) = Pubkey::find_program_address( + &[ + b"metadata", + TOKEN_METADATA_PROGRAM_ID.as_ref(), + mint.pubkey().as_ref(), + ], + &TOKEN_METADATA_PROGRAM_ID, + ); + + let data = borsh::to_vec(&CreateTokenArgs { + token_title: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/spl-token.json".to_string(), + token_decimals: 9, + }) + .unwrap(); + + // payer doubles as the mint authority (matches the original example). + let ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), true), // mint account + AccountMeta::new(payer.pubkey(), false), // mint authority + AccountMeta::new(metadata, false), // metadata account + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new_readonly(RENT_SYSVAR_ID, false), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), + AccountMeta::new_readonly(token_program_id, false), + AccountMeta::new_readonly(TOKEN_METADATA_PROGRAM_ID, false), + ], + data, + }; + + let tx = Transaction::new_signed_with_payer( + &[ix], + Some(&payer.pubkey()), + &[&payer, &mint], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); + + // The mint exists, is owned by the token program, and has the right decimals. + let mint_account = svm.get_account(&mint.pubkey()).unwrap(); + assert_eq!(mint_account.owner, token_program_id); + let mint_state = Mint::unpack(&mint_account.data).unwrap(); + assert_eq!(mint_state.decimals, 9); + + // The metadata account exists and is owned by the Token-Metadata program. + let metadata_account = svm.get_account(&metadata).unwrap(); + assert_eq!(metadata_account.owner, TOKEN_METADATA_PROGRAM_ID); + assert!(!metadata_account.data.is_empty()); +} diff --git a/tokens/create-token/native/tests/fixtures/mpl_token_metadata.so b/tokens/create-token/native/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 { - // const connection = new Connection(`http://localhost:8899`, 'confirmed'); - const connection = new Connection("https://api.devnet.solana.com/", "confirmed"); - const payer = createKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); - const program = createKeypairFromFile("./program/target/deploy/program-keypair.json"); - - it("Create an SPL Token!", async () => { - const mintKeypair: Keypair = Keypair.generate(); - - const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - - // SPL Token default = 9 decimals - // - const instructionData = borshSerialize(CreateTokenArgsSchema, { - token_title: "Solana Gold", - token_symbol: "GOLDSOL", - token_uri: - "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", - token_decimals: 9, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: true, isWritable: true }, // Mint account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { pubkey: metadataAddress, isSigner: false, isWritable: true }, // Metadata account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: TOKEN_METADATA_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Token metadata program - ], - programId: program.publicKey, - data: instructionData, - }); - - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, mintKeypair]); - - console.log("Success!"); - console.log(` Mint Address: ${mintKeypair.publicKey}`); - console.log(` Tx Signature: ${sx}`); - }); - - it("Create an NFT!", async () => { - const mintKeypair: Keypair = Keypair.generate(); - - const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - - // NFT default = 0 decimals - // - const instructionData = borshSerialize(CreateTokenArgsSchema, { - token_title: "Homer NFT", - token_symbol: "HOMR", - token_uri: - "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json", - token_decimals: 9, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: true, isWritable: true }, // Mint account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { pubkey: metadataAddress, isSigner: false, isWritable: true }, // Metadata account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: TOKEN_METADATA_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Token metadata program - ], - programId: program.publicKey, - data: instructionData, - }); - - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, mintKeypair]); - - console.log("Success!"); - console.log(` Mint Address: ${mintKeypair.publicKey}`); - console.log(` Tx Signature: ${sx}`); - }); -}); diff --git a/tokens/create-token/native/tsconfig.json b/tokens/create-token/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/tokens/create-token/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} From 7e7653683131f5d1e8abc12870111dfb6a02179e Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 17:48:48 +0000 Subject: [PATCH 019/138] test(tokens): migrate token-minter, transfer-tokens, nft-minter, pda-mint-authority natives to mpl 5.x + LiteSVM Migrate the four Metaplex-using native token examples off the old mpl-token-metadata 1.x / system_instruction / spl-token APIs onto the current toolchain, matching the create-token reference: - mpl-token-metadata 5.x builders (CreateMetadataAccountV3, CreateMasterEditionV3) bridged from the older solana-program types the builders return via a shared bridge.rs (to_mpl / bridge_instruction). - solana-system-interface for create_account. - spl-token-interface + spl-associated-token-account-interface 2.0.0. - transfer-tokens now uses transfer_checked (reads mint decimals). - Add each crate to the root workspace members and remove from .ghaignore. - Add LiteSVM Rust tests (program/tests/test.rs) loading the program plus the committed mpl_token_metadata.so fixture, exercising create/mint/ transfer/master-edition/PDA-authority flows end to end with assertions. - Replace package.json with scripts-only, delete devnet TS tests + tsconfig, regenerate empty pnpm lockfiles. https://claude.ai/code/session_013dpnF6uSGWXjkJJZseqzcP --- .github/.ghaignore | 6 - Cargo.lock | 80 + Cargo.toml | 4 + tokens/nft-minter/native/package.json | 21 +- tokens/nft-minter/native/pnpm-lock.yaml | 1874 +---------------- tokens/nft-minter/native/program/Cargo.toml | 31 +- .../nft-minter/native/program/src/bridge.rs | 30 + .../native/program/src/instructions/create.rs | 51 +- .../native/program/src/instructions/mint.rs | 74 +- tokens/nft-minter/native/program/src/lib.rs | 1 + .../nft-minter/native/program/tests/test.rs | 138 ++ .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes .../nft-minter/native/tests/instructions.ts | 21 - tokens/nft-minter/native/tests/test.ts | 126 -- tokens/nft-minter/native/tsconfig.json | 10 - tokens/pda-mint-authority/native/package.json | 23 +- .../pda-mint-authority/native/pnpm-lock.yaml | 1861 +--------------- .../native/program/Cargo.toml | 31 +- .../native/program/src/bridge.rs | 30 + .../native/program/src/instructions/create.rs | 51 +- .../native/program/src/instructions/init.rs | 2 +- .../native/program/src/instructions/mint.rs | 75 +- .../native/program/src/lib.rs | 1 + .../native/program/tests/test.rs | 164 ++ .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes .../native/tests/instructions.ts | 24 - .../pda-mint-authority/native/tests/test.ts | 161 -- .../pda-mint-authority/native/tsconfig.json | 10 - tokens/token-minter/native/package.json | 21 +- tokens/token-minter/native/pnpm-lock.yaml | 1874 +---------------- tokens/token-minter/native/program/Cargo.toml | 31 +- .../token-minter/native/program/src/bridge.rs | 30 + .../native/program/src/instructions/create.rs | 51 +- .../native/program/src/instructions/mint.rs | 4 +- tokens/token-minter/native/program/src/lib.rs | 1 + .../token-minter/native/program/tests/test.rs | 134 ++ .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes .../token-minter/native/tests/instructions.ts | 26 - tokens/token-minter/native/tests/test.ts | 105 - tokens/token-minter/native/tsconfig.json | 10 - tokens/transfer-tokens/native/package.json | 21 +- tokens/transfer-tokens/native/pnpm-lock.yaml | 1874 +---------------- .../transfer-tokens/native/program/Cargo.toml | 31 +- .../native/program/src/bridge.rs | 30 + .../native/program/src/instructions/create.rs | 51 +- .../program/src/instructions/mint_nft.rs | 74 +- .../program/src/instructions/mint_spl.rs | 4 +- .../program/src/instructions/transfer.rs | 11 +- .../transfer-tokens/native/program/src/lib.rs | 1 + .../native/program/tests/test.rs | 173 ++ .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes .../native/tests/instructions.ts | 38 - tokens/transfer-tokens/native/tests/test.ts | 321 --- tokens/transfer-tokens/native/tsconfig.json | 10 - 54 files changed, 1140 insertions(+), 8686 deletions(-) create mode 100644 tokens/nft-minter/native/program/src/bridge.rs create mode 100644 tokens/nft-minter/native/program/tests/test.rs create mode 100644 tokens/nft-minter/native/tests/fixtures/mpl_token_metadata.so delete mode 100644 tokens/nft-minter/native/tests/instructions.ts delete mode 100644 tokens/nft-minter/native/tests/test.ts delete mode 100644 tokens/nft-minter/native/tsconfig.json create mode 100644 tokens/pda-mint-authority/native/program/src/bridge.rs create mode 100644 tokens/pda-mint-authority/native/program/tests/test.rs create mode 100644 tokens/pda-mint-authority/native/tests/fixtures/mpl_token_metadata.so delete mode 100644 tokens/pda-mint-authority/native/tests/instructions.ts delete mode 100644 tokens/pda-mint-authority/native/tests/test.ts delete mode 100644 tokens/pda-mint-authority/native/tsconfig.json create mode 100644 tokens/token-minter/native/program/src/bridge.rs create mode 100644 tokens/token-minter/native/program/tests/test.rs create mode 100644 tokens/token-minter/native/tests/fixtures/mpl_token_metadata.so delete mode 100644 tokens/token-minter/native/tests/instructions.ts delete mode 100644 tokens/token-minter/native/tests/test.ts delete mode 100644 tokens/token-minter/native/tsconfig.json create mode 100644 tokens/transfer-tokens/native/program/src/bridge.rs create mode 100644 tokens/transfer-tokens/native/program/tests/test.rs create mode 100644 tokens/transfer-tokens/native/tests/fixtures/mpl_token_metadata.so delete mode 100644 tokens/transfer-tokens/native/tests/instructions.ts delete mode 100644 tokens/transfer-tokens/native/tests/test.ts delete mode 100644 tokens/transfer-tokens/native/tsconfig.json diff --git a/.github/.ghaignore b/.github/.ghaignore index ae4a2717..f94cb08a 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -1,12 +1,6 @@ # uses generated client from shank, can't rewrite to solana-bankrun tools/shank-and-solita/native -# can't test on localnet -tokens/pda-mint-authority/native -tokens/nft-minter/native -tokens/transfer-tokens/native -tokens/token-minter/native - # not building: pyth-solana-receiver-sdk 1.1.0 pulls a borsh version that # conflicts with Anchor 1.0 / Solana 3.x (PriceUpdateV2 fails BorshDeserialize). # Blocked on an upstream SDK release compatible with solana 3.x. diff --git a/Cargo.lock b/Cargo.lock index 707ad832..09654b5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2228,6 +2228,26 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "nft-minter-program" +version = "0.1.0" +dependencies = [ + "borsh 1.6.1", + "borsh-derive 1.6.1", + "litesvm", + "mpl-token-metadata", + "solana-instruction 3.3.0", + "solana-keypair", + "solana-native-token 3.0.0", + "solana-program 2.3.0", + "solana-program 4.0.0", + "solana-pubkey 3.0.0", + "solana-system-interface 2.0.0", + "solana-transaction 3.1.0", + "spl-associated-token-account-interface", + "spl-token-interface", +] + [[package]] name = "num" version = "0.2.1" @@ -2414,6 +2434,26 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "pda-mint-authority-native-program" +version = "0.1.0" +dependencies = [ + "borsh 1.6.1", + "borsh-derive 1.6.1", + "litesvm", + "mpl-token-metadata", + "solana-instruction 3.3.0", + "solana-keypair", + "solana-native-token 3.0.0", + "solana-program 2.3.0", + "solana-program 4.0.0", + "solana-pubkey 3.0.0", + "solana-system-interface 2.0.0", + "solana-transaction 3.1.0", + "spl-associated-token-account-interface", + "spl-token-interface", +] + [[package]] name = "pda-rent-payer" version = "0.1.0" @@ -6268,6 +6308,26 @@ dependencies = [ "spl-token-2022-interface", ] +[[package]] +name = "token-minter-native-program" +version = "0.1.0" +dependencies = [ + "borsh 1.6.1", + "borsh-derive 1.6.1", + "litesvm", + "mpl-token-metadata", + "solana-instruction 3.3.0", + "solana-keypair", + "solana-native-token 3.0.0", + "solana-program 2.3.0", + "solana-program 4.0.0", + "solana-pubkey 3.0.0", + "solana-system-interface 2.0.0", + "solana-transaction 3.1.0", + "spl-associated-token-account-interface", + "spl-token-interface", +] + [[package]] name = "toml" version = "0.5.11" @@ -6390,6 +6450,26 @@ dependencies = [ "solana-transaction 3.1.0", ] +[[package]] +name = "transfer-tokens-program" +version = "0.1.0" +dependencies = [ + "borsh 1.6.1", + "borsh-derive 1.6.1", + "litesvm", + "mpl-token-metadata", + "solana-instruction 3.3.0", + "solana-keypair", + "solana-native-token 3.0.0", + "solana-program 2.3.0", + "solana-program 4.0.0", + "solana-pubkey 3.0.0", + "solana-system-interface 2.0.0", + "solana-transaction 3.1.0", + "spl-associated-token-account-interface", + "spl-token-interface", +] + [[package]] name = "typenum" version = "1.19.0" diff --git a/Cargo.toml b/Cargo.toml index bbf919a8..3e79eb10 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,6 +59,10 @@ members = [ "tokens/token-extensions/transfer-fee/native/program", "tokens/token-extensions/multiple-extensions/native/program", "tokens/create-token/native/program", + "tokens/token-minter/native/program", + "tokens/transfer-tokens/native/program", + "tokens/nft-minter/native/program", + "tokens/pda-mint-authority/native/program", ] resolver = "2" diff --git a/tokens/nft-minter/native/package.json b/tokens/nft-minter/native/package.json index fc0ff32f..a6dfbb45 100644 --- a/tokens/nft-minter/native/package.json +++ b/tokens/nft-minter/native/package.json @@ -1,22 +1,7 @@ { "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts" - }, - "dependencies": { - "@metaplex-foundation/mpl-token-metadata": "^2.5.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5" + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", + "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", + "deploy": "solana program deploy ./program/target/so/nft_minter_program.so" } } diff --git a/tokens/nft-minter/native/pnpm-lock.yaml b/tokens/nft-minter/native/pnpm-lock.yaml index d320451d..9b60ae17 100644 --- a/tokens/nft-minter/native/pnpm-lock.yaml +++ b/tokens/nft-minter/native/pnpm-lock.yaml @@ -6,1876 +6,4 @@ settings: importers: - .: - dependencies: - '@metaplex-foundation/mpl-token-metadata': - specifier: ^2.5.2 - version: 2.13.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/spl-token': - specifier: ^0.3.7 - version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.2.0 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^5 - version: 5.9.3 - -packages: - - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} - engines: {node: '>=6.9.0'} - - '@metaplex-foundation/beet-solana@0.4.1': - resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} - - '@metaplex-foundation/beet@0.7.2': - resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} - - '@metaplex-foundation/cusper@0.0.2': - resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} - - '@metaplex-foundation/mpl-token-metadata@2.13.0': - resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout-utils@0.2.0': - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.0.0-rc.1': - resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-data-structures@2.0.0-rc.1': - resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.0.0-rc.1': - resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-strings@2.0.0-rc.1': - resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - typescript: '>=5' - - '@solana/codecs@2.0.0-rc.1': - resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.0.0-rc.1': - resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} - hasBin: true - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/options@2.0.0-rc.1': - resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} - peerDependencies: - typescript: '>=5' - - '@solana/spl-token-metadata@0.1.6': - resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.95.3 - - '@solana/spl-token@0.3.11': - resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.88.0 - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.18': - resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} - - '@types/bn.js@5.2.0': - resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@25.2.3': - resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base-x@4.0.1: - resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.1.0: - resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} - engines: {node: '>=6.14.2'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.1: - resolution: {integrity: sha512-Z3u54A8qGyqFOSr2pk0ijYs8mOE9Qz8kTvtKeBI+upoG9j04Sq+oI7W8zAJiQybDcESET8/uIdHzs0p3k4fZlw==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.3: - resolution: {integrity: sha512-OkCsBBzrwxX4DoSv4Zlf9DgXKRB0MzVfCFg5MC+fNnf9ktr4SMWjsri0VNZQlDbCnGcImT6KNEv4ZoxktQhdpA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.28.6': {} - - '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - bs58: 5.0.0 - debug: 4.4.3 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - - '@metaplex-foundation/beet@0.7.2': - dependencies: - ansicolors: 0.3.2 - assert: 2.1.0 - bn.js: 5.2.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@metaplex-foundation/cusper@0.0.2': {} - - '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@metaplex-foundation/cusper': 0.0.2 - '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - debug: 4.4.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - supports-color - - typescript - - utf-8-validate - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - bigint-buffer: 1.1.5 - bignumber.js: 9.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - fastestsmallesttextencoderdecoder: 1.0.22 - typescript: 5.9.3 - - '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 12.1.0 - typescript: 5.9.3 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 5.9.3 - - '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.28.6 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.3.3 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.18': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.2.0': - dependencies: - '@types/node': 25.2.3 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 25.2.3 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@25.2.3': - dependencies: - undici-types: 7.16.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 25.2.3 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 25.2.3 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansicolors@0.3.2: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assert@2.1.0: - dependencies: - call-bind: 1.0.8 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.7 - util: 0.12.5 - - assertion-error@1.1.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base-x@4.0.1: {} - - base64-js@1.5.1: {} - - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - - bignumber.js@9.3.1: {} - - binary-extensions@2.3.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.12: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - bs58@5.0.0: - dependencies: - base-x: 4.0.1 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.1.0: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@12.1.0: {} - - commander@14.0.3: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delay@5.0.0: {} - - diff@3.5.1: {} - - diff@5.0.0: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - emoji-regex@8.0.0: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.4: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - file-uri-to-path@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - generator-function@2.0.1: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - gopd@1.2.0: {} - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-callable@1.2.7: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.1.2: - dependencies: - call-bound: 1.0.4 - generator-function: 2.0.1 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-nan@1.3.2: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.20 - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) - - jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - math-intrinsics@1.1.0: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.12 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.12 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - possible-typed-array-names@1.1.0: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.3.3: - dependencies: - '@swc/helpers': 0.5.18 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.4 - uuid: 8.3.2 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.1 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@5.9.3: {} - - undici-types@7.16.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.2 - is-typed-array: 1.1.15 - which-typed-array: 1.1.20 - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which-typed-array@1.1.20: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 - - ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + .: {} diff --git a/tokens/nft-minter/native/program/Cargo.toml b/tokens/nft-minter/native/program/Cargo.toml index d44fa35f..0edccbf9 100644 --- a/tokens/nft-minter/native/program/Cargo.toml +++ b/tokens/nft-minter/native/program/Cargo.toml @@ -4,12 +4,31 @@ version = "0.1.0" edition = "2021" [dependencies] -borsh = "0.9.3" -borsh-derive = "0.9.1" -solana-program = "2.0" -spl-token = { version="4.0.0", features = [ "no-entrypoint" ] } -spl-associated-token-account = { version="2.0.0", features = [ "no-entrypoint" ] } -mpl-token-metadata = { version="1.11" } +borsh.workspace = true +borsh-derive.workspace = true +solana-program.workspace = true +solana-system-interface = { version = "2.0.0", features = ["bincode"] } +spl-token-interface = "2.0.0" +spl-associated-token-account-interface = "2.0.0" +mpl-token-metadata = "5.1.1" +# Alias for the (older) solana-program version mpl-token-metadata's instruction +# builders return, so we can name that Instruction/Pubkey type when bridging. +mpl-solana-program = { package = "solana-program", version = "2.3" } [lib] crate-type = ["cdylib", "lib"] + +[features] +custom-heap = [] +custom-panic = [] + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-native-token = "3.0.0" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.1" diff --git a/tokens/nft-minter/native/program/src/bridge.rs b/tokens/nft-minter/native/program/src/bridge.rs new file mode 100644 index 00000000..334d6840 --- /dev/null +++ b/tokens/nft-minter/native/program/src/bridge.rs @@ -0,0 +1,30 @@ +//! `mpl-token-metadata` 5.x is built against an older `solana-program`, so its +//! instruction builders return that crate's `Instruction`/`Pubkey` types. These +//! helpers bridge them to the `solana-program` version this program is compiled +//! with. (Both `Pubkey`s are 32-byte arrays, so the conversion is a byte copy.) +use solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, +}; + +pub type MplPubkey = mpl_solana_program::pubkey::Pubkey; + +pub fn to_mpl(key: &Pubkey) -> MplPubkey { + MplPubkey::new_from_array(key.to_bytes()) +} + +pub fn bridge_instruction(ix: mpl_solana_program::instruction::Instruction) -> Instruction { + Instruction { + program_id: Pubkey::new_from_array(ix.program_id.to_bytes()), + accounts: ix + .accounts + .into_iter() + .map(|meta| AccountMeta { + pubkey: Pubkey::new_from_array(meta.pubkey.to_bytes()), + is_signer: meta.is_signer, + is_writable: meta.is_writable, + }) + .collect(), + data: ix.data, + } +} diff --git a/tokens/nft-minter/native/program/src/instructions/create.rs b/tokens/nft-minter/native/program/src/instructions/create.rs index 1bc557ea..72986241 100644 --- a/tokens/nft-minter/native/program/src/instructions/create.rs +++ b/tokens/nft-minter/native/program/src/instructions/create.rs @@ -1,6 +1,10 @@ use { + crate::bridge::{bridge_instruction, to_mpl}, borsh::{BorshDeserialize, BorshSerialize}, - mpl_token_metadata::instruction as mpl_instruction, + mpl_token_metadata::{ + instructions::{CreateMetadataAccountV3, CreateMetadataAccountV3InstructionArgs}, + types::DataV2, + }, solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint::ProgramResult, @@ -8,10 +12,10 @@ use { program::invoke, program_pack::Pack, rent::Rent, - system_instruction, sysvar::Sysvar, }, - spl_token::{instruction as token_instruction, state::Mint}, + solana_system_interface::instruction as system_instruction, + spl_token_interface::{instruction as token_instruction, state::Mint}, }; #[derive(BorshSerialize, BorshDeserialize, Debug)] @@ -77,25 +81,30 @@ pub fn create_token(accounts: &[AccountInfo], args: CreateTokenArgs) -> ProgramR // msg!("Creating metadata account..."); msg!("Metadata account address: {}", metadata_account.key); + let create_metadata_ix = CreateMetadataAccountV3 { + metadata: to_mpl(metadata_account.key), + mint: to_mpl(mint_account.key), + mint_authority: to_mpl(mint_authority.key), + payer: to_mpl(payer.key), + update_authority: (to_mpl(mint_authority.key), true), + system_program: to_mpl(system_program.key), + rent: Some(to_mpl(rent.key)), + } + .instruction(CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name: args.nft_title, + symbol: args.nft_symbol, + uri: args.nft_uri, + seller_fee_basis_points: 0, + creators: None, + collection: None, + uses: None, + }, + is_mutable: true, + collection_details: None, + }); invoke( - &mpl_instruction::create_metadata_accounts_v3( - *token_metadata_program.key, - *metadata_account.key, - *mint_account.key, - *mint_authority.key, - *payer.key, - *mint_authority.key, - args.nft_title, - args.nft_symbol, - args.nft_uri, - None, - 0, - true, - false, - None, - None, - None, - ), + &bridge_instruction(create_metadata_ix), &[ metadata_account.clone(), mint_account.clone(), diff --git a/tokens/nft-minter/native/program/src/instructions/mint.rs b/tokens/nft-minter/native/program/src/instructions/mint.rs index cf47ed67..8d821958 100644 --- a/tokens/nft-minter/native/program/src/instructions/mint.rs +++ b/tokens/nft-minter/native/program/src/instructions/mint.rs @@ -1,13 +1,16 @@ use { - mpl_token_metadata::instruction as mpl_instruction, + crate::bridge::{bridge_instruction, to_mpl}, + mpl_token_metadata::instructions::{ + CreateMasterEditionV3, CreateMasterEditionV3InstructionArgs, + }, solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint::ProgramResult, msg, program::invoke, }, - spl_associated_token_account::instruction as associated_token_account_instruction, - spl_token::instruction as token_instruction, + spl_associated_token_account_interface::instruction as associated_token_account_instruction, + spl_token_interface::instruction as token_instruction, }; pub fn mint_to(accounts: &[AccountInfo]) -> ProgramResult { @@ -20,7 +23,7 @@ pub fn mint_to(accounts: &[AccountInfo]) -> ProgramResult { let associated_token_account = next_account_info(accounts_iter)?; let payer = next_account_info(accounts_iter)?; let rent = next_account_info(accounts_iter)?; - let _system_program = next_account_info(accounts_iter)?; + let system_program = next_account_info(accounts_iter)?; let token_program = next_account_info(accounts_iter)?; let associated_token_program = next_account_info(accounts_iter)?; let token_metadata_program = next_account_info(accounts_iter)?; @@ -38,6 +41,7 @@ pub fn mint_to(accounts: &[AccountInfo]) -> ProgramResult { mint_account.clone(), associated_token_account.clone(), payer.clone(), + system_program.clone(), token_program.clone(), associated_token_program.clone(), ], @@ -73,17 +77,22 @@ pub fn mint_to(accounts: &[AccountInfo]) -> ProgramResult { // msg!("Creating edition account..."); msg!("Edition account address: {}", edition_account.key); + let create_edition_ix = CreateMasterEditionV3 { + edition: to_mpl(edition_account.key), + mint: to_mpl(mint_account.key), + update_authority: to_mpl(mint_authority.key), + mint_authority: to_mpl(mint_authority.key), + payer: to_mpl(payer.key), + metadata: to_mpl(metadata_account.key), + token_program: to_mpl(token_program.key), + system_program: to_mpl(system_program.key), + rent: Some(to_mpl(rent.key)), + } + .instruction(CreateMasterEditionV3InstructionArgs { + max_supply: Some(1), + }); invoke( - &mpl_instruction::create_master_edition_v3( - *token_metadata_program.key, // Program ID - *edition_account.key, // Edition - *mint_account.key, // Mint - *mint_authority.key, // Update Authority - *mint_authority.key, // Mint Authority - *metadata_account.key, // Metadata - *payer.key, // Payer - Some(1), // Max Supply - ), + &bridge_instruction(create_edition_ix), &[ edition_account.clone(), metadata_account.clone(), @@ -91,45 +100,12 @@ pub fn mint_to(accounts: &[AccountInfo]) -> ProgramResult { mint_authority.clone(), payer.clone(), token_metadata_program.clone(), + token_program.clone(), + system_program.clone(), rent.clone(), ], )?; - // If we don't use Metaplex Editions, we must disable minting manually - // - // ------------------------------------------------------------------- - // msg!("Disabling future minting of this NFT..."); - // invoke( - // &token_instruction::set_authority( - // &token_program.key, - // &mint_account.key, - // None, - // token_instruction::AuthorityType::MintTokens, - // &mint_authority.key, - // &[&mint_authority.key], - // )?, - // &[ - // mint_account.clone(), - // mint_authority.clone(), - // token_program.clone(), - // ], - // )?; - // invoke( - // &token_instruction::set_authority( - // &token_program.key, - // &mint_account.key, - // None, - // token_instruction::AuthorityType::FreezeAccount, - // &mint_authority.key, - // &[&mint_authority.key], - // )?, - // &[ - // mint_account.clone(), - // mint_authority.clone(), - // token_program.clone(), - // ], - // )?; - msg!("NFT minted successfully."); Ok(()) diff --git a/tokens/nft-minter/native/program/src/lib.rs b/tokens/nft-minter/native/program/src/lib.rs index ffe183c3..ea8dbc74 100644 --- a/tokens/nft-minter/native/program/src/lib.rs +++ b/tokens/nft-minter/native/program/src/lib.rs @@ -2,6 +2,7 @@ use solana_program::{ account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, pubkey::Pubkey, }; +pub mod bridge; pub mod instructions; pub mod processor; diff --git a/tokens/nft-minter/native/program/tests/test.rs b/tokens/nft-minter/native/program/tests/test.rs new file mode 100644 index 00000000..11eabe8b --- /dev/null +++ b/tokens/nft-minter/native/program/tests/test.rs @@ -0,0 +1,138 @@ +use { + litesvm::LiteSVM, + nft_minter_program::instructions::create::CreateTokenArgs, + solana_instruction::{AccountMeta, Instruction}, + solana_keypair::{Keypair, Signer}, + solana_native_token::LAMPORTS_PER_SOL, + solana_program::program_pack::Pack, + solana_pubkey::{pubkey, Pubkey}, + solana_transaction::Transaction, + spl_token_interface::state::{Account as TokenAccount, Mint}, +}; + +const TOKEN_METADATA_PROGRAM_ID: Pubkey = pubkey!("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); +const RENT_SYSVAR_ID: Pubkey = pubkey!("SysvarRent111111111111111111111111111111111"); + +#[test] +fn test_create_and_mint_nft() { + let mut svm = LiteSVM::new(); + + let program_id = Pubkey::new_unique(); + svm.add_program( + program_id, + include_bytes!("../../tests/fixtures/nft_minter_program.so"), + ) + .unwrap(); + svm.add_program( + TOKEN_METADATA_PROGRAM_ID, + include_bytes!("../../tests/fixtures/mpl_token_metadata.so"), + ) + .unwrap(); + + let token_program_id = spl_token_interface::id(); + let ata_program_id = spl_associated_token_account_interface::program::id(); + let system_program_id = solana_system_interface::program::ID; + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + let mint = Keypair::new(); + let (metadata, _b) = Pubkey::find_program_address( + &[ + b"metadata", + TOKEN_METADATA_PROGRAM_ID.as_ref(), + mint.pubkey().as_ref(), + ], + &TOKEN_METADATA_PROGRAM_ID, + ); + let (edition, _b) = Pubkey::find_program_address( + &[ + b"metadata", + TOKEN_METADATA_PROGRAM_ID.as_ref(), + mint.pubkey().as_ref(), + b"edition", + ], + &TOKEN_METADATA_PROGRAM_ID, + ); + + // --- Create NFT mint + metadata (Create = variant 0) --- + let mut create_data = vec![0u8]; + create_data.extend( + borsh::to_vec(&CreateTokenArgs { + nft_title: "Homer NFT".to_string(), + nft_symbol: "HOMR".to_string(), + nft_uri: "https://example.com/nft.json".to_string(), + }) + .unwrap(), + ); + let create_ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), true), + AccountMeta::new(payer.pubkey(), false), + AccountMeta::new(metadata, false), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new_readonly(RENT_SYSVAR_ID, false), + AccountMeta::new_readonly(system_program_id, false), + AccountMeta::new_readonly(token_program_id, false), + AccountMeta::new_readonly(TOKEN_METADATA_PROGRAM_ID, false), + ], + data: create_data, + }; + let tx = Transaction::new_signed_with_payer( + &[create_ix], + Some(&payer.pubkey()), + &[&payer, &mint], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); + + let mint_account = svm.get_account(&mint.pubkey()).unwrap(); + assert_eq!(mint_account.owner, token_program_id); + assert_eq!(Mint::unpack(&mint_account.data).unwrap().decimals, 0); + assert_eq!( + svm.get_account(&metadata).unwrap().owner, + TOKEN_METADATA_PROGRAM_ID + ); + + // --- Mint the NFT + create master edition (Mint = variant 1, unit) --- + let ata = spl_associated_token_account_interface::address::get_associated_token_address( + &payer.pubkey(), + &mint.pubkey(), + ); + let mint_ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), false), + AccountMeta::new(metadata, false), + AccountMeta::new(edition, false), + AccountMeta::new(payer.pubkey(), false), // mint authority + AccountMeta::new(ata, false), + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new_readonly(RENT_SYSVAR_ID, false), + AccountMeta::new_readonly(system_program_id, false), + AccountMeta::new_readonly(token_program_id, false), + AccountMeta::new_readonly(ata_program_id, false), + AccountMeta::new_readonly(TOKEN_METADATA_PROGRAM_ID, false), + ], + data: vec![1u8], + }; + let tx = Transaction::new_signed_with_payer( + &[mint_ix], + Some(&payer.pubkey()), + &[&payer], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); + + // The ATA holds 1 NFT. + let token_state = TokenAccount::unpack(&svm.get_account(&ata).unwrap().data).unwrap(); + assert_eq!(token_state.amount, 1); + assert_eq!(token_state.mint, mint.pubkey()); + + // The master edition account exists and is owned by Token-Metadata. + assert_eq!( + svm.get_account(&edition).unwrap().owner, + TOKEN_METADATA_PROGRAM_ID + ); +} diff --git a/tokens/nft-minter/native/tests/fixtures/mpl_token_metadata.so b/tokens/nft-minter/native/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 { - // const connection = new Connection(`http://localhost:8899`, 'confirmed'); - const connection = new Connection("https://api.devnet.solana.com/", "confirmed"); - const payer = createKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); - const program = createKeypairFromFile("./program/target/deploy/program-keypair.json"); - - const mintKeypair: Keypair = Keypair.generate(); - - it("Create an NFT!", async () => { - const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - - const instructionData = borshSerialize(CreateTokenArgsSchema, { - instruction: NftMinterInstruction.Create, - nft_title: "Homer NFT", - nft_symbol: "HOMR", - nft_uri: - "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json", - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: true, isWritable: true }, // Mint account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { pubkey: metadataAddress, isSigner: false, isWritable: true }, // Metadata account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: TOKEN_METADATA_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Token metadata program - ], - programId: program.publicKey, - data: instructionData, - }); - - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, mintKeypair]); - - console.log("Success!"); - console.log(` Mint Address: ${mintKeypair.publicKey}`); - console.log(` Tx Signature: ${sx}`); - }); - - it("Mint the NFT to your wallet!", async () => { - const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - - const editionAddress = PublicKey.findProgramAddressSync( - [ - Buffer.from("metadata"), - TOKEN_METADATA_PROGRAM_ID.toBuffer(), - mintKeypair.publicKey.toBuffer(), - Buffer.from("edition"), - ], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - - const associatedTokenAccountAddress = await getAssociatedTokenAddress(mintKeypair.publicKey, payer.publicKey); - - const instructionData = borshSerialize(MintToArgsSchema, { - instruction: NftMinterInstruction.Mint, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: false, isWritable: true }, // Mint account - { pubkey: metadataAddress, isSigner: false, isWritable: true }, // Metadata account - { pubkey: editionAddress, isSigner: false, isWritable: true }, // Edition account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { - pubkey: associatedTokenAccountAddress, - isSigner: false, - isWritable: true, - }, // ATA - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Associated token program - { - pubkey: TOKEN_METADATA_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Token metadata program - ], - programId: program.publicKey, - data: instructionData, - }); - - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - - console.log("Success!"); - console.log(` ATA Address: ${associatedTokenAccountAddress}`); - console.log(` Tx Signature: ${sx}`); - }); -}); diff --git a/tokens/nft-minter/native/tsconfig.json b/tokens/nft-minter/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/tokens/nft-minter/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/tokens/pda-mint-authority/native/package.json b/tokens/pda-mint-authority/native/package.json index 1acaada1..afd1365d 100644 --- a/tokens/pda-mint-authority/native/package.json +++ b/tokens/pda-mint-authority/native/package.json @@ -1,26 +1,7 @@ { "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/hello_solana_program.so" - }, - "dependencies": { - "@metaplex-foundation/mpl-token-metadata": "^2.5.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5" + "deploy": "solana program deploy ./program/target/so/pda_mint_authority_native_program.so" } } diff --git a/tokens/pda-mint-authority/native/pnpm-lock.yaml b/tokens/pda-mint-authority/native/pnpm-lock.yaml index 2c9ba7a3..9b60ae17 100644 --- a/tokens/pda-mint-authority/native/pnpm-lock.yaml +++ b/tokens/pda-mint-authority/native/pnpm-lock.yaml @@ -6,1863 +6,4 @@ settings: importers: - .: - dependencies: - '@metaplex-foundation/mpl-token-metadata': - specifier: ^2.5.2 - version: 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/spl-token': - specifier: ^0.3.7 - version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.5 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.16 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.4.1 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@9.2.2) - typescript: - specifier: ^5 - version: 5.9.3 - -packages: - - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - - '@metaplex-foundation/beet-solana@0.4.1': - resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} - - '@metaplex-foundation/beet@0.7.2': - resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} - - '@metaplex-foundation/cusper@0.0.2': - resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} - - '@metaplex-foundation/mpl-token-metadata@2.13.0': - resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout-utils@0.2.0': - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.0.0-preview.2': - resolution: {integrity: sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-data-structures@2.0.0-preview.2': - resolution: {integrity: sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==} - - '@solana/codecs-numbers@2.0.0-preview.2': - resolution: {integrity: sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==} - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-strings@2.0.0-preview.2': - resolution: {integrity: sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - - '@solana/codecs@2.0.0-preview.2': - resolution: {integrity: sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==} - - '@solana/errors@2.0.0-preview.2': - resolution: {integrity: sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==} - hasBin: true - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/options@2.0.0-preview.2': - resolution: {integrity: sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==} - - '@solana/spl-token-metadata@0.1.4': - resolution: {integrity: sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.91.6 - - '@solana/spl-token@0.3.11': - resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.88.0 - - '@solana/spl-type-length-value@0.1.0': - resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} - engines: {node: '>=16'} - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.19': - resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.12.12': - resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} - - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - - base-x@4.0.0: - resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.5: - resolution: {integrity: sha512-4mAmr+AEhPYJ9TmDtxF3r3ZcbWy7W8kvZ4PoZYw/Xgp2J7WixjwTgiQZsoTDvch5nimmg3Ay6/0Kuh9oIvVs9A==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - solana-bankrun-darwin-arm64@0.3.0: - resolution: {integrity: sha512-+NbDncf0U6l3knuacRBiqpjZ2DSp+5lZaAU518gH7/x6qubbui/d000STaIBK+uNTPBS/AL/bCN+7PkXqmA3lA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.0: - resolution: {integrity: sha512-1/F0xdMa4qvc5o6z16FCCbZ5jbdvKvxpx5kyPcMWRiRPwyvi+zltMxciPAYMlg3wslQqGz88uFhrBEzq2eTumQ==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.0: - resolution: {integrity: sha512-U6CANjkmMl+lgNA7UH0GKs5V7LtVIUDzJBZefGGqLfqUNv3EjA/PrrToM0hAOWJgkxSwdz6zW+p5sw5FmnbXtg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.0: - resolution: {integrity: sha512-qJSkCFs0k2n4XtTnyxGMiZsuqO2TiqTYgWjQ+3mZhGNUAMys/Vq8bd7/SyBm6RR7EfVuRXRxZvh+F8oKZ77V4w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.0: - resolution: {integrity: sha512-xsS2CS2xb1Sw4ivNXM0gPz/qpW9BX0neSvt/pnok5L330Nu9xlTnKAY8FhzzqOP9P9sJlGRM787Y6d0yYwt6xQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.0: - resolution: {integrity: sha512-YkH7sa8TB/AoRPzG17CXJtYsRIQHEkEqGLz1Vwc13taXhDBkjO7z6NI5JYw7n0ybRymDHwMYTc7sd+5J40TyVQ==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - utf-8-validate@6.0.6: - resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} - engines: {node: '>=6.14.2'} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.29.2': {} - - '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bs58: 5.0.0 - debug: 4.3.4 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - - '@metaplex-foundation/beet@0.7.2': - dependencies: - ansicolors: 0.3.2 - assert: 2.1.0 - bn.js: 5.2.1 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - '@metaplex-foundation/cusper@0.0.2': {} - - '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@metaplex-foundation/cusper': 0.0.2 - '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bn.js: 5.2.1 - debug: 4.3.4 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - supports-color - - typescript - - utf-8-validate - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bigint-buffer: 1.1.5 - bignumber.js: 9.1.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.0.0-preview.2': - dependencies: - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-data-structures@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-numbers@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-strings@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - fastestsmallesttextencoderdecoder: 1.0.22 - - '@solana/codecs@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-data-structures': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/codecs-strings': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/options': 2.0.0-preview.2 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@2.0.0-preview.2': - dependencies: - chalk: 5.3.0 - commander: 12.1.0 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 5.9.3 - - '@solana/options@2.0.0-preview.2': - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - - '@solana/spl-token-metadata@0.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)': - dependencies: - '@solana/codecs': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/spl-type-length-value': 0.1.0 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana/spl-token-metadata': 0.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - '@solana/spl-type-length-value@0.1.0': - dependencies: - buffer: 6.0.3 - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': - dependencies: - '@babel/runtime': 7.29.2 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.4.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) - agentkeepalive: 4.5.0 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - node-fetch: 2.7.0 - rpc-websockets: 9.3.5 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.19': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 20.12.12 - - '@types/chai@4.3.16': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.12.12 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@20.12.12': - dependencies: - undici-types: 5.26.5 - - '@types/uuid@10.0.0': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 20.12.12 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 20.12.12 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansicolors@0.3.2: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assert@2.1.0: - dependencies: - call-bind: 1.0.7 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.5 - util: 0.12.5 - - assertion-error@1.1.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - balanced-match@1.0.2: {} - - base-x@3.0.9: - dependencies: - safe-buffer: 5.2.1 - - base-x@4.0.0: {} - - base64-js@1.5.1: {} - - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - - bignumber.js@9.1.2: {} - - binary-extensions@2.3.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bn.js@5.2.1: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.9 - - bs58@5.0.0: - dependencies: - base-x: 4.0.0 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - camelcase@6.3.0: {} - - chai@4.4.1: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.3.0: {} - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@12.1.0: {} - - commander@14.0.3: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.3.4: - dependencies: - ms: 2.1.2 - - decamelize@4.0.0: {} - - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.1.2: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.4: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - file-uri-to-path@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-callable@1.2.7: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-nan@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - - jayson@4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.1: - optional: true - - normalize-path@3.0.0: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - possible-typed-array-names@1.0.0: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.3.5: - dependencies: - '@swc/helpers': 0.5.19 - '@types/uuid': 10.0.0 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.4 - uuid: 11.1.0 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - solana-bankrun-darwin-arm64@0.3.0: - optional: true - - solana-bankrun-darwin-universal@0.3.0: - optional: true - - solana-bankrun-darwin-x64@0.3.0: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.0: - optional: true - - solana-bankrun-linux-x64-musl@0.3.0: - optional: true - - solana-bankrun@0.3.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.0 - solana-bankrun-darwin-universal: 0.3.0 - solana-bankrun-darwin-x64: 0.3.0 - solana-bankrun-linux-x64-gnu: 0.3.0 - solana-bankrun-linux-x64-musl: 0.3.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.0.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.0.8: {} - - typescript@5.9.3: {} - - undici-types@5.26.5: {} - - utf-8-validate@6.0.6: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 - - uuid@11.1.0: {} - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + .: {} diff --git a/tokens/pda-mint-authority/native/program/Cargo.toml b/tokens/pda-mint-authority/native/program/Cargo.toml index f0f4aad3..0b672b4a 100644 --- a/tokens/pda-mint-authority/native/program/Cargo.toml +++ b/tokens/pda-mint-authority/native/program/Cargo.toml @@ -4,12 +4,31 @@ version = "0.1.0" edition = "2021" [dependencies] -borsh = "0.9.3" -borsh-derive = "0.9.1" -solana-program = "2.0" -spl-token = { version="4.0.0", features = [ "no-entrypoint" ] } -spl-associated-token-account = { version="2.0.0", features = [ "no-entrypoint" ] } -mpl-token-metadata = { version="1.11", features = [ "no-entrypoint" ] } +borsh.workspace = true +borsh-derive.workspace = true +solana-program.workspace = true +solana-system-interface = { version = "2.0.0", features = ["bincode"] } +spl-token-interface = "2.0.0" +spl-associated-token-account-interface = "2.0.0" +mpl-token-metadata = "5.1.1" +# Alias for the (older) solana-program version mpl-token-metadata's instruction +# builders return, so we can name that Instruction/Pubkey type when bridging. +mpl-solana-program = { package = "solana-program", version = "2.3" } [lib] crate-type = ["cdylib", "lib"] + +[features] +custom-heap = [] +custom-panic = [] + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-native-token = "3.0.0" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.1" diff --git a/tokens/pda-mint-authority/native/program/src/bridge.rs b/tokens/pda-mint-authority/native/program/src/bridge.rs new file mode 100644 index 00000000..334d6840 --- /dev/null +++ b/tokens/pda-mint-authority/native/program/src/bridge.rs @@ -0,0 +1,30 @@ +//! `mpl-token-metadata` 5.x is built against an older `solana-program`, so its +//! instruction builders return that crate's `Instruction`/`Pubkey` types. These +//! helpers bridge them to the `solana-program` version this program is compiled +//! with. (Both `Pubkey`s are 32-byte arrays, so the conversion is a byte copy.) +use solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, +}; + +pub type MplPubkey = mpl_solana_program::pubkey::Pubkey; + +pub fn to_mpl(key: &Pubkey) -> MplPubkey { + MplPubkey::new_from_array(key.to_bytes()) +} + +pub fn bridge_instruction(ix: mpl_solana_program::instruction::Instruction) -> Instruction { + Instruction { + program_id: Pubkey::new_from_array(ix.program_id.to_bytes()), + accounts: ix + .accounts + .into_iter() + .map(|meta| AccountMeta { + pubkey: Pubkey::new_from_array(meta.pubkey.to_bytes()), + is_signer: meta.is_signer, + is_writable: meta.is_writable, + }) + .collect(), + data: ix.data, + } +} diff --git a/tokens/pda-mint-authority/native/program/src/instructions/create.rs b/tokens/pda-mint-authority/native/program/src/instructions/create.rs index 1a2a8e9e..561355b5 100644 --- a/tokens/pda-mint-authority/native/program/src/instructions/create.rs +++ b/tokens/pda-mint-authority/native/program/src/instructions/create.rs @@ -1,6 +1,10 @@ use { + crate::bridge::{bridge_instruction, to_mpl}, borsh::{BorshDeserialize, BorshSerialize}, - mpl_token_metadata::instruction as mpl_instruction, + mpl_token_metadata::{ + instructions::{CreateMetadataAccountV3, CreateMetadataAccountV3InstructionArgs}, + types::DataV2, + }, solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint::ProgramResult, @@ -9,10 +13,10 @@ use { program_pack::Pack, pubkey::Pubkey, rent::Rent, - system_instruction, sysvar::Sysvar, }, - spl_token::{instruction as token_instruction, state::Mint}, + solana_system_interface::instruction as system_instruction, + spl_token_interface::{instruction as token_instruction, state::Mint}, }; use crate::state::MintAuthorityPda; @@ -88,25 +92,30 @@ pub fn create_token( // msg!("Creating metadata account..."); msg!("Metadata account address: {}", metadata_account.key); + let create_metadata_ix = CreateMetadataAccountV3 { + metadata: to_mpl(metadata_account.key), + mint: to_mpl(mint_account.key), + mint_authority: to_mpl(mint_authority.key), + payer: to_mpl(payer.key), + update_authority: (to_mpl(mint_authority.key), true), + system_program: to_mpl(system_program.key), + rent: Some(to_mpl(rent.key)), + } + .instruction(CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name: args.nft_title, + symbol: args.nft_symbol, + uri: args.nft_uri, + seller_fee_basis_points: 0, + creators: None, + collection: None, + uses: None, + }, + is_mutable: true, + collection_details: None, + }); invoke_signed( - &mpl_instruction::create_metadata_accounts_v3( - *token_metadata_program.key, - *metadata_account.key, - *mint_account.key, - *mint_authority.key, - *payer.key, - *mint_authority.key, - args.nft_title, - args.nft_symbol, - args.nft_uri, - None, - 0, - true, - false, - None, - None, - None, - ), + &bridge_instruction(create_metadata_ix), &[ metadata_account.clone(), mint_account.clone(), diff --git a/tokens/pda-mint-authority/native/program/src/instructions/init.rs b/tokens/pda-mint-authority/native/program/src/instructions/init.rs index bc75700d..59fe0f78 100644 --- a/tokens/pda-mint-authority/native/program/src/instructions/init.rs +++ b/tokens/pda-mint-authority/native/program/src/instructions/init.rs @@ -6,9 +6,9 @@ use solana_program::{ program::invoke_signed, pubkey::Pubkey, rent::Rent, - system_instruction, sysvar::Sysvar, }; +use solana_system_interface::instruction as system_instruction; use crate::state::MintAuthorityPda; diff --git a/tokens/pda-mint-authority/native/program/src/instructions/mint.rs b/tokens/pda-mint-authority/native/program/src/instructions/mint.rs index 420b7e1a..fccb48d1 100644 --- a/tokens/pda-mint-authority/native/program/src/instructions/mint.rs +++ b/tokens/pda-mint-authority/native/program/src/instructions/mint.rs @@ -1,5 +1,8 @@ use { - mpl_token_metadata::instruction as mpl_instruction, + crate::bridge::{bridge_instruction, to_mpl}, + mpl_token_metadata::instructions::{ + CreateMasterEditionV3, CreateMasterEditionV3InstructionArgs, + }, solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint::ProgramResult, @@ -7,8 +10,8 @@ use { program::{invoke, invoke_signed}, pubkey::Pubkey, }, - spl_associated_token_account::instruction as associated_token_account_instruction, - spl_token::instruction as token_instruction, + spl_associated_token_account_interface::instruction as associated_token_account_instruction, + spl_token_interface::instruction as token_instruction, }; use crate::state::MintAuthorityPda; @@ -23,7 +26,7 @@ pub fn mint_to(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult { let associated_token_account = next_account_info(accounts_iter)?; let payer = next_account_info(accounts_iter)?; let rent = next_account_info(accounts_iter)?; - let _system_program = next_account_info(accounts_iter)?; + let system_program = next_account_info(accounts_iter)?; let token_program = next_account_info(accounts_iter)?; let associated_token_program = next_account_info(accounts_iter)?; let token_metadata_program = next_account_info(accounts_iter)?; @@ -45,6 +48,7 @@ pub fn mint_to(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult { mint_account.clone(), associated_token_account.clone(), payer.clone(), + system_program.clone(), token_program.clone(), associated_token_program.clone(), ], @@ -81,17 +85,22 @@ pub fn mint_to(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult { // msg!("Creating edition account..."); msg!("Edition account address: {}", edition_account.key); + let create_edition_ix = CreateMasterEditionV3 { + edition: to_mpl(edition_account.key), + mint: to_mpl(mint_account.key), + update_authority: to_mpl(mint_authority.key), + mint_authority: to_mpl(mint_authority.key), + payer: to_mpl(payer.key), + metadata: to_mpl(metadata_account.key), + token_program: to_mpl(token_program.key), + system_program: to_mpl(system_program.key), + rent: Some(to_mpl(rent.key)), + } + .instruction(CreateMasterEditionV3InstructionArgs { + max_supply: Some(1), + }); invoke_signed( - &mpl_instruction::create_master_edition_v3( - *token_metadata_program.key, // Program ID - *edition_account.key, // Edition - *mint_account.key, // Mint - *mint_authority.key, // Update Authority - *mint_authority.key, // Mint Authority - *metadata_account.key, // Metadata - *payer.key, // Payer - Some(1), // Max Supply - ), + &bridge_instruction(create_edition_ix), &[ edition_account.clone(), metadata_account.clone(), @@ -99,47 +108,13 @@ pub fn mint_to(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult { mint_authority.clone(), payer.clone(), token_metadata_program.clone(), + token_program.clone(), + system_program.clone(), rent.clone(), ], &[&[MintAuthorityPda::SEED_PREFIX.as_bytes(), &[bump]]], )?; - // If we don't use Metaplex Editions, we must disable minting manually - // - // ------------------------------------------------------------------- - // msg!("Disabling future minting of this NFT..."); - // invoke_signed( - // &token_instruction::set_authority( - // &token_program.key, - // &mint_account.key, - // None, - // token_instruction::AuthorityType::MintTokens, - // &mint_authority.key, - // &[&mint_authority.key], - // )?, - // &[ - // mint_account.clone(), - // mint_authority.clone(), - // token_program.clone(), - // ], - // )?; - // invoke_signed( - // &token_instruction::set_authority( - // &token_program.key, - // &mint_account.key, - // None, - // token_instruction::AuthorityType::FreezeAccount, - // &mint_authority.key, - // &[&mint_authority.key], - // )?, - // &[ - // mint_account.clone(), - // mint_authority.clone(), - // token_program.clone(), - // ], - // &[&[MintAuthorityPda::SEED_PREFIX.as_bytes(), &[bump]]], - // )?; - msg!("NFT minted successfully."); Ok(()) diff --git a/tokens/pda-mint-authority/native/program/src/lib.rs b/tokens/pda-mint-authority/native/program/src/lib.rs index a2c361f3..3bf0740b 100644 --- a/tokens/pda-mint-authority/native/program/src/lib.rs +++ b/tokens/pda-mint-authority/native/program/src/lib.rs @@ -2,6 +2,7 @@ use solana_program::{ account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, pubkey::Pubkey, }; +pub mod bridge; pub mod instructions; pub mod processor; pub mod state; diff --git a/tokens/pda-mint-authority/native/program/tests/test.rs b/tokens/pda-mint-authority/native/program/tests/test.rs new file mode 100644 index 00000000..ea245cac --- /dev/null +++ b/tokens/pda-mint-authority/native/program/tests/test.rs @@ -0,0 +1,164 @@ +use { + litesvm::LiteSVM, + pda_mint_authority_native_program::instructions::create::CreateTokenArgs, + solana_instruction::{AccountMeta, Instruction}, + solana_keypair::{Keypair, Signer}, + solana_native_token::LAMPORTS_PER_SOL, + solana_program::program_pack::Pack, + solana_pubkey::{pubkey, Pubkey}, + solana_transaction::Transaction, + spl_token_interface::state::{Account as TokenAccount, Mint}, +}; + +const TOKEN_METADATA_PROGRAM_ID: Pubkey = pubkey!("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); +const RENT_SYSVAR_ID: Pubkey = pubkey!("SysvarRent111111111111111111111111111111111"); + +#[test] +fn test_init_create_and_mint_with_pda_authority() { + let mut svm = LiteSVM::new(); + + let program_id = Pubkey::new_unique(); + svm.add_program( + program_id, + include_bytes!("../../tests/fixtures/pda_mint_authority_native_program.so"), + ) + .unwrap(); + svm.add_program( + TOKEN_METADATA_PROGRAM_ID, + include_bytes!("../../tests/fixtures/mpl_token_metadata.so"), + ) + .unwrap(); + + let token_program_id = spl_token_interface::id(); + let ata_program_id = spl_associated_token_account_interface::program::id(); + let system_program_id = solana_system_interface::program::ID; + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + let (mint_authority, _b) = Pubkey::find_program_address(&[b"mint_authority"], &program_id); + + // --- Init the mint authority PDA (Init = variant 0, unit) --- + let init_ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint_authority, false), + AccountMeta::new(payer.pubkey(), false), + AccountMeta::new_readonly(system_program_id, false), + ], + data: vec![0u8], + }; + let tx = Transaction::new_signed_with_payer( + &[init_ix], + Some(&payer.pubkey()), + &[&payer], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); + + // The PDA exists and is owned by the program. + assert_eq!(svm.get_account(&mint_authority).unwrap().owner, program_id); + + let mint = Keypair::new(); + let (metadata, _b) = Pubkey::find_program_address( + &[ + b"metadata", + TOKEN_METADATA_PROGRAM_ID.as_ref(), + mint.pubkey().as_ref(), + ], + &TOKEN_METADATA_PROGRAM_ID, + ); + let (edition, _b) = Pubkey::find_program_address( + &[ + b"metadata", + TOKEN_METADATA_PROGRAM_ID.as_ref(), + mint.pubkey().as_ref(), + b"edition", + ], + &TOKEN_METADATA_PROGRAM_ID, + ); + + // --- Create NFT mint + metadata, signed by the PDA (Create = variant 1) --- + let mut create_data = vec![1u8]; + create_data.extend( + borsh::to_vec(&CreateTokenArgs { + nft_title: "Homer NFT".to_string(), + nft_symbol: "HOMR".to_string(), + nft_uri: "https://example.com/nft.json".to_string(), + }) + .unwrap(), + ); + let create_ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), true), + AccountMeta::new(mint_authority, false), + AccountMeta::new(metadata, false), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new_readonly(RENT_SYSVAR_ID, false), + AccountMeta::new_readonly(system_program_id, false), + AccountMeta::new_readonly(token_program_id, false), + AccountMeta::new_readonly(TOKEN_METADATA_PROGRAM_ID, false), + ], + data: create_data, + }; + let tx = Transaction::new_signed_with_payer( + &[create_ix], + Some(&payer.pubkey()), + &[&payer, &mint], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); + + let mint_account = svm.get_account(&mint.pubkey()).unwrap(); + assert_eq!(mint_account.owner, token_program_id); + let mint_state = Mint::unpack(&mint_account.data).unwrap(); + assert_eq!(mint_state.decimals, 0); + assert_eq!(mint_state.mint_authority.unwrap(), mint_authority); + assert_eq!( + svm.get_account(&metadata).unwrap().owner, + TOKEN_METADATA_PROGRAM_ID + ); + + // --- Mint the NFT + master edition, signed by the PDA (Mint = variant 2) --- + let ata = spl_associated_token_account_interface::address::get_associated_token_address( + &payer.pubkey(), + &mint.pubkey(), + ); + let mint_ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), false), + AccountMeta::new(metadata, false), + AccountMeta::new(edition, false), + AccountMeta::new(mint_authority, false), + AccountMeta::new(ata, false), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new_readonly(RENT_SYSVAR_ID, false), + AccountMeta::new_readonly(system_program_id, false), + AccountMeta::new_readonly(token_program_id, false), + AccountMeta::new_readonly(ata_program_id, false), + AccountMeta::new_readonly(TOKEN_METADATA_PROGRAM_ID, false), + ], + data: vec![2u8], + }; + let tx = Transaction::new_signed_with_payer( + &[mint_ix], + Some(&payer.pubkey()), + &[&payer], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); + + // The ATA holds 1 NFT, master edition exists and owned by Token-Metadata. + assert_eq!( + TokenAccount::unpack(&svm.get_account(&ata).unwrap().data) + .unwrap() + .amount, + 1 + ); + assert_eq!( + svm.get_account(&edition).unwrap().owner, + TOKEN_METADATA_PROGRAM_ID + ); +} diff --git a/tokens/pda-mint-authority/native/tests/fixtures/mpl_token_metadata.so b/tokens/pda-mint-authority/native/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 { - // const connection = new Connection(`http://localhost:8899`, 'confirmed'); - const connection = new Connection("https://api.devnet.solana.com/", "confirmed"); - const payer = createKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); - const program = createKeypairFromFile("./program/target/deploy/program-keypair.json"); - - const mintAuthorityPublicKey = PublicKey.findProgramAddressSync( - [Buffer.from("mint_authority")], - program.publicKey, - )[0]; - - const mintKeypair: Keypair = Keypair.generate(); - - it("Init Mint Authority PDA", async () => { - const instructionData = borshSerialize(InitArgsSchema, { - instruction: NftMinterInstruction.Init, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintAuthorityPublicKey, isSigner: false, isWritable: true }, - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: program.publicKey, - data: instructionData, - }); - - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer], { skipPreflight: true }); - - console.log("Success!"); - console.log(` Mint Address: ${mintKeypair.publicKey}`); - console.log(` Tx Signature: ${sx}`); - }); - - it("Create an NFT!", async () => { - const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - - const instructionData = borshSerialize(CreateTokenArgsSchema, { - instruction: NftMinterInstruction.Create, - nft_title: "Homer NFT", - nft_symbol: "HOMR", - nft_uri: - "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json", - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: true, isWritable: true }, // Mint account - { pubkey: mintAuthorityPublicKey, isSigner: false, isWritable: true }, // Mint authority account - { pubkey: metadataAddress, isSigner: false, isWritable: true }, // Metadata account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: TOKEN_METADATA_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Token metadata program - ], - programId: program.publicKey, - data: instructionData, - }); - - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, mintKeypair], { - skipPreflight: true, - }); - - console.log("Success!"); - console.log(` Mint Address: ${mintKeypair.publicKey}`); - console.log(` Tx Signature: ${sx}`); - }); - - it("Mint the NFT to your wallet!", async () => { - const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - - const editionAddress = PublicKey.findProgramAddressSync( - [ - Buffer.from("metadata"), - TOKEN_METADATA_PROGRAM_ID.toBuffer(), - mintKeypair.publicKey.toBuffer(), - Buffer.from("edition"), - ], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - - const associatedTokenAccountAddress = await getAssociatedTokenAddress(mintKeypair.publicKey, payer.publicKey); - - const instructionData = borshSerialize(MintToArgsSchema, { - instruction: NftMinterInstruction.Mint, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: false, isWritable: true }, // Mint account - { pubkey: metadataAddress, isSigner: false, isWritable: true }, // Metadata account - { pubkey: editionAddress, isSigner: false, isWritable: true }, // Edition account - { pubkey: mintAuthorityPublicKey, isSigner: false, isWritable: true }, // Mint authority account - { - pubkey: associatedTokenAccountAddress, - isSigner: false, - isWritable: true, - }, // ATA - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Associated token program - { - pubkey: TOKEN_METADATA_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Token metadata program - ], - programId: program.publicKey, - data: instructionData, - }); - - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - - console.log("Success!"); - console.log(` ATA Address: ${associatedTokenAccountAddress}`); - console.log(` Tx Signature: ${sx}`); - }); -}); diff --git a/tokens/pda-mint-authority/native/tsconfig.json b/tokens/pda-mint-authority/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/tokens/pda-mint-authority/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/tokens/token-minter/native/package.json b/tokens/token-minter/native/package.json index fc0ff32f..d9bf5e55 100644 --- a/tokens/token-minter/native/package.json +++ b/tokens/token-minter/native/package.json @@ -1,22 +1,7 @@ { "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts" - }, - "dependencies": { - "@metaplex-foundation/mpl-token-metadata": "^2.5.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5" + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", + "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", + "deploy": "solana program deploy ./program/target/so/token_minter_native_program.so" } } diff --git a/tokens/token-minter/native/pnpm-lock.yaml b/tokens/token-minter/native/pnpm-lock.yaml index d320451d..9b60ae17 100644 --- a/tokens/token-minter/native/pnpm-lock.yaml +++ b/tokens/token-minter/native/pnpm-lock.yaml @@ -6,1876 +6,4 @@ settings: importers: - .: - dependencies: - '@metaplex-foundation/mpl-token-metadata': - specifier: ^2.5.2 - version: 2.13.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/spl-token': - specifier: ^0.3.7 - version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.2.0 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^5 - version: 5.9.3 - -packages: - - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} - engines: {node: '>=6.9.0'} - - '@metaplex-foundation/beet-solana@0.4.1': - resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} - - '@metaplex-foundation/beet@0.7.2': - resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} - - '@metaplex-foundation/cusper@0.0.2': - resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} - - '@metaplex-foundation/mpl-token-metadata@2.13.0': - resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout-utils@0.2.0': - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.0.0-rc.1': - resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-data-structures@2.0.0-rc.1': - resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.0.0-rc.1': - resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-strings@2.0.0-rc.1': - resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - typescript: '>=5' - - '@solana/codecs@2.0.0-rc.1': - resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.0.0-rc.1': - resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} - hasBin: true - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/options@2.0.0-rc.1': - resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} - peerDependencies: - typescript: '>=5' - - '@solana/spl-token-metadata@0.1.6': - resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.95.3 - - '@solana/spl-token@0.3.11': - resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.88.0 - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.18': - resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} - - '@types/bn.js@5.2.0': - resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@25.2.3': - resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base-x@4.0.1: - resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.1.0: - resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} - engines: {node: '>=6.14.2'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.1: - resolution: {integrity: sha512-Z3u54A8qGyqFOSr2pk0ijYs8mOE9Qz8kTvtKeBI+upoG9j04Sq+oI7W8zAJiQybDcESET8/uIdHzs0p3k4fZlw==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.3: - resolution: {integrity: sha512-OkCsBBzrwxX4DoSv4Zlf9DgXKRB0MzVfCFg5MC+fNnf9ktr4SMWjsri0VNZQlDbCnGcImT6KNEv4ZoxktQhdpA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.28.6': {} - - '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - bs58: 5.0.0 - debug: 4.4.3 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - - '@metaplex-foundation/beet@0.7.2': - dependencies: - ansicolors: 0.3.2 - assert: 2.1.0 - bn.js: 5.2.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@metaplex-foundation/cusper@0.0.2': {} - - '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@metaplex-foundation/cusper': 0.0.2 - '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - debug: 4.4.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - supports-color - - typescript - - utf-8-validate - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - bigint-buffer: 1.1.5 - bignumber.js: 9.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - fastestsmallesttextencoderdecoder: 1.0.22 - typescript: 5.9.3 - - '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 12.1.0 - typescript: 5.9.3 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 5.9.3 - - '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.28.6 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.3.3 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.18': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.2.0': - dependencies: - '@types/node': 25.2.3 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 25.2.3 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@25.2.3': - dependencies: - undici-types: 7.16.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 25.2.3 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 25.2.3 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansicolors@0.3.2: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assert@2.1.0: - dependencies: - call-bind: 1.0.8 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.7 - util: 0.12.5 - - assertion-error@1.1.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base-x@4.0.1: {} - - base64-js@1.5.1: {} - - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - - bignumber.js@9.3.1: {} - - binary-extensions@2.3.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.12: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - bs58@5.0.0: - dependencies: - base-x: 4.0.1 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.1.0: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@12.1.0: {} - - commander@14.0.3: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delay@5.0.0: {} - - diff@3.5.1: {} - - diff@5.0.0: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - emoji-regex@8.0.0: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.4: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - file-uri-to-path@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - generator-function@2.0.1: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - gopd@1.2.0: {} - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-callable@1.2.7: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.1.2: - dependencies: - call-bound: 1.0.4 - generator-function: 2.0.1 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-nan@1.3.2: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.20 - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) - - jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - math-intrinsics@1.1.0: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.12 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.12 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - possible-typed-array-names@1.1.0: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.3.3: - dependencies: - '@swc/helpers': 0.5.18 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.4 - uuid: 8.3.2 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.1 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@5.9.3: {} - - undici-types@7.16.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.2 - is-typed-array: 1.1.15 - which-typed-array: 1.1.20 - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which-typed-array@1.1.20: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 - - ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + .: {} diff --git a/tokens/token-minter/native/program/Cargo.toml b/tokens/token-minter/native/program/Cargo.toml index 9f655a65..0f1eb93b 100644 --- a/tokens/token-minter/native/program/Cargo.toml +++ b/tokens/token-minter/native/program/Cargo.toml @@ -4,12 +4,31 @@ version = "0.1.0" edition = "2021" [dependencies] -borsh = "0.9.3" -borsh-derive = "0.9.1" -solana-program = "2.0" -spl-token = { version="4.0.0", features = [ "no-entrypoint" ] } -spl-associated-token-account = { version="2.0.0", features = [ "no-entrypoint" ] } -mpl-token-metadata = { version="1.11", features = [ "no-entrypoint" ] } +borsh.workspace = true +borsh-derive.workspace = true +solana-program.workspace = true +solana-system-interface = { version = "2.0.0", features = ["bincode"] } +spl-token-interface = "2.0.0" +spl-associated-token-account-interface = "2.0.0" +mpl-token-metadata = "5.1.1" +# Alias for the (older) solana-program version mpl-token-metadata's instruction +# builders return, so we can name that Instruction/Pubkey type when bridging. +mpl-solana-program = { package = "solana-program", version = "2.3" } [lib] crate-type = ["cdylib", "lib"] + +[features] +custom-heap = [] +custom-panic = [] + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-native-token = "3.0.0" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.1" diff --git a/tokens/token-minter/native/program/src/bridge.rs b/tokens/token-minter/native/program/src/bridge.rs new file mode 100644 index 00000000..334d6840 --- /dev/null +++ b/tokens/token-minter/native/program/src/bridge.rs @@ -0,0 +1,30 @@ +//! `mpl-token-metadata` 5.x is built against an older `solana-program`, so its +//! instruction builders return that crate's `Instruction`/`Pubkey` types. These +//! helpers bridge them to the `solana-program` version this program is compiled +//! with. (Both `Pubkey`s are 32-byte arrays, so the conversion is a byte copy.) +use solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, +}; + +pub type MplPubkey = mpl_solana_program::pubkey::Pubkey; + +pub fn to_mpl(key: &Pubkey) -> MplPubkey { + MplPubkey::new_from_array(key.to_bytes()) +} + +pub fn bridge_instruction(ix: mpl_solana_program::instruction::Instruction) -> Instruction { + Instruction { + program_id: Pubkey::new_from_array(ix.program_id.to_bytes()), + accounts: ix + .accounts + .into_iter() + .map(|meta| AccountMeta { + pubkey: Pubkey::new_from_array(meta.pubkey.to_bytes()), + is_signer: meta.is_signer, + is_writable: meta.is_writable, + }) + .collect(), + data: ix.data, + } +} diff --git a/tokens/token-minter/native/program/src/instructions/create.rs b/tokens/token-minter/native/program/src/instructions/create.rs index b0cc3708..593af9e6 100644 --- a/tokens/token-minter/native/program/src/instructions/create.rs +++ b/tokens/token-minter/native/program/src/instructions/create.rs @@ -1,6 +1,10 @@ use { + crate::bridge::{bridge_instruction, to_mpl}, borsh::{BorshDeserialize, BorshSerialize}, - mpl_token_metadata::instruction as mpl_instruction, + mpl_token_metadata::{ + instructions::{CreateMetadataAccountV3, CreateMetadataAccountV3InstructionArgs}, + types::DataV2, + }, solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint::ProgramResult, @@ -8,10 +12,10 @@ use { program::invoke, program_pack::Pack, rent::Rent, - system_instruction, sysvar::Sysvar, }, - spl_token::{instruction as token_instruction, state::Mint}, + solana_system_interface::instruction as system_instruction, + spl_token_interface::{instruction as token_instruction, state::Mint}, }; #[derive(BorshSerialize, BorshDeserialize, Debug)] @@ -77,25 +81,30 @@ pub fn create_token(accounts: &[AccountInfo], args: CreateTokenArgs) -> ProgramR // msg!("Creating metadata account..."); msg!("Metadata account address: {}", metadata_account.key); + let create_metadata_ix = CreateMetadataAccountV3 { + metadata: to_mpl(metadata_account.key), + mint: to_mpl(mint_account.key), + mint_authority: to_mpl(mint_authority.key), + payer: to_mpl(payer.key), + update_authority: (to_mpl(mint_authority.key), true), + system_program: to_mpl(system_program.key), + rent: Some(to_mpl(rent.key)), + } + .instruction(CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name: args.token_title, + symbol: args.token_symbol, + uri: args.token_uri, + seller_fee_basis_points: 0, + creators: None, + collection: None, + uses: None, + }, + is_mutable: true, + collection_details: None, + }); invoke( - &mpl_instruction::create_metadata_accounts_v3( - *token_metadata_program.key, - *metadata_account.key, - *mint_account.key, - *mint_authority.key, - *payer.key, - *mint_authority.key, - args.token_title, - args.token_symbol, - args.token_uri, - None, - 0, - true, - false, - None, - None, - None, - ), + &bridge_instruction(create_metadata_ix), &[ metadata_account.clone(), mint_account.clone(), diff --git a/tokens/token-minter/native/program/src/instructions/mint.rs b/tokens/token-minter/native/program/src/instructions/mint.rs index 78865299..8b6c0a2a 100644 --- a/tokens/token-minter/native/program/src/instructions/mint.rs +++ b/tokens/token-minter/native/program/src/instructions/mint.rs @@ -6,8 +6,8 @@ use { msg, program::invoke, }, - spl_associated_token_account::instruction as associated_token_account_instruction, - spl_token::instruction as token_instruction, + spl_associated_token_account_interface::instruction as associated_token_account_instruction, + spl_token_interface::instruction as token_instruction, }; #[derive(BorshSerialize, BorshDeserialize, Debug)] diff --git a/tokens/token-minter/native/program/src/lib.rs b/tokens/token-minter/native/program/src/lib.rs index ffe183c3..ea8dbc74 100644 --- a/tokens/token-minter/native/program/src/lib.rs +++ b/tokens/token-minter/native/program/src/lib.rs @@ -2,6 +2,7 @@ use solana_program::{ account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, pubkey::Pubkey, }; +pub mod bridge; pub mod instructions; pub mod processor; diff --git a/tokens/token-minter/native/program/tests/test.rs b/tokens/token-minter/native/program/tests/test.rs new file mode 100644 index 00000000..553c06ea --- /dev/null +++ b/tokens/token-minter/native/program/tests/test.rs @@ -0,0 +1,134 @@ +use { + litesvm::LiteSVM, + solana_instruction::{AccountMeta, Instruction}, + solana_keypair::{Keypair, Signer}, + solana_native_token::LAMPORTS_PER_SOL, + solana_program::program_pack::Pack, + solana_pubkey::{pubkey, Pubkey}, + solana_transaction::Transaction, + spl_token_interface::state::{Account as TokenAccount, Mint}, + token_minter_native_program::instructions::{create::CreateTokenArgs, mint::MintToArgs}, +}; + +// SPL Token-Metadata program id (the program loaded from the fixture .so). +const TOKEN_METADATA_PROGRAM_ID: Pubkey = pubkey!("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); +const RENT_SYSVAR_ID: Pubkey = pubkey!("SysvarRent111111111111111111111111111111111"); + +// Borsh serializes the program's instruction enum as a single u8 discriminant +// followed by the variant payload. `Create` is variant 0, `Mint` is variant 1. +fn create_ix_data(args: &CreateTokenArgs) -> Vec { + let mut data = vec![0u8]; + data.extend(borsh::to_vec(args).unwrap()); + data +} + +fn mint_ix_data(args: &MintToArgs) -> Vec { + let mut data = vec![1u8]; + data.extend(borsh::to_vec(args).unwrap()); + data +} + +#[test] +fn test_create_and_mint() { + let mut svm = LiteSVM::new(); + + let program_id = Pubkey::new_unique(); + svm.add_program( + program_id, + include_bytes!("../../tests/fixtures/token_minter_native_program.so"), + ) + .unwrap(); + svm.add_program( + TOKEN_METADATA_PROGRAM_ID, + include_bytes!("../../tests/fixtures/mpl_token_metadata.so"), + ) + .unwrap(); + + let token_program_id = spl_token_interface::id(); + let ata_program_id = spl_associated_token_account_interface::program::id(); + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + let mint = Keypair::new(); + let (metadata, _bump) = Pubkey::find_program_address( + &[ + b"metadata", + TOKEN_METADATA_PROGRAM_ID.as_ref(), + mint.pubkey().as_ref(), + ], + &TOKEN_METADATA_PROGRAM_ID, + ); + + // --- Create the token --- + let create_ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), true), // mint account + AccountMeta::new(payer.pubkey(), false), // mint authority + AccountMeta::new(metadata, false), // metadata account + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new_readonly(RENT_SYSVAR_ID, false), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), + AccountMeta::new_readonly(token_program_id, false), + AccountMeta::new_readonly(TOKEN_METADATA_PROGRAM_ID, false), + ], + data: create_ix_data(&CreateTokenArgs { + token_title: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/spl-token.json".to_string(), + }), + }; + let tx = Transaction::new_signed_with_payer( + &[create_ix], + Some(&payer.pubkey()), + &[&payer, &mint], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); + + // The mint exists, is owned by the token program, has 9 decimals. + let mint_account = svm.get_account(&mint.pubkey()).unwrap(); + assert_eq!(mint_account.owner, token_program_id); + let mint_state = Mint::unpack(&mint_account.data).unwrap(); + assert_eq!(mint_state.decimals, 9); + + // Metadata account exists and is owned by Token-Metadata. + let metadata_account = svm.get_account(&metadata).unwrap(); + assert_eq!(metadata_account.owner, TOKEN_METADATA_PROGRAM_ID); + + // --- Mint tokens to payer's ATA --- + let ata = spl_associated_token_account_interface::address::get_associated_token_address( + &payer.pubkey(), + &mint.pubkey(), + ); + + let mint_ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), false), // mint account + AccountMeta::new(payer.pubkey(), false), // mint authority + AccountMeta::new(ata, false), // ATA + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new_readonly(solana_system_interface::program::ID, false), + AccountMeta::new_readonly(token_program_id, false), + AccountMeta::new_readonly(ata_program_id, false), + ], + data: mint_ix_data(&MintToArgs { quantity: 150 }), + }; + let tx = Transaction::new_signed_with_payer( + &[mint_ix], + Some(&payer.pubkey()), + &[&payer], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); + + // The ATA exists, holds 150 tokens of the mint, owned by the token program. + let ata_account = svm.get_account(&ata).unwrap(); + assert_eq!(ata_account.owner, token_program_id); + let token_state = TokenAccount::unpack(&ata_account.data).unwrap(); + assert_eq!(token_state.mint, mint.pubkey()); + assert_eq!(token_state.owner, payer.pubkey()); + assert_eq!(token_state.amount, 150); +} diff --git a/tokens/token-minter/native/tests/fixtures/mpl_token_metadata.so b/tokens/token-minter/native/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 { - // const connection = new Connection(`http://localhost:8899`, 'confirmed'); - const connection = new Connection("https://api.devnet.solana.com/", "confirmed"); - const payer = createKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); - const program = createKeypairFromFile("./program/target/deploy/program-keypair.json"); - - const mintKeypair: Keypair = Keypair.generate(); - - it("Create a token", async () => { - const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - - const instructionData = borshSerialize(CreateTokenArgsSchema, { - instruction: MinterInstruction.Create, - token_title: "Solana Gold", - token_symbol: "GOLDSOL", - token_uri: - "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: true, isWritable: true }, // Mint account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { pubkey: metadataAddress, isSigner: false, isWritable: true }, // Metadata account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: TOKEN_METADATA_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Token metadata program - ], - programId: program.publicKey, - data: instructionData, - }); - - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, mintKeypair]); - - console.log("Success!"); - console.log(` Mint Address: ${mintKeypair.publicKey}`); - console.log(` Tx Signature: ${sx}`); - }); - - it("Mint some tokens to your wallet!", async () => { - const associatedTokenAccountAddress = await getAssociatedTokenAddress(mintKeypair.publicKey, payer.publicKey); - - const instructionData = borshSerialize(MintToArgsSchema, { - instruction: MinterInstruction.Mint, - quantity: new BN(150), - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: false, isWritable: true }, // Mint account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { - pubkey: associatedTokenAccountAddress, - isSigner: false, - isWritable: true, - }, // ATA - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SystemProgram.programId, isSigner: false, isWritable: true }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Token metadata program - ], - programId: program.publicKey, - data: instructionData, - }); - - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - - console.log("Success!"); - console.log(` ATA Address: ${associatedTokenAccountAddress}`); - console.log(` Tx Signature: ${sx}`); - }); -}); diff --git a/tokens/token-minter/native/tsconfig.json b/tokens/token-minter/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/tokens/token-minter/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/tokens/transfer-tokens/native/package.json b/tokens/transfer-tokens/native/package.json index fc0ff32f..935732df 100644 --- a/tokens/transfer-tokens/native/package.json +++ b/tokens/transfer-tokens/native/package.json @@ -1,22 +1,7 @@ { "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts" - }, - "dependencies": { - "@metaplex-foundation/mpl-token-metadata": "^2.5.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5" + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", + "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", + "deploy": "solana program deploy ./program/target/so/transfer_tokens_program.so" } } diff --git a/tokens/transfer-tokens/native/pnpm-lock.yaml b/tokens/transfer-tokens/native/pnpm-lock.yaml index d320451d..9b60ae17 100644 --- a/tokens/transfer-tokens/native/pnpm-lock.yaml +++ b/tokens/transfer-tokens/native/pnpm-lock.yaml @@ -6,1876 +6,4 @@ settings: importers: - .: - dependencies: - '@metaplex-foundation/mpl-token-metadata': - specifier: ^2.5.2 - version: 2.13.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/spl-token': - specifier: ^0.3.7 - version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.2.0 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^5 - version: 5.9.3 - -packages: - - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} - engines: {node: '>=6.9.0'} - - '@metaplex-foundation/beet-solana@0.4.1': - resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} - - '@metaplex-foundation/beet@0.7.2': - resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} - - '@metaplex-foundation/cusper@0.0.2': - resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} - - '@metaplex-foundation/mpl-token-metadata@2.13.0': - resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout-utils@0.2.0': - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.0.0-rc.1': - resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-data-structures@2.0.0-rc.1': - resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.0.0-rc.1': - resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-strings@2.0.0-rc.1': - resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - typescript: '>=5' - - '@solana/codecs@2.0.0-rc.1': - resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.0.0-rc.1': - resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} - hasBin: true - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/options@2.0.0-rc.1': - resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} - peerDependencies: - typescript: '>=5' - - '@solana/spl-token-metadata@0.1.6': - resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.95.3 - - '@solana/spl-token@0.3.11': - resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.88.0 - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.18': - resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} - - '@types/bn.js@5.2.0': - resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@25.2.3': - resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansicolors@0.3.2: - resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base-x@4.0.1: - resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.1.0: - resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} - engines: {node: '>=6.14.2'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.1: - resolution: {integrity: sha512-Z3u54A8qGyqFOSr2pk0ijYs8mOE9Qz8kTvtKeBI+upoG9j04Sq+oI7W8zAJiQybDcESET8/uIdHzs0p3k4fZlw==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.3: - resolution: {integrity: sha512-OkCsBBzrwxX4DoSv4Zlf9DgXKRB0MzVfCFg5MC+fNnf9ktr4SMWjsri0VNZQlDbCnGcImT6KNEv4ZoxktQhdpA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.28.6': {} - - '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - bs58: 5.0.0 - debug: 4.4.3 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - - '@metaplex-foundation/beet@0.7.2': - dependencies: - ansicolors: 0.3.2 - assert: 2.1.0 - bn.js: 5.2.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@metaplex-foundation/cusper@0.0.2': {} - - '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@metaplex-foundation/beet': 0.7.2 - '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@metaplex-foundation/cusper': 0.0.2 - '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - debug: 4.4.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - supports-color - - typescript - - utf-8-validate - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - bigint-buffer: 1.1.5 - bignumber.js: 9.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - fastestsmallesttextencoderdecoder: 1.0.22 - typescript: 5.9.3 - - '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@2.0.0-rc.1(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 12.1.0 - typescript: 5.9.3 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 5.9.3 - - '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.28.6 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.3.3 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.18': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.2.0': - dependencies: - '@types/node': 25.2.3 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 25.2.3 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@25.2.3': - dependencies: - undici-types: 7.16.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 25.2.3 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 25.2.3 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansicolors@0.3.2: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assert@2.1.0: - dependencies: - call-bind: 1.0.8 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.7 - util: 0.12.5 - - assertion-error@1.1.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base-x@4.0.1: {} - - base64-js@1.5.1: {} - - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - - bignumber.js@9.3.1: {} - - binary-extensions@2.3.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.12: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - bs58@5.0.0: - dependencies: - base-x: 4.0.1 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.1.0: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@12.1.0: {} - - commander@14.0.3: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delay@5.0.0: {} - - diff@3.5.1: {} - - diff@5.0.0: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - emoji-regex@8.0.0: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.4: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - file-uri-to-path@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - generator-function@2.0.1: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - gopd@1.2.0: {} - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-callable@1.2.7: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.1.2: - dependencies: - call-bound: 1.0.4 - generator-function: 2.0.1 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-nan@1.3.2: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.20 - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) - - jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - math-intrinsics@1.1.0: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.12 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.12 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - possible-typed-array-names@1.1.0: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.3.3: - dependencies: - '@swc/helpers': 0.5.18 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.4 - uuid: 8.3.2 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.1 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@5.9.3: {} - - undici-types@7.16.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.2 - is-typed-array: 1.1.15 - which-typed-array: 1.1.20 - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which-typed-array@1.1.20: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 - - ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + .: {} diff --git a/tokens/transfer-tokens/native/program/Cargo.toml b/tokens/transfer-tokens/native/program/Cargo.toml index f28db2db..d8a30a43 100644 --- a/tokens/transfer-tokens/native/program/Cargo.toml +++ b/tokens/transfer-tokens/native/program/Cargo.toml @@ -4,12 +4,31 @@ version = "0.1.0" edition = "2021" [dependencies] -borsh = "0.9.3" -borsh-derive = "0.9.1" -solana-program = "2.0" -spl-token = { version="4.0.0", features = [ "no-entrypoint" ] } -spl-associated-token-account = { version = "2.0.0", features = [ "no-entrypoint" ] } -mpl-token-metadata = { version="1.11", features = ["no-entrypoint"] } +borsh.workspace = true +borsh-derive.workspace = true +solana-program.workspace = true +solana-system-interface = { version = "2.0.0", features = ["bincode"] } +spl-token-interface = "2.0.0" +spl-associated-token-account-interface = "2.0.0" +mpl-token-metadata = "5.1.1" +# Alias for the (older) solana-program version mpl-token-metadata's instruction +# builders return, so we can name that Instruction/Pubkey type when bridging. +mpl-solana-program = { package = "solana-program", version = "2.3" } [lib] crate-type = ["cdylib", "lib"] + +[features] +custom-heap = [] +custom-panic = [] + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-native-token = "3.0.0" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.1" diff --git a/tokens/transfer-tokens/native/program/src/bridge.rs b/tokens/transfer-tokens/native/program/src/bridge.rs new file mode 100644 index 00000000..334d6840 --- /dev/null +++ b/tokens/transfer-tokens/native/program/src/bridge.rs @@ -0,0 +1,30 @@ +//! `mpl-token-metadata` 5.x is built against an older `solana-program`, so its +//! instruction builders return that crate's `Instruction`/`Pubkey` types. These +//! helpers bridge them to the `solana-program` version this program is compiled +//! with. (Both `Pubkey`s are 32-byte arrays, so the conversion is a byte copy.) +use solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, +}; + +pub type MplPubkey = mpl_solana_program::pubkey::Pubkey; + +pub fn to_mpl(key: &Pubkey) -> MplPubkey { + MplPubkey::new_from_array(key.to_bytes()) +} + +pub fn bridge_instruction(ix: mpl_solana_program::instruction::Instruction) -> Instruction { + Instruction { + program_id: Pubkey::new_from_array(ix.program_id.to_bytes()), + accounts: ix + .accounts + .into_iter() + .map(|meta| AccountMeta { + pubkey: Pubkey::new_from_array(meta.pubkey.to_bytes()), + is_signer: meta.is_signer, + is_writable: meta.is_writable, + }) + .collect(), + data: ix.data, + } +} diff --git a/tokens/transfer-tokens/native/program/src/instructions/create.rs b/tokens/transfer-tokens/native/program/src/instructions/create.rs index 27d0835b..31bb0ca6 100644 --- a/tokens/transfer-tokens/native/program/src/instructions/create.rs +++ b/tokens/transfer-tokens/native/program/src/instructions/create.rs @@ -1,6 +1,10 @@ use { + crate::bridge::{bridge_instruction, to_mpl}, borsh::{BorshDeserialize, BorshSerialize}, - mpl_token_metadata::instruction as mpl_instruction, + mpl_token_metadata::{ + instructions::{CreateMetadataAccountV3, CreateMetadataAccountV3InstructionArgs}, + types::DataV2, + }, solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint::ProgramResult, @@ -8,10 +12,10 @@ use { program::invoke, program_pack::Pack, rent::Rent, - system_instruction, sysvar::Sysvar, }, - spl_token::{instruction as token_instruction, state::Mint}, + solana_system_interface::instruction as system_instruction, + spl_token_interface::{instruction as token_instruction, state::Mint}, }; #[derive(BorshSerialize, BorshDeserialize, Debug)] @@ -78,25 +82,30 @@ pub fn create_token(accounts: &[AccountInfo], args: CreateTokenArgs) -> ProgramR // msg!("Creating metadata account..."); msg!("Metadata account address: {}", metadata_account.key); + let create_metadata_ix = CreateMetadataAccountV3 { + metadata: to_mpl(metadata_account.key), + mint: to_mpl(mint_account.key), + mint_authority: to_mpl(mint_authority.key), + payer: to_mpl(payer.key), + update_authority: (to_mpl(mint_authority.key), true), + system_program: to_mpl(system_program.key), + rent: Some(to_mpl(rent.key)), + } + .instruction(CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name: args.token_title, + symbol: args.token_symbol, + uri: args.token_uri, + seller_fee_basis_points: 0, + creators: None, + collection: None, + uses: None, + }, + is_mutable: true, + collection_details: None, + }); invoke( - &mpl_instruction::create_metadata_accounts_v3( - *token_metadata_program.key, - *metadata_account.key, - *mint_account.key, - *mint_authority.key, - *payer.key, - *mint_authority.key, - args.token_title, - args.token_symbol, - args.token_uri, - None, - 0, - true, - false, - None, - None, - None, - ), + &bridge_instruction(create_metadata_ix), &[ metadata_account.clone(), mint_account.clone(), diff --git a/tokens/transfer-tokens/native/program/src/instructions/mint_nft.rs b/tokens/transfer-tokens/native/program/src/instructions/mint_nft.rs index ac166b21..b4d227b4 100644 --- a/tokens/transfer-tokens/native/program/src/instructions/mint_nft.rs +++ b/tokens/transfer-tokens/native/program/src/instructions/mint_nft.rs @@ -1,13 +1,16 @@ use { - mpl_token_metadata::instruction as mpl_instruction, + crate::bridge::{bridge_instruction, to_mpl}, + mpl_token_metadata::instructions::{ + CreateMasterEditionV3, CreateMasterEditionV3InstructionArgs, + }, solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint::ProgramResult, msg, program::invoke, }, - spl_associated_token_account::instruction as associated_token_account_instruction, - spl_token::instruction as token_instruction, + spl_associated_token_account_interface::instruction as associated_token_account_instruction, + spl_token_interface::instruction as token_instruction, }; pub fn mint_nft(accounts: &[AccountInfo]) -> ProgramResult { @@ -20,7 +23,7 @@ pub fn mint_nft(accounts: &[AccountInfo]) -> ProgramResult { let associated_token_account = next_account_info(accounts_iter)?; let payer = next_account_info(accounts_iter)?; let rent = next_account_info(accounts_iter)?; - let _system_program = next_account_info(accounts_iter)?; + let system_program = next_account_info(accounts_iter)?; let token_program = next_account_info(accounts_iter)?; let associated_token_program = next_account_info(accounts_iter)?; let token_metadata_program = next_account_info(accounts_iter)?; @@ -38,6 +41,7 @@ pub fn mint_nft(accounts: &[AccountInfo]) -> ProgramResult { mint_account.clone(), associated_token_account.clone(), payer.clone(), + system_program.clone(), token_program.clone(), associated_token_program.clone(), ], @@ -73,17 +77,22 @@ pub fn mint_nft(accounts: &[AccountInfo]) -> ProgramResult { // msg!("Creating edition account..."); msg!("Edition account address: {}", edition_account.key); + let create_edition_ix = CreateMasterEditionV3 { + edition: to_mpl(edition_account.key), + mint: to_mpl(mint_account.key), + update_authority: to_mpl(mint_authority.key), + mint_authority: to_mpl(mint_authority.key), + payer: to_mpl(payer.key), + metadata: to_mpl(metadata_account.key), + token_program: to_mpl(token_program.key), + system_program: to_mpl(system_program.key), + rent: Some(to_mpl(rent.key)), + } + .instruction(CreateMasterEditionV3InstructionArgs { + max_supply: Some(1), + }); invoke( - &mpl_instruction::create_master_edition_v3( - *token_metadata_program.key, // Program ID - *edition_account.key, // Edition - *mint_account.key, // Mint - *mint_authority.key, // Update Authority - *mint_authority.key, // Mint Authority - *metadata_account.key, // Metadata - *payer.key, // Payer - Some(1), // Max Supply - ), + &bridge_instruction(create_edition_ix), &[ edition_account.clone(), metadata_account.clone(), @@ -91,45 +100,12 @@ pub fn mint_nft(accounts: &[AccountInfo]) -> ProgramResult { mint_authority.clone(), payer.clone(), token_metadata_program.clone(), + token_program.clone(), + system_program.clone(), rent.clone(), ], )?; - // If we don't use Metaplex Editions, we must disable minting manually - // - // ------------------------------------------------------------------- - // msg!("Disabling future minting of this NFT..."); - // invoke( - // &token_instruction::set_authority( - // &token_program.key, - // &mint_account.key, - // None, - // token_instruction::AuthorityType::MintTokens, - // &mint_authority.key, - // &[&mint_authority.key], - // )?, - // &[ - // mint_account.clone(), - // mint_authority.clone(), - // token_program.clone(), - // ], - // )?; - // invoke( - // &token_instruction::set_authority( - // &token_program.key, - // &mint_account.key, - // None, - // token_instruction::AuthorityType::FreezeAccount, - // &mint_authority.key, - // &[&mint_authority.key], - // )?, - // &[ - // mint_account.clone(), - // mint_authority.clone(), - // token_program.clone(), - // ], - // )?; - msg!("NFT minted successfully."); Ok(()) diff --git a/tokens/transfer-tokens/native/program/src/instructions/mint_spl.rs b/tokens/transfer-tokens/native/program/src/instructions/mint_spl.rs index 41ed91b2..2448c6ac 100644 --- a/tokens/transfer-tokens/native/program/src/instructions/mint_spl.rs +++ b/tokens/transfer-tokens/native/program/src/instructions/mint_spl.rs @@ -6,8 +6,8 @@ use { msg, program::invoke, }, - spl_associated_token_account::instruction as associated_token_account_instruction, - spl_token::instruction as token_instruction, + spl_associated_token_account_interface::instruction as associated_token_account_instruction, + spl_token_interface::instruction as token_instruction, }; #[derive(BorshSerialize, BorshDeserialize, Debug)] diff --git a/tokens/transfer-tokens/native/program/src/instructions/transfer.rs b/tokens/transfer-tokens/native/program/src/instructions/transfer.rs index 8133e002..55bba1c7 100644 --- a/tokens/transfer-tokens/native/program/src/instructions/transfer.rs +++ b/tokens/transfer-tokens/native/program/src/instructions/transfer.rs @@ -5,9 +5,10 @@ use { entrypoint::ProgramResult, msg, program::invoke, + program_pack::Pack, }, - spl_associated_token_account::instruction as associated_token_account_instruction, - spl_token::instruction as token_instruction, + spl_associated_token_account_interface::instruction as associated_token_account_instruction, + spl_token_interface::{instruction as token_instruction, state::Mint}, }; #[derive(BorshSerialize, BorshDeserialize, Debug)] @@ -55,6 +56,8 @@ pub fn transfer_tokens(accounts: &[AccountInfo], args: TransferTokensArgs) -> Pr to_associated_token_account.key ); + let mint = Mint::unpack(&mint_account.data.borrow())?; + msg!("Transferring {} tokens...", args.quantity); msg!("Mint: {}", mint_account.key); msg!("Owner Token Address: {}", from_associated_token_account.key); @@ -63,13 +66,15 @@ pub fn transfer_tokens(accounts: &[AccountInfo], args: TransferTokensArgs) -> Pr to_associated_token_account.key ); invoke( - &token_instruction::transfer( + &token_instruction::transfer_checked( token_program.key, from_associated_token_account.key, + mint_account.key, to_associated_token_account.key, owner.key, &[owner.key, recipient.key], args.quantity, + mint.decimals, )?, &[ mint_account.clone(), diff --git a/tokens/transfer-tokens/native/program/src/lib.rs b/tokens/transfer-tokens/native/program/src/lib.rs index ffe183c3..ea8dbc74 100644 --- a/tokens/transfer-tokens/native/program/src/lib.rs +++ b/tokens/transfer-tokens/native/program/src/lib.rs @@ -2,6 +2,7 @@ use solana_program::{ account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, pubkey::Pubkey, }; +pub mod bridge; pub mod instructions; pub mod processor; diff --git a/tokens/transfer-tokens/native/program/tests/test.rs b/tokens/transfer-tokens/native/program/tests/test.rs new file mode 100644 index 00000000..b33b771f --- /dev/null +++ b/tokens/transfer-tokens/native/program/tests/test.rs @@ -0,0 +1,173 @@ +use { + litesvm::LiteSVM, + solana_instruction::{AccountMeta, Instruction}, + solana_keypair::{Keypair, Signer}, + solana_native_token::LAMPORTS_PER_SOL, + solana_program::program_pack::Pack, + solana_pubkey::{pubkey, Pubkey}, + solana_transaction::Transaction, + spl_token_interface::state::{Account as TokenAccount, Mint}, + transfer_tokens_program::instructions::{ + create::CreateTokenArgs, mint_spl::MintSplArgs, transfer::TransferTokensArgs, + }, +}; + +const TOKEN_METADATA_PROGRAM_ID: Pubkey = pubkey!("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); +const RENT_SYSVAR_ID: Pubkey = pubkey!("SysvarRent111111111111111111111111111111111"); + +// Instruction enum discriminants: Create=0, MintNft=1, MintSpl=2, TransferTokens=3. +fn ix_data(discriminant: u8, args: &T) -> Vec { + let mut data = vec![discriminant]; + data.extend(borsh::to_vec(args).unwrap()); + data +} + +#[test] +fn test_create_mint_and_transfer_spl() { + let mut svm = LiteSVM::new(); + + let program_id = Pubkey::new_unique(); + svm.add_program( + program_id, + include_bytes!("../../tests/fixtures/transfer_tokens_program.so"), + ) + .unwrap(); + svm.add_program( + TOKEN_METADATA_PROGRAM_ID, + include_bytes!("../../tests/fixtures/mpl_token_metadata.so"), + ) + .unwrap(); + + let token_program_id = spl_token_interface::id(); + let ata_program_id = spl_associated_token_account_interface::program::id(); + let system_program_id = solana_system_interface::program::ID; + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + let recipient = Keypair::new(); + svm.airdrop(&recipient.pubkey(), LAMPORTS_PER_SOL).unwrap(); + + let mint = Keypair::new(); + let (metadata, _bump) = Pubkey::find_program_address( + &[ + b"metadata", + TOKEN_METADATA_PROGRAM_ID.as_ref(), + mint.pubkey().as_ref(), + ], + &TOKEN_METADATA_PROGRAM_ID, + ); + + // --- Create the SPL token (9 decimals) --- + let create_ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), true), + AccountMeta::new(payer.pubkey(), false), + AccountMeta::new(metadata, false), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new_readonly(RENT_SYSVAR_ID, false), + AccountMeta::new_readonly(system_program_id, false), + AccountMeta::new_readonly(token_program_id, false), + AccountMeta::new_readonly(TOKEN_METADATA_PROGRAM_ID, false), + ], + data: ix_data( + 0, + &CreateTokenArgs { + token_title: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/spl-token.json".to_string(), + decimals: 9, + }, + ), + }; + let tx = Transaction::new_signed_with_payer( + &[create_ix], + Some(&payer.pubkey()), + &[&payer, &mint], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); + + let mint_account = svm.get_account(&mint.pubkey()).unwrap(); + assert_eq!(mint_account.owner, token_program_id); + assert_eq!(Mint::unpack(&mint_account.data).unwrap().decimals, 9); + assert_eq!( + svm.get_account(&metadata).unwrap().owner, + TOKEN_METADATA_PROGRAM_ID + ); + + // --- Mint 150 tokens to payer's ATA --- + let payer_ata = spl_associated_token_account_interface::address::get_associated_token_address( + &payer.pubkey(), + &mint.pubkey(), + ); + let mint_spl_ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), false), + AccountMeta::new(payer.pubkey(), false), + AccountMeta::new(payer_ata, false), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(system_program_id, false), + AccountMeta::new_readonly(token_program_id, false), + AccountMeta::new_readonly(ata_program_id, false), + ], + data: ix_data(2, &MintSplArgs { quantity: 150 }), + }; + let tx = Transaction::new_signed_with_payer( + &[mint_spl_ix], + Some(&payer.pubkey()), + &[&payer], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); + + assert_eq!( + TokenAccount::unpack(&svm.get_account(&payer_ata).unwrap().data) + .unwrap() + .amount, + 150 + ); + + // --- Transfer 15 tokens to recipient (creates their ATA) --- + let recipient_ata = + spl_associated_token_account_interface::address::get_associated_token_address( + &recipient.pubkey(), + &mint.pubkey(), + ); + let transfer_ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(mint.pubkey(), false), + AccountMeta::new(payer_ata, false), + AccountMeta::new(recipient_ata, false), + AccountMeta::new(payer.pubkey(), true), // owner + AccountMeta::new(recipient.pubkey(), true), // recipient + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new_readonly(system_program_id, false), + AccountMeta::new_readonly(token_program_id, false), + AccountMeta::new_readonly(ata_program_id, false), + ], + data: ix_data(3, &TransferTokensArgs { quantity: 15 }), + }; + let tx = Transaction::new_signed_with_payer( + &[transfer_ix], + Some(&payer.pubkey()), + &[&payer, &recipient], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); + + // Recipient ATA holds 15, payer ATA holds 135. + let recipient_state = + TokenAccount::unpack(&svm.get_account(&recipient_ata).unwrap().data).unwrap(); + assert_eq!(recipient_state.amount, 15); + assert_eq!(recipient_state.owner, recipient.pubkey()); + assert_eq!( + TokenAccount::unpack(&svm.get_account(&payer_ata).unwrap().data) + .unwrap() + .amount, + 135 + ); +} diff --git a/tokens/transfer-tokens/native/tests/fixtures/mpl_token_metadata.so b/tokens/transfer-tokens/native/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 { - // const connection = new Connection(`http://localhost:8899`, 'confirmed'); - const connection = new Connection("https://api.devnet.solana.com/", "confirmed"); - const payer = createKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); - const program = createKeypairFromFile("./program/target/deploy/program-keypair.json"); - - const tokenMintKeypair: Keypair = Keypair.generate(); - const nftMintKeypair: Keypair = Keypair.generate(); - - const recipientWallet = Keypair.generate(); - - it("Create an SPL Token!", async () => { - const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), tokenMintKeypair.publicKey.toBuffer()], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - - const instructionData = borshSerialize(CreateTokenArgsSchema, { - instruction: MyInstruction.Create, - token_title: "Solana Gold", - token_symbol: "GOLDSOL", - token_uri: - "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", - decimals: 9, - }); - - const ix = new TransactionInstruction({ - keys: [ - { - pubkey: tokenMintKeypair.publicKey, - isSigner: true, - isWritable: true, - }, // Mint account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { pubkey: metadataAddress, isSigner: false, isWritable: true }, // Metadata account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: TOKEN_METADATA_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Token metadata program - ], - programId: program.publicKey, - data: instructionData, - }); - - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, tokenMintKeypair]); - - console.log("Success!"); - console.log(` Mint Address: ${tokenMintKeypair.publicKey}`); - console.log(` Tx Signature: ${sx}`); - }); - - it("Create an NFT!", async () => { - const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), nftMintKeypair.publicKey.toBuffer()], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - - const instructionData = borshSerialize(CreateTokenArgsSchema, { - instruction: MyInstruction.Create, - token_title: "Homer NFT", - token_symbol: "HOMR", - token_uri: - "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json", - decimals: 0, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: nftMintKeypair.publicKey, isSigner: true, isWritable: true }, // Mint account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { pubkey: metadataAddress, isSigner: false, isWritable: true }, // Metadata account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: TOKEN_METADATA_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Token metadata program - ], - programId: program.publicKey, - data: instructionData, - }); - - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, nftMintKeypair]); - - console.log("Success!"); - console.log(` Mint Address: ${nftMintKeypair.publicKey}`); - console.log(` Tx Signature: ${sx}`); - }); - - it("Mint some tokens to your wallet!", async () => { - const associatedTokenAccountAddress = await getAssociatedTokenAddress(tokenMintKeypair.publicKey, payer.publicKey); - - const instructionData = borshSerialize(MintSplArgsSchema, { - instruction: MyInstruction.MintSpl, - quantity: new BN(150), - }); - - const ix = new TransactionInstruction({ - keys: [ - { - pubkey: tokenMintKeypair.publicKey, - isSigner: false, - isWritable: true, - }, // Mint account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { - pubkey: associatedTokenAccountAddress, - isSigner: false, - isWritable: true, - }, // ATA - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SystemProgram.programId, isSigner: false, isWritable: true }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Token metadata program - ], - programId: program.publicKey, - data: instructionData, - }); - - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - - console.log("Success!"); - console.log(` ATA Address: ${associatedTokenAccountAddress}`); - console.log(` Tx Signature: ${sx}`); - }); - - it("Mint the NFT to your wallet!", async () => { - const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), nftMintKeypair.publicKey.toBuffer()], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - - const editionAddress = PublicKey.findProgramAddressSync( - [ - Buffer.from("metadata"), - TOKEN_METADATA_PROGRAM_ID.toBuffer(), - nftMintKeypair.publicKey.toBuffer(), - Buffer.from("edition"), - ], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - - const associatedTokenAccountAddress = await getAssociatedTokenAddress(nftMintKeypair.publicKey, payer.publicKey); - - const instructionData = borshSerialize(MintNftArgsSchema, { - instruction: MyInstruction.MintNft, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: nftMintKeypair.publicKey, isSigner: false, isWritable: true }, // Mint account - { pubkey: metadataAddress, isSigner: false, isWritable: true }, // Metadata account - { pubkey: editionAddress, isSigner: false, isWritable: true }, // Edition account - { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account - { - pubkey: associatedTokenAccountAddress, - isSigner: false, - isWritable: true, - }, // ATA - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Associated token program - { - pubkey: TOKEN_METADATA_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Token metadata program - ], - programId: program.publicKey, - data: instructionData, - }); - - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - - console.log("Success!"); - console.log(` ATA Address: ${associatedTokenAccountAddress}`); - console.log(` Tx Signature: ${sx}`); - }); - - it("Prep a new test wallet for transfers", async () => { - await connection.confirmTransaction( - await connection.requestAirdrop(recipientWallet.publicKey, await connection.getMinimumBalanceForRentExemption(0)), - ); - console.log(`Recipient Pubkey: ${recipientWallet.publicKey}`); - }); - - it("Transfer tokens to another wallet!", async () => { - const fromAssociatedTokenAddress = await getAssociatedTokenAddress(tokenMintKeypair.publicKey, payer.publicKey); - console.log(`Owner Token Address: ${fromAssociatedTokenAddress}`); - const toAssociatedTokenAddress = await getAssociatedTokenAddress( - tokenMintKeypair.publicKey, - recipientWallet.publicKey, - ); - console.log(`Recipient Token Address: ${toAssociatedTokenAddress}`); - - const transferToInstructionData = borshSerialize(TransferTokensArgsSchema, { - instruction: MyInstruction.TransferTokens, - quantity: new BN(15), - }); - - const ix = new TransactionInstruction({ - keys: [ - { - pubkey: tokenMintKeypair.publicKey, - isSigner: false, - isWritable: true, - }, // Mint account - { - pubkey: fromAssociatedTokenAddress, - isSigner: false, - isWritable: true, - }, // Owner Token account - { pubkey: toAssociatedTokenAddress, isSigner: false, isWritable: true }, // Recipient Token account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Owner - { pubkey: recipientWallet.publicKey, isSigner: true, isWritable: true }, // Recipient - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Associated token program - ], - programId: program.publicKey, - data: transferToInstructionData, - }); - - await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, recipientWallet], { - skipPreflight: true, - }); - }); - - it("Transfer NFT to another wallet!", async () => { - const fromAssociatedTokenAddress = await getAssociatedTokenAddress(nftMintKeypair.publicKey, payer.publicKey); - console.log(`Owner Token Address: ${fromAssociatedTokenAddress}`); - const toAssociatedTokenAddress = await getAssociatedTokenAddress( - nftMintKeypair.publicKey, - recipientWallet.publicKey, - ); - console.log(`Recipient Token Address: ${toAssociatedTokenAddress}`); - - const transferToInstructionData = borshSerialize(TransferTokensArgsSchema, { - instruction: MyInstruction.TransferTokens, - quantity: new BN(1), - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: nftMintKeypair.publicKey, isSigner: false, isWritable: true }, // Mint account - { - pubkey: fromAssociatedTokenAddress, - isSigner: false, - isWritable: true, - }, // Owner Token account - { pubkey: toAssociatedTokenAddress, isSigner: false, isWritable: true }, // Recipient Token account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Owner - { pubkey: recipientWallet.publicKey, isSigner: true, isWritable: true }, // Recipient - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program - { - pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, - isSigner: false, - isWritable: false, - }, // Associated token program - ], - programId: program.publicKey, - data: transferToInstructionData, - }); - - await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, recipientWallet], { - skipPreflight: true, - }); - }); -}); diff --git a/tokens/transfer-tokens/native/tsconfig.json b/tokens/transfer-tokens/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/tokens/transfer-tokens/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} From de9e7958e2ab43c7013143c928d4f952ab0a71fa Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 18:49:41 +0000 Subject: [PATCH 020/138] ci(quasar): support multi-program projects; re-enable cross-program-invocation/quasar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The CPI quasar example contains two separate Quasar programs (hand/ and lever/) rather than a single program with a root Quasar.toml, so the Quasar workflow โ€” which ran `quasar build && cargo test` directly in the project dir โ€” failed (quasar build requires ./src/lib.rs and is single-program only), and the example was excluded in .ghaignore. Teach the workflow's build_and_test to detect a project's program directories: the project itself when it has a Quasar.toml (unchanged for every existing example), otherwise its immediate subdirectories that each contain one. It now builds all of a project's programs first, then tests them all โ€” so hand's test, which loads lever's freshly-built .so to exercise the CPI, finds it regardless of directory order (the 47 quasar projects shard across parallel jobs, so cross-project build order can't be relied on). Verified locally with the quasar CLI: both programs build and all tests pass (hand 3, lever 4). Drop the example from .github/.ghaignore. --- .github/.ghaignore | 2 -- .github/workflows/quasar.yml | 47 ++++++++++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/.github/.ghaignore b/.github/.ghaignore index f94cb08a..cf5190de 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -12,8 +12,6 @@ compression/cnft-vault/anchor # builds but need to test on localhost compression/cnft-burn/anchor -# CPI quasar project uses subdirectories (hand/ and lever/) instead of a root Quasar.toml -basics/cross-program-invocation/quasar # build failed - program outdated diff --git a/.github/workflows/quasar.yml b/.github/workflows/quasar.yml index dbfc48b1..609b913a 100644 --- a/.github/workflows/quasar.yml +++ b/.github/workflows/quasar.yml @@ -171,22 +171,49 @@ jobs: echo "Building and Testing $project with Solana $solana_version" cd "$project" || return 1 - # Build with quasar CLI - if ! quasar build; then - echo "::error::quasar build failed for $project" - echo "$project: quasar build failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt - cd - > /dev/null - return 1 + # Determine the quasar program directories for this project. Normally + # the project dir itself holds the Quasar.toml. Some examples (e.g. the + # cross-program-invocation CPI demo) instead contain several program + # subdirectories (hand/, lever/), each its own Quasar project. In that + # case build them all *first*, then test them all, so a program whose + # tests load a sibling program's compiled .so (the CPI callee) has it + # available regardless of directory order. + local prog_dirs=() + if [ -f Quasar.toml ]; then + prog_dirs=(".") + else + for d in */; do + [ -f "${d}Quasar.toml" ] && prog_dirs+=("${d%/}") + done fi - # Run Rust tests (quasar examples use cargo test with quasar-svm) - if ! cargo test; then - echo "::error::cargo test failed for $project" - echo "$project: cargo test failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt + if [ ${#prog_dirs[@]} -eq 0 ]; then + echo "::error::no Quasar.toml found for $project" + echo "$project: no Quasar.toml found with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt cd - > /dev/null return 1 fi + # Build every program first. + for d in "${prog_dirs[@]}"; do + if ! ( cd "$d" && quasar build ); then + echo "::error::quasar build failed for $project ($d)" + echo "$project: quasar build failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt + cd - > /dev/null + return 1 + fi + done + + # Then run Rust tests (quasar examples use cargo test with quasar-svm). + for d in "${prog_dirs[@]}"; do + if ! ( cd "$d" && cargo test ); then + echo "::error::cargo test failed for $project ($d)" + echo "$project: cargo test failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt + cd - > /dev/null + return 1 + fi + done + echo "Build and tests succeeded for $project with $solana_version version." cd - > /dev/null return 0 From 9c1ca6d1b5124c8e4d933e6634b14a4c00adfd6c Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 19:52:04 +0000 Subject: [PATCH 021/138] fix(pyth/anchor): vendor PriceUpdateV2 to build on Anchor 1.0; re-enable in CI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit basics/pyth/anchor was excluded because pyth-solana-receiver-sdk can't be built against Anchor 1.0 / borsh 1.x. The latest SDK (1.2.0) builds against anchor-lang 0.32 and pulls pythnet-sdk (2.3.1), which still derives borsh 0.10 on PriceFeedMessage, while Anchor's AnchorSerialize/AnchorDeserialize derives need borsh 1.x โ€” so the SDK's own PriceUpdateV2 fails to compile (`PriceFeedMessage: BorshSerialize is not satisfied`). No SDK release targets anchor-lang 1.0 and no pythnet-sdk release has moved to borsh 1.x, so the dep can't be upgraded. Drop the pyth-solana-receiver-sdk dependency and vendor the PriceUpdateV2 / PriceFeedMessage / VerificationLevel layout locally with Anchor 1.0 derives and manual Discriminator/Owner/AccountSerialize/AccountDeserialize impls. The fields, order, and 8-byte discriminator match the on-chain account, and it is owned by the Pyth Receiver program, so accounts written by Pyth deserialize unchanged. Document the situation in the README (GitHub note callout) and a matching comment in lib.rs, including the "as of June 2026" caveat to revisit once an Anchor 1.0 / borsh 1.x SDK ships. The existing LiteSVM test (builds a mock PriceUpdateV2 and calls read_price) passes. Drop basics/pyth/anchor from .github/.ghaignore. --- .github/.ghaignore | 5 - basics/pyth/anchor/README.md | 11 ++ .../anchor/programs/pythexample/Cargo.toml | 1 - .../anchor/programs/pythexample/src/lib.rs | 106 +++++++++++++++++- 4 files changed, 115 insertions(+), 8 deletions(-) diff --git a/.github/.ghaignore b/.github/.ghaignore index cf5190de..0c7d2136 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -1,11 +1,6 @@ # uses generated client from shank, can't rewrite to solana-bankrun tools/shank-and-solita/native -# not building: pyth-solana-receiver-sdk 1.1.0 pulls a borsh version that -# conflicts with Anchor 1.0 / Solana 3.x (PriceUpdateV2 fails BorshDeserialize). -# Blocked on an upstream SDK release compatible with solana 3.x. -basics/pyth/anchor - # not building compression/cutils/anchor compression/cnft-vault/anchor diff --git a/basics/pyth/anchor/README.md b/basics/pyth/anchor/README.md index c95755fc..46ea6809 100644 --- a/basics/pyth/anchor/README.md +++ b/basics/pyth/anchor/README.md @@ -4,6 +4,17 @@ Read a [Pyth](https://pyth.network/) price feed account and log price, confidenc See also: [Pyth overview](../README.md) and the [repository catalog](../../../README.md). +> [!NOTE] +> **The official `pyth-solana-receiver-sdk` is not Anchor 1.0 compatible (as of June 2026), so this example vendors the `PriceUpdateV2` account type instead of importing it.** +> +> The latest `pyth-solana-receiver-sdk` (1.2.0) builds against `anchor-lang` 0.32 and pulls `pythnet-sdk` (2.3.1), which still derives **borsh 0.10** on `PriceFeedMessage`. Anchor 0.32's `AnchorSerialize`/`AnchorDeserialize` derives require **borsh 1.x**, so `pyth-solana-receiver-sdk`'s own `PriceUpdateV2` fails to compile: +> +> ``` +> error[E0277]: the trait bound `pythnet_sdk::messages::PriceFeedMessage: BorshSerialize` is not satisfied +> ``` +> +> No published `pyth-solana-receiver-sdk` targets `anchor-lang` 1.0 (which this repo standardizes on), and no `pythnet-sdk` release has migrated to borsh 1.x โ€” so the dependency can't simply be upgraded. As a workaround, `programs/pythexample/src/lib.rs` mirrors the on-chain `PriceUpdateV2` layout locally (same fields, same 8-byte discriminator, owned by the Pyth Receiver program) so accounts written by Pyth deserialize unchanged. Replace the vendored type with the SDK import once an Anchor 1.0 / borsh 1.x compatible release ships. + ## Major concepts - Oracle price accounts diff --git a/basics/pyth/anchor/programs/pythexample/Cargo.toml b/basics/pyth/anchor/programs/pythexample/Cargo.toml index a62ad14a..2acfd580 100644 --- a/basics/pyth/anchor/programs/pythexample/Cargo.toml +++ b/basics/pyth/anchor/programs/pythexample/Cargo.toml @@ -22,7 +22,6 @@ custom-panic = [] [dependencies] anchor-lang = "1.0.0" -pyth-solana-receiver-sdk = "1.1.0" [dev-dependencies] litesvm = "0.11.0" diff --git a/basics/pyth/anchor/programs/pythexample/src/lib.rs b/basics/pyth/anchor/programs/pythexample/src/lib.rs index c3ccced2..fd5980ed 100644 --- a/basics/pyth/anchor/programs/pythexample/src/lib.rs +++ b/basics/pyth/anchor/programs/pythexample/src/lib.rs @@ -1,8 +1,10 @@ -use pyth_solana_receiver_sdk::price_update::PriceUpdateV2; use anchor_lang::prelude::*; declare_id!("GUkjQmrLPFXXNK1bFLKt8XQi6g3TjxcHVspbjDoHvMG2"); +/// The Pyth Receiver program that owns `PriceUpdateV2` accounts on devnet/mainnet. +pub const PYTH_RECEIVER_PROGRAM_ID: Pubkey = pubkey!("rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ"); + #[program] pub mod anchor_test { use super::*; @@ -13,7 +15,10 @@ pub mod anchor_test { msg!("Price: {:?}", price_update.price_message.price); msg!("Confidence: {:?}", price_update.price_message.conf); msg!("Exponent: {:?}", price_update.price_message.exponent); - msg!("Publish Time: {:?}", price_update.price_message.publish_time); + msg!( + "Publish Time: {:?}", + price_update.price_message.publish_time + ); Ok(()) } } @@ -22,3 +27,100 @@ pub mod anchor_test { pub struct ReadPrice<'info> { pub price_update: Account<'info, PriceUpdateV2>, } + +// --------------------------------------------------------------------------- +// Pyth `PriceUpdateV2` account, vendored from `pyth-solana-receiver-sdk`. +// +// The official `pyth-solana-receiver-sdk` is NOT Anchor 1.0 compatible (as of +// June 2026), so this example mirrors the `PriceUpdateV2` account type locally +// instead of importing it. +// +// Details: the latest `pyth-solana-receiver-sdk` (1.2.0) builds against +// `anchor-lang` 0.32 and pulls `pythnet-sdk` (2.3.1), which still derives +// borsh 0.10 on `PriceFeedMessage`. Anchor 0.32's `AnchorSerialize` / +// `AnchorDeserialize` derives require borsh 1.x, so the SDK's own +// `PriceUpdateV2` fails to compile: +// +// error[E0277]: the trait bound +// `pythnet_sdk::messages::PriceFeedMessage: BorshSerialize` is not satisfied +// +// No published `pyth-solana-receiver-sdk` targets `anchor-lang` 1.0 (which this +// repo standardizes on) and no `pythnet-sdk` release has migrated to borsh 1.x, +// so the dependency can't simply be upgraded. The fields, order, and 8-byte +// discriminator below match the on-chain account exactly, and it is owned by +// the Pyth Receiver program (see the `Owner` impl), so accounts written by Pyth +// deserialize unchanged. Replace this with the SDK type once an Anchor 1.0 / +// borsh 1.x compatible `pyth-solana-receiver-sdk` release ships. +// --------------------------------------------------------------------------- + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug, PartialEq, Eq)] +pub enum VerificationLevel { + /// Partially verified: only `num_signatures` of the Wormhole guardians + /// were checked against the price update. + Partial { num_signatures: u8 }, + /// Fully verified against the full guardian set. + Full, +} + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug, PartialEq, Eq)] +pub struct PriceFeedMessage { + pub feed_id: [u8; 32], + pub price: i64, + pub conf: u64, + pub exponent: i32, + pub publish_time: i64, + pub prev_publish_time: i64, + pub ema_price: i64, + pub ema_conf: u64, +} + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug, PartialEq, Eq)] +pub struct PriceUpdateV2 { + pub write_authority: Pubkey, + pub verification_level: VerificationLevel, + pub price_message: PriceFeedMessage, + pub posted_slot: u64, +} + +// Anchor's 8-byte discriminator: sha256("account:PriceUpdateV2")[..8]. +impl anchor_lang::Discriminator for PriceUpdateV2 { + const DISCRIMINATOR: &'static [u8] = &[34, 241, 35, 99, 157, 126, 244, 205]; +} + +// The account is created and owned by the Pyth Receiver program. +impl anchor_lang::Owner for PriceUpdateV2 { + fn owner() -> Pubkey { + PYTH_RECEIVER_PROGRAM_ID + } +} + +impl anchor_lang::AccountSerialize for PriceUpdateV2 { + fn try_serialize(&self, writer: &mut W) -> Result<()> { + writer + .write_all(::DISCRIMINATOR) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?; + AnchorSerialize::serialize(self, writer) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?; + Ok(()) + } +} + +impl anchor_lang::AccountDeserialize for PriceUpdateV2 { + fn try_deserialize(buf: &mut &[u8]) -> Result { + let disc = ::DISCRIMINATOR; + if buf.len() < disc.len() { + return Err(anchor_lang::error::ErrorCode::AccountDiscriminatorNotFound.into()); + } + if &buf[..disc.len()] != disc { + return Err(anchor_lang::error::ErrorCode::AccountDiscriminatorMismatch.into()); + } + Self::try_deserialize_unchecked(buf) + } + + fn try_deserialize_unchecked(buf: &mut &[u8]) -> Result { + let disc = ::DISCRIMINATOR; + let mut data: &[u8] = &buf[disc.len()..]; + AnchorDeserialize::deserialize(&mut data) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotDeserialize.into()) + } +} From 925c91dc8add6b5e1c9cc086d0e62cc64893356f Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 19:58:22 +0000 Subject: [PATCH 022/138] docs(pyth/anchor): link upstream tracking issue pyth-crosschain#3756 --- basics/pyth/anchor/README.md | 4 +++- basics/pyth/anchor/programs/pythexample/src/lib.rs | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/basics/pyth/anchor/README.md b/basics/pyth/anchor/README.md index 46ea6809..0a3d38bd 100644 --- a/basics/pyth/anchor/README.md +++ b/basics/pyth/anchor/README.md @@ -13,7 +13,9 @@ See also: [Pyth overview](../README.md) and the [repository catalog](../../../RE > error[E0277]: the trait bound `pythnet_sdk::messages::PriceFeedMessage: BorshSerialize` is not satisfied > ``` > -> No published `pyth-solana-receiver-sdk` targets `anchor-lang` 1.0 (which this repo standardizes on), and no `pythnet-sdk` release has migrated to borsh 1.x โ€” so the dependency can't simply be upgraded. As a workaround, `programs/pythexample/src/lib.rs` mirrors the on-chain `PriceUpdateV2` layout locally (same fields, same 8-byte discriminator, owned by the Pyth Receiver program) so accounts written by Pyth deserialize unchanged. Replace the vendored type with the SDK import once an Anchor 1.0 / borsh 1.x compatible release ships. +> No published `pyth-solana-receiver-sdk` targets `anchor-lang` 1.0 (which this repo standardizes on), and no `pythnet-sdk` release has migrated to borsh 1.x โ€” so the dependency can't simply be upgraded. Tracked upstream at [pyth-network/pyth-crosschain#3756](https://github.com/pyth-network/pyth-crosschain/issues/3756). +> +> As a workaround, `programs/pythexample/src/lib.rs` mirrors the on-chain `PriceUpdateV2` layout locally (same fields, same 8-byte discriminator, owned by the Pyth Receiver program) so accounts written by Pyth deserialize unchanged. Replace the vendored type with the SDK import once an Anchor 1.0 / borsh 1.x compatible release ships. ## Major concepts diff --git a/basics/pyth/anchor/programs/pythexample/src/lib.rs b/basics/pyth/anchor/programs/pythexample/src/lib.rs index fd5980ed..8416108c 100644 --- a/basics/pyth/anchor/programs/pythexample/src/lib.rs +++ b/basics/pyth/anchor/programs/pythexample/src/lib.rs @@ -46,7 +46,10 @@ pub struct ReadPrice<'info> { // // No published `pyth-solana-receiver-sdk` targets `anchor-lang` 1.0 (which this // repo standardizes on) and no `pythnet-sdk` release has migrated to borsh 1.x, -// so the dependency can't simply be upgraded. The fields, order, and 8-byte +// so the dependency can't simply be upgraded. Tracked upstream at +// https://github.com/pyth-network/pyth-crosschain/issues/3756 +// +// The fields, order, and 8-byte // discriminator below match the on-chain account exactly, and it is owned by // the Pyth Receiver program (see the `Owner` impl), so accounts written by Pyth // deserialize unchanged. Replace this with the SDK type once an Anchor 1.0 / From a74092878b8fd39285a15afd2395e2eb1f7ae51f Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 20:24:33 +0000 Subject: [PATCH 023/138] fix(compression/cnft-burn): remove stale ahash pin so it builds on SBF MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The program pinned `ahash = "=0.8.7"` (unused in the source), which pulls getrandom 0.2 โ€” that `compile_error!`s on the SBF target, so `cargo build-sbf` / `anchor build` failed. Drop the pin; the program now builds on the current toolchain (it was already migrated to Anchor 1.0 with manual Bubblegum CPI). This does not yet re-enable it in CI: it still needs a cNFT-burn integration test (load Bubblegum + spl-account-compression + noop fixtures, create a tree, mint a cNFT, compute the proof, then burn), which is tracked separately. --- compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml b/compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml index f059008f..e2347277 100644 --- a/compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml +++ b/compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml @@ -25,7 +25,6 @@ anchor-lang = "1.0.0" # which is incompatible with Anchor 1.0's solana 3.x types. CPI calls are built manually # using raw invoke() with hardcoded program IDs and discriminators. borsh = "1" -ahash = "=0.8.7" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } From 839931b12241e83f194e3a1652854cb55b0af021 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 20:27:40 +0000 Subject: [PATCH 024/138] test(compression/cnft-burn): add mainnet program fixtures (bubblegum, account-compression, noop) + provenance --- .../cnft-burn/anchor/tests/fixtures/README.md | 24 ++++++++++++++++++ .../anchor/tests/fixtures/mpl_bubblegum.so | Bin 0 -> 1329808 bytes .../tests/fixtures/spl_account_compression.so | Bin 0 -> 2349040 bytes .../anchor/tests/fixtures/spl_noop.so | Bin 0 -> 41056 bytes 4 files changed, 24 insertions(+) create mode 100644 compression/cnft-burn/anchor/tests/fixtures/README.md create mode 100644 compression/cnft-burn/anchor/tests/fixtures/mpl_bubblegum.so create mode 100644 compression/cnft-burn/anchor/tests/fixtures/spl_account_compression.so create mode 100644 compression/cnft-burn/anchor/tests/fixtures/spl_noop.so diff --git a/compression/cnft-burn/anchor/tests/fixtures/README.md b/compression/cnft-burn/anchor/tests/fixtures/README.md new file mode 100644 index 00000000..6e1ab7d3 --- /dev/null +++ b/compression/cnft-burn/anchor/tests/fixtures/README.md @@ -0,0 +1,24 @@ +# Test fixtures โ€” mainnet program binaries + +These `.so` files are the compiled on-chain programs the cNFT-burn test CPIs +into, dumped from Solana **mainnet-beta** so [LiteSVM](https://github.com/LiteSVM/litesvm) +can load them locally (LiteSVM only bundles System/Token/Token-2022/ATA). They +are the real programs โ€” not modified โ€” so accounts they create/verify behave +exactly as on mainnet. + +| File | Program | Program ID | Source | Dumped (UTC) | Slot | +|------|---------|------------|--------|--------------|------| +| `mpl_bubblegum.so` | Metaplex Bubblegum (cNFTs) | `BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY` | mainnet-beta | 2026-06-05 | 424532091 | +| `spl_account_compression.so` | SPL Account Compression | `cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK` | mainnet-beta | 2026-06-05 | 424532091 | +| `spl_noop.so` | SPL Noop (log wrapper) | `noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV` | mainnet-beta | 2026-06-05 | 424532091 | + +## Refreshing + +These are point-in-time snapshots. To re-dump (e.g. after an upstream program +upgrade), update the date/slot above and run: + +```bash +solana program dump BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY mpl_bubblegum.so -u https://api.mainnet-beta.solana.com +solana program dump cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK spl_account_compression.so -u https://api.mainnet-beta.solana.com +solana program dump noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV spl_noop.so -u https://api.mainnet-beta.solana.com +``` diff --git a/compression/cnft-burn/anchor/tests/fixtures/mpl_bubblegum.so b/compression/cnft-burn/anchor/tests/fixtures/mpl_bubblegum.so new file mode 100644 index 0000000000000000000000000000000000000000..3b573de0bfe31fac52f561db9709b4c30cf766d0 GIT binary patch literal 1329808 zcmeFa3w%|_bvL?&IF{`s6&5~*oRsJY@v>4SfFBTAw*q3D&?drmWH7BFWSIhXT(dcj zVSA^s@Dn>}0(N4Pq-}I0WaPHDqUi(LBt7&?Zt65mOWNCB_mP&ozLI`vKl)1CrZIQ@ z*MF^jMn@7a8)APq`v;mcGizqntk+rl2f!QYQy7y)1>7*jHa;~fL|d0r+u0Ewc*i(a2|%`rb^bp z+UW{V8y^2E%X#SKrbsf{JAO0E)rJRHEb{O|izjpVBWY#ItSgUcLRvWR0)8YdGc7)# z@yc?IMh()z+43`G_o8(5AHAr(p&?RQC$}zO zdT&v~N=bw0Au0ZvS4B|;%#dfhgm0E`rr=R057H36DUV-KbWl?Szrt?z<2Lp$>1BR} zWQrQP*@3Gn0ZkY^~(cjgfoS>SIC1n!gT#Eg-r|n8uoM`CyE-a z-NfnAwpa50MI<0eO-^miKa-q<%Ev@U?h)`TP_` zHOfUls`Yqz@D1%%=4x`ZU+Adq8{I0mFnzl;k9I(pE_slOu;)?cH-DI+!}n}q9DIQ+ z_H1Ol(dw%hJn|vmo<39Jjq(5*VUNKheGFd%ywIaYk|*kUD@sPuCW%XtsB)D?BgZdE z7*EzQob@QM6ZsH$^e-1(tnp->$w$Jl`_b>7Kt{68Z`t;<@)Dr=f_D8b%03rIX@w9M==|VP9m8jHa{g-$V zaBasmf2PC-t~906^kbS{8I*`T4U#`1_@r$|t==OR9v%mG7#Lk7pG=89dCeOnaS+epm^VlxcrU#@A%X?DL`)%@6AZz0)@00s0B5!q=I^tL;J! zLwNErVm}1FsPNA#9^i|XU&j8F3Wr&~tj+4Uab%KyeNpCHL7x`=`D<#`HLzLPI=P80@8Q=Du$~&#?fgN_)=KP{I-P}c1@YB z=fWCIKL{frPkKA$F}-~Q(*+19mI}ui7c`52d+eCTF@B8E+m9aA^w5s1Q9Pd0 z^z`;;Ej%<1u0!BLIXNV8$m_4Hog(_%Ev=5#U&($^`r8@k?<$+9D;<+E z`IQ#-THN?p*llt0ISuRw`9Glf>FpyH9?%f<2>I^(PAA~+fbbzLOv2y5{(zrJd8yW~ zc4$mLd|YGuX<>)Li5((dncXye3!5!}m*um6NqM)$+5e=x*W#p4D3=w%CzLnH=|SoA zLZK`0`!m5Wghze|kNyB2Dhc>M7Wg>skeJw^rxy~xkp&udkzJWzS(-sOAEz+hE|+pS z^-87uE0CX8jp65G?Efjp!Slz@y=TbJ$CaN&;mYaolW-wFTclhlFD_p$FAq!o=?=5| zo6$-X)!O;WJf>IZ9!6ak)Y@;-5BiG7{V?~x4$AnddTf3c;zhu<9aH{{_q&d2dWg5` zciVHCo)(_9@DSmK(5m=n(g^gy=XaGGnGU`9%Qdjyt(p+}UjqK3?DtcvtNvHje!u+b z@mop{`XN>O?RJm$s%rOW&yuq13GH2C{%v0PE-bD38JWJFT|F5c#n;4>l-XW7gL0bL z*BQcC&1XC53<~I^@_dBGMoKP zZ2s0gm-Ds;@h2hI=}Ok;^EWiVP|BrL1JMUMp6D+yOHI$y%UCWKeO>zterUe+H`DVB z?(eCG^MRGv8>h3)CzG8_&)1=r>U=F1$%IaxWGCC}s{3!!c_;hZRrg<6`wDkI``b0; zJDT2ACkii*+dJ^t7U%E4}vgNn() zry&PJCeMSW4?9iXY<`&--fs82Uv3W_pR_!b~}Q6z@CC$uUP>3?$>&f zLF!pfy?`oTK)(>5?w02WZ~aAnh*x*Z|D*XXCyDWGrm$;XfM@sOKUKKAt!?Ha#zVY; zXE@)Fu9_0{njJzpa3B|P-7^_EK)lRf^YyFb63SOvIHvhNe;?P*pwUPAbJXZ_#!Vlv3~Qd<{vz43mhrU$v`4O(&U;6CCvG{SJ7;X8bYc&)c^wbi?faD8no*JpAQ z;=L903GjBlJ~R7qmNM2gcZ+F?Q*>3_jHNv~ZOC2;^@Ex0QhxMyp!(6n& z=tq72e%dAA8QP^gg}=RKcdB-Y4nQ(ubT_|fyj>d5{-teu$I(aI3G{of(dWY-7yE2> zBz}hDWd5Q$^TTG7PS&1}@1=RN2q}--sq|`%ik`elfAkLinzo;qUMBkt?_tVOy57Ro zOi!0le)`&2uFux#Li@5AbPDiy{!UT;(!L~vTeaPZ?9)0aAKIrsek1JKI^sFFK|{=c zr$`Sd6g1CG_ z;YyeFXuR|!@kq*SC%sGx%9E5?Uq*koZ#y+x*A=DN6IJ_ljCj5b?AIS(0l(_S+plM3 z-4y(E`}H{Z>Fc9|wjP|>uSok}wO?GHt=ccH&sOc%Fax7@$7b_Ut*ME;eCP*lqNtA(mSy@T98 zN`|cbKEr#Ma+I#OaJAKI>-&9eEZ0{cJ|X@ipi_Xq^Y?b;?+DlL2M=gCk^R~$APv2!?z~m7>N#ni`mz1ragQj{O7mrq+%vw{nXa&T0Zzx&MWRv-$CI zj`zu8hTTmzKVEKjbuq*4rsuUC&>K&(oQ_~}1;g&?oF5;QY5>wTWdp#*%pYGZeC@Jz z{v@_`ZA;Mig$@e&fnUBJe+6H%BTBYuH1d6yuBlTL4)law_b@3L-nOrU`50@Y){&!%k$G#={1QRzph4+pGY-D*FMDtuR6UdL1S+uh&6`U85FwkTR6 zS8OjCJf!6ks=uz|fnKS}MOQrpQ}}7;JHQ9#8-L6mp?*!b`n#rBxhBF@^BK=YMXk4Y z@at@Uh~sUt?>OVbl&5sPg{zsKE+brD8_V@g;MWcaA|ahXH}L;!b7fo@w0`?Mb!5QW zH#!7zq5WB@XhvOAtv|MYRlCk}w)D&Vk%!ri+naIorsd2}&bPkG{vP#pP!ULW5Rb}E zhM?<*g|1!EFEiiPlakZb+ecZ?DfRY&mq>3PG`)SOs13*crnmQ--tIEJeeBOvE=p}* zVtBFX>w44I)s&-j8Rf>;ozjnvD14~5&(+AI`{Dm{F~l#}M@{@pZgwS-wHYB;7rczQgLvL7HX!x)xF({mb$h_j4Ild#+%owD%R7i|Tyd z{IHj={r;kMY$E&pWtG>@GyhEO_x+^TOK!jK?N|96?|;#cOeVAAk4$36?>$31-gf$S zynT!vpK;FY_?k)V_&>J7j=xqJar*Y;oeH0?of&B(P`?Vg9GjYrVuxC@xFKay<7vq@gYiCo>hqWFXzjkW( zblvUcGA=IskspkU={q3JBEM%j4?5#<@%yk(J$uo)*{44C29clt1NW(ys-31iekJTv zzd`tWKKH3V_*<{ced<3Ddwe$g)bE3w+xf&~a5Me1AM8_eKJ_Bb&wOy<#CGXbTQ~j& zZ1UH>^qy-^=ll%T1;c%wF11TGU$S!()qQHN8&vmsxXw}C=Xuup1q@{V8k~~}@$z*D ztXePqr5o=9>>X1-^F=@Rf%J8U-c>?+Vc>heo!WVFq`&odzVs=i*FS&xbrbnZx}LWW z5Hf!g_u;Vg5B|-t%I^U2vvUm-ou3KundtmXh}X%^&xClM&iNVO>3%5i-7EarOA(4`sXitUvb@l|SiqGZ|hjjFcy>+2;<|c?7Ls zANk+3zH#fh-v_^^UhT`zD*lcy)(1m9J{|jleZ(Wks(J6`CD=y}@k$F9Djmn$ zmuXpgsK?#wj^rK?|y>EAegs;(!$^!v(sZeUQ!qVE-YKR>Q`9x^-+YdDeJsohuJ zqIPHOzVfO1m)V_c-*}g{cd~ur=b?8(HyqgnUEg~H#uJ`D>btCYP~N9J9fLAyE_->VHT<#qn^unKsk5` z?AX}zd{sL(_B>zJj=j|9VfrVO>lMmq_w&A==lN>wSV{PMKF`B^@t0oN=V30Kz`mZ2 z-TE`U2V5R&wB`kiuW%ZW-CKflcyJK&7cj%$o4K?1%~}BSEPt?ro^abe!h1wfKXdRC z^9($GA5MkaXi;;oCP!!okDuFXUqpC6x7TIo?fm^#v};B597_96?&sFxlkQ}_eh#V9 z$2k1r*9kvr;T`|*T+1=Y5jr7Hdz0aH5#wEQE*4Lvm2vn-$L`~A_FEFF@hMm6c4y`9Gx_kE3MoQ?{=py$)L0 zE^S5Hxrzy>cMSce8vUdmrQb~kC*&GKzm=2I@8J+{f@vkvRFvBORWiruw~}Ep$LMJ9 zXC|}RuD_R=@lh(NrRygGy1G2|wz8p$wYOIAKucXyNg&8aQR04HHD~97K=;+1Q)Imk z*is(;{B4Mnj>wPRUge|TzXUn#4ezUw;-Dnpzj0jv--=qRdYd$%!fG7wSFWnUdw-CA ze0eq9LZ^Y<;?zPLZ(=jEUepg`$dy`Mg)-PU>jA?T^uC-n2P z^8RI)zX$8@r)2MojOaMx=QI7BLhZWYOZh(gr&m<%!HbcrZ;9N5a`huMaO}e@L@pF5%?I%s7TQXe`mB;Pz znVwfmjL+5c+ge?8>hs;J*zWWWhGyr^U;8_({jJ}p_D9(6B?E?s2Gw)&W=}FY+Inh6 zXZO!qtenUT|D_Did;7-!>6^b#?GLcs zOZGA}Q&Q!#CRg?82Xa69ic>;i`0H$5cX^YWe(#`)wD+C`ra<6a&hShe2{Pl3ty-7cA?8TmTCcTy=54t_Bn z_v3tAa6c_u26HJiB7`aB}S~qAsU(fp>Aa_XEGIz74Z&^rqpGUQ?(PZhz^Xj*GI?mxEr*adp#CvyN)BH`6 z4u7igMorfDRq!jrQ`*D$nV)L+-Z}nRI^Va;MZ`bv@2@$WRF3jp_21L>lG)ZDdCvh) zE@Ha#4gTe>uh=G-e~)L>))Rbv!rzn0-uqc*esJ5f^oQ+zB%L2_+o^U;_P){)EeH5_Z!D=%-FW9+rO_6Hvvpwj-9?o1^T+#{kNcK!&L}*;q4RiKmjK@I zXy9M3lK;M5;p+~_N4>~@i~RTdQWLxHz~!RR^t*Bc+ubhsTp>RpCpeMZnP>XwRSZKo z+^kSp!}LuOTq6HFr7b+kzN3^kksD}kQa+~f&Pz30-V-EUE6W*oy7>E&zMj@NpZUJ- z>vHS&wvAq3`5PJH{$k)?*}ypP(ta48uFrrgO5P@;Q>W=k#rli3bd1H%UL0zP8?& z;nB)`z!&A`CXqLUohIM=B@V(@j4zGIl&7(#z0p3VyIyUV_LPoR59(Dq-fD0+GXz{w zenMUlc6z^gEIva17&`U}kUXPx3^TmeFy1Krz~lPqd`3M=kGaf8drFT9+8aaX+V(nF ze!B!k`M*i%fUwi);dJVdM0pye-*`r?-Ad4JrH}Cs^(cLABYa55q9kQ<=5#(&`hbY? zG)lkmj9R;=lCO-;*RmYsTIslwap0wNoJ9VeKhPtPrqlT3_mgLOBy=hw|3>*EPh$(i zQKP4ihuZ~C`6Jn?2StPP{+WGny8wFxkje_eW%Au*<&Y`QXom)wKj7oLuaA6~*;zj9 z@;mD`E7$*X?Q7oU_X;EZhSH4R0r+bQQ$Jr@-q+va7M}aa*UeD>1ml=L5Mf`(t5|<9 zjvux2C4f69d_a-*OIZ+cJa`WtkK2Kn4N~sCnxx~l-!r#X8qx8<><`)(P<_yT`wWZ@ z(vGC#7wA!x-xv?RAnUBYE|attCZC9F< z_xA|z^mqDsyJteb=VUxYdw9--e$U;s!27uf$SWSlC*SZ!jn5b1o-My} z5#yByHCfLqqe#-rxR2kBa~V%M*x@wCFzGNp`$6AKE8$J(rXz4zoPtf{NhKM z-rY)V^M1SEjs624^dIjECVf_~;pg;lyU;j?^_4!v5bdG7x7Xb&1D`x6Yv&Var>1_V zbNoPymTwR=K)=!=jp}-R*be;7zZ1T90RefE0nR5}Z@nMBzF+14pPXnGc*jrefyB}O zj{`67zsXN7GQV#=T9I;QAKae6KPpPP+kM!reu=l+I<4FFzBbN3G%kH>Z$c@l&*W;N zdO%s5~{Rt_5y@dS|mI^%Q=lQ?~H~1m{sOGc%?Ls$jXsv`=Uc!Fl-^+Q< zL5V{@a?t|$EA*(*qwXf;R_O=2VMwULX?8ZAmIA#IuuM+;Jg4J3zCXmr@x5N~IxOW& z_Zl4~4$kMI>GHQq$MN;hHh4Rri}qi_)1lw^`l@(gNCzF|Uj+P)OBmueRpQBJArL~h zLpwDZT@!Nvbvg9&vElb=-X=I!%d?z+=OvtH;l6>e+%;mC8+Q;seVFb0I)Uql`+F6# zIr8~IV&5h4`*xc57{0xRuko|;IMc&@_9ehKD{uH(`K*6^Oo!Yo0G?YIPoJ6uPoJ-t z-sSy%gXN+`^5pC0X_(l4ZdX0HA%0223JoF8c>ErS^d4(RaK+>MdAW!VYOVj^ei6R+ zp^72_G{Dz&+rL8iym^E`8uTuz5Od*^C=QaXUX{R%Qx&TanUa@yQWm`u(^PJmZ? z3-Qm^4QtNxblE*!Is5+3c=@J1uf?xcu6y*A0ONfZxXwO67BO@&i&!J zqPIfo2zE_F;TIsFFQ5I)XFh|EXm-lB>zWsg|pNG}THT0c5(fayl zwQ&6Js*?wRr!+)avcxpQ(qKcTDAT&;R_@Pd_m~zfBOYZ>Gp~362jk@obEJ` zNuM@5Ilb+^vs2MK^ao~~Bf9_LBy|6aAl>!B*SQ<7WdB@_+E))Q(f`hq|Am(_V4>v-Kshv(N~i zFOD03$)-sCr}qe;JdpFuk6o-uCq1u<`gJ^!wqRe^1^CzEo3^k%9bW`K(+B&`OdL;B z1umIi5yzKUTmu~^Vc}h`Dub*K{l<9W^Eu#A`k?5eeGkO%xvb9jb5XMt4eh0$^DRm` z$`8OkX63o>ljC+Vf}P9z?R$IbJR%^ULUN(f<$S!u%CqKY`rH(54UMroBa& zDv#UoP%iSJT!4x8pq%^b4)5Q4^m_pko1cY#KDyL?EA6hz6Y2@*fqL;^N|NSbT`=E! zn0#ALf55-n+1IPtdJY{uNFU?65%Bq*RMdVedpS;CBp>jhzj=#}tCW{yg!N?e^9kn1 zt5?f>cQf0^ck;&IZFnU2EKmUOS*lkb2?_0&aX&p7J@^8UG+hq7rI9@gB1C$?I3fcpFwY`s@b$fq%7VWt_#PKg` zyIpnso=W%qr{B*no}^v1pHg$FMXMKk_geiC-y<)t%F})S$>j+Ab9&;tu#RsnA8Yj< zeg(>vR%$cK*O1PW^)GCXe%8cx)A{H4KyJeN<9qJahPy6!wc4G@+H-vg+Z{S1dUCu! z6FNS1p6U1~+M7iGPff?v==d7d%QKEqvAS*M=J?+oR#C>(%2TNAch<3}XhKBRm~Tg?C5_I`^?L3xsG4_aIl zMdNhh(iV-Xeir4Y+d_@1o_&~?FUbeuaA{x3T#{x8$^&V>K%=b8V_As^0?|Gu8x z{D5{hO77X9KjzB&F_6HMjc?!}Qt`6_Tqa6G~;Z>^W$i*#&2@}!R?sa5$|8JZ5`W-S7{i&cjfDi-~O)nwRA(H z{6$<}^ZA3%!+k!IK91f5=X1;S=c{n0Z{{zh{{EZs$Lq;O{2n6KWBtL;_gv{hBSOnBV!nZ6D!*M`^mcsj*J|`!y3_k+ z^m7~2ll_y>+xCgQpOewM7N2V-k$2Yz_b)>Ed`pOr^WE`s`q$tSmcL>Gdb=DXb}!zR z>o#bI=U#N7`s=m&=y*XcVHzM0iv%w(pV4U&d?uYoUiYB3>wZo5{U?{p(BEsBsQub; zzlJW8jYsiy4=Enq_tUP`_CIX5DQwrlr9^*>qrQ^NLZ+HHJ9tIPH& zOEVbH=`97ASDw0m-6ZsMU^k34S{j@J#5f`lGyJosJ=j+CCOheaI#|72w99-GjmCoq8^Xtg|O`7ifKcuB-88jaKhj=^NYLS{ba6 z(lzy8RF2{2A)ej;BJJV1v#&?P(9c6wa)l<-D)jR=(*0hG%0j03duYuN0(sP*L@2;$ zuid||X6^a;kjh&D&3==j=FdLSnWgIw`GcbA6O3iwQ7b&F{YpQ|@z>9(xIIa4H~nq3 za&6S7Ywnrcp9G}S*ZnETDM3N0RxJ?_`MbbTO#Bo7Ue%1ECL}{g zlpohzJ@NSD{sHQJqvA*Sq=t@-kFtLEi`>t0zM%Xp;I)}>&hM(-Fu9-^m-oELFQ3n) z_e%xxxV=PuzjAeTp5*hW@chrgAm8_I!}0g9tka{OcS^m zmihgkeqPeY72lV1xSYNvC;hSa;!1^GT7TNs&+xGw3_rS+;k}zR?6rI1`wEX*oOtyW z-mh_|uip#f=Qq=P4_G~iGC1hHe|H4siW2vIX4uj2{u19`4Cy-}eDQnA(|bvm^j^|6 zgxf4|;r_GpbKw%)*Y_%AOz1b@9&5DU7v9Swb{tb8%-@d$_cP&K>G2>AIeFpDReAI8 zYo+$Rd4Df5E$me~$UVBGOJTQ$A)dekbjeG*sP}Wd41Y}2{X{Z{?et#D zFf~6DcmO_K!SsCYDjpmvlEpf^O_ejWVGC@p665MY|Lq?VtX#@zVO``$%rr-F~6nzmof-DjQhH-xtlk zzv zHkp62QP#UeTu#7`K-m5yY7=^GA>1_|o~u8at(@EU<{K=3kLhcfah#V>zx+nVE9OU3 zu45c@_!+Dt-p081$NQNKu>XmDpR_`BqDE^E^p$^6`{O^P6*L&$8QtA)S$&jxZ1?6@ zxQwQHJ0g5Y>|XuE-c$DW8%=@T-*bP#@$`0lpRmE?wPN&1Kl(iFhShV;yVnl+nlL)m<0S?~PXwF2hso0{ELgK)V4ufEs;W zGH3HJf6vnSmOe&0`ndwP2dRB$7yNuJ=sEBl`@NCvX6GM9Sl;R9bZ*{DILD{a)=OPg_gU5O+^#7m3@ksbtkaW=F)BnM70`M6gW*^d;`6KMlWb>1CHS+PXrPXoF z?TUXl7f?g@e`#T%)|0RM9P4c> zDxD{_`!M$X@?ReO%-?sF z?N=&#I(`5m8!tKt4}D{gZG5Qzq!t)w$4x%c!Yaxah$BzBdX2`@ix*nh!F*{SPcGV^ zVKU5n=G`tNtP`G6OX2Q$h3H&;@F@LR?Eu5C>yxQQ0MzZ#_AN!AJ zywldDlc5fcmlm~Xfn;c=(x7QGRZ>aFeu$xYMoA{F^)MJu>mbS+CQ3f294v zdjyKdd?_rCtdkRuk)wncBovSPnV+qf3_Y*;rA0-}SS$4^en#(P=orfje%kN-)5f-! z(fPQwcOmn=J?m%I?-JWTRlj|GCmRn;&i(x>$SpA5ZecRGknKOcRNMFSvAO820zrEU z`1W1}i_-PG^hdgSH_Mexe+mraJzO6^JLq@(IQv|M_7*rPi!5Nol zt>~fBb1viY9$0BPf1cG#z}kA#Hqt%bLj#r7|2P}&wD!|B@;BZCEQ5OYUc$Jbqxj;F zJnANAphPxJG3@aM<#tL-M3;hb%4vt?>gE7shIQgz=|n2;;|RSUUAOe*Co--%GgNBrN>B zqU0nde+`1}QTR1Rhf0Re0+r9?8ID&DpKhVtq?c>;*}Wy(g{-Kz^D3reJx}H7LB?gB zNbzvJb$#`FRyGNk>g^Emh2E(=u=|m(-z7urAM$}o)qav5NY{FvCcSX)i`L_IIIxE( zpA3=ioevnE&yX+h?=^pfeCyon`Q$6|7fKT3Z>fZx=3n7n6|@h1N50>CbH`)!uhPQ9 zv^&DaqU3K9Iw9O{Vdor)$dlQjK8uTZDLpA>VmFT~J)w`oM`Lm0M4|;^B|8p7qaD&WDZ8>rHQm zAF_PYmto>1>#_#_faUjF{CPbBOVas1<LL8ovlxy zo|&JsK??ZTI(-PgN#PGGUX}dF1lUIO~kKDgkO`de~~aQ z&&l8dt;f%6`TRB)(cf`-u7&gR*}UBDPtVyZp3IwwZ&p8~LilKO@N!9+{qpur4YPSY z`u~4j5zL!ye8Rl%f7h(P!b6Pd&dI!06hxkUUA^)P@YB9l)w7&xx5%iZPYu!!3V-3* z`MehGf8j?bSid!S$k#2@b`q1v*yPObsq=YcdZU6xem?@zA%E$OkXBi@Up-&xm7m(K z@x1HESy42E=3b1N487@E>^B z+Oa?RH`p=hxI7c-!2$Wc49cM&{(UCb3%}3B=~J@xR;Q2OFXQphzAK%LE@=1om~nvg z3+aUZO-?83NeDk*;b||hPYe80+dm5J|AJG{t!omx?H9T^9ZC;_dXO_2IOXyF`Z}GT zw?rIIX&$ht($n>|c0DU!&-no4QqauyGvei1e9Zcl_HPB#ONH$!ANe}YE3p2Ad_Qj! z(h2eh`6yw3bb#`flqp|%ITwg086431(s>w-gpLh# z?{v&XEn2QxAM1CxT*UcXmLJ?7N_isw(xEC( zBjfaNhroq;2>OP4_^L_dsXLIT)Z}TLTx9n0X6?vJXD>s6SzQ;iQ2b}ynBm24I?b?L?@%_wD-cM#f za}o6o?E>GDeW%0kTdTzzampR-`*^vl?Zv*wgFSf0qxZ*W`Z1%U|x*k9Y;k{TJk14fs(z51Vxgxj*qEC!2>=<(_`a z|2c9$JPEzN^Dk9B~>0|Ks;fXY;M1s!78&E%3cX;M-8PhpIo$XOuEl+ z07pM{SLSbzoo~|*5A7W1N1QhSzf;YR!u8dI;=cir^mfk2LO*qL&HSjpW`4A35`OP)0>P=i{es^KO%E2oKo%S+*5f>EG$JUW97jpeHu7?!_J?NOrdcKv%Dx{QO zL4IO>(So?mJFq^D7L!53V|^Pv_x&$_-*1z!2Q_pql|S-ezfa56?oU3!d|Btv_EDdf zoA2rDFVeOAKGFm0?bs*Xp{j@RedBbe_p}oj+yjC*(xw+QM>vo+{Z#efE9Z#Li;?eu02?E+;(pfs68U zyM^AKpG#UR@Jinn!uxyl>FwO#^L-MRCts)UH27q2RfhLMsUjJm-GclqmH(YZ`6Ewy zFZWA*A2!>cmOPa6?@{=EZM@IuZ1NeGxxeXplbydPbDtCG;8#4vea`IMMVb4GUM_x` z`;OUuyv?WM!QELuw4P_U-`IJ%REl~Bxj*Xq6YuB#Y3(_pc$nh_`ls~_a^KYVxzmfe zPnqqjn_R{FxZewYLT=*$?gxX8%Kr}eAx}Kaec-JAa=+s3`{MBk_n9G|+WtQ7Gj~47 z@_zm;)4OdPezn|f2_9PzQzCO@b ze1~?Ceo_ukJn(Ui$K^*f%*NfPDZlZE?f?6EfMN18DRW#X)wO6nr5jMY=)*Ae;f@=G zKpOARdi!pWj>)6@rqY)?ZqTUQ3t;2h9*#GeoRpXk`9RH`s~C6sg02fB34Bn!d)VNO zp4*+S5^DLYneY1Bc`M^-i!el)z5r`7RXP1tA>7F6!q%5tvRw@PuMOf>g|>aw(lk7kludjk86GI zZ~8tC{KB#O_Zt*1z-d2T2K!#K7EV0hy6ZUB8OR9Wi+&+U5{SO`oVw8em3x}op-)n=-}&v)p=Bd_IIw_d*33zCYqnLzhUzE zsLMa*QGciS)6a=x>PP0+#?U6%A^IV4On*||pHe?0j@=)pKNQEd{##gM`R*svuZm;$ z*Uj&YdA=|$&<~5_qP0gqEsoJUw12?rqn(lW#4Jua$UKVicVjdWI~Thjz1!g2kKSc* z_q+Qo-mK+h|JUNLxA<0z%YY}3$dScG@ie}{;;_od@31)STUuCWar)EQ{2_M#dzIzW z&-QcdaZJZa<~^3reUEIOl5k*;w{kuZ$MpN-yP+l0{~f|ud9w5KLZ;b>+jyAlU#Ru^ zI9eS)Bef67zBSAjc~pDK?p6KsviXscujBU~ZBF{nbiaQm86Z89GW+3vOeeb|ej)qs zen(R4&yxL8@AHa}j6)ORm6XW`_k)rl@(JUm;z#mJd*o-ey&YM73TN#lgZ)ewa-!?W z$S%f(7z($5{SD_gN++73>N($s2$%UE6ie~*N$0gfKlL9LIsJ_O<$(+@)SKA3cK7?_ zeZaB#cHXiR$jP%-{-a)}r+@Eot;hk>$)}7D<-=Kh+TX#wj7$HuzZ6%g@7WAa`%AHn z?s)9IlpE`pzlVCqvfDHrc1`|CKaOa5f8QJFcwBBUpDIdxoL_GSD_wt&*5~t*O#%z} z?G|=!l^^nC=VIqD?&sg#?+WKxV5R%}@IQ(Y&(4Wj|K$Fhj2;UmKb(gxMfq0wBTstq z&k;YV2XusA0(hTa#bwe7atgY}gFjDrlQYL79(+%h4m!vCQjPn$)pXgM`Ph8%T!D&DCZ`QcW zef-S3nJ;pu?GBlIx!tgJhxnOzEL?e8R2^qvfWEu`91l@G-S33FtNcF5dg4LKRjJM9 z>yliQ|E`zWe1>j<*i*`j>(w~DH9V3*%1bscGka1&{U_V+T&4x>-p59;y)#9Hj3?gHR-Y=#BX}D!llcewYZJ@%MM%I`~v$P zZ#><`{bdI%pMsn&8?iY1lP(*uxZ%Hy^YVDQFjSs&*>20vS$vnq)7zh8`epRn;_2qk z`T6nbBKTUKb|aonI;G1f*YPy-JEn60PnT`Bc8uQ3XeZ+7&Y!~`m6cG3)3ncV$ z9eRrN?H2mFXkzaNpd2tt_OYM7PLz~M2js()B*UZ=@KODySc!a-o`8eo_<7rLev+ME z&DtAWqx5pSp6n-Ip{H7p-R}T+rAI84%j55PCuPcs*XRC7^2}DP*Xfy*cQEetm|e~6 zzdwo?@!(A9m~Zq*%7-=X-*a9o=YO`tU{s-w&g!V{1^NJeA^A|8&a5=--Z5ozZ zEZoWTQcSqCx2XAP9qUPNAYOj|Rk~cWv-PiDljn`~7wL^A8|6GJP}^8PPuE-W_19>D zeEllzf$!VkJo#NU=gA=|x#&@a-&lW{ey@3BeXE|Z&(~k8=gsr=Z`JQlHwaN6FQ;?= z$eX`z&Vs-n6nTaP$NeM4;5>3Jq9NE=|2nNVU%y;W`sVB3qPz(4{zeVnki1;9P5z?a zuhsRJeEkZ&X&_&JoqlODEdS9Od|I^p?OGoF6cpt?theg))>D07LkB0bV(s0ixcw>pd{}`WqwgCxrj^G4PADe((hz z#Od&5eb6891)>eU90>RVJt@jPCb{T(tv_skLrrgm^U7)B{h|@1F?a zK3M}dPvIbCW9$1$4IE4p4 zA<|)YnjhC_@N&ZTM}~Yrn_jdI3j?_8Baf^?RpQ6E!k9+QQ*1 z^84`MFM^VHEhk)OFGFYtQ1CgyX+rW2rYAmr*u6h~&b;wj=KDR6STDIklF%MJZJ(!&-Y_2S zO_JpIvsIv6^1x36sWLx#-*JwIZy~@a#YNtyw)CF`7o({0It`)<2qI7842G42q0d+S zd_V9jN|wJzJo<>iuQPb57WqDp&HTkx)qF@8_$ZF!hrj| zu37x!ih$pfm|&tJkMkv2XLzq+eW~$3xmm%Y#)lcYd~O%ID*vS#tOyU$sM`A zG?<;LJZ0sLzwNC@s23(LDGa1M{@wW0?wj!MWVu}WeTw7k+C{~Q?b>VE0smgB+r7pX z!{=FwT5hmJ-08r}MbC z(d?GpU+e2le*WLbj|L$-<`e$@gr9Hs^DM}R9Q!(i+mZ0zxW9UJb-V-~SjkA+I6sAd z^PAs*XTc|J<2<%h7*+aUUbSFOkYC{ZEbQMX@GG!CfREnhwMjb#&hJ9_y$a9yU*&1S zHe4WnqNIo4i^V#c_Xl{cx!NWtQUrdABv1`%GuRdsrFX1D)rjD((%pcFoXDq^mIM=L(_w6C)5L$o9sPB*Uw}d z4T9@~p9_v>TX}20cZNt^LZc zC{OZrCJ!y-Q8Jryl*|ToqUaaoKj7V7fZj)g_vS$F1@eA`%cb9gfO7+Q4vIMerIWcD zjoi*SUd=Z#-PiAz2!3eV@0*@=0}UM7{RhDx&=TC&E@yV}pxr-}a{=DI>aXUo{|U*d z_mxKd%m7{Tij~j@Mo}KWC$afz#(_5;yjKSN+x@);k|*+e6#TwMv};*P_x9Ja;)9Zo z@}WKZqm$s9?m?@x4+xVM%1K(Vanj_&?=#OuTz8Id1GKcWhGFAEhOwTekaQo%pR|1I zXX!e|lLr~5*3aZYle6nch~z;MGQAF7jo|g5;brSwr3+d#9dZW#H3%_;Px3t+uCH~$ zK*}Tgt;)l6C+m}aOvY{e@&3D>xL@M;lBcU_zmqwJ&uSZo<`};I9q(JTxyZ*y_mdg~ z4E)H}!R)@u#O~jmC3h;~ft~;^r=tz}%leb2IUaQ1_Fcu>>EeET_ie-vYtsI{-jeV|NUYgL;vhY75{$PhrwMM z*2=r<*Eo99{Eiv#F$DN~LdgvBBiY7qrr7CMeX8*=VxPSJkKQy(-u1%+d}#MD>lOQD z`-OnN`?Ht45osU#)#-oQz4*U~=Qi450bFST2I#$jt_AY_W|-#=4m;UM-?ff+5HbWIpqg{ke=|r0e{&1vr9lv z+c!!E4-ntj$5W0w?)PQmYj!@6b~%X^4VecV*76wVL%R9B>qrmjTWDts>b zO_m#HuTL$n-_ZKbqr4`!JO=7CjxIQGI`aD6KbzYJ_|_|y|KvpSdSuzJ&e8g|F8b%vzX?94K=Gp**Y+Bq7(55mvU_#PWG+KjGEq zKt3_=$K&?a?W^0w^-u#5K81Mf<>pOqr{RLnC_E$i||94~g ziPIVH|LO~0xeoAu^1qT_n`pfM;oo}bpOD}4(@XZ8Y`kCg{{MIgaB{NwnR7Ybe;V{W z2jhK6H#pM&}Asx;{USBhzyq?-W{n&)^diMV5o^vR#81LWygYjPX z8EVJ-ThEbPkD>Q@81H}U;QJK$P>djG0(X?K6<9LZ-$x6tl} z^a<^5NSDy=hIBX+yZg=w<@MBd_gj}t%p69?%2#vy|5-Ut)QE|9O_zS8d(+8<3l?ed#^do{qdO{iPf41ND1cia`{r1V^^{v12rB9)r`sXjd?p(_2t>;KyL%N0X8qz0} z*N`ruyoPi*6M6l_MHBf0r?#&hCzDrO*UsK6*|q>IijugfVMSLkxzD{u_D3q*UXgsR zXLQxcfiijg`@7hGEh28~);=G{y76C1dUalUjPu8xk|@u1@%ORQ4!^ce9;6}k{rn1> zi{4a34%YLDh<|U?*U7{47Dr|Mc_#LOUwA>^J(J*tnX(IDXF1?}2YLI_#Hy2SMjVkHPnRi1l<$<$6nE`?G!? z0P`Q<2PlMIE<4X)=b!R*@38fb#af|%&#ghKMSG6NeyLB}-=kpJJ+|8=3Sxs!UGg9o zVb50ll5@Stl*j4cvxaf-3+o*{H!$94{PA;V$d@iho{s)B$^&SGJqC~Tkl$~zbl~-) zfbEw*^7JfZxJd#?oS!ps{E`jKcYku$R$wRcCjX_0>Uz*L+aJV%MR~d#Y`t~0`GQ65iX>vhQ{uG@9b;Cf}xTbb|Q>C8tvG$9v#R^=x@mFFXz558|!>0r725-4A+ z-y!{g_c*?oJT*JK@C{GTT85yT@?{OGlOvB_!Fd$;g6-`y;ATeyXT!^ z95p_|`g)cy^zQ&~k|_Gq1EG+oYbxIx^zTW7F5rmUPd~4iew2FX?>p7%Z!*Aj!dgAg zMZDi988}KigU01a_Hli?aXI7J`ESXGYX6~yz7ClTAJOu6HtCjOlvq8mQ_xG)g0QCr zzi^(*_-#w^I9~?-X8LDvZl|_OKB~mN(?^5%bEGbJ z8Nbc`jN^BZK8D|xzFqJGzg<3S>9=;Lu*0XB_8aVHcV^1DZe8s)|Jx&3{H#NNO4b7GA~cOT!{R{|TZKO@9G22#Rx{ln5PhsSvMHaRDl3{W0( zQM>d&`eX0&$~`AapTyp$tvrleIoEUn`|aONhx~vFJ(VmzJM<%)xH8FJI7~)_7wg5o$_9c=KDEioQp7XC%7w8VU-Zzi! zyS(J0ub_Fcud8Se`!PDp5~_jTj)H;Vc@TF+Ux1R zt^M`$dysGBS02}5QRvssULxm)FW~!3iOyt1&ISJ68%tXOz46YwO0M^#W)HJ-DFS!r zUAO%l;Ci>+bz5aFenrt}o}qtF)9q!&`U86krxWkR;G|3EwFYl=8C_#>qeJ$72ZUZ8 z=ovWBY4yR6?cKIf@z}U2dDrMo3a0N5-n8-V1hHFh+j#frjZF9Vji6t58or}*30G0-3msNi-0*3f&Um_Pm&)OOsjnzWjaGlC z4@w`YN9kj7nDJqb)w`S_^he)=TD?Q-&FEwNN>^{C+%Kxa7v<+BYv1n+NbTMR=NsyM z1K@`XnC@;EED%lK%)@zSE2M5^j$q$^$t(D)OEdHfTEJ7Ek)vh{n^8 z4rrKD?(#i$%!~Ye|B}HweyC5!%bi+HFrWa!^*-!Ap*`(bOC4mrI<{`>oiehvU| zN-wkXevd@w7OQU_L%1vc8|D z^pJM&R4!+@UFI1|_afuyhthpF<39fd96(?P5O#h@{>bCwuAiG8?a<_Cv}oaChA!W3 z2S=TrH!&alQ+nRQIOwGGgtE#L@>%I={Q#e*Nxt8w5&C0ANrxOE^m`?I{_OQNTKg3Y z_VSGGW$1n%^ftKlhVIZ?*bb8D{c1kMWHDhOf($+e6H&gJ;3$ZpJF6r|=Wd^-h;R zlc&l22bbH%DOS&1hM69jJ;>y>R_`w}c<0Y@#xr>}x$*mYoZrY-dUN>G_n=j7Y}{z< zU_A~$x`**b!)F}7136WB4)}eE6wTfj?zei4UzuD>|BHZI!TkLahhcZRWPZ<8%+Kg! z^njgJeKx+so~d2DjqpBxxZTd=dV|&H^qU-eq>Q~un_@}rKg!8KZajn-cu_nc4JIBNYv z|CK&2H-SDNsn&1J^v2{G^%Vgp{YU8c`nmt$_Sf%6$n4E>0hVV{`E04?kLkDB+ff^L zvUXMyKJjOQvvHs>7c)*40 z0uBdyLezWuSkC>taGgO=i98+i>M`r*hEMH$`%M9!Sg-SSz@7)$PDc0Tj8D4$Ded98 z)9&9(_AuUa1H){c)A-gP@Jcr!j?!%r;X*l7x=E+T&}}8*njQX9#?h}abn|{mB}zAg z_x`yb4*gTQc|8&zL$@G3T&H-GrNeH6ZprZ2`Ac()^~dpTWqj27-}3_%)aD9835a%qV)EKiA_my!FPL1no&)XsgEWQ_z*NzSg|iQ{^P_I`9}3FD`sEIp<|#jOlWODt@%bi0o`ZlxnxT4G@n z!#KW7@rqj+mX=u9Wa;q?%V$_xVque|+j~~Ay$4ZRLI<$a#L(|Ek6T}B{kO1*VI1>* z&A63eX^DkRmL9*(+Gki=Vque|$99i+E5p(f3!5z6?-y^KW$jzo#4wIuZ}l@QEwQl4 z(&J{!XINTdVH3k#^xXFVa8T6ogoN4pk=adOmzmVwETX<7M#t3X=KKDs$x-6(tNDAE zv7(jTr;&?BiHE2yG{5~i%Ev*8qXl2*%Isq=%O{UpJuM7#(NAeT;eN_-v3Cc>9Kmv7 zKc!V{Rq`~)^JL&Sx~=QDv}{^WfA=&6*K~|iNR^+B| zE_?g!Z)Gcp<5_EXbxol?#D2nmR@=L;eFg1U*qy+AwupygyXWALk@e*Q+fub=z+M&(B4`FL_rqUcfkjn*$_XXiJ%NXE?n zS}R}}x6nQ%hx=0PO@FQ>Yw_~?R(zhFeYZ`@qr>R`wkxMZl?`kdR$Zz;;q$h3Fi0NE zBk*g!gn;q;PW-#+zRsDiLyw>b>y(~$-G7v9(d1~q@E7%C-5-7@QW5sh97M_e>{Z&f zi{+W-*i3um(M+*2y|UUy-2nYKj(|{ z0rw{$r$N9F<}c!TG`AlO#z*^I6|^sRX3$X<-OpM0xe7m5<$OzqC}+(y ztHLkJV`A@bLytc44UubMCgd4dB1|u)9A)#gfxSwv9+Q(~-+;#5udbb^`8=vi?m5Nd zcF5(>>+$)FuXBu>he^Mck3J7uq}Ay@3HX-H!>oV)K0oLx|8#$A4F7Imd8dcNqyJ<0 zXK>j(>?W3*X#TAHGrY#l!-DiN{Ihi6`J+;`)2|0e%Tuej@oc7JePXHn{6h;de&e~b zmESK&Rxn-#Out!y`4Bnlu8yuLd9 zrGNTAY`??t_o&dv$6wGLatZxupN(;t_A4jW6h(c%B(Z(6xpntNMM+Ou79cyCD@PbH zQ}Fvn4@%?k?E4B|e*yVnySt>_@Oz zHrivvi-2pRJ;pdZaHT1ern6t+cdG{kpX~k1!n4}nv_Lx@!W{zMu~Z@t=ydE#tmTpL zxhU22q@_bc(BoP8l~d_ve=w6d8+!cf!dC`8KBx3}ul7F|-J+p^z?ki zF^Pkpe^D=TKg{peNV{4t7adW+EiH6J!PjXr7UrURH686?26{GpJ@^XY>-&_iTeQEq z==E8@F|$9Le(!yS^!r`fZ?11thP2!IJ!mll>NoctwLwU-V0V^Ch;xlc0(*mT_;?V9 zoPB<7_5QT;p&#!#L;dKVL_cEHk6o%4;&+*Tyh{mlKKk+AGwjE}B>h;Y{TQ)+@H<(# zhz^n4kEC^-_A6bsL*erEo$Tij<8$kaVgrQl_#@AJ8H8p_m=srOJiU0Umh*ezuzrun z?2+WddM#FZ9Wr_y&`{2AYJb9U{jijW9zbIt=anmj9>dRCIes537tLe2 zCp5_Psk@%*g#LXs|NdIzV#39d_7`JM>t>P6?mlUH!FSC8oYc*MdMvlu&N;V53#)8qc~sSP|o2RFIO-* zmqh%pX{Fzk46~kOkoEih%9zgsljKG#_XP3E?pdj&|BXifCph2gZZ-PbdF$kfOSGcy z)*AY+HTpl!g^ccPc3x8OhpOg9mhpfetrF&wNgbyI&#nxJ~KtUWl8>*(=WXqmZ=Tv?t@rTz^Py8IP zuNT99;OQ$ISGyA4uX-Hw%@*eSJOlHnq9nop#yU%HndS0zD;3bseRo~BQrG#gzlbLK z9{U#SFDsbtr{G?|aGm*EXm1pEhW(JUU4Kei z!}0cz;l=gSQ?EkBJPYX+p59D)NSZMJL#@7WFr<|mPqQ+zU zKC8T!dD3>1A;ar#wqJRuipQ!kc&w|zV@(Ynt7`D*ARf=`P&~tVzxMmqYCCWEp(#-eJ^tN;WSIS*^^UtVAM1f&NPcRf@hTkg zoAr)gtbu!)aVa!Qe)Sc8Y#ja_;2Xj8yugnk9`xrKS+avZqFuRXMCnkqdq*^$7N}QM zySJBcq9;X^Yul~y@pf;QriXg_tmv(r7qNP`TDV~x+y>}-uT(A%2~ zV5DI#+N^khUOz1OoDKbxR|x&zru5hDioE}&@*ycxF8scVr0nv-aZSE6V*GuM{3&;6 z=;K^s--Gu1ZTy^)kB6Y^`*oZ+uH_IHk&|(Pdg}XsA^*01PvmA$(Nq82`S&x*za6x5 zgIhI}^=j>qfA=RDUZD7PzvBbM*S>F(3@^0w_Yn`bvvbYP4lHGU?h(z;Pjxymo-`4k z5KqVJpTAot-=U{H%-7j^ki8!o!XJ=+K@RWIejKuX9I$@y!h-X`k6$=LejJ~KA8p!? z=dB;dtsmc|T-kSIlHpZG_ud+Qtg-ZWj^)Q}1j}{WD4r@EK3` zJ+qox-seNv{6y>$L@nD7wfFJ;9*}H)@_-14Jbpi7Hb0T_nr`1Mb9wDvQQeOd zlO+3bKdx}0oYKE465q0B>wNxHa{9Jch@7^loKlf<(XW^soO`)CQ~zp%*s*YYbGcfm za<$p)*#-@(az%&9uk=;E*_&d z17rA*7Df#J15AGj>@Dp7+1T3)#^}urici&^?XbAx>-LfTsoKX~)*rWzyDjeaaj(TU zXb5}sfiu*bfl2fxuX;10{FV1DG|WY8FY)(1hbRZ#i#Z=l{Jqd2+K2ANhlv-Av^?28 zx!lo8 z%*(k#gkin?HT5Q1?=Gvi-|D5GmEmpr*d=>Gcz_pv<)S`qKdgUuP5pOj{d=wc-Bv%> zdoq8C=1k7<(m$OmZ&@yp`mx{ET65mJ73mGpaa$mRle}Dt1tk2TFE^xgqq=)W9 z7P$U~dUm{BtJXih?-|1H75ce-sf-X7?;{=-xsrP*H39uWyRog$lnU1?AG+$k%zD>9 z|KIqL-oBLK>JEk%FJ!oE6~lWM5buu`HH=%x2)y?PPWXH6)q4w<8r)oMrwTVm<5jqY z2KWE5cP8+a*5$oFVGP7*YgiI8N01YSC3AYY4cidYEkLm`_x6%O!o=9r3{y)CZO!2o z$(z?D1EOKn8bBb9+c{Zg&Qz;WP=cZfZbVUtD?vemTjSCiYt>Y}a-Zk<{hs%{IhnAD z+vju72j-vef8W>V|9>0S+RJ2MPwKP&at%kC8vAo1Hgf&_!(0RI!K=AC$(^LTDIy~( zm0U-l^C=IS+j0{0rCyl56L4`--?1=za;HFlxh<#wm$E>R3TTLU*_Y)e8{hcd+4?)wL z5tCelboTO7`)bqQjngx2{Y5Q{R-gPGiKwL><X)|v()2Hp{K|-aIEnOVIV)d5)!*R@4{v~3^>`^^`RQ{0P zC6eD6QLmut_0Q{x)&ncgX0@&TFyiO=cRsR5^pPIbZxVZ2Pt}Rn({KX$p#Ew-2n)z3 z&(BNK-$eQ(9$N48-nsg7{zdYS{B}q^weo%~c-PR9*^jD!0=4}=p!R>;)Lh|VaGLpF zK>m3>$xVEV_7JYDr%;ZQ-++Gp>ok7|>J-E4?ts0i|7-eD_Y(ORd7k_O@*Ma8 z@;5j2@6;cmz3-EU!Nu|E17*!VSYCi+^n@OZ{Aj7P{99lz>7$-_4D2lKV$_;tVR zn?xK}%g3+ezLuVExLlFWZ?1plA$Cr#J@4$58cU4p-}SnGVZOuaRotJcCHZOo%73ZO z!}MRUs=1RePzL?zH+G1g^-Ha4s{Jzh5%1^D=lHwx_|wfiNG~A%1=MHRzalSMJRuq}pY6(i5%$K>9xsu6v;6S>z0sm4 z_iNDZg6zBDe|6E+9g+=}&fTzgY5TkAAKHC5f&L&)H=3!v)1vM)yo@;2@u*4E^Dzv^ z?<8I!{;T=g=x5#cxb+aQww0pPaFSq^HTK-bEfa_{mK4Y?9TEX)2Ec(r_y=Ng>Y9sPJ4d% zd-+id-tm#|aK!#uJjRu>tl( z-X!+l!kfVOq~&PgZE<^5@NW|1lcvYg%lwP;ljZK|yF%if5id0VRXv~akFvAoU$Wh6 zzo`A;|2<0NVG5|dV>eW+ zS)Xb=Tn6;dk8Y#%{BkE|Mq=^7qY%- z{mY0yS5WnPg_Ws0MOXa4%9QwBW4Cvh*q11#T)wwF{GQX^Yz|c(E+c=Pa)R2{G`!8! z@^E#%uQp!7dhPF*m$zq+f4O`AZb@b8ugrh#*EN4mIrT>4UEP?+cs%bE!;F|{zQ}So zmRI)nbEmjh^PUFz$5fo_Yx%aWnV&4K8@Dl^SulOIKfT8O`f(of8I1G0ve++BccY2= z;_d5Jsb-q4Xo&4@2<_r^C#+ue`+pONX|P}OgRlETs)JXmapcA`d1#$OXXa-mhT=^rrvJ$wH{{Vui8ym z_?Nez{o;@2!wVbCdffiB{}m$}hxHwwpfQ?)$bENj+X=|SUQ2=!0(KP%zy;y#wL zPBFZ`YWm*ztx|o8_r3bjFDJ{tcZ2a|hsfi}c^Jo+UQ;Vmuh(Q-|2+C&$^Tm=Um8?j zDq~Zky=gtJO!UthubKzex;uvM+REJh@|aS;ZsoPX{$g*LyPuZ1+bEvXW$soUqr1T} zci(x8?&izfeLdk$%TNBZc7OT5V_u>4&ew}kKl&-nhoyu+-k&AQvwR?Pmz_j)s0s z{oWA!y`jh6?|nwjoep+>uH%rF(-XaavNh3Oe&hWM$2YByUzGBG-2Dspxsvs3V1xeU zuAgcDGRXdA0IJVJ*+rE1yCL@#O7qC0tY6f9zl_A!znkFu6*|8DK--ZHlJfI=1*hy5 z1G1|A-9n!i{n=^9s`i@s?ndMExYSc`zdlZv<_oO1zeD5odtZgVh&QM;X6aU--V7j;k8(Z{vPl(+2(9iq2OhzE8A&dqZN}E7h}M zn~Rm^PlIHiKMjyaP4)W@kL7;d+id=pUC~XGqt`&P z&uA6ALLMeBlSjZ8E*XaxEKOZ+(Ax}+sI4gR`Tjkkx`)7ql-x@mA@`Ao$php;@*sJDJWTE*kC1!GqvS5~7`cO- zC%2J{$aua!u+(@1$XUGfWdh#Nn@4m4dw;t5%=F!_^lVH~3zElpTXT%4Nwo zLgqM@9Rbr_lpY3OTMvKM`8QMM-*lOO#WMf$^e?l4e~V@QEtL5;U*_K&{bT&wdo8~@ zEAr-lXO+$>F<(htMq|yoLf>J~{lC|j?f)HpQgU69vVHQ>x}wTB>aT&mOcQLLm~OQBtIl&W5{}#_ zGuHXq+I_%!%ySDG8`@5O7pwYK3OO+Nv1!m zSuj=PQp|jZ#9#N#MPAYB?fDIeik!2WJ-N4F8p-vv*O$q%`trFGf4A#Pd3-0WzCeyB z`F=;Qwg<_VC%V3O+keB<;TYVp(huPrNV z7}RLWy>mbJej3u>y=>|C^D2$s*B8Zqrd!je;d%NtoX1RXJjr8x3HKpirN}(Dc&_%e>+x~CUijWM=U_Ph zl62bq+23VSdncWF%)7;D>aaVerlNGc&8tkm>(fW7{{4Ns8)SYI>%Z@Wm%dQ-pZ~z@ z9*KXfKlZxe@2P%xX5)(`{-&Qym(HKc=Ml+wzjPj^`>|SXS}(@`K+jRCFds{=vi@>@ zmR=#RS~!w!GUjb^J_NoN{dsK#`}cL_hxCR=qCSfpu=y7r1$R+9(&y_5Pgj&>yjmEa zcEqF7PG6JrZjZmm+vAIPmdY3Pq&&Z(H0n!I|Dm#dU9AV2Z&H+&Z(E*r2;^{u)&I|n zd96)!wVq?2Mas?ENv;67St(yK4|LZ*Ce zdYDZ4+w>rr^10~&GUa#EePqh_rhCbh|4nz1DIc8fAfp}2IXIc}#pzZu<&V?NWXdO} zo5;Ul{xy;*-<-~nU4FWr?DEwsEHA7Nqr^&6xT0gf)J(c=n>wsDnxR9U3%h>hR-k+L1=$GtaUsCQBn|-zS z3F{Z3U$VDi`62iD%%1FHGah}67y1kD=j47L%`-HgA-BcxevZWl{+7bQzNYlc7M{lE zH5MP}m+WDGRMtCjynkx;pkJ~#&3u5q`gfh#gMP{0D$@sjJ@0#k#;<+F+{gANQ}B=a zw~C!t%KvfykY7T4q!`|(;bg(F`|&Ecr@qE#PVB|*3pKHO?Z;#N@p|Zs=AB9V6B+2s z;B|jef2tATw7^{YE7+6p}y3h)YturE0gZ`wb2~*)cj`}-+t<6m#q9^|HeCD zKMQj|my4=Xh=-IjuaEObx>y>PP*J;Od&#-PK9|rbb}C2jPeL z4D3nR1M+{I{`@HYq1sJ%X{I~dVdiq5g(~t}>%U}0!kKQnPR9Of zkbNl``>R1VAY*?u$X-Uq{%VlTfeWj)-x{O`$UZORd}q7}^Xw4a=gARyjQn!)DESrS z5%Md^)0PiW7HW`Pr2Yc+p$6G|slQBps6qD2)Ssh1)FAsM>d#XjYLNY+=||PWrXN&) z0rraMmxDc@r@Ja^cR}`ZD|vzZ0dQdvoPIxfnS6`0&3A(I z&1B4HgY^5zDcXN8xrRJV#`#!~elr>8V{$*2JZI~wAbk@V=VL+oMl#OFg7gh!oR01)Y29}Ci>gn$F;HfT{cYoi_8P30w zYiR!s;K>o#Z~u2Ur~P-6t7!k9!4m_p-|`>EQ484jwPZhp?%zZADY}0nczhJ@vp<0Q zJuB9a`Tkart}uO_|LMF(&e?wD4?=DE8r1d&pz_{EQ2kYK|5u<6 z-Dj%2JBIv9FOt1}-%Bpi{LAE4@|VcoUU_e?&_weu(7c)adE;QO-vex<{sQe)k?$eb zlkX;H$e$(GkUv9SBHu+`Aw#ZD%AfoxnopDG$qQuMKl6Q}ApJ?2&(Zu7X3qc~u(s%%q-hoc;*S>*@Z(- z?{yZ6x?GiM)%vOum@B zLf%PUCHI1hDXR~1zou+nvVwWZKAgV={XaBLzCXDj2c*gKBs*Wq+4hT_gS>vT>`(Dr zB-*oV;RXETo)JWj#Z_g68w&mys99 zmy;LCFC{OL1M)KYGV%&JM_wflkW=gzUqY@T{}Z`}{Ey^%@;{I>Bi4QS#f#W8}Ay^W?XZi{!VEr^$QCGvqgu=g4E^dGbx< z1@evLMe+^gW%8SxSzgzZeI0ZiIYs-|l55DLWZ!>jBQJ3N&`O>sHvQsZND<+TQ_p-wAK^w0$yu)B@ z=BFH?r-qO>(WuzDm}sdSkII;EF0FBcEw7hMQ7yqxky7eWm$H)An}s`1aL z{cIKTBb|cUvWoJ5QUig1B>tSHQ#O1P~zug$GqO)LM?~NmWJ`4XI zbN=ix`$6?JP`gJ=joOEywhTfY8ZcGXSvF4kJJ3h75rDNlKxdr~la)21G z!_yyY{$RY1hA>Zv`Y}HU_rafNUA@}J@E&Wu!aM3g^=;-Z=$K$gnv+y2D0FjxD7Vn5o8`**Vc@KZGrxxf`u_uw9$$iZ2^DDR<~zN}MN zuDFLM=Q3p6!%L0_Iv$Fgp1DivLv9%N@{;^l?uwX+NWK@DoUn_OCUX z-YKw;H{m4uBTet+n{^y+M1MV=ftsj);{4&booo^hGv}sYmtaT!b5^ zoAZm<-MMAyID_dxwpo8}>1cvKvAa!W?waUslI{D6hPy%j#o<1$EZj4}@q3_0gKt1| z?VY7m^N}RXTb`bnN9sKTO=@N8$F`1^c^Ss8jJbvbI-I3W zsr{b$S6gw6&5LpkBc@+lf%SaYP%svGX!zUkW-|8;8?Gf|zcFmMhRppvz5{vesWKsx zpUrPYjlVBcVEiWFzUN4OUx@EH%R7=5ZqJdc)=%2JS=@&cO!p+>)pG{Fr^S4#t-$_; z-_NK_-Hm)}n6Vj9DLvCB*DJ(}RlV>8Y)_%i>p=x`X9Yo-W>}T9+<-UwPwn z;rq(96|?mJ{pSDd4$V#JKigNWT;uO8H$s25j%op_ioMfetCCF&Vg-zxwGQW zu)f&4jQY`!ecv$0{&#@=Zh-zad@1@@ncrK#Dc?bZ8lu1KtU$ixc1ITQ4hdH)L}$gg zaa7H9UH1~gYv($!h3miUoayIw51IYiiZ)X7?G-9F2QWWU@Y4L`Y0o>9KcoZ0;U zozE)OyC{u$m*;oH?{WLR1MSB(1wppn>YZ{%ILg)->pF4G{aW6ONRE@k5`L6LI~2KS z%V&{4$9_Jt0ryIEJWcH1zv_6AqfB98ksN2H#XnttKGA!U_a9kWkA~x2h!5vOnh%ns zRKWTYog@`Re%>#Ig;C4z(!E{IU(>#ig#0YMYu7>hzHaX#`?|iDjCH?;KPK~nUA!l( z>m!R#KiXr|zhL>EEbk`Gw?sZJ$hdFwkss>)+$Kw3=^oY_Ej>y1YTw^KRd+xClC}qg zQ(JMj*$>Cj-sQd4wdGeZW4lM)TNaNcVSP_ck`$lAsQ>poMep?t(jWFKg#q{1(kJil zkr&Cmq#i!r$L|#ujrf-z(TSpRK$S<*oUw z@konceW~0g%%ctWg*de8{30*$(sr%CQ;yWqlJer_PABgT`8%!kGOx|Q%B)zwP|NSF z>=5^>;?FFW!!~}e*&o{c9QZ5VSE>JEzgJX^_kGVOwMQ+tqeTCS^lLT0C;i$t8?;|T zK3Asx&g#i;qF;ISVSGDYS$ zJCM%t=C$_A?792O6uuKxUVkI5pZwkFXfwi-`#jc9_`CAn4x-Hn-}|9x2>q?rGo8rz zds@+6^wYB6VDXcFgZ)lCUXi_BdcTBmOzt0<`I>%1+e4zAdj3s)Qrju|o!W}iErNQF zLQ|ssy{nR?a;~FPoYS&*mkZhxoa?w*RZYDEV;!`7if% zSx=C^N%txCbN5*NOQ9Z(SFNp2W%WvH)jpN;bxoxFJpXDBL;X$Wj~G|Y24*dFN^a4@*YdAQ#4BlEz4Usl z@zLL5GX7{xXSp8M_q{c%XHQg9dF!|qYB;)r^xX)KUWE1$F+bHGZD%^Xsee63Asxy3 zmS=stZIjMdFfR`|FAR68YwbV!5DxFJ`@QOLC&NplJ%l^Wy4d%A2J`*!hz>LG^73_9 zG9ET>;CDaNUdF;j|CF?+?Mvo0)(@#YO{&~?G}e4wdmkMAmCWO@f0RW%S9@#kgO6GI zOn=RNaP&i}zxF;j`Xkj}dmkMAQZl|eZz=B|llQ@OUZ?F+>w(sjrAjRa@1GaZ?hD>O zFOa=|o+o?%JZG%&s!!}IY}9XiKC1osyRin5Xh?n{eaUppNjlcAqgLW_5HI3#@Np&S z{$Tl_>HWkXYI+fWc_+u>ulkZL@@@{+r~ZyYIDvJqpKHvXs+y zTtn|KTTq_i7S`Jqq|@C+oF{w#=I^Wc_Zv#*L);f&KO*0Yw0v-Pp5M8`u%$=pJJz=a z+$)j%A>+P?+=n3J-iF)*C-YuLx=6--2ssxd6ge z$oHnmxHlm0IgxQ6K-xbU^8V8P$&lxl`2`vB`O^N$qYS@|jC(y%x|NK3KXNWa#=Rif z2PWg*P?T;Y<6e=xdqu{*Bia8Y<6e^7Zzhj1{3H)Pz`k^YB_`#Dnn^llRg8F*5G8NcoeCG#?@3K8ln-8TU-2{K>dSBIQrU{SYaCGVXs!`IB+KL&~3w z`x;XIkZefsxoOaLx`Rt$_a@j#Qat+chXN__X(k^F>dJ&{u&KmV5NV}Xh>Q#^)W;#&s zg0#z7cUgG{X_vF^CA*w;ANl2UKR|Xl>p`;1Sr3z4&U%DANcW>;m$M!tyPS2N>~hvc zvddXdlU>ewhU{|Ib7YsZo+l45`~|YhSuc`Z&U%ULa@Naam$P0WyPWkZ+2yR!Zw6_X zvqrxfr27~?`rRPya@OdVgS5+8qu&nFE@zE?JxIHpHTwM^?Q+%_7lO3QS+`oh9i&~( zx{ch+@H@yaBzKYjmfTD3A@`C0hCD!i0eO(zO&%scpFBeDB9D@HkjKauk@MtEa*=!? zd7At@@(lR`@-lfld6nD&-d|(oCEvZV{>0@@f_~1g;(iAGg`BIh-{Cwc?x#3Uiu*Cn zqYCI>O7r`A3)lA-!a|1Ji}gaGk=#daB4^0xf25xyqkoeApN#&?#6VZz!|d312>Xg9=M6@^1#hxmj`YoyF73kd4TcmAiF$p7un^3d&w>j z+(&kK-~qDB0}qm29(b7S^1vhHK88O^c6s12vdaVK$u19EB)dHDG}+~WXUHxOJV$nU z;CXT{!(Sk~Jn$mf<$;&TE)Tp+{u{bqA-g>AD%s_MQ|upH9=M9^=QuTFmj|vVyF74) z?DD{kWS0kSBD*|rGuh>VTgfgD+(z#3@+Y59?jrvmaxeL>$$jMiO&%csFY+L{ojgo_ zE_sBEb12!5CjS-9$H>ni=gH@hi{!r~Pm|9j&ydd{FO$zEuaf;-teO3apPQlIlm3tP z(JxB>NJhUY^FU)=xBE}`4}AUU`)BLqVRaKp?d@B!c*NgD*#iBIzW#RqE?p-Ni+(z}uTXwYr28ov{=GYO zUvmWG2=|ly{OOV8VSPU)BT-X-Hp#rL9QY^1mzTN z%2)()PeDX-l{nbTr6}iG-EQd)x}OWRz0K69r4?$H?RSXnc8|ALv{TvFLjG`T?eWUF z#&U=_cChalAst__@IyZrx*qwc^}zB&+LWrkPp0z?{YBmAfBbvICHd9``1hFQ5r@ov zP#r?;9yB#-AAs7@2X$|+sik{_UC_^VK!0ix`9ry>ko$SMUv24N`MO-bpC3d#=Mecf zbKfcTOYK*tZiTWi`rCr?iuSTzA3*=@=WC^K{)OSN9$k>p>`mpK$9i-j z>rp4`Q8(-d?FYW0=uy+*x#`iQwjH7<^H~yWO@Hz|5qrAqDLT7*}{c6BA}JzBe(eHrYP+OOyTYvJExZeKsM`F7C#-%vODZtk8XGmrLS zKJWXhN%D^`ip&E<47CPu~H|)jk>gn$6GIuJ(AU~1ULpz>gyV-|! z6Z>~|nSV#oznyR&hvVl?lc=|`d!93u?9siXOMkJx(I3FlS5Z9|I)~ktMbG>4^;&^!fKFRu&FRM?dmgN`aD|}uN z`@{MWPL$QB-<5i?LAv95u~9lVtWSrb9&AvbDpQ-x+~q`b4HsL5^6-Mwb{czqsZ2qh zDcPTmN=KsWg!1n_yh7@Z&)ehgByzD3{SJKJvpl{X$EtkN`tMWxs^7o+S2@p&=dbbi zgE@W|rZJwUF<-`3z6`AK%dV-H zNSFGjKiS{oIt%%s^Gh88gX{|OOE{zUvdhRX;k9zWOQxUfr!`;XJlOQ*z75rxb@pbY z9VO*}e|e17#}`RxGEbQ>CBEOF<@7}5fM1ZPkA6-a-y7OnW9bjKa~?#wif}vTJ${ZK zZpVB_)}uBL3%6sQFu z?h)v`SL3VW$JeBMYUTc){wh=7NBI>D&AeXAkLl5Rwpr4YE7Y64&I%+TESzdA`y0sT z!dCJyxq&=L-b@|#xSFwqi17&4FF%qs;vywU47T-j|s(>!&^` zb3gab_Zxl}+s9sOA3H7Lm8rK_I^~@c=2wyI?Kw|Id-wH~?DtuI%K10V$H*h(JQ?dS z%?G`|wu|3wEy<}joBgOC<(w4P}FIPg7{C#^?$j${8W+KPJW@|*$N zNoDF>^FYJbA@qs#d$0RFDc2WTxoU0JcGk;s`1P0T6_2xA8#gG|f3k9IWVtp$ov1-Q za=D{2`QJ+JqK1^alzlFwdjoe`52Px^^Y(8g~apqIk2Kn?{%cm~pQ?IF& zDehx&o-6Mzn0`;gF676l?8nE^U-mShet7>Bo+g!Ce&GcA*Phe<#@zXSQDq98Y@asn zCi=e*-lO}wGj#XI@Nb;sc6Jrz$bHyyf8u?JM0?lqU)N_^qqW`t^Diq>FU}2`zsY_< z`(e2+WZ~+(BO^9sJY@bXV80`a{_9fq>s}9J+%z)JOcnaip)O;k%~4zWyLT zdQSVcnV0GhIGN8ck@(2G&ccuO%ppDn%wt533;KJfO-;J9dY34lX{Kxc11jf;`WH^1 z-X-1n`0)oamGSvSZG}v;?f0f-Z&JQXZ~8g*yYlV@>>a4Fex~*i?d4^z z$Z^NlUnTivw7Zi0GW(5KewqCTmP@iO#=KVURigfE?lb?rzlk>Yl3AZOcah;P+T1~| zLjQP#p^R@xN9nt9OmF~Sx~>^93(<>*p+0pG>hlLo4aZS# z(bggv^tot-HzSuY#?^Wb_Zw)_Fs@8N{%ID?HL?HL_Me)-U+4bgUKv|`e*C+< zzw%Eqb+1i*-^%;R+<&}FzSF4Vm@H3Zy@PU-_baS?qImzY$;v_QJ(#}i3zJc=!tEI{ z>XGbMl2MOjzmhyi_f=%nTiLH9kI;Pehni5i*Fat&50ID1UF0QlFL{yNMqVIykmub# z#72tz^h+gxj0RJm1^i=;lmchKznq%A1USQOeuh(|#3s znw%ofkXNmPlYKz)3OP?+CKt&|}tS`;vIdT)rbCKLg_Y35D_n%xtUM5$OSI8+c=Q%@| zU+Vc$oAe7le~!;DLhBY&vo}J0hOd{d1OGmsTO9I?(!Rp))49caWG(RfFs@!DbFA9b zPOB)DDV)#zCiZQgtaFR&mVdM77BBrhDc3eDSDRkSxy609j{HrO>yveEvBS!>5%C^x zg6jK+|Nq<~KDRr~@~MmY)NAT*>)aw7$2g_)>F&Fe=N3)Yzl4wZ++rGXK#Be6@^gzT zey;5v;l23qUh_YBzVOKB7w|uN63;JQWbyI+tFr`UvM2wN{Us>8_RT#^CO^e0~x2&scn- z$8l~k`jy9aZt;^pD9tZ^^>d57)!Wj!1?pMp+@eTxKereo`?DaNjEz*K6GO%JG~>_78rh^|f?v zf%{&$f}dNY7@nV7RFVDMqK53}7WHI5x5$va9W|1Q~jJa!t+0Crk^`UYpeE`T!(Rf5uaC3p3C2fT7Nzvovr*Le=q*g z&MSC+vO|tTw7|7r|Af{Hz84!#VZB((`$%#=X8GdpZK!>@?)7lVe1YagOaBgeY{>nU zZY@>I_o}2`(jM%`=Ojn=iY>(BKJ_=YKS%orU+TH#S0~>Y)OhHxbYGeM&yjtmFXw4! z7e{s&tNjb*uaf_Z^dG94Z(U=)WacUlC(kLC(mR>5_5H14_shxnQvN!sE}4ISjrj_~ zYlo`-o|g=7a+T&-zpMGar29$ii`*(gYzLD12e6+JwZmNY3lTqY|GK2TN$g8R?I>UM z|6&P0YKMNUys4zWa1#3&t}p4aaZl|R*Z7Bh5Ph#sj?_}o9Vv^iFggu9Q9nyTg6=N zHJN^#Z~I1QkM^s<8n3pbfB8|^t493PTqSp+YUs!Q<;Q3b`f6|68h`RMhpOg3S(C0J z&7rEfZvDjhou4*yP0#g7cl&1GZZE^{2dljwt+6);_fjr0T$TJiFi-dNU(9!jx!g-L z{WyIG7HALp+J3$z{zrSEuk}|sj&E@h?s;AuPA$QGH~rZIbAOL7uCG(eW^YytL4Mj^ z?pJ@kK2NT|pLW<&^XoJo?a=rBUix9$qkX=Aqy5u!#NXIIzLy@Hseds0qYlJVJB4}HncKTYZv zGtigx&aKIhM$?bl>7SUtGU;xz3GSr4ULpF?UT~aG2b$rY`q3VSBjLX<8BVbk_V%zG ztHE0CpI&3H4dF>x&r8N5-vRg4C38JGj;f&_$0y%Kd(hW>yfW#3zL(}u)jV1gP9M#o zs`;O+F&}_=zlQ@>dy;jfdXXPAd)kf`li}|hrhBMr{< zkM`T^WBXUH@h=a3iCmAwFKP$J{!A9(5A~&Af_H^$%!#{CHeU5L^PUOE*J{HDcKiz8WQRH=O9E|T9XPcqFSt^qJ z!dlM9{eCdz-9o?r=kgf!w0AV-Z8GnJzx!%Tjp`cVpWhRy%a9jo?(P=I^ly9_>2djm zx;D6Txs1A2GU6N6>8L32ZZIVk)ir@#E~BnXvqR>kln1NpAhUm|Ya?@>Ro6=Pcv*Ie zdyjV&&6hmhWTZc;s|PnQKK^bD?`g&F%y@dzD4+0nP2~|H;$Pqa#iSW>qg0#$47O8j34ItQ61$93Rnk3b$v9)Iw7j-C1afw)KRX3>!qNM zavfYZ1$C6`;P-igx>35vIx486TnE2<6x30!gX^lGj&dD^D(jzvI?8o$ofXtkuA@*- zbINsa-4)bPu7m5Zpl*cWH_<-jI{00!ppJ4KT$crPlV`dhE03V=>sB5?-RG%~b{o_^ME%cEALDXRw?zE~>epC%2fb^AX_|0wm}NBt`5-$DKNQon=xbJU-v{uuRV zssA48cTxW%)PFbi2dV#I>i;YC`>20A_1{JP8tQ+D`tPLvBJ<&c)c+UiH`4xX)IUJ| z6!mAQU!*?9pP)`hYLTO<+fV&^+W!Fc_fda=;l7{xQ`E;gHK@CV`jhTI+uzO9pP)X* zwV>{O)E{^MY5%>{FHnD#@tLN6-t?oBnrV*yR>ldpZ}F7zij46ws>>Mbd{zJO?`H&c zE9S548!>%mP0a1sTE>YL`sd@*D(!bMzAjhQM)%)fJilNbiM$o#|1s*{OnvMJ1$8cm zRiyiG(%u(oZ-DMUPW@Y`-^cJ>ZmXB>zeRgrqP=0d{{;2l@BY&LP2>)`|2FM?nfi0o z|0MN4K>b0wA9Md`@84+eUg{Sa{+-m<643D*`&~hu%aQfb{W9$>(q5kK=czwK{Sk)m za%YWn{~g-9kM>6C{!`Sy&GqTt<MOA z{$14n5cP|6?{aW?+JhXI^y{=Y&G0`%_qV$~-Mie}Al?5v?L9zyb9Db%>VKH}dAf(3 zT`U(^_aC(PHQHOGdwgdlsQU=@n;G5@X#YX#&(r=r)SoqdxyNAovmK@_-wzqF`POVB z*zdK6hd|yVY=FLh*D`9c?YmUy_apo}qr9ILwXB$bVI|~A!cCMTX&Ht7Cd!Sp41*76 zJkprw)o)t+9(eryE78{kRHk&-5bx|6A&$=Xb>K2m5z!qM@SYufNBj z_M~cx{Obzpi*QC*?tL3;{aSP1J-uZ5$#a0bra!$%f9I*rz}~ocCO^FgtM{MOzw-DV zC-NQ#dxt^uN9{k+d+#qlv?O;b`#p%)hVL%qY2Ih5^kd`>@+i5BJVx#{RrB$xqxGKd zaLkfq$=9lw9}wQfcNf(DF~a`-fTr_rmrLd7a>DYCtF`-NelN;Bk>okNzWb)-e(X2( zydLXMxkmzbY}b`3^!wr25~%#N-W>YCPae|0?|o6>`ePef^-p`hPog6G1b=Ou40ogY z_Dc!-_o=>pPWCKH-zD;M!QX!U(872!>c{*B_2a&8X#K$cg~*AN)sGP?@9=E)pHe^W zyX&FnsOH_@3*Xh#aJ$vx@ND* zGTO(?2JPc=YaesgF62ILS^GG_$~(8+lvH?u2>;11%2ptME|5Xj_`l))0!+N3><`IW zTh;z|j04UW^}AEr;*#~Kc#!zbUS-ZxvoD1jPGLT({r=8x+Ia@T884dJc}VNS+7zR` zn6H-lXUvO};f-l{Q}q8zs+^aFlbGjfIOl#H_uAFpu#jhXV+`*!gvWcO{(a*c;9cpy zO(Xi3-0shtNoPe`cF-lB?KA(aYPehf6_xM9$@z)xzl7Ek$vomv&L_o{=4kDq$X7jY z(qGuYdji$d@NdWJit0y0!>eY#V}(3IUM7!{m&jw}MRK0JK%OSglV`|t&Td7eB? zULY6Ai{w0ci9AMLCXbR=$Rp%c@-R8Y^beA&$OGgWav!;#+)K`oyU2~?4ssK@joeIb zCAX5B$!+8&atFDQ+(piid&%|WK5`9tfLui$B&W#3;11j)33u?m$k3|0`=Ql`PTmvg z9)Z5hMfDeT4R(^`F+i%#NA1yqk;m6MxtKV(7>3byl)n@Lblz2{*%D zw08jEoCGd~^DXpae$K;wE{?x6dW}yUf9(Y17Y%j6zm{I8%)d?vAMyVR;{RIMpGEYg zoim?ed7dh?^W$MJP7lX9f+2kx8|+>$b28_$#7qKr6qnU4y z(f_D>5&rSJHS6C)-iP>K)rR<=#`t5nOC833Hm<)<(cD6PRyEACe~#~Kk6C!W&W+Ad zTgm#2byIi-({Ucm4`aR6U1Y0gQvdabU1h0f{R>FP-W8}9nsKUAY^%-6)EkhFGwaPD zY|5CL+tvv6*;}EW&i8m*zHa3i?0pDo{}Rf#dJ$^(0@U_-sM$HF{7zH28~*w@6*8TV zT5nZ&M1B$Tw^Y8DBmUf%^89<$_SZg#{Aihn>iY?C`|F3lS2kI=zAxeDwvSrATg+K1 zIvZ-Kzjz`1J>l_|7GUlqmfu#E-|;NJ>=D>^+ME$+ zDX8tMEVmV?Ez71R=RYg*K5uvc<3jR1w_EM|r7OSCh}2eK01)|7+pmnWRi-cfiK(;u zEV?#7QU8+b^OW*Vm?z%_dfkuZU7%|R%^+#N`RB5qlC3d+OYZ_PyncjtDZiJd^E&Ce zWFGb>|cbDaR1D0Q5;fF{czqb|^zC+H?{2_8Z zc;AebXLvEf2@jxs9(zQ)Y52UewgL^--w9OxYO%2^jeV75yfyvF_Z;=T(d0WMD!qs_*{^Y$tt3S0B-?Mai{wL!*DEY4SU56lz=O0OZT%Z5L%>O}_ z=Ysj0E8J}1*H-+cNe;?>s)Zk6H!_I$k>PGH^?PL7#SeynP`e7|YE{148HeY}p}VP$&jMH&8;^XNEcY?!_97nP-?QEF9rCEV5%HLU zJWJG_Aun6~jJh!nid-uh{b@Lb{yFMyqJ5+%>TV`;T<>lrS6RHH?lv;&LDbzrUZ!~$ zndkf6z2sGz_Zf?vA=K(&sM$fN=>bzkj?C&qkjD2tWgnl6?|+IM9U0#T6?p^f06NhS&<7M zk6QTAP!;2`zIu*)GpPdyBtse2%+EeGkXkjDiQ2XBsb?7aomdbT6*~|USWUm)vWUn_jk-c8sNM2;Q-auX=zlrSa`FipS&95V` zlCLGFygrk?J>xsArS^>PwU*j5zS|nc?HS*1EwyKS$Fy zwL)#k`~~f!1?R;69;}R`n7_Ze%REZ@-=*`P3HYz_8mqE@@BM~`_htE{f%Ko8|8zm! zziR0%&4c_MwxZRu(mbRQ{S42`ot2QN42+N_T&%w%^ol%b(l<-Ex)e?tG(};J?7hf z+7merE62oo?AvOO>jsgNKzw)Bn*(_#$T(RK=5!sJm|rE=^&0LoWe+R)ebS{e`&Msu zm*QC~_M<)6FPHJp@=w0kyrMRue(ak|IZ_|{=JGuVidbyp?(!QSl`;9PGY|$JP+=5e^0!7 zIP!hFN~yT=3(rHnDw%WscLv?b{-e1&7aVdwKHRrp@hD$UcRq#woCWrz6Lo)XS-7mPaXL4ur@WUPPGX+)WVgpht!EtH zWPOft;x}E-Ck7DiWZ!Qo{8onF{A&uo2J?sw`a9W=GxN@hqRo2_wl6dy{l50^x2mF|E-?QqQ?E6B4@c)!dL+0j-D~Mj&I4@RPK?jJ(h(>3 zc~6&piqig6YRx?DcWGbuFv&BQ&#W}5zP0l~-A~ee%=21WAyNP*?&QsLC z^7wvN>czq2G@GQ{)czBd)BG!u<<)wp%-eh|!vOV3T#qn@{y*0j z>C*oH)zZ*+r4OEd-;YbS)5Z8=?n z*C%nmp_N^JQ48l6W#=aGyz^1!nSMUq`2^>ik2=0R%6#%s$LGoaKabRM4mX&Oh2`_d zjpk)nsV~ycNxjj2B>HvFANOpq*;*D^lwd*L{yPu+mvM6R#N`X$-VgPLxI+R}*r>MZFH&c<{F3%fPEz8hKXvy4?Ze z_%YCYBs`%%fB4Ia#Q2BwMSE)CzP}#vDhtQ`#jPle?|E74hWnA<{(batlj_RdfGvo) z&hsP+(m(6zyV$>s>l5BH>Dj{X=UvA9qdZE_mQ^d0cpo5Oz8(d&=Zya{^V&nO01FSn zy~)}`Zn7GaJLLHqtbPAoV{*!tXDZ4)gCUq#G@E&C1^unqZXADyqT;z^?l)DOO~$@i zSn+If%HrYaKehoC)aQ}46*lXqUN$UB){k-Wv6i`~VW_`IO9;F7D6j zI!N>3PsRVR*o$_(uglcR)JqYLf4_usF@B#%z8`7zD}HYx{(j*M^Ns7N?Q*pr1SE@9mEu`$2Q};&cAa_|h!e zad^(9#!+?_;huwmB0M)T{oG$(W$LcqUHKx`+r5WK%;F_hfPB;Bze`VuNVjNo4@i}DCf_+>dn=NCe3&K=nyUHorpMWS1~+Iwcipe!!!XKk-=L|Lshcbu9Y6kLv_j6FPEM+U!UA;lz1mxAZrashowkbNs(7{kyWq7>DEENB(7xB7c+o zbn^Y=rx^P^x@5fj%Hr+g{FIgBfVmI%^_eR3BJ;=JTgWwdK8=}vX9ec>VFSxEy^44= zWXz)Mr;#~N;C=J>J8QgW9yXvJc)5fPC~q&fu%VUyp&Y`7Hu562=h}QI)!$JI zFV}$gH{`pNLm;4~PgZwpeEBOI(6Zw8}hWu4>4f!kN z6!|_f&S7#5i{u&GH_kQOOP(WtnLJPa5_y6AMe-u~3uNp==Ndjw#{P7!;d5ljPvsgG z$g6aZcUGcw7t8BznzxZZOKv8AhTKTLi(F6sG`WiWDKh%|T*EwhnfY@kd6E1{@;vzy zl1IpQkO#?gwKk$ain zGvq$}KhjN9SF$*GRORgs`ktHJX6Zueb6M3H8 zOkNoYI$ivY->T5WG`WbASX81*#qdyHNX2^>)pCh9`4JYQw=ug9m1v2{6 zaAJ{+{?xy-8*D>=8cr1n9EX>dx5k}+Qp`ED}C6KTI>%rAUDEvUoz6Y_nOpbqm9f4?@Un`e5K z=zf{JO2+sm@(^UqcjR4NYhOVf#zQH8GUi88{$z}wQvPJjr=!BQ#fkUIR~^Zd?=lTE|#GX^bK7x{e^ z-|x`-rP{MZ?M3r9sXt))W2Ud`p(^81*qb!(?f&tKuG88_*17L6`-AKBn@qni_BUfZ zZ7lCJQyr!{K(*IY-50M>`&r~m)Pnp-uIFssm_@$&IwrY}Y7`4e`)#`3+a!DL;%{Z@ zO!*i44-%B@yZ*q!^?Zx{n=otfd1kHw<5|?QX!d8fl*||8&!}a7o&L1x&#coQHT~i` z{Q=V-GkuM(l}8K9BM~1fkCu^j?mNu=;5z*#)9;J@%@{8jM=f(yr>U}hT39|U1Jplw z`S^L3d{-RyvK^)-^Zy50e^_2Y8uj$ClvlOHQ|BLb|4||L!2SyUbDum{cn-PV)Lh{_ zat-+}$yMZY$tm(VWb_}o!r5f>A33&Dxi4k?Nv`l0G)MoFEBrZmk>-C!ULgM|8U0_b z@F!&Sf4M>n8U1Ij@N6>r&m8-eD2@KN^u47#{oh9WV`Tr{(kS^1nvalACl8bTdrO1l zQ)xZ`&Nmt7_TxKCxgx%=lska$D&-3Jo>Ff7k6>>i3w09TugOg{8V46iA<8d!4%$z! zO-Uu6DEo*^GWo+BSgo+lqgULe$J&T+{dDR_f?BhR5%FzW1CS=^m`gwbK-q&%2$Mgs24pV+@~($cP|G~UOmmLrmyZ{&Ug(%?P=zD ztW>j%SkUxoIQqWPlJr-#Pd#0oNw~Pr`*_pk{?#6uHGe`xHx-74sbjBU`WSAUzA9J@ z>7eHtrmu?iFl73!Vfx(Pr!sw%3+TCiZTjMLsc@bAJY9Y+9{wfV$MHUd_4r)GH$*X} zj%{MRMSD%TP<|!sK!kdl81Hi#?+(VhiSdTFsqkFJ`y!UhHpW{jNk;7WIl0%rPL_v` zI~tRy0UiZB|M7Zzuym>Y+Cvb2_*+hw=d-7;R=yIWDXC0-*VI`|Q&Q#c>Uw?F^lMJ* zJVAf8m6w~U`{oyQc6KU=QhCaDO*O{RzSYt>;OqsaojO^JHRsix|I|xA57zhkQo}IO zKmELY7S$vEPV;dr2Y=_(_t#H36&@?=uaocB%%Yo%&kJ@)J6x4^r}03~5BY;rjz$7? zzd_Th^MT$(I?Cf6yBIhCct4!T$ z=Cde{)Fq;7ktY37qqyFv;jsKKKh=-x4Ti(i?Ad0NI_^}cns55^caBbhc#*N{>$^Al zo5gUO+9CE2T3?PpMf3VHdzv}3db9bF>P-Xe>G#Jqhi9E7Sk2*Cc$*3X)PoSsEfsBt zyXaK(E9&0zTimHXy8hC9_k8Po3gnoQ`)p#>;&^s2e+l=GC%<1XtL^dEm*0by-@O*G-$s7-Jo*yR_P41hRzLr}??fH8-E!_WWKQ1=6dX;Wm=g+Fh|I2+1 z(+{_|t%x_`5B5jH?X6_&pN89U|5NUvTKvN8O*F^;X}GTc~{)zIaP zHSzLu|GYnq{lzjX6`loq@_wMDFUo*BE1z!uSISrNR40tzI~YVh91nYs>Oa2|w%%X# zOHbI}{fI}LAC>it?*oW$EY~*h_~I-1sXzbjTCNH6cKLp!`IBqfO7kXiBe@yjG-b%G z;L~*!5dT`*z!Qj1w8gY#Jo9*e@>h$u&!dJq5U;Zs?;*zfEXI3?@ji?39%8)D%2z%Ovq7$KZZgPM4{^1k$$Mf-Rh!5Ydk@q~2@8$J% zgLs9#h*wmdK|a=a`Qv?pT#c81isoMaRS2ghV;)HV1&-fitOpkmA78I@Zt{4)=2wgN zC5-nF<9)Q3KjVG0mp|iuw3k2QeKg}e^jPEV{liNT@A&?HFVl_q_&op}=dEAkJW^SI z;RNiL-t+YO@OSWc7aF9$cl2ofmHhF1eF6Nrw#veb&s7gMT=(v%&rjp{T@QP*ulo!A zE4PdJ+Oj}qzP2oqnXfHN#^J7vc@VWMlf6H{eZO#`%krxf@6Bvi*tZPhct5^;mG7q@ zyg2@IjGxEf)8p~?^mzP{o>KfhJsy9iXI=R{gYn0{VAMTr;YNFApbjA(;SDU;4f+e2 zw^_cd>o>ZK@F(s+G7RroR?cyF)&GyZcY&{~s`AIrEnEmyhY+}Fh*ob%fe^t7uM(o; zq(CJU#0b3-I%G@;fs{v^+gnObk0SvTW0@IJ6o^&F+?!xhd_@qAq9i^><70jX2gm66 z$oL{MKH@wyDkJ~(`0jJ|J?EaJ1$3DC&;1m3);asJ_F8MNz1G@~qwV?az&;Plk2`{P zLUQSuc2dGVC*$Aad6cwc{0iESCU|D|g09v5O6R?xYxMwN(6xF{V0SO%qIw80=vqB2 zaO#j7q+#}}-gp1~_cK7rD!Ru<+B>C25lcE1l8@z;CETkAK6e41df;;x@TmtrcLASz z;B!}6>Y@9K6ra0*Prc$Zb&k9y|4kjR2wr2rEBhhI$acwJ{K|?m)M)t=sXq<$C)@Rc zZ}o)o8TazV`jKp}^lKeFg_vbzBd+Sf4hZgt)&0rt@fdI6aX_8a`hKc%jZT~R6S=WsUz+v( zsWY@+N4{NC+dpQ$x^FeCMNwc3tb(009A;Bl$;+r#-Cj)O3sCVr4{G(JP?yHZcC8t0Dk z4S;{6^GCiBu=@A3eyi=8{ge3?z_4rceSpV1G6$)Br! z2jDWmLx9Us-yq;BzypAx_x@N21-upS=K%Kro)?(zUj@7X zxDD_k;8wsrXs-ou8gMh~=GzVrvnI0N*{V1AvtRN;6%d$(jbP(ADG)i-Os znS{}+FH-*=c=~#Eohmr{{uM^i#Nks0Z|FhS=+(`rpVmz{Ki&VT^&7p~rtkT@ozzGF z<1|$Uy~+Une7#DFRs41Ao0`Hra^zmkXX5=_AL}bO4SlwHR{5SzOGa`S8vsJGKbG%9MlOux#|kQ4S>~-qJ1-f%kjQhV2bkqZUO87 z?gOmro)izqIM;R2K+o#BDXj;~`&{++ArET*k%t22Px zfRC>G(mp5PGl};`uRZ|Sk^H&p4+Aa(JOQ{I^^F6r0z3@Z=+z;>y?8$exE1gKV53KG z1#I-_Er3;z=BoPv8$H?w*yzz-z#XW+2XGJI4!~)^ZGguCw+bBGk1>ho&GJ0ZtBnHN z`cd_21M2HXxs~U{uuR(f9~0uda8b$%wZZAF#R{F8&h9wTrym5@_9nXq@(M??s}b&+$*(xgI`>I z-ah4z2YsGNnmB{5vmSJPemy46@Gq*LRzXhShq=cc7=A7b1pU0-y~2mAAHN#_ta{qp zJqTC{?(H5D*!AOgIzC)K?%1dAG0zzJ%_L2nLG4X%59qT`$E*1ssqrTdxF0kRNI&)| z9@(?uhwcO3`2L5tPw~#4jehJKRy-TiQa-?6`)~Y@0Dlu_cmQ-)d7%4wwVoKdn|;T= z9K)XR_GtUwwLMz?y;@HoFGl`GwY?k#QR-YrDVO+A@66E@}34 zoTlyi<1G%q^EIC@&pw`tM}TKr2v5bs_3;Eh4u}0ytMz6M)Af&}vqSjd?Q7KjK@Ypl z;LoZ9#5WKAr%nBT0)2C}*1t#TY2q&jTfZMyAHz8F+gXElE|+$uUZ?Gw`=s3y73TG1 zo=1E;l>-8RId#wE{}Ug#lqo$oLN2zH1BP5|sR9hS*pgPdZA_zlox<1$MEAxB?Cp@( zPNu9H`075&srCAt?r+y}@W0*T%H+iXv%TbL4w?_L~n1W_B&H%>Z#FsHbd?Xx}Mj9uJ9kvQh9fw4~?EQ zenR$Wr9<{8rH`?1b4_a3=Jw629kFLl)7`V0Zko}wep*u67q9%So&?-1aIV_et1W{aD+uG-kE%ICmdRX)@G(g-Gj=MS!$i3Wlv@Bi40sW658x%heSnSM(hu19 zH3I?%e$gOc;};D9R=+6D9$wCFE@l6^BhykZ+hvm_?A@gE8tFfszmRA}h};&9SLOE2KyOZKx_eU7O%s}$d-Q$z8cciJMkX#a$fJ%@hYWS|DKd7%v)w%#cjlV z)}Z;kEvnx#tF$2Z$NU%{v+vKWr?7u2-#ddH=I;kRS_?+@gTlV7I)ci*L2KqJ%zDR^ zsvX&HNG6f|`28uz>cWSSM_IomS}}cI`0s%~{@lS=4Ys876X8o3FAs4*?hkLUH1}SR zA1nDyKd(DhX~5-4OynIuIi>0fdC_I|m(zQ89n3g5zN|d)TO!;P+F^5&-%o*0<~zqC zUx%!6IF7-1a6FR#AVdJXAU`E>f?ShJx%)T^G5@|@%&kI4wOG@ zV)*mj^Di6bUcJBl^M~2|nQeOCI(~j+?`eOAWfbiOk8XD?R|3xZwG3#6Vh zm9v5)Y0`ODO~I=rgAHnfnKCOiM%AUf6HDV87i2 z|6%vHB!BMOZ)&=FPEv2ntfrf0G&Sc0v5(lRSA1={H#5Bo=s)R`4u(en6SH`KyO{@g zd^J4I_wF=H{jBGC21`0kQo!tYcMFs9-mMMlp=zG;FkhH^QQcad-+129_n7Z0P>%4C z=QRquBW6CM0`zmSZ;;~~norB~d_w;SuNKYsKY*^ul5{;?@y9uWKRjJkj*`w}!oSYK z6_R$G-x_9 zt?4M_X`_(C3BG%x@E`1+YRFrhefx)?Pk9V|{zB+e1^Sf#k?5o6PLj?)OMAB75WPTy zOze=`ln>r&^{<(q=YEX#H@_Er+pl_u_Jc@0bWTV7Ze!0JX~uU!%iH$Msr2PcbDzMG zw`e<4YBoEmBhHfglFkpbzC7e30ll>het-Hb;kR~K{7wdbhbaAEzjva)-HD^=1g7J3 zC(foF;+(b%J-ZX%5dD=(?5CcvJv}Ka@;3bk`MboV?)c;@>pMwREvldKQKJ8TT_1JF zblsHgqE~Ot$!4|Aon1ZN8nw##c}r)mhuhk^?V497owrI&-H8f^XCB7uI7x4IUQB5! z@liRkl1lu2VlBZoUahol$9Nr2&lxXCExZ~9FOBE8V;Zk9_qA0~{?rpt{#>5Qae0=f zMf%=B(zywE)yX=0cj9K}WO~nd@XVM>JeGJVr8YjSZx|nT`WPQcEqqQ8e4uy6RPV6e z+PSm)s;)ImRkfeb={~QU|GvKanoe&GRY*Uk+eO`-SM%SmzA?8m>0Al?&KLWpJMo~L zCt|$##BwSzpWqs8{Ca8KlksEGVEiPt@T(B~G+yA2X*`14-PW~z2NiL4ba(Ca)^P2L z&-NW#ck3r8JU8#?7W_BdxU(neyc&33O8hdxM!1dFH01m!dd_r_)S}Bj3tlrCUmVl;E#t*Z$l;!K=Hmr7+;Ag3 za&~rJNpv|3?cXWil}ROjkx0?IRN{9DmJ7Rm{w@Z~O*DKxEd3D+90>Bk}^MXS8Myk4x)!OuC{F!I(2T#U7d8sxOr;-oz8knSw1*IV7EWJ zLi_hh`*Uc2)^GoM8a7<_&aKv5Z!$ltdyZFW%K-aELT3-fUeTKRiED zRnDbbuOYb(#R(q?Zy*~86S5ldWsP^kDy}Nze z1u~vqwPXA4r1L8D??;KVLhUW0Ju=Cpf0A15J^2x~2bR#@qEGMbJ6|RGbNlXY;(uU2 z`EV%d~?y=-?(uzBJK2H9_p2p`P&T9^OU@n%n6iMQ+c-WTuF|>>@)ZDc)K!pPN^h zM{?4B3)*j%l;^RX-Ir*++jm@L&m-OBm@yvYw_RfM;eu_uI{EqaTd$&V_Q41p%2&`U zR|+0g&}Zeo{$yol>y_=-TqgRhv$wa%j<(vrDCzuNr2RD7=lPb$x1`qizC_wb9DFS8 zw||4QuYnMz%l2)p(*E{qc97k}S{eS}4ZZTbJC`H=1oCO&b#BtRBZ5~e#(xFX!+1$* z;q~W&R~z(BtE4QS+lUMHypq|mbu;6#efvcu2iHd0=|DSia(J4w(}Q+8{C2LPfneK% z+ji#APD_y-p3|Ar@!7h4Ytq>gX}=%zuR%X0wfcFSv_Am;_e*N)*PE?)1<{eaTBOhB zG0x-cwMwa9_i?*py1$$GN&fPyxGu5_NX`%EKPBE^%^NgdZjSV4aRt3nChaXjuPyp| zjR&zU&pUD|Pu;oV`TFAR=c+t)?j(Mm7ioVO<2p_CvD`>%(R1lRwhzWJu7~|`-AQ&1 z6%jkgE3$*SMZa`j#dg;RI7< zz9a3-Ku)K9Io(DMw>=)VZ-c+|s_i!>ons^I%%Yt*d6|`V=FrZpq%1FFUI_l=#uv$p zHJBgy$;Zi;~UH`NiBYTM%wEE{W>JI<-f_2f3`2UJlhw$>H9TFM-LL&^KLW7 z8(Rk4o}^ZLACdN2Fy5La<^Elev+YN=)^t4h^DJdZI{zlm?e?b8UYs5GUgaCwo0gR2 zgZ*#Yj@w3#H&;&XdGS0S#7QnlI^U19KMVTS&>QZrq*j0LQGSBHvl06KWr)69p6PqB z(D&<+_J%S3d1m1DB(>TbkoLwg{)Z)H`gW24ab-D)I|TCwg+VXn=UqMBH`wz>W?Sw? ze%{-=eMi#yEdN+0INli~~k9$UMOJ-4lh{ucm` ztFPWle$oS6vW0bez!?` zOK5M=Z?8C>8}xf88CKi~k>i3Q`uAQXc-Q0of6^M)2r|{Kxqb>s1aQ|NWA(Jf62TC;g)^T#=neW{ku!wowKf zkMp{_E@H{Wbs8_ZbZ2LgUvJT8bJF?qNc+>! zQ@j(5+n3a8|KA^AJ7ETTYTDORJ2qT(6<4-{3|h}xpXnyUh@X>LQsif!cVjR7AfDG> z##xH!FpTl~C-j{0kkrEC`+~+3lCFFdjcA?N@>C z<&yGvq&Tb016y|&k4LhbWFE*-1{)8KQ*-BuPGpY@8659+#mCzP_#PckcPkjVH?M2A zexJ$4e~`wNeIMRWsXz92$}VNOB7Er|?K>Nnam6tI%>GfcKacs%tj^VIyo%v8=c`BD zir}K}!{dHQd;bFO_cZrQn)?CFzCAl1+aczjKAyi%q;^Vu7oNu@)BEXu7yeDZ4E9gb z`C93}=b!7J0Nf|3xo^)i`|$AH5A!`6^Zk(E+`i5e{(e5flSoAOv8!K9`)Ng9_&i20 z@w{vIfV5-tFZ`V^?l05hWC~H3?+Unud8x-cLFFU7@3oVICiLs3=(w(*zXaRk=A>#^>AHrBl-B%aIlt)-ev)z{O+ zBU^u@_oxNN^C+xWpM~}64?DVE{gB4Lim_f0TfEibq0S&w?sSXbVJb>#;{U(tHJ zb0n27h0nm*c0H${o>Q>y`#P-qJ}BR(EmeNJ2#@1YegoERKP>mYrVV)B>0!XAI0LjF;wE+&6fQT-o7{t@z}OZRu7h>sse{(|mvDbe4V zB0jti`SZH3qeT9;qWt$E|FFi5OXP1XqUU=geO_wv|$3q|=h$L8xRYWFp<`Pz!;w<$K?Tv5J_vH2E? z+HH=_H(A7wm&fKCD(WxqGATX&>x%N78k?`I2)~nK^Gz1@m#x&&?G6>ycU)|~zM}fr zYARjdQc*sRT9nRLR+LY5YpL-&S43y_>Ppu)Swz1hV)L~WJ}-@?PTr_Wt`>_8V$6i+wNp{r`~&&VlK$ai$uPPub>wf6BJMTe-elH6PpE zPmyEd7Fxwn$>#5uG?RFN*w1v|rNDOiGWJiX`@i^QfH&Xc!4&5D8t3XfAR_I=3g!-ThHK9PUR!s*`(@I|$}>cqB6( z_dm(!6!g3I=6l!KyxxDCtA0}3!S^RJviqkvF0erTWPk8e&(r$e@OAP}M%2Hd`(~tk zYE^~w%cc+eH%y=Z3ejgZ@H&R+Got>D@pn?>Z!mq5&Ob_r+}k8^48Qq&LjyfB_qLe( z@ceTRb?PT&R-GgT>Hboon~m2@s6SUqe`b{q_|AB0)#^xpCefe6|E-wc9JgmW|8|u7 zGp+UDyK;OkMEmn`;4`QE-8Ub>YdnP4YZ$Nn6TnN?iBhXx62WVT%1ymZs&|;)KMc{E z*e3Y>nDN^`4E%;9P0_AO#*g{SY3>BbCE^iDN9`O#$AjSqq4kspexz3Ec&2lyMg8aV zdlUwG%Bxboxo_2enEmklUihtQuqa*?9>0(C_{BIi<2Xb2pDO)X>Wbxh0Q@{A#7{%7 zY2oJ}=rsU(nfh*)`aIlIWXo3=uQz_C6kgi|FS?&MA_w8}kMj33#&z6B`^DH6_p68H z0po_{;j~cyjD8yB{*Cvdf4Z&}$m?FI*VTm17bycg#E0Ap5_tNV_>eh&WWGCM&eNK6 z!mRhxoWEM*4K}^zng951wf$V^P~cYR93(Mu7J7}Ua;9V@ROR|J-{*LV#;eWwX}UL3 z^tFjUneP;uco&`5$9s(fW%IoPy9L#=ISg@k6nc1rpkdKL+Y9KR?FDoIzmC#!=DXPD zdk$-BULh~ce4R?j5_ge&w-FzCT>cZqkj(jJ)-zw>b9^Hm%C|zBq&D4JAlGs8Qn$!; zE6TTMnnnMP0iQRaf5(8&o6x^wbewvdV)|#k;%S`f@$!qRSM%J!0aHZb9kQUh(N7I=BU;YkS2b^4!=*bU&=-!}odHYd;~d zIZvK+6wczl=9KJ0CpqcVezV?erax`Ffb9fh7ufRj-rw=}3DpkhEG%h%N7N3*FjF20xRfnF}YkL#&f?{uAThm_A%-YIF) z`6s0d5uNGo&ri1-zCJ4NZNAoF+|1IrVLo0hCS>BVwn%Td-_V0^Cp5`G>bCRZ3 ztrPjAeJo5)$9=mbj(aQ8TBK)cx^^SCPI`p&8Z*NGe%{-)efLaF+c)AnbZ^J_IaAa2 zjY~Q%s67ANyLFtI`{&v()pMz-LywpDc7MY3&Xk~cDf@Q@blx1IGjoLbzE9{pt8~G4 zlLLF=Yk~)TuT|tJptsV?#&0r2@1OH|Ph(dXCPD9Np|@Rb9Qeig8@CI76Toj=>mh%K zIgxZ85&Xjb1?y1~Z{I#;z0W`TE|v5nquY9@{NuupgRzgLUf*9?r}Z{XM#kGvh#p@N zdJJnn3PakD68_2n=n?0yTqX1v)Ozv*T95CqybJi~{urCieIa~4A^2dPEc5}NlOz1; z0X}hh_7cIT7x?r5pIYz-ehKLFTp3?HpYqS#&*6VpndGE_o|p1di42xs^p7GpUX#)} z;t#=&H}|K7{UNVuA|fv`zV8yW9ODP@`0N+@svTnHo#p(aHt=g>XuKauRdanWlKMKp zuQu?@_(vL-^qPhb7{BXF;@2qr_nL-E*K@1(lkxehspaO4sQ=f9{>Ax!j^NXb{xydB z2Ro=~a7DbPOX77R`Zcg(`6Jo?i=7Xn{i;I0Mi=135Q#W0MI;iw{iwk8rO~gdP`}m+ zLA|E_74iB#_bcL;s$M2PN6IHkW5?U=l~H?UTrKBcPjb8C!n=aU!Nhc-EY2sx|DxC z|24KZ9Pmry0d_gQpKv)l+!c9K|H;3P`#I=e%RP6aLKeC2hvk6z{L(KopEXWL`%lD= zOFFwC$CJtz-=Ed_E4c5*__KjLatl#^_A63P;Lj?Y-JlLsDgiqh_tIyNGS5}-(svw0 zZp`yc;91uvXqC^*0i^HxFU-_)ump-;BP(DB6ryX)XL;Cllm zZud;}kb90)@2ssz%O7SOCS|q1cs{5L(W6)B(ExhXMd(olKE?TaM+iNtP(BTMyjb{T z^Lr@NZl|<6jB-Pfb_dXIoIUj0Jj=%b$`7L5BX!(tfL~Woz1?1e?>%l%{YK+VLpNalY73qJ>Pkx*g^OGMp z!2IOLSydmHIBRYV&n~1FfPYl(p057acGlLsR_Zr$mrDGFz&8K;z<-Xfvfir^{`Z4_ zeG&fmfd4i<*{(8n%O{xs_)ex<=+Sz@{d>moRqbD}Pf_Vi_Xw+A&MO~+eU8c}bFZx3 z|2FDRsrc%3Ut;~=20C;|nsh!Ip~np9_gE-Cz4R#0pR*`G6DcwEoy+X%nl%Lcz ztK-1zw{)|x3(R+vvapM)+msHNZ~eG?{@J73cnsan6S|E9?+Hnh&YcS5d&@x_`29uv z3gW=~<+(rp@f~c}j|1N)?}K?$VKa{G_-_wMyd9^rKJ0jz$Fx4s#$`bi$*$Mn5B)YE|X8u#$l*8!fv`!rzn z|Gf1^AL_j3neS8D?(4P3 zODo&`w`zW--)}xiihJ$zaOAq;r-Ee*j}*tF6Y|Fp5H_@G2Y|EcZ$yneqGgzLMPe}AaJhwKLlQ`-(P*0 z^_;eA`X9s*I2u?yzw^0IwwL4La!1Q}Uyyd``(To0==LRYMJPVoqy0pDHkEj>)E|z^ z`Ej>X<+Xetl_kqlaiMy8r5If6hPzTLjX5DQV{M{Y$yGcC? z-G4RA_QA0Br!cPgl=!YY_d6F_N3!vi`xq#biAQe|eXHZvE$Dbnt@;=7Z|!n?&V>08 zXWxFG@f*=`XTDFBO3X<;W}KPtfOY0KLw+ulv@`!&!0NBl{2?&uU+r(c18_@({w=Ie z3*Z~|i{pe6S0fXF<@FMh*I<3OEmA%_E`Ln?i^}I($W!x*GNOzqmNph~TIC z*Z5Vb#J3P{nU?v+mZL$c??B=oLtO8;>TNf#`rqIg^j{etjepGO{OHF&6pvtieNx{a zrE+7=v+%r`rblMqfsOZs#6Q$tvY(6mSn|jBu$%aYJF4>m%i%-c6*+_)4`}`X#mL)(g3c+h@=wa@B|Oy_&)Q%wJ`UxVnX z`SVKe;CmX%53+;tUin3Ku)uadI#{0VI0)$<=J)C^GQT^3e~+YeE(UxCf3g3fy~4yn zAO{8IQ+tKloq;_ExfxNuw%3-9gOI)xePH4nsl=a)V3_d}`0*F&^O~^SEGnM9+$;bF zUF+u+_T@&$MHP)7d;T)t5n=p!9;5S65&G$O3$(w%_|yK`bY7D2r~Kl4j7h*RohOXn zYM0}2YtIinUU_`dKgS-Q8)SUWNWaW^HxrjK_l2AN80MaE(s#%|C}|dcLNGoFQEn%% z^G*prRpra4bIkZesN1W@_#Dyp)}D5p)X(FOTcUdx1vcjclaB7ou<0>Pb_VA+aji`< zPG>}3+`@EZ9+`k$5@&z?;60?L^AjjPDQVJ)o;REiwfk~ucLC+*Bkj(j-8g&WF==-e z<>%1uca)xmA(cF`q}NVDQ&mMcAIUdt)=$7+lQqhijxXIy~-iL zYIk{+gMigu@hS%ZD}TJoet~nlcH?;m>Zt?V2RIE_`RG-$=HhYMg7->q+UEyY^bME?s*aan9@OzsY94HenFmjr;d!tT{b-QX>?7iF$3rj2hw|uWzT1){E1qGS zUJmGM^wxty-!jzeNNVR_g#L)5??s|NmW01Gt`0X>e9W>)-;h50Un{~ZH=6zo6-+c}=mOn)aa!Y|G^!@zd7VvkZ?Ye*B#YGS7wI4}U%(=jC`Dy9L!J zsa1Lo!yQq5V%OVG<=Eei8<*ewJJx#xf{&Z;S3Kj^)g$pYU4JPVe`EY_Rs2~_-}(t^ z$LyaR!+D*<-azev6#fd9xtm)$2Nu`;PFw$pMM`+H~Uq zX7i(iV0*qk^H9R*_VW!39~V_0`uirkG~R%C9PJa4 zer6K2LJzyYb5uXi4<=6apLBIA#gDbV!knbb?K6zC8~;Y|ngw1nT93bPP0u-cO}hSO z<1-n;=Ldq%H1L@OKF3P`>~iB&j_K4M+6TpvPL@MY@RY@AHg)V-4@-zYE zJVOKhS!#b6iG{U4?8iEO&>xO_5<32VM8DosQ7^rhdi}U(bRDae%G=}Ul7DWvHZ2%ugLx+NS;Lqs%!gf)bs(QB0?YN_=-+A0z_-(c;dsM!w zXH;+b>&erARiCYNZYQVPMJOHseY_#ue{Cn|e}~rZ`*YBnemtaA-xnq%J&-t>#H~r+ zh0p7}PV`JK_@(xxJ)YViZ*lX|FW$}LpabRGG*x%dvEpcoZxBZVtoG0!}%ooCyo<@-OE*BvK6`QDFkci%`+W8?p;ccwH52+55}MVk$sGF=Oi!muf(|)SNdzq z$qf73l-c-C&l9V2|*rC(;f+q;KnWzwVmc`2R0y!B~$ZuX4?>)VR2S$A_swB2BRTkWp+b5o~9 zp5HLP|ELNe`^YQg!%TwB+3*?b z-@$-9xBD>wKE~;RTES}o{Tc*bs>r?ietkY3t+#>kDk$E3Zf4LLFO26qX?%3%HE!Eg zU8nfw^*d_0>XVh9MjrO4J(H5JA5jdA#x+&AcI|PpjHc_9!=U^Iadf zdTkB2O7SX^8~R7{ubv0y`Ti#-JT6Yo~Y6Vzr>$^ zDt;yTj6K5b^)8&Yo%2mj)VQvhhiZQbxlsPw^9^fCd;IWt3ePt@j!u(#M#oEMLB~;U z*OlB9&BHow%sk=U1A9-eX`+2kU6L%_yo6f^W_`k4% z+`WVOZ_Zodeh@cr^z@L{n>TuV5U|qS=yBQyB+reWXFk~cH0ya`{+V^ZFyGAj3_rK| zWc&(yJj_x5Y&(|qFY}@0@7a!>gIv!`8pMZ`A0{pyzNc{t`rWJ7^#r5m-8RIHpa*01 z-@U><$J{s0`f(-w*9*QH{rC4@A^gWwUT7Uz@GqtRc)!?GPTN~9UUmiZd8|k2fqf8} z#E6VO}dWY?Z$cp>@E8{_aaA- zPyhTP#XZTKdCEH*^Dpjuc6S0F>Nj(S*Sk11=N}p7pG)I~f8J_czwpjiIFo#t<{*3fVej107_Bzns%^|zP+%xnuX|Dt2 zdn66?5aj6u#P%=*j+b^b{;%L`YF3tqUn|fO^-M2)CgWlCok;;_7C{9OZyw1FWka_)Dz(=*8j{rlXP^Q$dcnwxSL2w7hpKS^>`}d{m3V)w2RmjS1-RJNOy#FkJi3|i zWxduI;tR8u@xPAs!AJ|{;bzP;3#I3oP&_(lR}Ds+P7P=`8`4AO{-`UY-A1(Apegzh z#G`K#LVHcxKfC_0J#Z+0-*+Tz4_pmCj4L1V$~T@5!{x7Gdm>WatUHK_U$h^g9Q})n z^EXTXs?fi3(ACs;1^P9-B3{2|e?5ZNG3eKjl&5?Cq`r)QpG395zP)oA`c3+-f&Mi5 z(AJYYpBnv{T2(6rXdO)IXL?b0eLKOg_f*tN@1vOUFCEo|3{uui-%jZrM{yHR=W_~wV0Bjn9(a)PDKvm3(@P_}MhD zq8yd89PJN}k3SVTatmqEpGijzIlEtJ@Gb7V34+-k zp{gjp)h2vq`Tp7*jobW^lqdgNQa8T{co?wCE$zDnJdgK-l4kQJ-q0%b`upPZbt+Hj zPe2E4FIdmh_N?_xZO5mBwnzS*JYQS$G9i$O2c;5fSK4$LhCVRoL%+l4`$opWuVG2; z{DaT~adFmNGR}rjUgP<0xPShBK=jXF&qM$G`}dTd)_Se>H?RHkszJ}Z(%Y-n_$2v1 zlF!3;D%`yC%d6ISsNJ7_mgi9+llTiP56tfqKg;|cKtFUHB4Vfd`vGU=~hf`IO10z4w!T{$$PtuUiGLB^_tDH_pyK z55FMJAAO zcOw6kz!a|+J0Mr7{-KfET;<2{Uj3q6{rOy_u4Cp-cq^VS0IvbSivoL<{eYJM_W@SBz^m*P*xS{E=j9?FUS)?qzo!k) z)&B7+TLG)x>Q%M?Ry*0NYzC}$w^!LHu=lD4JlApSRo3bA^=UlU`IYvG1Fixd<(d!c z5Jn%<`hf7omZR2?9KBHFs10(^8j+)B$WfgC^bwJx7L;#>9KBA*jdm;Y9Vj=8{=lBH z@f#+Csfy<3*6-pa_00I|thX20F2?x@W5=5F5_Ubjj<=k@`EJ1*aeV9-&8)gb?a*6< zoDQ#tJg>L=!wmi4(Kl?2TYoY40CN7ucVBWd=fCdI&;CPujjq4Aw@I%D|_p7+0!27->dG2jN zx=EkYJ?Qeht6s}>RnH4-)2W{tvgyQhV>*3~4Pf~6J${mVwup5K-TF&hAw(;+!3V8g->8-Ug{`-_}IA?1185=vq ztJL~E*nxK|I?mKt`iH;%g>ja_y1$J_<8O=o@f+kkX5(+U2Di{GX;QxSMeyaijy4sh z!}*|(Xbu|h(5r{j;|8k7dyC?eIW!s{Y6-R9F73CV{Z>f>yI1GSATGe0_@QL7dp9d!Dh; zeHAUR=i=8|r0t$VCke(oXa*I2l`=@;)RDUOeo zQNQeU*tmGY`?!B&YFD}WGT~Ryzqdu|WqD$KRQ)a1+iHJse%9MbXQ$-%c01A^IzK0N z3GLT{JgB`x`?&zCA42=R6dqH#cC$RXXk7Z|DaZA_AGa6=3_Vdlq_FR=4+z%BMNI$l+CP#X zp`V*q`Vw6MEB$HzA7JGV@kL;}A2ZYsJ6>Vr{3w}s)lZ^zFY!~7PD?~?8lgu%6pG_M zpC~PMj?keQ{BM*rmFPx%`-liXs!(5Cy!;HQFOB-DP~Wal+!gZ*)@_o`d4hLm;VS8W zS3Snn$Q1&c`*z*Y%?fWC()#baNZ~CyuDa^Ayw`+sn~;Bt=Ig3f`LpS}#Pqesm7(wc zY5V+``hj$RrnGDPNV9L%*aNixS^8n@1^-_EU8)a~&WZBg$OE1868zgM)Xz5S?X+(k z&)=o>@gS$4SwD40R4&_VReuEWBIuJ1n&0g2Wj^0Y`=3%yyVjG}`Od`IEPbZ<1^NuI zug?_r$Fu6G==W5fu3pgk)>gbr@C@|Adj+0Sadf=hOTXaZkPwnJ>J3ivn}Kt3FKfl9yt79}~q7 z-Ga^!{Qmb7^nO3yGrk;e-m5U_DXE9;s|I?+`Ct1B!qcj+xP6_kIN!f>y;eTn|7zBQ zxxNn6cRtm}bYqU0^V1CT&zzqoJrjuo@cy?_`288 z$fj3VK9VFK-fHcSFHd8NH?O-hAA)|X9B{jz3Gtzd^QpNd{Cp(zp1*Hl*30pmyE+0{iP`Sx4xBT>b;(vR7bpjw0za zGrAR11s%3*=qEB;bagTGsVe#N~Y?X_FveJ~FwZ1-b=@aA~ayR7{d zEH5voam4i|>2HSL@r6Kd+T~|r%0K@-q<5)2yQp2&iWkG{2qybl_`u`*PU~KDn?Fnk z5A$-@?s?@K_@3LX_LGgrKnZ>@-osOD4{Cgs=1HNq8=mL-wuRb z=hp|j&Tp?@`eo)@BX@Sc`nX@COby+~#&X8}dW`#(@6-O6`?YW$C+R$2^`)ghs%TvJ z`eVQ1YwITpffdaoI$l+t-9n&mjt}KyeN#%0xIZtRzlJHFnI~+0vy<{Y=k*QAspuP= z+qC)ftm>OF=$qXdZ?fANFCpJd#}1MUmWLxg!}2f={bKy=OIU1*=8+al4s8BE@u36b z|BpiX;`o2|0rLNh|KmUDIpYt;&o@IQ`0tJc^UEuR|3e}EYaq~;BblcxyL8{ZbpL0* zAbKc>qv&~&a9ql+r;Xx;%lXl}?xFFXZ_~I+p+nN7bCc@3!i3y z=8*jJ_&55G>vL$|X(!_SL7eF_!Oz7#J4JM)e!7K#kH2_~$Fa_j#t(e<*9(Y{^ov_B zpnVf+Z4l=uFG=G^NacZpowP(@%42wZftz}5U)4;8m{4Uo+JGjZ+(*5`FmCvua1n@ z9+dCJcuh#VorTY-JV1Wk(K&&=O-uTGbQZAM?FX`M)E3fbY~M3|{^}8tf7mr0l1Atg z+Hd{8f4uzgNfx}g@tSnz<-N`C7NRfv-Crl0ndw?9^3e*qwn%E{Z>0Ro>GMzC&HB6% z<(nm?eJ|3k6`zBg`0+W&haaC)IEc>){B+`Tbs_mNdf`lxA0B@^o=C4Mz9S95_YTOj z#{K;HZ4~ACH>8g*97gojKQ!DaZ1-hky$34o=F|=#^2BfKkE@;{O zDFZ*h1AhL5&*zPlquw$}?fgp^?{VjNZWVqmVZ1w1e#LQyd6U=oSbv%IyQHIWRud-= zzjyQMZ)A_UoW+>#cf3ead%i82uWyytBDeQ`Fqnr~j(e?a<~9I7A0MA9RIJE+uuXa9xL;UEl+ch12Zo+ ziyX{@eshxA`Da#;gKxf_=fxS6pOrM}d`tClr-;9-2Q<>3HvibaVLlmu=F*=sAM2#N zSJ{B^0D!`;D1x^EIYn0+?dhChpYT$RaJf?jcn$O>-vRCt$ z+NV+n`k8YqRZKtNZPq*deJYn>pGt+cEI z3Crb?v>q8PZ{#v6H@yFb?fMpOPi9rG z^vmW4mt%Wx-rF}b->?f93&)N4$o<}Ev|Fon@=Y)v;V)og@?*9`yg!kFFE9|rR^GG{O zjHhm=bC~XN`|&=`?d{k7FLW+W@J=OeFWsJhPUlo<&x#wUy#5jP^(=6|3M&7spN*b* z8PPw88!RXvu#YT$Uys_Cf3$r&=PTZ<7piD~uD@?*RPDg%cpeuz2mA04*Y)?|>As*~ z{ZaSX7(YH(|HrzhuNM)w@aus-*Xh__x25xk(thl|9g1b}&)cW_U+nQ7-k0$;`tFz6 z=X3lK*tbLG6`69*DK7t?{g_lM_b$l39ivwYS})J*4U~oRf9r|jbYJtd zOg#DE_w7XS`#j^fSKFcQunHX_`*!v!J^v8CL^I=h8FP4k%NFwZ=5yAFPUUmxuJO})BK z{S5Z)^l-mQ*m>>TFMRLJ#diz?IeJ3Z`7He*`*w`}7(<-G(oYY*kJ_>Lit&p1F3>k0 z4CRx38zuC}s*t|XeLEN*);#xLKlvY^Z%B^G#3Os;54=xsKlIJM=)Rqy67p^9_q!y1 zI|Th={OL;wYl?eWav=M5AP4q3L@vbFIR0-7<%{G0XNa%1JjL<-7PWf+*Yni7kyR?@4uBWqarv>rsxbrVh?WOrJ--38*tE5RMqxum0 z75sfWV+X%)XBWv$HhYrvFO|4L`)SF!Z74EAB&qFYNr)iOVj87cl&m}u5m5MnZN#p`@rZsckPp`Od2YwFYaobn_Z+;HuXR~id{p#iR?Tm-!tz$)wCm@I8 z5jh@$9LMe3d4LQ(x*rYYhb2uqx~^#ReIV5CYH4>6F`mmve-Vz20Ev%e3g1Ip8rb>5Aj{f4yD#3+UPCzMUD!f!Vk7#c8&iWU8Z=MdtJPGwL{Im9lQVYw2oox(^Dzl?7F%iC!3#_^I@q( zTI^Rohi86l*_-tsb3T{%{d0Z(dH}^qxyUI;Ye91_ROV2Hr%uz_s%U*@{*C%K*PBYP zwd^>TQL@DQDNhv8;r1!3{5an!Yp4PGnRO3tH%)n1f4}Y#4&D$0;=L%x}cQ8R`f1gR6;vKmsxlZGnnN?}YK;JP{d9wP+-*aL* zn|(v=(>%T$&}B*Nuhgm_bwK5_RJ{^y<4KlA;x{DRh#sFHe;&iT?YyS_T+ zm$mL3_q~ZHxZeE@pnIL9sl+#B-PyZ`1ciP{=M_@Fx68my3ZwrALq|f(|4wPfzi+xP zLdUrf9nTOt&P%^(eFt=07op<}==gBxJ`QvL_*aCEvszDn26TKO==kCY9jgdoo1e9U zM;iRBQhKe@??Tx0FN3_t-GBM8;86~`mx1mN3Ek-)LC{y}axnCz?pyR-2RZGH(04LK z-!kdfH0V1C`s#O6?S74ezH#?l4okl#K;LoD*TiH04fym#@EHo>^DAC28W{#YL%^px z!tVj#6L;^}-wHm1z-IvX=>7S0-lK><2SaBHSNU{Kt@@Gpb@Y8%=@bQ<*1P^Zc(0bLZk2Mu z{mzYmb$;-wn*r-QLFdy~Y^R3KA4L0qx5xwCi?(9A1KwYH=$qY70bVd;;>P=7(Pbjq7nUy+xJu_{c1+P8bkfs4Y{Ziyv%)< ztRH!1^y5%7Qe@H&PkC|b%SG;f;`xC=kK>LUzkom{#%x>G|E?LnnnMP zQaoM0oPvICO6?>6yFo|6E+13;>3%qke~l?Uz1=D=?wHcs+g*M*XqZi<$r2k9)}oCO-iED3{bbLHUq$(u)5w_A9SHvVHc&kX>QE z>-cG=Q+`Ot1=e?h`jtR7o;{#@-1i?oCUoyrd~ttwDsd(316{DO>uW)MkA?7K4sicJ zAoaDPz7|PSiJaPb>y-}X{!R85_!rsFK7w&Ds`PI^1K&X!!FU-}{~UDnTBY;~_RS6JIPmw)4FOhpBmYfd$Rm9ZP+`QY+**}G zuSwf?Ytdgb{%}vMKmLwWyp8@@TT>wqm@Z73Qs3K|B>CWRXVxRW%jXqGrXdfL5j{Q* zd5Rl%H;Furqx^)VfjoUl$4OrKV7^b#Uh%JZu6%F{N~iXU1?30$>f-y1WM2uL+G~HP z{J{6_g8Kk!rQdXKnzSFpwHoBPEq}b9*6#l!(tqrqE$BUUc7C%@KF&VAO!}{JEZT1< z@ztRJ_Y1yueRH7yKa=8OdHi}B;@ zjd{hRpzTHPA6I+I&G#aomT#~4o$@1(e)!*`&~yDppSlI~+y5TLe@M9u*6+=CAySFk zq$AON$U0tweaJe#&H8bi9_04ZR3q)*6};_n!2I*7XCu$W|0pOuIW96w`HbCR+fm2z z_u>5SxXdVB{O`C-16Dej@5mT`!Ps@dcU%U9kGTqJkbdrH@3YL;3BhM=%{5ZL(dVgz z2DWUv%s`)o&sWGf^pROz@4~fP-j_riF_`@gvhV7|ol%Ld8o2Ty-VxHOrx%KzW zL2mu~u#}!AzDWB@L1*n>@Ew;)c^-VnMfnkY$3^*7>N_su)Q?hj)V7Z@zbAnIxTNNO z4b~(4Gxv3xIBe4SwcugXX(@)jzvg{BBaYfBg(a!qF303U z-3s*UVfvZx3l$nd?LRE-)A<@r{qOPI1O12b?(4s|$@4(}sl2(q{<~A&^S%=PB^`wW zJ(!Z`W}m0AKT?TiJns!ad#d^&u8OOC zhk+&fWAq=Vsiev`!~8Sf@$g=&aE78ioP+IF3LA>Q%Bg#%_TN=Dh)*u{l8r0%%K!D= zU9QQ)dEyKOAo+dL!FN9zbY5}KN^>?R+o*iVo~`~?_Vjvro@-LSBDYV!+nd{?`+dFL z)6#Em^`xd-CN!-c*L2gcq<*}k!o)v77sLlv`fiE2pUc}I=vdzo{Xw_rcJYw+WLT&w~E%UXBi$*{CHh(m|*7r;74fw!+EdZdpkps`uZt9&x3LP zD3G9MecxBJz~{kT>8!T7h2Q@e#$X)imbep=@6 z7f3wQ9chd7V+nDKxP7$uNI#Zf4>&UJgY|uN@QwYEbcO{H@?$jrJ9M3v_K`}vWG87q z@}N5l1>;`;O!i9$!Ce0)dc^%X;)lFHM&lV>h(l%bACmfV)lWwBP?#PKV?+=1+t9`E zA?ZZpI16NFGhgHU!ktVH6Q_dzpGlbW?6cbMTXfuI5=TkLY<|tL9Z&r<>yuyP^RgrJ z(hpi!lQgxeLilBun*m-w4aJxEh9#y`r{JZ21l{AI^(2mvdXmnyg2%zEuMivj^_9%3 zbyD7Inu+jlGSr_BNq>wTqIQZIM|OY4(VtcSuCX0%fa9J_G49X#(jT>_={`{O$HdiJ zfzNaVpP>*w?-qQ9LEjH}Tk)+;K6F8!cOpVF7?Nu|pRL6^xD z@tWOV3NKy%^qMACEMLpz$5qb+P7$5|41c%CUILH z$K21{3DAT1-a|NUYtyrh+MBvf$g=Et^vAi~@eZ`xrm0zX_v!m)smPl5mEQGBq921e zh0d2joI>YK%YT*pR-8g$8}E6R!|Ld~D)Lp({z#mH@&$1Uows;AANnQsTYIElbB>Ab zfdD)$X)sSr0@itq;uHdB^SzShj@9DUN)i<@u9Mc$fGzERUG`sc?d&_6#uf&TgNiJ1Q7 zwSN@f1AUdw!9AnOhv1&k8OcZSd`azo)Uh0og6}k6vK%mw_fdDcSQB0 zw?2*cil?_8cJheM2OidmTzr?@e4mB(528IO?sT1?8;^38x*s6vY!kXh^wsTZrzD-N z5&l*|zD-=?BXW*44Zc=MYRf|z)OIgZyv=^VDRl#!1F?6X zdN0*$?A<)<-9)^-JG6qm+bDPr2|ejvTS)`?-6x0!_U=y&y1PSOyTanfxJyX-@y zC|&&den{}3eNG{IE4^&|CPVaoh0uE%^qvI0PZoOH<;HsjidqUQ^CWWp1I$o{W^HRsW(E8@c3Tfc_vn$M*XHX&?U}qx=!fQ0lKt- zE{0FWZ)#l;ua}mLZy3L+WySJu;PSD4lhUP>-_(Ns#raLIk^Z%!e=X==*l)sodH{Y? zBei!Rep55IJKl_T8#OIxKX{!(=a)CgIC!r5P3E3Fwx`?qJCM(o-?T=$&HL~~F5C@( z|A>B59r3Z0-_#@erUCq_lhmG&a3JJj#UD?NF>m<-`n zDR@nz-pL4F<16?P9}>JKP<|YE{k^u^8MMnYa;(33zUE^+Q1>rUf72Zqka~0LwSP2U z3+%0Lk%Hc?W=(Hzl++#3`M_J>0Js(T>ongzX*}0?H1I!_-+}+B^L5~V_MjdqPX6aR z<&RwDdn8Rd8zc0d3(DA6O<4vJq-iR0TQrblEw_dCtK&@20$ zkBvn6v7FzzIkbMn9Ao`*tngu0>E^E=8G8x(6Mjr^o^NHp^9JF^H25(IenkC= zesNOpn*e^}T93c}q8Gx4{jzw!vqShF@jDThH|IXX^{wpZsXn#kb0{RA7YaRwL60HO zBi_$DJj5@SK<3vE2AJ=IpvM5{Vfb|wiyht1t@_@^r!R!h*@90$@aY3SQU3IRKXLQ$ zqk>N_@aX|Q#?QM1_$Ymzxu2)~I(R=%=QW!iY=0SjVEhZF?@=Oeaq+Wwe{W-mUq@2U zxxNnweL6s&HqgiL>t&!%b3~tq{m?Zf;!K%Udd}8sYFx2=cggYwk7&Od!S^^n?=IetceSHp^Uy^ryV^+T0!%lV;ke)by$zgFPa0{p%eTED}*djNhY`!7aLc%MMr z`M&Mk?sx;*t*Zep5p;gd>;q|+FC)o~7gI`sW z+WLb1H|BesAKD=DR*v#znmz~pQ1-)0`JvyRU_Lv*e@Vt|)IODAP3M!;9{Xdh-$nh< z9>Fj0LtiC`x%a8Q$i7zn(^7sY`<1pI+9rHol=@uwkv8AiUtzw-&40gq3yt^uJj%~W z8ude=XO{6p*{`(m+9-HUpx$vwZM=qnSDZY4SMVA}`61vH^+Vf;atGpvUiQ7HADX*I z`{j=GO8wsYR@M8v;D_Gctb7^KdB9t5{Lx0_Z@_!yTd*#w^L(%_+KT*D$glhl{8F7i z1HZHb`6WB~r6cl3u5wILx`!g-m$IK}(?2EjpOt!yUun~S67-MrZ$2pWpGNsfNt4dq z+V16wms$7p>L=uVDZjLt>=b*SUkBU$g=VQIJErUBnZwnNBtJjWFN0^CoV-KuRQ%k6 z;!Epr6dB=lnqkF%udZu))k6yJkG8YO^P`G`!}c@VFRVW{Q9V4597*!inSZC?*HyhB zdM2CK{oA?fpQ_%$I$|mz+mPvA{XT8)R?y3=!%)2}Ii8A>W8d>a%|7Kds(y0Kcbc%C zxZ*z8w6^1|?v-}E3lz>IWA+KBsblnWNk8y!rTV>Q$!6`Z)qTRLLl)(Qw{Jk&&DPc{ zjP<^3t?Dzgo|LVv!}~U+Pi-2oj+5ZrrH&(;KEx)UK2z(YnBd((e|nn+wck2?9e14) z*xNL&?VK0nX93}Tdz_keGKTr*p2Xat`t~(zx&2x`pr_dv{B@BB_oQaYZ`S`-q@&Ll zQ_okV9&dHOw3l7CMe6f5H3HTF=WS{L+=lmcir>0cz-hqHUz@4~P95^7ybt>wEa!vt z##43_-8&o}x8KdvxW)K1<2P8BkJ{gpus7oL%W*tzN2Yb$;9N*xUp}t=X(|`|ZM_x7 z>&qqa`X|I;%2q7@GKoW|J~)tm4WVCgcKhMduVM6SNYbERUqQc|74iCeiC2a3`Y`&n z^dwib99^oo{CK#$@t64Yd2#tZ)_=Fj<7M~v{p;;qZ$J9i7wX?hqIccAjzhCg&pKDB z<0Uv(3Ajuerv29nAEkIizk8tZal7C1tPe`;?-MyGXgw_Fvy_kZIV0$fP6+*3uj}{g z)L#zv_vyYmuNwQe@=8ZKhp71Fb^Z$W_v!vFIyWu#`u91E4htMzuY!N>(?Qz{_W6Nt zJ{`2ZV4vT(bSyZB_<+Du_iBG_`f&V%?E>)^R4vGSb`%vRyGQwmbE|f_HpqG0yn8>( z!AJ+nw`qEdwjZ2FL_huge(0ya-!G=0{(e8u75nSxJTK@!EorbHa0YOnq;@}ASguDE zFV@Q}7tHr7KE(b4{Of}H*MYzAgcJzQBdUBR9o55j{cK+|eN7zq$9xX&0M-NI;)ORe zU2(sZTbLF3iQnUlKSobuz$h+LR|drI>K*i zr?yMqJyrQGEFKV^N#`6XXty^9`84!QTa3Y2~> z?oSTht2~AXYV`}=lP54Bfh@LctaSwCy9xI~^?=TS8u)|1+6FBX{RdHy9Gg#*9;LV0fFC|jfU za4Mm8oV|~?nR3#3eBp!bkFbAY`y+q#9rkC{@5oi&DfM?^e`8nW9f02}cy(1iEN~Y4 zOmme}fb~35XF<;?nQ`Q;m)E4n$^{Q2H(e+EtGvin{z6i7FOE5{P4O4aUs;9sYNwd< zn%?boc&_teaL%(2<A%Bxp71h^mXhXJ<$9tYeCcmi;nz`4pv zz#V`;4!8&KCjd92{4`)4A715*z}`KxcwU8kbAZ!;=Kj}N~8%{(uaqrAok$+w41ySO;jyQKXFl&_PN^rp6dnUK*xcX%-SurFr+!K{-Xz&`95od1opi{2u5 z&WL?Z^S7kI{H<~o%p;eJ!XUd+@_F^sS}w9)J|WL-dO2jr*!rOZ_U$Gj1<&)p`Svqg zFHaBiybAm6S=fht71JfMUcO##r1hG{wciJ^5BuW}iJb*`n3MFmyAS(CBA_<^!s}!I z_MRxcms<~yvkT4=I?pOyeEY`uePtqV!8$kz3jMq$z1P6TZxZ9z*kyMJy{AF%NzhyO zVJDp$sVBVd?9bO#W%8cK0sk`oJh>?2*ThZy{S0Zzw#;{~S4#$ezr6o_>(GArr1md% zzr6oFYuztz=x`wW=0ACW{4#c2I%LPOslwwlA^Zy4afV-ClYV+lL!t4Z29nLMp%A|^ z!mnZQYY6;`u8$kLHO?RT*_&7{2elsGZZ+%Uj|hG%@|}%o`g!<%bHIP>n@8N?>F-|{ zjOfR{5Is&8dh~-HeV|8l|3VMup*a8N%R-M{(4$A|A$jI5CY^U_Kb!Ra2%A4`A$)2C zpAO*D27IFD8d`u)+`Ra4!KW4Yv;ZG-u3-=GQTjy2S*^ULeLkB0vCgF!Jz(OlQ@|rE zNA|uIB7=3_Snp$?d$fh`tY^q=_0MVe`!r6~e)0PT`qQgY*lQYy$cyOXyY#(@gYo!$ zT<9A&52_xr`P>M8#qFoKP3mg~zZ$_WBR`u30Xmm-!1(=RN&FfSC+sa<&#l@|?%xlW zo#&(dt3vgIk$_KT=qru$%}e9~Db_1W~P z1Km%z?$=}dc&7^Uu~G1A0Dfv8rxH`K@r5$f7ZJV4A6K1M`@+AsZ%$!9t~x7l zaDIGAV4Ln7H}vQZe7RTf$|0WOj!ui5MB~bckNW-Bc7nJv#*^QFZ6}B;*Gq?jxbhhS+x<52&hY+| z^ZESr0mMDy{HFQac)ZRk-?0zc#FK(}GWzGolhHpvo*dIZKc1{~H0QOS&iV04mg7}AlaA5zlPY)q`EcAPl%K|P?MHjXtiaJYllHs4R@Vu69Plsc zC>+F@)GnlZM?^l%{bs3z>RpPT6g@Aszod@(XU7emFMQQ_g}cl>&~f(3eazRq#z)+O z#zm6OTG1yFJ>u^#*(G$a+JjT;A)kE$%QoXabA}xQIahP=K1h)HE7UI)4gdXLP zzcNYf{7axm+q(e`dZ z&I`q9KnaN>!Xr9IQhdy#s5}}0?UkUV=)!F)DEv_=rD|_)uY3ErYWt@M=xy%I{ASi( z+WTzFN&=+)?)efg&ED%VYi8E0nOTqBg*4s2$9;bY`j@O1g3gKl2OpCAL%^qM_lLAo zf2!&KuY8F4+^+rTl(Z0FT=?{;DE+=l^qap*$SZVwtExC!%(-2+YEEf9IL`PSVlQ+nd)HkL!T4+-7I6z_3KX`K~tNymem zH$MzKOFC}cy(%Z=xf}mw9cS)dl^J=T%$tC19Qo@nL&Oq4uF7#%w(IuMbC&m)e*>_|n7@;K zh~xUcP2X1(#(Y8R`wAEJ{fNS*A4e62Ttrh73L{=e@}#g7r+tW6N3!*!LU4=Bm-FaO zF#kg2i(BiZT($jxazC{C*-X!CKR|L@UXgmj6CJ{*WIy03)L%lq?8g^3nAacRaZoBs z`(&?3S_l@U0{Wf^o*%XSfNQc*FREnQVL#rNgY^2_(?|{mNTecA9o3w-o8lP7ueD%FQVJ< ze#3o%nR;wr;HtEj>A2jj=a@#*3$fyN#3?9lUN9z(o=){|u%C4T>(qrV*^(jR|* zOyjj!6)$%_bHnlrRm)qP?i|5mUHdve=f(NYl75}id2L0~q+g%Ye)WS-syBLT4rSU| zQv1QyW%~I1{nRq*)%`-%){PbvzpGN~5a&}1tcO>RG9MQezl9Wjzp423W#~4W!e_7G zGpG2#o@uCkjl}JIdQB=mZ%E-|=gz(*_`nW|O0a7hYI@ei+5P%DX<(}Z8L535J(={qAl3&EK1)2By~#-&fcr!jt|78!qW6Z9wf?--A@ zzm9!IC8X9C!2ppJPLkQhWpa zt7v`_3(-eM6+h43X?Z{K&7<1_HSC{{_yf7GY*FY;=NTmJt=%GWXYE84v|9*%Od9a( z8`p7lS!!HaoOoEqmHG#^PglRQWA!F_>1U+=xI_Et^b-6;zunQ49{Bukv0gH}eiZto zHoM+7r1-uyg|F#>1A^~}>ZPHSUP9o7&I=14e0=&-_T7m4CO7t{M6&c@H>JId#urW+nUfbYDjDUdx%>}@w*FV%WzyvumqP!G&Wd6OTme{*`EGb490?!EE;-1l$JKI&9?$y;Ch z{wUYirSj6L@?v%g_Vdws>J9Pw)Ca2J^{XPs_Fc@xe}RBF`k%3$Y}pWxEsV#>wEg&c z)pyYQ*>eQT(2p+8wWKiQD{fW&3H3m6J?K%64-`p6?0Z7KzF<9U-xczo3qQ+=T+LEG zTjzHF3Z`}ht zk~s4k>Tz^fRoLjDbaiw5q-L*cE>8_ zzmn34DqB(eC2zflJ}toZf|g%F8fyPsyifb*)_b&nZoMa`erGtm$vUk!(0cEwYJb^xR0=^`roAGy=i7~cz~`{1T2Qa9 z_cYYLEo(1ozw^Fhd9C!jQSqx+{NAel-iC3a-+?3hP~`c*HrRFKFJK(F?+Hyw{vuNY?LF>_?&ysbun}op>XOrjACE&Ncul8M`1szYeFLzStwWxBm zAgM1OvpSCQ?70^*ol0|Bepb>#fbVPi^^B(4y+_&|({iJkc89dxyz$#A?T%>qA#E3Q z^W&)_L=r!a#&I=2o;v+?j;A7CHoW}{LcjsNhx^d>-&6Pw;pd_4{~~Z$IwtV&_U|bC zE`bNicY*Kfha~&h5idygvF~7Y7YuK|NK#s#7yc#t*x`pK-xY$NVEforj_EkA^%fPLP`Fv)Nrhn_7lLO9|9!ciOv(MFBKH-Q+eu0N z{NpP3dH(B{-p=D~Ld%a!O6&a4i(q$<-hUol9SGrAPZp_PySAyHp!54R^n8U3_J-QC z<$Xgf)kyhl{~NzwllQejKRv&OdQWIR+FR2Yup}_G#x7$I4?mutp7*($fIi_YKh95~ z3s)ce!!!&ZeT3Ga=+9u+MFD~ylIbCTM3=xiPwK8*S-UJ_kx@%TxU+tV)@;--qgetVOIxbH8&`n|-DGW30T z;(NmX-mOoC{Wt|Z@0VX7d^tXmr`O)~cINMb;=i~K|3dI);MF>T_xgPovfnazE`N{k zETf-HZ?hY19jQQiZ=m#j!S_(p()T!LSb9|8;ij(&?Bkv8_fI`YcxwNw{|&YHZjN7W zf$%t8oGax1PAy7%)Ne_9Ypw?U)bFeIJ)rvUuAle6z~?E;_21=wG}NA}^luc{$0wk2 zj89%%>$O7v0QJ=9y%6O(feX4{+v4f-S8!`o7tyzkQg@DB$CZowwA4wy-r5F9eSB6` zel2eJo6?U};iuidM|MJnzbh(7d3s{6^kW6})SM4`lurq4HbE+!^b<_?=QcvTEB0Te$zb{8&5Z*k+^=w_q~Q$gB=TznpW&;iL-dQL zFnp=`sMm{T>AXv^=jrL)9WFY->E?@-;XpDbiD5zYyVtaK>O$70y+IFp?}72XQw-U zgCF)?YucBkd|1xP7mvqj;Kl2@%zwuJ>J!ZG9>u>;(nOzK2RpH(<%qbGN{?LsU+7Um zeWgiB8)}Bt5B?RYZ=n1;g5RN5$XPV?34vYQe)_|J_d(90nQ6fL`=x(}T2Vgk&~p1U z|9<2ODhVebE^_J1tZ|EmPw_zofz{p_5p@qx~t3tk7d&0_vj zKa2J!>+_GubCyf~MP(gNQ;>%P^f5Jlp7`;A6M}CtE`Lkl_?#~2sbf9przc-6q^EeC zeog!R9@0niKtH&U+%P8PBLs6we30_H;C>N*{!;4q`ObWfn>s-|m9cm&NaH#_y<*hvX1+JHHt))0>(Kb{*w^iM|9&%98{A zc%J8+Q}x72wL7~6E|3=@?Uwjo z(z(=5T0VM7J~HxD(fmX_=0no&g#X)8e5eqAef~c^^?pS754xH^=ktGn>Fc%2^Lf&4 z!v8I)dKW1l&0`{0KL4*t$x{o>`_Ef1CoMR=N>drzKLY#pE{L6! z*jH7$m=d(FR-Z%OXdadR4>vs|&l7oH(0tH~etWCrC#L5YTK5892}#yx z^BO>4x&J+h$FHj2_*W|TYw9;%E$x^cOY?@n2e!Q${8M{2DuccUw!PBPgPNi74gAP1 zLAf2>@;;eo0Q>mY5xp8|+`sRyl5xyO5bMG(C^HbsVMNrtLM%A8uZD_T3`*>FQfjxRJX@_W&*fc78;*Ujg^4iv9L%v0no1 zSDot36VSh&KH_!#L>~c9=4W`Eo|gm-(XSX^kXyQELgbh8{c0*7>#b_~XyL2t=fO46 zZ#oXV`SLTA@BitoAHCjct1@1A9y0suWfkUAo5)q-m%mm7#-HzsEDuK^NB%r|VM=cD z9rJ~HkQMpCZ#2>z0^lDUYS3UbH89O&G z&cbsX_xCw0mlf>e36EmKPeaWcGyTOlsfhkHJ-iYfYxcGRpmZN=!QcllHC-1df3HFiMPe1JTd&R3_xx@le z{(J{JZL@wm+fhX#K(%r1+sQtk#UCmQ*<>Ap`Of;Ds#1YT)2BzLt_#`zhTHgD^i-FQ|4vE${B0ZPkMl%-v}yTvNfZ6? zf293^^6!IQQy53l^s>P5KK0k8^&H#2RXpzieGj$%wZMm}#CKOx{>KXOmG#4WrkRf` ziqENa_~flm7@sY^^}`-Fblz0?+J|(9u<;4h8+(Nh7GF;54Z8O;BPUBLCtoAqgX#Jb zk&|Vm>yo6toGff0C(AMG@dYivxQ;J{K=;R#bX>VO<22-^1i47!j3s%_a?ii0ta9Yy zjJRL2w+8c##Sd-YPeaWsP)^rDlIPdT^LY#-@ekUl4d2h@bz{~awocsnCp>Q~$#^@o zJr<0@64r-@x4&Irzr4(sT0hrg^W+Pt9*Rqgo`|=Tk-+^b^(#E7@SwsI3Xdv0uJDk; zV+tew6K@|Cc=+%UeLk-FS`>zUqWv=pWB#Q5H3Aocf0sD4&+l244?Ac4eLg2THK+WY z&B({3%17S1{(USTQxz>gi8QS@AGg1Xb)sZ_0rHltC#n8vQh&7sxr&?MuloHTr~Xv) zPp=gHGok$$m(K%BL= zc3JX8BN!Lv|FM2NF;x@v24BT{-Io#RmLIn781F|YF2-rY78zCoa{;?oFTR8!YUiw+ z??K#({zR7{--hQEj|@paU z;Uiy0dd?E+-H-V^-iP>P+%bpeO|wW_E0X&1wM_H0uMaCaZ-0mOB@O6#^4^+f$@+G5 zLgxcJPp)=x^i1%b^(X&gwHM3|i(8kgw##zR=f(TDJlDkh`$U=7o1QK8ZMZLs%CS7` z+A$#c8*2I`Ed;+T=|K6L(tb1reG^SNR4mD-*pGeV->BxA; zBzJTU9PO1SBrOCt2p;i~K|DV(BxyJzkAvZ3YXYB+FKbjk(}yLM+ZiYN^ad}G3QX>M zYknH=O{kac3YO4xy}pwRNI*{P8tH74Uwey!g)bN7(Kj1>H`LNNRpid>rlSGR-=< zY@=6xJFIW~ar|_V=TAy~zC8DAP;RS~!~XZjGYriK| z=SY;Kp07wfk<_!5e85$Do^IFrl;=MEc;NeXP`{2Z^DE!_WwwWK??3TR;sRj_=Ld(I{!L)NKDqDk7SNUD;C=V8 zKh-DnHTop`7s;TdpI`nI#haNfdG|i7L|or0;uHEEgWj5My&t?C{dW72p|AY!`^(RI|ui_I~iTjC{?d=)G0wZShIO9UE%@v)vC4I-JS<;O%F~ zuZr^Pfz_ z`jNTkp+%pozISm)x8MH)$q;uGGx9ropNE9LdGp{oQox_5+Esq??(ut+4DM*EQ~A}d{4#$9>zZ*# z-5KN8T@}CGG7rWbfz)IAzMTHGCcc=Szpi0BDq}DFjN-AnVfmS=<&7>` zI-eqj^E{Zhulg%OXWX|D>37VMaoQ<#pt#S5c>OKyv&iq)%7*3tJNGMdANb`$mq_o; zCR(QT=DgF}KWm%lCjYg0LDQ91go?i+_*^yP9*>6Le0=EG87p!KcEI(x+?hAdd;8Cx5)M>vys(57W&SmXa-o5Vk zNPR2VhfrEx*RLd=u6B9q{uSrfmZbX;6hvd6`@W*WZJh|s~0r-@lC(rzz z^B(A@J?Z|d-{<<@uk?UlK<9{3{qF%>MqK5*=2ofD*0mdI5b*ZpaE|!M{7;{6`5^DF znOabO%}MH)tEjx?`F}4Jd7IVp6{H%cdNSQ}KEZN4t#VCzl=V65m2Xc{|4S2!|D>da z;36H5b4q8>|G>5%^gZYB3zPNLc0t(g$+G9w?m3?$Kb`q&>tAmMUm$Hw6sJJ?QN?Q{gV*2&@rG~T%yW%76FxX-ieeqY+fxf6<)Nclpb zdgN;8ttfrZ`PDSwnC^M^oWDZ(lDX#`4pCHweb-QXwbYaF^>Wnv1LG^kq3KuLX0SdU zG^X^Gd$2V=$NJ^pPe>eJ={%O9^T-Btet_vbHLB%DkUoj-!5$?1tLfE!qE`nM?;%MG z!LLc`%VnL?&E#@f=vA-f>N5G)bUftQiJ{2lnvRD++kGSI%gE*Dq2Dud`8j#+_RD1C z^1sOY-kMuP?l>RYskRS}SG#?C@A23n@BAdsPiBXxek#E}u=QIyk0SWcz6gKJytse_Sl)&A*WRT**=&Dh2N{nuTzrx^0BP^_UY;0xBq+@A1hjZ8EGliKerD? z`{&MCsGa4`VStWCmmkEv@r%@-YUAavA7VZ)YCo1FrTYdTx4O6e!F|) z6T6rNlkSnidv|X>SwQc)rEi$Ns3=eeqp_uf_Yx-xoOE zJtXbW_Yf2w6ga-4U!P;1j(7Jd4F5E_KOTN`a(_Jd8t?AZ{Eb>K^m8;-RJcvww=0am zS~P|EBi>!q_jUTdQQ>-pb)K4PQCR1*sWycrJKZ1ud-8|f^Hd0~5&OuO-}an&;b%qe zJHg*_yQF@(7M&OJ^xRhu^Sscei>y0k?-*2F-d!$V)x{<3+$KYIH#?@vE7^J&zxksmJsKR%7}Z?_q8D( zCDcpbo5=8aobf9|E;w%6nHo3EG;Rh;cL`p!Uq#A?rFRKD-1JR>>3%4I?cP4}OB60j zO8ci3ZjsdQ-wOB7YoGTC@wmN|P+~jenbf|YKTXdU-9!DZpnp*rbWPU3vhk=zZcpQe zOwW&|)@S%8UvBs9OwY=a_HR+r-kJ*~9u$VyH`P#s1%C2#w129%O6a%EpHT_@ws|(1 z0v~KYklp*5#1$%_oAawdKik(!-|xhG7gqrN&pWq47@636=Lzi7Z;bly`!%2Cb9VM! z(ejw|)6dWG`P0eWevv!G>7(+flrM?3%LDXKD@acl@QKy*1dc5*u#5-u;N+OZV%8Zf?Ivc0JqlmGR>{avpuXzN)sKZF(zjAN#um zKh;}qz1_ZdJtg>^`Fb|`(d+z&$Ge`5xK7*wJJ^>`)@MAw8a=)y^nm_~%Ft&GwHJ%L z`{j6E=6N=6J^PJ9k8#!Cn5P?Ric(J@II8>tKL1hVo%JC99_#m~duuVE>7I3wQ=gtA zDLzaKA4XMAz+R~~ZU&VPdGX~J2_J@(4}+2>GbZJ+*SbaYs{ippp8{+kas(4{P3higv zuzVx?dzp3Rddzoa$Vnl{uG_X~|MJ$&|L!eJuQu&pi}vpyWc@W+=TQ6N4Ax5 z%DdO_o7`@tsO>f))qW)7;Mat{+4WM`>&baw*!PKF1G_VcW5MoZyT3>^TAa`y=PN9S zO-mWOQsfKW7dc;2yNIfC^Eum@-<9v{z%G5_)=SlX+aqM~zKe}^lK!iG?AD9>U@tqr zPVH;AUW#)V=HJ=(gnfF{5g(cV>GjgHMBmgazv?9Q%dKhLCeMz2zsOsl<<~^+?K_oE zruEWOIq{qB_p?8-3cSmwB+c64;Fs;2F9Z*QAMRWN_;X;}AM5i4q%Mw$IA!9eF5RqP$P;w}*X2dQk8SFR?fS_5(#T&==v=cwTKib(#9_`}d#cbBbs1J@CBw z?po%1X-Vm}C}|;B7Q8ch#;vDfU$`${6DhntCU{M1y%Uo9`NuYp$6pY<#l;XJh z9s$8fzrPUgZqxUe2jkr>3Zva5uG^{Q)jv=gTU0AM*UUCgH=Zmaj-!2<}6>uK`}>ho{eh`t8&c zUwl9OzrBm(u3V4tQMy6WUb}~Ssxi~A#SP@8Ab2h+o=b}79}0qWpNPP5tJ2{;xCcFn z>t*RO#Q1viOVN`nmZKviM+2oB1y8#lEG)fQ;Nd3R^BI+f1g5wk^lE8D;XqP5&tu<9 z@#(d|^R?H$oWmlywz%mH)V`lTP2c<9$@T;2Xmn2ErdhwfqV`B$y!20pxxQKLM@3SL zm)gF@xMNc2+*_mP`bv-wwkIca-ZH=Gr=cHozL}7;n!P?|c%}B=@f6B@_yfUfT=5!1 zJ*0nWiX{Dui8k)Y>YtGmKF<++MirkC#pgL0KW?LU|C z<&8(SOL?B*nclt+$@2Ii{$7(?4_F317N1r-Hqkq<526zEAl+vm`NLA1q{A>5$evZb zwMWFnvo~8%zw3WdVe7y0%h{V~Cn}?z^O`rdH@kG4r0vb$mh;Lz;9I#%QlDP!I!^NJ z&2AYdom##fX{h~k>*Cr!w=S;zbL-+c{nPuOl6W@goW#4Agic939DJhlU-I1VM+?jG zH1OhcoGb^-=bHBkpB4W$NfUch$9GQrn%2|7r!w$Q>`mZB-~W{N2ezf{P2fp(2j1^M zJ^A+LO9b)cdugZ8u73Y4S-+~2=gImN=0mrBrQe0MarAh{-+AZ$tl*XSIXHmp)4fsU z&ell=Mc#@^??y@e{B;}18(rm1^H;r=uS4qANkGqJokZnK@3BeNJy(=YI*#1@-llXN z(f92Nk1E`$@R-6~lKS|we^yP-KJi|bvo+|yav*pYf{#i0%zWbP^WVzU&wi8dH@sNr zxvKS^lGMkC{fyJC3x543qNncTrhRi#z7XKMRJ0xM7{w>r8;?@eCH`pSnYEAKH&B?sn_=x*rNCCDz>wD+_GIY|MQYv?1~qE zk^KbNaRcsNTG)}pyD`4$o*e17+57SFqEryyVfH=dt;D{E9g^7hu$S!nS%-GQ4xsyn zq@F^6bG!4I^)8*Su^hV24(uWQs{al)7izRRIlXuM~9gn znf0#sBmU>syTJD|S?~H1ovSB*UiH+nq}lZ@wTBQMclXY0e6H5kyR>}ndY8SYiH?5x z>s^{JcfIQcQr_opT0Vm+{HW#!EGi%J)=#b!J}jwTUj*HpA8@1K5qFGUO!;Jf`+5>E0|9Fi(5h0UKjWJ8phYHc)!{6 zqz$#-lJZ86&HFRs89Jur?k4e%^YlP=Jz_-ZnYSMC?U41rsM2#J#a~;G7}*f7Pgcdt z)+2^CEPpn~RdUxOK$mLk5rf*ly!D7bmHrKB{|2>x>GcTJ|7Wls(MRo_iGTP-Za3v0 zMrHJa?E?7uPxkeQS>YS|4gXWV!!-!`)_aa4w{Lm@RC-^Uq2es@*yKER3&c zTIbh{e~5N|kn0g$#7EWxY5(w_ORT4QATN)>KfFuity9alBhC1S+CS$X_Jdx|Kh*K< z{9n+K;t5L6A>`NiKYdR@Velbt8dZ2v^N&gD>*p4hW6wWiJ;Qwdxd+*9Z&UnRB+c4M z;NOpaJp%SgvL11TAQsJFoSkkxqEY#8=OjKZd@pLh8zuGWRY&>RzRa7Kev$cJs@L*$ zl4jQe?ZbgfbU89d}M#sr|(;YzJc;>P4M&cv;WC_&$FYSCiGpEa^yEkO8c8J-csuf zaVz+ECj0&7e}m-7{GSuL-*0RFem}!AFK)Fq#PSLJ$d45~v*Q}^w?eQ@JX^ZQ5dFHx zzQ4Kz_$2g`Pp6IipBqVTHu8TG`xc7Num6;eSF>+_PWZN}d^;s+L+!SVJ-MvoHqXBO z8q>x6meMlnslj(r3&B4^P9LK^*h~2EFYds&^ZT=y>dy}8&yx0MQTv1VyI*cj`;+HS zd`9}SfO<-E+8@|q1-&2C@YzhCUmr90@ zJ=AYMPIN(4zvE3pZ(G;%`I#<%GyCxwzr*mzt`BvwJg7ckdC1$3w2%8&>CygmrTVAy zrSc((ORotZ6T5d+VaQ9~_rsEPp=HVM_jiTmWYhbQFi-Kg8~jbS2Vt*1-hD_>8S}?5 z)FQ19>HPA9+y5^T`AOpRdjAMKR- zByFgC;j!iPr-T@4-CB z`AFY~zhr7u*mlMm~-ck%a5sW+O!IEZ(r?d3_#XKr5(^r6|y@o}@0RqyNh zo=EQ>N#gaeKl1Hl#Jw`}l=D-TGJ2&>$B+3>PnB^~uX0l-sV@&~cb{(loMw3_1zLVh z`c2=XM7szxKBoIQUws$VYj$)=?dY0(J9<#@%p2eD5KYRH~KuD^@LxQ@w^KDx%)Z4 zE%UJ1^|nv@Ox6=V%ja6nF4yyH4YaSG?WiZ;{hSvH-%m&H@77jA(Vyn;<(@NvnG%?v!+Pf&k>kAiBJ2OPD}D0L2R$tG z=~Vi(D}9V#*xwa*G-mjfp2zBWe$UKf=c)f!zhU`ntClxBvi)k*e&yMSvke1PpWd3?`uZPX+ec(JEZs+fjJwbkPvL2@P;S=r;Z@gd9;^Jw4 zc%09>PX)>^*yTR|H;Ox7Eb_K0@@nz%C*%1XUU#YH5C7S5=JSf;zbt9i-j`ub-_x?V z-jC{hPM6@9tcP_8V$n&AGxKMwozGdM{`>19R}0^lwBL)8`h1_;z@PhHZ=~^FTF~-y zl4jS#RL?j+GrJx(mcr}Bg4ej#JC?y~MDfb=-@Yz*jcWN3#VflW)=!l4_jCFFy`9ft zJ<#*{te;Qwk<>f98~vm8WP$BorucA=@Fl)O`7>3g?>pr=?e|nz;{nIp^m$RAwvewrDS7VWSwKGh2aqzA6V`U8I_ zkblwrsz>B&ctLQW2jA^udF0<_?nj_y2yeX#@kFD4re8Zy{}2B=D?cd>`+QB0pHI;E z2}|D<`Zd&iP5cZ*`G7N%Cc<@B!Tc-njK9Cg^)R3LXWwDm^-2V!jo!Uy0k(aIT<^-; zP=@PmD4>FCC|Tomux7lAk4%Uh^Y;a};!(i)cQyaMKpgjG&U5=k`kUpk`4csgGGD62 zV+h@3za&>iza$Rxd4V&0E6U>^x;)Z3IqCo7mCN4RR_Q?8F_h5@Z0|7rOfT#by|AG3 z)|{l(;(0t@vYyI|mwo1uu8aI|I=r*Go}zoP1kZ+=>t%ct0$n#$dTu7pA@Zl+X=$ka z3#l*e03A5aLEUij>FUjmbM$5Cmmb%9-*LKm5qi|8-=5zbkzhVFGKkdAq?O&JnFE5VpCh1>~_78SvBDdet z{&j7L*H6hhMA{y?TH`mJDf)av>fJnj+Bd}GFx!ijG#=Lq9<+`q5UeP0d+iBA4F z{NVf8ei;H?%7fs0?Uy9J;+N}F`sT$CuMqn7D}DP=PtE62ahi?B;hNZkh2T4qrtLoZ zev&-rdBc9J>h1e@z8xy_7ro^9V_x^~@;oy8dvuc;ySD%ECfon4w!a`L%h#Fd-A`+|Pi?Z?$FCBeJ><~_X15Iano$( zx#;~e+Go3GmhCcn<9kox@739Pyrv4;FRe-%H%%%GeGxZJD7>QY$0ZH*ylN8P zn}j~wgZ90BKPd0cL!+If|EiZ<|IrSeCy;XIHNRXcO!m9<3GDNc?|ElAO2_wpT*h6X z{94QCNxom4?S(wQ_#@2ssa5o=dw9iF=od{*C|sxTh{6I=Jnu8|$ME)fNejWh3g0tws`1xY&*diay(;+& z!T*-jms7rXpX;&xKX-|oE=l{eze-X+|D5WPJbUK?me10HmYFBpn5m4|7T3cQJ%hghTu6S^sw_>iM}Wcos&4AWTW|MME;0dM^Vnj0kNJM zH^E-?>9x`RpQ9wlk7xf+<#yKFdF#2n+l0nVNfH@nr)XU9Jdo$_{QV6w52#*%KIpCa zhUii9+t6=!Un}I*uYZ~6VUj2FulI;N**v!__5MfR|8t}Yy{p9w7M0F<@z!~v^ODke z5p*HF$@5hq_^>c6?&wd^d*l5-=L)?SP_Nz_@L2B0{gB`{tN20BH@NS;P6&S0;!VE4 z%W}X!+b`Ga=7q<*|K|eKtM>={@;8x^zkhm==Uvzrk-Hx^8;2fKe&xke?i6~!j)_WR zDSjPRe7b~RK0YHUeEvf48CCv_pdS5xvR`gc@yXM(Hw!*P%AY~S$G-Rax^?u)#P@c{ zYdTktbi;VFyN@~*Z+7=k=fs=c{nL*<-b`fh;?4NZob5k+4Dq83e`KDivQK74=$ofk zvvHO_b@jRH(_qI<4eyT4=>3Q_KRm&S5 z*?zTazw-R#ozkyP?N@uMU$#%CZNq-OgyVL(`(*m0e6@WtU5Z~`d~2KF*Q5A#DSqjF zGG&aHob?)?o-NegnfTFLxZO&dw%dZVjD943^sh;~Sw9-%De&bX+QdT zqMwV(uSQ9I{@1Cz<=K_Le?5=SdM#gvG~-8W|C}GK{d0bFPXC_3bK`3q51Izu`Cc*B z6Rckj-^+Xs6#q3DcUij_<$m=0WMGdbekINaMJF-NPPb3yl=|o9_x$~P*iL|-Wc!tpp>sY8n;(t& zGC5Zc`ztvw)35m>=Tt88{HZI1{tH@uPSQef zKiYi_@Ur`Bl6dDW$j{^S|G$mo&GyBd(0wuPT=}Vt-fG_<{Nj0zR2-U*b6skE;7&CP}U~+7FYgM?mrWeBgQ6 z_d9PAzUlm{=l80eE9ZHD$93Mi?m0{s+s9JEe9+*|mD6RL^mFT$mojwv?;ePMr0b!{ z{`y9to8KRvXZ-&3Nq^SQE7kl?*6ZA#JU?c2ko%+hUGMcv?2!k+*N*xOKBh0tuiq>9 ztg2j}lC+wixsl%dmf*93dfa!}ZGZjkiVx_s89EdBJio#A*P~yX_Z#Xm^hl4#n{Q>h zLhfx`Ci}6nb~Wpn)5T#vBXm){Q-a<}_;gU|5@5V(Jf@-MZpa_K6*)WOb!U7((wDz< z|9*Ls{hQGK6;tbb{6#y~Uk^$DCYA4)my-VNmHydyk2~jPSP;_38IYtLfzy5b4^>Mw_~q&ppT9n}4a}i``TM~{dKsV36MX6w zpE|{-S>uzi2mJcxQh3}Vcq}L$bBf1Jnf0!U;&E<@E_@Q5<$ylvM|yQu@u(;s*GoNx z;Io4JX66Nd{%xqmd1<5T=H-4d!;iGyJfH2fP0S0tzRUAMUOZ#%I<7BJdaQ~5PxR75 zLXWs(VMDxrTjJR1`3n2P;*L2fZ{wh$<~FI9>9e_cWp+b60>&e=U&qczVcxa459@iB zqqhovzC7A`cV67;kA;q_m_JLWl#VMZSBU5O_3^sbnZ$j5pX;sY`d4WV z^_S6)giqL)A2kcwUfg3D`p)eiSW+1Mj9XP7y0{1QViNb6ll(s3tXDU?eN+*3n@F@7+F%mr8|9 z7y2(~sQD#e5*+6mz&tYkGf6dYEsKjAPu#DPojMkV=T|p zz>DKQthbooyT_T|7q**@@<&yXhzEkYeX<6xO{=$OLbw%r4mb9TZ&ddkA9?kkM zZ~sG|(02*-=y%~8YA~;4^g~WOH@n{f_k?8kJ3JzG5z7((DE)G==%j;yTe3?2+U<^uW*d zOGHy@7wUZ|G!JTfZCd}T!YvA~DO^-I5I!gO2!gIjyr*8@LqF2@W)zm}ZB@?Da;b5bSX z&GYO?s@*?XAyBd}<2)I7bT5|Vw|f~Q7mr#-J&)m@!m7B{?(wR}}u~Jf{1ss>P$0sT}LSym-_c)5q>p$=q|eCU`tndpNlda8c;y z_h&KHpR=VuYM+#0msIn6=CnU~@u&|-e_+SZJy4=w6Fcc!(jT%%!QThrPxyFMQh5Cf zpYuIAtM&l&bwh3TKEMeo=lhF!G#4LYSQ-ss$4pI^oxo&=(rhv5L#Z` z%I*VP-+$H*G>npS1$RnwkLffyI&{#99MdcNt*Bz21l&-8~S`q z>y@Wf#p_P7|Kkq$fu}1!#CmBH{TkGM<@sGdFZ~+QehsGj1qPhSJ%wAvA57DGMEf<7 z8Fy*A?B_UKW}V#P7ggdSEaz~K0@f>e_Z;rx{^j0t_z?7p+ArRIXPG}dJ6&PS$3Lul z4*l<6{Q`eS?Fm|^wtJcre`N*p$sUZigbt5)y&CJ5kI=a039X@~M;h?uyPf!0&0pzd zefK!-IsC`h^EhdPT>l5W=Wz0!%+93{^5PHkQeVH;*QfQpUFu8x7{x!=kD0@GbN42~ zU!ncC`W*WT4s82`z${<cfNlM}!Q$=%D9`f`OQ`Rs7>HuH()+U)`<}>G`}G}P7I`9^1USU z7cf63_bI+t@(pi)NYX;^70}K33(61YFZ`jr_xWC@^KD73qg-aB7NTgd~6+u zUd`;M9+T%jy;#nCx$7s`{9_)cU;mwr?RLMu^!)noZ)bg&o}X)Fex4r}u^>M`yPkJS z$9tY#v`5DKs*d+lkOQrcz5^up2hcfs&|wq%tM3>2T2c90mNc`!n&y4}MYm|WL(`4+ zf1ah|B)$LhEFDjI`#%f1KO?pOv*D}@rQy@j|BtHBznWjMxPiVtSLnT@^j-vA-2Q4I zGu_`cl%n^>`>U@LdM_xw=ak+}kdG4R%KEXQ_~rR=kG_uOY*z8BD1Nr?{kKxlneVSg zKYCpp>WSK4-JcnM>^J#-?Uh20Nu|ex(j&XxI;Ql<^8^1}=rOMJ7*l$fU2Es(`!e|O zyzS%je8Fc_@flHkc4hc8sQBdR-7g6~LyFI!;$!!gep2{j`}0jNL{E}&#`=(do4MD6 z$l>{&nD^oi&^zOAsy~r`j(sr0r?j5kR@J{VerNTo*;9G`+5N(=e&tu6^2_RbyU-)9 za$X>fS8r9k>>m2A4g2*lm*0ec)=q>!6aOsY{#81)f9 zpLU<1DfaYn{*K%ecPX9n{HX?^ zQxDoHbxE4NhkmpE)DwIU{ho`ZqYZkGb2J5eFIgvgnY@oqVjP?QRqdWX_8WNKGe6^1 zB4>fpc`c)-Ebg8+-~GcO(l4b|=nwb(qc4iy$oQkq|M@!n5YO(heISO{9>Hrt>z&Ks zW&1z!yLKn`!?{) z-3thR)V{+TO~HOLKh*f0tY2Y%P4+9pj?4E)aqqpaKbBK+aIVmMMd`IHsh@vQ{kS|o z<-+IlsN_~8a z1hc=`#Q11E(EvT9pW!!;W$oY@T5oha{F?Yx>fdk$^ow7GG`b!5#IHgc;d&r?FWF?@ zbCL5~e>^i2_MhOmAg+e zekuMr{DxCe2 zh@u|$^ff=R`R;ysOZ>8XXPTk!8)`0+Hyl5r@Y17^+EL+4Q6S!ieC#hueOKVQty2wm z-0b`he$%i86*O#lF7h{FovM)vFFjw4NXkd|HD~;i1&(huP0Dl5KZ2{aq(S>0o^L1L zEcvmH_6VUV_#K;&^6{|>>OUdH1D;<;D8KK2j58eKJ=+!W$(n%s#U{`EP08~=r1NF* z*`UMl9e7>{u%5_xj$M}Yi|hFat#4a?i$@eBx`}%|8PDOJ{4b@-562&{!|}=QFXPMg zm-yU81^tXpf{qPOIbZ6d{gLQ@)2jHH>GFQRCb*um)>G1YYEDW$anp*Fr~Lu&S6#i! z8`gU_*E^&2PHMdYpQ0cdA6r6wA?V3`BhxI{#e}3^A$Yo^)#!Q)(RKKaNqHZiEeYj6 zE`Kncxt`(elLE(%Pxn@T|7v+m<=-iPL>162QodiW<6vIxeZE(i>yKZ6a^?^5a|(Mr z8ovPjY1neDWQg}KN!tNGZn0s@d0f5F^?Ot<+`+X{y&dC_i)TSzcphL; zj&^72u;3RT8xuMW zlBkXyAC)i;Xq{W&>-GMI8=J=PUiIwh==RaKvK|H9L)DYL zHD?7ZVb&j~mq4z-^gZ2I20pirD*h#D_fS)vqywdCg`Wz1lpl1DndCnmUbQTDDi6Ii ze<0;UrAOQ}xMBJ4upXaQJwBsyRoDx@k=(L`asN2Ab<*A~4B@$?G<@a#B=lCVK=dBN zI*2A!@1B6%_p%|v<)JQv>ra3WHy+k~C?~+D*uL+10(^`QACqzeCqTDDhcU4aoB-Vp z9e#_vk4`{Nh7TW682b6f!!Qt|6X3`2;URqwI>(0x6$YQ&J%wlY$@6$`57Jk6A>Xu) z-@Tm*WBkT@+ZC>W?|a)6URJn8;Zq716<$%eQQ=jE$snL#G`*xS^h%6rF&LP}I5@QT zZIW+bI)FUwMSL#4;}$JHDCLLuP6|A{^C6_WKY;goZfAJs`|*7H`y?GGeOJmI+Fnxl z-xQt}xDb@3z05d(7}5Ou0eOGA{p@D<+!B&JZfN(kp+2A^`Zuj7Bd#Z7_xz6F8#fiD zJl&fhX<|<`ZdmV|xZYg5rylh^2D|6b6x%%rR3>&0?6icg`u+~-2GMm!{>Z#{b`J>j z#MwQUf`0ok{^EU*vnS5(SrfVXk8Jn+?-SMii#>FHwh&-FtzirN3RZ(`&xAXmC}YoF z;CaRD1?PWJepZ>gG=5hI{!HYp+PwU1lBbMZoGt7lxw#g6>`?u44)jb^0$)!z-yETN z(B_*4iZ}BwYd@%*ZkN~89`t51FG0_puAK|2`YkV$3hA7Q$cek>+W9Su^89r57OUD% zx=-f>%JaNLr1s`L$Ypxoqy2;!?|QD-z1MkdU`p+j4&2*5Fr{`%M?1<*Pf8l^!~7P_ zQ~>WEmGt__SxIj^XG~Jse+l?(==1p1nBU^PFc70@&~d~9U&ecFK5G&D;=M&JuX=W`&1cZt@m`zHK)-lz zdOibv4(&Z8^$bjdeuwtHLEzz?kgwtGw+S5YzCqH0e5D0^V-^f=S2^4%ubn-1CiBow zzlHR?v#Vg|$2S14r~*FGc@*&FVesX2a(97OU$VdV$AJG0O1B4-?&rr>3BA~b{^yp;u{)42c7pCYTk%?9}Mu^ z=v4;2;#Tn8&7;GTJqR(q1nh6~_%lD;;#Q^~&90>HeoFnrt?H*uf_~A%O3!^5w+*%M za~f)Eq~1bsKpLFad6e$imwMd!yAtr>cGGsnJv{$Ug5M?|wEtWR*gfj8)2G_sCg|Bn z=`*hcoF7CxhHs?!H`H7Q{5VKOKaR`MH1Vj#Ey5jm9$$rVGk*bK7r(m-@FSRJ0-HY? zwqQS3@0Qm>zY(43zhKw7IC#kY<+#N4JDB?H$Eu$7<|WQ=^Agw3IpYUapX}dQulEo8 z^9R}~1RoOmhbK4oU;C<-$3ASEU!pSPdwARHxf{Xoy|0rrDxp6&Zd3iJ=k{*g*01k% zKHR2y($3d!!~A9QW4x_P^2fJyYB|VHyscefwd1#`o-AQ}#M@f*J;p`6t*9{MG}iAo zM5Ut8Bi8!|q7vlV;&#U}>ov;4YHhIVYaD6YO{cYUu zPiy@ps(&6~F=xk_96tiJNpb2~jI(2Nl5%<0Z^KP%4lWWLH?0cHay99#1H?_If zo^Z*-tFb`&J(%h9EsDo-O3jj8gZ^4PEOPgmjtHJfylhC}arC39PvHrL`xTy4cu>+q zN5&*&dOnlzvp5&SYzf-;N4P&<^Uit2O{xcv!Onby_(xp~hL6-seLkJ}o(zAThv~!p z8+`}w^VIoP?`8DMEioO5UjN{=%l9qu%*f^c&$Ub+%oB9(P~>v>FyztByIWk;*+Dy~ zF#V!SAz1wVK^adMT+HG`{cRWgqumVAxEMgn^DXC#n|jc{=Hxklk1$qx^SCI|t6k^L zNQQ6#GH@N0CzONmbui$rqjs6T-D)?4hnV_7a2=KBcESP9P46#}B)EpkKT0ik?*SYh zLP5@7q(^aUQSb_12m6WZZ=vVimudck&y_#o)<)zzxIXTZ7ZARL2XRis{J`)a_nz?v|H6Y!3PZny2QeSUt$Jb1o7pVWNK3b$xKiV9EYd$sFZ+w?vB{uBLYtdqqzj7hnzXM_In4UiY+f063BSySWVbu?(&=sEMToziZw zCAf~{oLlbJ^J>>o^8!!ML;8_Ely;(N;K}^v_fZ-B=)OX-5q$wu+*tB+K9;Pg40>?; zB8M(Np3`|WX`;VoIFEpsDAK`^9f#hFJ1S=RuA~@>Unq>?GfDs zABY>(v*PfO_GX|jm_CvZVjIk3*auN%75S-AX?JE#;O^Veu8qT+iQY{2ZuO_kj^lB@ z?2YFe_ahz}&47+K?#KNfamO7ZFVPJ6a1G%j<5TguhV-Gp*P&gzH{lv;SDwEV&zZdp z8$Y^>cy954gkKn!X?~eM5j|Wl_*_TylYW;m&btq4JH!WR_X@yV4>!f=aeA|+*1qYL z>!=^{UeoRuP)7P4(zr)Ba}48V>Mo?y*!LQi#{`a#!0wIDIWF)cRJKU}@2an%f7$-P zIOq8#y>9>8lZjmr9~qVM{`}BMeBycaGipaX_)eNn9`2HSbnXNBLup3zCy_pw*C}}` zm80q9QTB`I&tTWZ#6bEr&^i(SI3_LWP1JFQpDRglHzk}uDq)@&zDMVqqj(?dz7d;m z;{CcWdf)i};T(3~LEMUc-C^l&X@~54c^{U3L*a_TO1~!T=MGEn(D$Pv*J0@)h5HnS zyv9xa3g52p>l9Y`)pf40bgRB!)Anvr82g~Z(ouy^>3i@YZfeo`-mmZ56n>w=oeIBK z;dX@|RCq|?_bA+@@PxvH3O}H5kHU~6`p%icxEGr26onDTBfC!V#rM?hzMHUguhv)8 z{P1JRZq)qa`X2kZ!_vDHUeNa#_w?O0DIZnFP|wjzMF32{gttB)FbSRLDb+LKQB3HZ zkH=|v3u__LLn@cokZ{R3MRh@V6cae-FH*knw#zwtzSTNPeX82bchUxLEz`hG#-4u$6w{#k`* z75+Jep~u3bFH*RI_jkNl;PB{6^!cQg+oQ1BHAg!Yp3wI{r7-5T@aQgu$Mro^k;Y{c z^n3UYOib)Eo|$>Sg#MXbLE}@}%gp;4-(YzXxdi#B|DYeO zuL)gDKD*8TEP)UFyq@uz2A|x#uXb#_56{U@SyxY_c7n;P`ID|bwGY_N5xih7QvV@e zF5e8~&&~fZcPZb>`u0vhj=P`5)FgTmKNxQ}@9&VuH1C2hJRi*Qyx-apa+s^FU!) z>uVjv`$^1$;lmF}ec=@N6_$0rYXu#{vhq#i*kM`cJKaYYmUX_}!xmMMux@ewv<}ze2K0{AAV}SG$@&C-NQL!llR_JF59eKKkfS=U?who+D0!aoJFV z@BGF$bP1kYNnTG-{h@xJGTw)Le2$4DHgvo+{_Mf6uo|7r4K=pO)*{Xx|=%M=Ae;wCnHNqh;uIag$MobspgO$Fp=l z7pq=>AL;dUuCow8F5=d9p;LTLQR*jqROlafbjoudZ>hgbmC;Z5O6_qwH`0c=u!R1T zeJ$mZbum)d^h@l-wll7`->bJlZu1~Lsr!ox!BNOb3H8zU^s{Lg5 z*z^2~`EyRnW#TB!f;Q>@3DisVNdBn`^6UIy{uY@+_^jh+=@gz*dFj`Q7SK`W zb+RK+-_#=VDc_CX=BLoTtMcBy8xu{ftk2IxpkGuPLOy4Ij3S@5-|e1{3m)^#JSm6q z=J>A9oqceT<-@#U`CPn4<=4e)^xh+u2kE!opOw&kMB0z^zR&rcsGsL`k*Ap=N@uh8 zqVkgDGx}Pb+4$0}bT>QQwRZ{daQ3>|r*;mQ$F=Zj8uo#+qu-+VpI8N5%nvB5{dg1J z&%Y8W)2T>*vR%vRbwmeFyKkj`=*Rk{Na@X*UPpg3+)Xh5%nt2Vc`!W{H^IJ&CfhM@ z)Dt4~i)M5lm|g?@IzfONix=R%u74h?FA5y@NJ8TZdSST!6_!uN)o?u+L;ixoC_w9D z0>?!#G%5$cqu7b^YPZM5ixh?(&3qBMRyr|mi5?U(rO^<=TB=3~P`DxDo zzD4s-x4C>$?@T{n8&_8%Upx-~Fm6LUIBj1uUPW%l$xFM`6O}trAH5emnzh|>7wA!Z zi9DeBLGle3&lfoEe}SY<-c-J$a+j-5@SPe0O!6Ug*kSee$n$7=5byKoa4GT|{^r-R z{wmTdo8RIh6mlV$6uepAbANa}vg<|az!Muz5j^oot=dD4`RKulh(Ut-ugdgU5=U?4=X6v2bNv(IX=4JZ4 z_LsBkooP88K1`YEXYpq{M-#n}M(6vhS6$ABAjL!g7vqCEuC9wXn6MBq?BjBXZ`s?%o{w8IR9q+r;W}XK34zf&9v`^@k#qn zpFPO_)AOYNkIOZ zkE9;hHQ_+B!w2+yF5nbB-8%Qcd8zzAnUf#(RX6~{o$-+RUyt?XbR5yvv6PAsZ#bXO?>ej-cV8rE1o08rBjG_XCdr2kmXG#GI>CKv&93}Bs(ADho zLmkj7;lrtQ$eGkSq{SomA+8pcK-aC*?$>GF;e8<7?yes{c{U}qPqtp{fp~u-(hm3& z6i*R2S+}cG*w*ce3fsCJ?8ju?4)$lVZm05JvUR%v{4UwL-HO&{>vqcu+qxb26P9e< zZbIMNx?M$K(234-D{Sj_YYN-C-KxU2Zg)yyTen+M*w*b96`l~hDUPMEt=r8hZ0mNj z3fsEfsKT~xH?FX)+l?t~>vlS>Qs?IEoP(X;OV;g%w7jj`LC(#u32UCu>=r#Ju~f3G3EDsuH2DMo%Y z_+@&#djQW(-$pZ_Yj+=>vp!|KoW7=h@Xz9k-NS(0e4+Ada%p9Zk60HM({w3(~xC!-zr7_hrphNti>e*vi zz5WR6b?PtUw`Fq{^5eK3DeTvUR+WxA(H@%H`V(9cX z;vHeh^maw_o8AtzKGWOd`rh<5{Ai22C;LN8Z!c?p)7wi5o8Cq|G%T6kUeNcZw`UbL zy*;L|>FrU4O>eI$Y@RM_w)mB9>5vB-S6^= zUa5Pnz=_`emG$pye;Mx+eGB^3V4yp_{1mqINdGv!y-#5GzV_$w-qlmodZ0)WdLBeM z>bK}km%mN(A8_@uehJUM7H~#yLvgu!3;U6eMx)dVcZcZw3wTcLNqsfH2)HJ#w_on^ zK_CB;z==L?2Y$7KseG&ni7ppOLiTx!s*V-+(lDy`+iW2K_eH+nv&0 zzTO61fAo4AbV>9!=$X;mC)D1aOzr!dQT?oXIhyLk_*VUF_aJU1zCNJ(nfbVDTZiap z|NXnx>F?bs{f+P3CHh;xA6PQ|jqltgcDKrf+b@THhR*I@`!{B6qQ93FHvPS%u<36d z2hQ%E)%T{qD+)WiTVd1RD+-(bURBui_bG)rz9^FF3}?h$I$-DcC_0(>hg=8xcKb?JH6O^w|kHJ-U&EUUz^tV z8!kWB7w_xB^PP9ebK5@?UT`P!k-kU0#{gTsFBLEdFNoLWi_hsneZ^nHbNW~M)hQt5 zKZ55}ue84(`XszClIPu5TE5#|K5jog(usO6x&zO*YQ0x!{^r~8oW`Tj>4IAYcJ?QY zIt&@7wNCC`E7uye=YQvtqX@2jmYzG2S*x+P9`@yLOd_tgy-id z|BFB*d@c-TI!7Vx+4p&GY=s?Y>pmH~c~Gk3{mD{}{gxs?h1od+o{BkxV$TD&A< zXJZ;Cx&sfJU$3J&MQ)h+^fSH~AB_G+Z+_lJ`Pd&|mb(3NgcnzFGd<_`b`Bw$(RqyM zD{?_8|Ds9Auf=0x)%RwfM`fJ{j;OzL0&+RujPhFv54zq@zDrZ2N4w4)AxUTa>%~sC z{zX$QfT>;Sr;hu`Tfb&Grv6Dj+YjmHUAXOZ?x@byBl)L`$Pf2FF!^Kpv)n{_A3fU( zLZ_E9cCagpl-^AEbDE_y;yosJZeL~z{!Y>__&Z$x`hLOhVLZ?;_&ulTm$PfouX=&a zAIr+t>F#IM8mev^Il z_#SW)kHhzZll?K3?{j|>ziv`tvkO#Tm&`6u{Zlf#K=qvS>!3%&lGz2&2cf%{3Umrf zW*5{6-NKUD1)zIaGP?lZ6Aty>F4`Bb_?caR?-3{a=vVZ;*#-E1aT1Ti_m7i!+=S*g zJ8fKHI|nhQu*FkH6}Gs*h{6^(7*g2c1cM5@IDx{>k5}02k{*GhlkH-shWEag+2i&L zhxfb>Fv+Ei%Vq(C@ZJaUoctA*ukhXP5!l7=?)wPd)3{|l8s7VxfX$z}Lck!r@53&i z)N}ub1a|ZJeJ9;}sb~Cyfazbsr&GWnJYKZK3e&g} zeXja6yyyM$g7s68{tCxG0GR%5q5mx|AKo*A=af(IJN__W!b9-0_}x9zE}!)C-YJ1C z4jJB4a_^;{2g-nH{*ii~C14OvOyW6JBK6$!kigwX@!siqOyhyu&v6j%S$`Di&zm*v zrj&oCH*CJWndnrc=eF(G=K~+_ z15E!)|B3<R72Z1mn98-&Uv{1=JU;942|f>eRN!t_yz~o?-;Z?SxTLmz z!u{v=c^?PYZ~GUWJXn8}zTJ07@!-ZA;0M{cuUOYn;wBx(x{u0VSLvqtoZ@;iuC_iU z2!4yI3d;{+oK3@CO8l*b?{Q0sUY%3e{HQ7Itl(hLh{b4 zW!F7>WJEE)`MxZEUX z{DhaD2bjuBy;mTAc-c?5d@?Ry*d%bb+UwzEKknXhJrsvR{V#w6!1j~Wca>zL{p&@% zZ--)Lze4K03;{V?KfQ*si~jCMIX9lwuLv(80?^Ow&9I#sVwftE_V^$Ag$T1ado8?# zxk`FsKoVyccf%bD%zv|Uz2WYsOGaBK4ljKMV58GP)DynoX?RX(NPl+!n84j|^OE!K zN0Hy@XOgQTJ#y;}uhI9E@birR2Kvc9N5}siQqcGxUjAHxO`hWYy54Xpa|v=)q%?fN zGZ_?rsfALDCk|XHkLi4bu3KFCRC(am*V@k!IMnY#hR>&t(C<(a^i@>qbM`E^7)_1= zroV+hK!fb$etB-^Sm}FUt{l_R=2Kdy7Cp=QUY=i0FX?CdM&o^|PacF`i%MN$2b+9E zCr1Din$o`dFwjF67h6$C#6Ep`*)>aZU2%-lJau>d(kOo)ceF z^-sF;>+6U9uz4q%>X&-i&Tk`9bRPmeLOn;vbmaEU4`zOeoHScLjpr#|q1utGSGZjF zE0E9mRktZj^BK>>(G13~#m&NpVYeE7;SB6rr>9&blZ%iC)5q5% zzuiL-PQre?jvg~z!YSB~=HJ8};A5!w;U)QC=O+0&g>K;__8+-?4?`bxD_(T|PVz-l zlag9|#{A#71JCJv72Xpa#XfQJfaj){O)l-+D(w$N{UzuF_uk31=?RP%=3kNeeY2)) zM=_k7o3?SK^I|$b*$I+=4;7-H=_@W9zYWhMK4{|~dc(bMHhSZ^>8Uh7qw=WW!Tl&wk)+=vN*|1WtC!A;$nzv0 z-bbZV=#QH>S5dFg-929fKi#~!w4R^(JS@YnO7sc*F2>*2Clp7McETz6U1pbs)9|}2 zJ{#)2v*xFVlkgjP97=s{pjS8rzt!b?82+sDb9N(Nr02(Np0oVXOn~{(>?E}h?Oa|a ze|ZJ{SAA%41Cj^GvCfyS{?eM0XTkdt#b@f2JdaMU;yvjzk@t7wz0)IFpIdKg(f2g2 zMUPyg_38PUbetzTxghj*{t30iKhxLr-A;LL@@xBom~Wy#ABI0|>sfYAis{R!gp;tJ znJ?}1e|JCqL%+2D!LanNQ(lw3HR0r~NRMp)eY%|CW#20?d&S1Z{Kcp*vo2(I`okDc zj4!uicC6EjYR^U|FfQ#mulI0%Tfgdl2LbepX2$+6d+z~X*HPt<-zVoqvJ(=;mTcvv zJ>wKbKfK7naTKK~UGZj-QeG?!NhB*y6q^N&pNp<9MF|0n*<}?6h!7=ua+6t#3B{sH zbW;MR1Ox;ky6A?@f~fwT@;!5}-m|U10>9n=fA7cEyziYeGiT16In(DV-=r^D!kgf7 zc{6T-{@6Ua+phBmZV2l=JDNq`@>M6Mh&;%j`D=Da9?cT(+Nvjj`viAZ9R%Jx#Xs^@ z-vk~3ehhdF_#43cfxixX0QhUb^HHf8?va1Y809 zMc_&qzvrvI09*rn!2Ch~LGuUx0B{!g{lK-r?*py}elKtX@Ca}d@IK&X;P(Kx0>2x$ z4ftKa?ZEE@?gD-oxEuH#z&*fwf%}l(Hv;SYRKDsBz&bybuX??O2mJtWH}LC#b$%*e z)eo%mQ~9a~fpvZ=U-eqxF@%2&@Cfj$f%gKd0itmL@HY4l0^bkZ58MZ=>lOK`7Xs^g zMZW3L;l`|tTjzN!bf4R{lG zz95pXT= zG{A1fm?tp5AlzD)zbw> zuP%ptwcU-X#GB;PfOx-+aQ)!p!@v{ZqX0Y(`g?$zfWHGgi0~f)o<#T|;0e&*3)~F+ zUEpDa|0wW5gx?N43Hp}+H~fKro4JQTvrGlfSzrp)T#Pb8-F~su;;0lD>1sothF9WVY_#XoA zNBBM?q9!L030cRoKJ-{^x z{|ewrg#R({1j2tBxEA4c-83v@5q_)1hwwiEo<#W10M{eDuFKl~oP5Kfx8910B6X*bm$_ zr)$2B#kg6!3xT^_GtT*CiMT6OPk9_uL)i8Oxhsy-@T6Blclq&(DV)$P6d1TGPVjWB zIqur02)1>hXtVZD+!eJ&bmtV&X?x1!E>4fvx9Z7lQ8O2~=0!s9u02!TE6x@-TCV*w zchy;n2Qc2+qw@6QUz9iZdSv{}k<(Lr4%Dynr7@4WUFB@!J07Ppe||pc3W+8@Pt>Eh zc-(H|Nn6LW@niB{-YmyU|JmIH*Y=s%{dw^^3i^Gxm#=f6SL{Q{Ind(!Xzd*6N?Z48 zl5pI6k#nGwZ%%)4b(g&N=RlX&h@Fi7_Z+Co1>bdw_nqw*`NaDuv>zDnI~#$&?W53f zLcH&+7yh=7q7T^iQEUOWeH5tw|J8G#yHI~RoBJ7LzD#gz$1k4lzv?3ON51?zbqB|)a*%jBFHpL9;!rwu^26tUl`?Ai@aI4~F86dQ zPc;<9^7QNF9hXd}zw1)P<*>I41XB7JPN!>cR7`)xE^}h^xK;m0Tux8Y?|7PGDqo>n zD3Iv>!P7~8yA}(!`xK(BIzDu(nv3YJEuw1{{p51w^mzYRJ-IEf7Bad&{!01bx~@`p z)ivtgd9}Fld7>tX$L1+*9?;K=Qai;@$vIFRzWaTB;h>It{r)s+2bnJ~|5Xx=%=2-+ zt(_^>U(?GHyNwPJ>p_;|CBE3@^)_~`9rg2jPyQUJj3=Bw2dZ*){v4>vCq4(N`HUK| zpW!feefl}jx5AFt{wW=Y#pj50Jmvg3A{`&a=ZK&W{v45xi{t&mI!_+&Ytwb0cwgHv z@@M!M0zc zxWD2$a-Kd*zuc-@6jQvl^vmp>^=md!q)caa!*#SMeM;?syQ5WciQR7Zbi&u_+XcsV z`#ID7S3O((z1`ONEZ5OCovxF6dT~8;9m}WtuewhCeLU@|haDZBj_rk8rG~=W4NqUI zdf9R7bo#q)Q(R)VpEaGXeWhahJKb*oqrN9OOZpwx`*73k_A@=5$nEZb5^Vd>qJetl zZ&gy@@nZTt4Z9V%bj2X6ZYd^u>b$oYHDzumhM?$G{hu|Augme}!^3Ojz^ z@{#Sh$|>%Dt9LNYlGIG+Lvg&%^I)ok3OI{+%bdwOT+%HR(e-_KJ;9j zPxRv`B4c|=`%R_1Y#zYdwH}LSqx|slK68U$>o-Tsb-vV{`9h_md}ZlZ$+=M2AAc_N zOrC+D{4a;ToT(jbclJ7czouFB=E0qh&2{AS4~+@o@_el*YP@cR~R4g>qX z=#lNN@^5z5+i{A6<6$n@ZRw>y^w@aE>!nT;ksOs@latBEnGS$83MxyxoH1eTA_1a|`m`^xe%HQcU_P_HmIwny=UOCpUM{ z(@VUS4+(C`iW9iGZ}t9Sm*>AtF^!ugKGY*O_br}I;;H_3!FF!I&D*2?s5frzn?1e6 zbDluT*XyU#o%{yH#rC~wK;Oe2yLqn@?CpEiPVX;#FW9A+>anDEt-!!l?eKKMcg=Re zEzRmbqdh-U>3n~-*q+bbtMOC4miSM8yT*Sm;wMM!`H+@}$-Ts$&wcImc&c=wp~a`K z>zQuu8$Df?ez^s2QcU@-rC&Dx?&kK(dx!lY(Q@cR)&2T@{x)%Go>$ws`8r|aPSS?$ zuV&Blk_>&{K>1(0S@+Y+xBAK{!Ium5E!=;FEeXuIh9)4F~b&yVPOWIR7I_B&27o*x+jw)v60z&1ZJ z4D9Defc^Xkus=@?Z0D(UJ=Xd2)VjVK-;-4fdOJ_8>(BALHuT4zr-t76^VHB!f1X;` z@$LKoeK!^H+r0KcV4K&T1pc3WKG4pAxVihecoX*glY&d_`G-B7*s*yZQB3+Oc5IPA zw&yCJxnrJQ>`mpUV6!W3?jzn`;+y|D#U=Lqvz|`kss4<{bCx({r$43ss5frzr#-#! zYJoD@4bR!d;W3nFMKcfgyIr={xMG{@zi`&<7pNr_^;dZ z0~)`#=bzX3OYOOohsnLvp1)^$JXP=3c+M1u`qvdG&kuUKEd6o|KBTzBo{z|TSG7-E zvgaDU>K*!i{=@oyO{Kn{|1N!h(mTcd8`yJ6=dWPTC7#3BbN{}ca=`tazqLJoI`&~? zDZRyWKdJ4ax92D?-#^#=Cb2zl{VfYRw&!iYX3yJ!&7OAwn?3IaHhbO!Z1!CD$JjY5 z+E)*MyB}i`*zV2J{Xp?LK?x%{^DM#RM>y&$e&7Kbfn>`-{ zHhbO=+=ul0fbG2Z7GOK?-3x5%6_vnt-n$0a&UHrUBT_dp7~w zdGBVy{(g-6f6B!x^Mzt}w*5q~^)LK7;{B6FbU!SjL%qHK>(lA_zNU0+{OEDpzAdir z=imPw#ndkn`@2ve(M@6N1;_0S?7;&+Q#!Nf+kWoDO|$0@{AfDetADJR?6%M? z6-f7fd}BJ@Yadf=?aVTx`~Gyg2Y;a0>^jEPuK#=bo-!f%c+GbO+dc`KA8yfUj$j4( zO24gL$mo6>m8-Y^SL%CfH$$9@^Ztv>ALFWR2jvCJThf2<7lN%n9S*4+{dtSI2ww;J z-v1R1Pvs-w`ybWtEHrxDwr`5d@n;!7@GZqu9<}t#%FAsVm-p_~Ulo_y3DwJ2e?i~h z|3!VD3H1GIzpU?H_a$-dzKd|T&Ue}TG~3rKQG~lyPQ~XQ{JaOzFx@7&Eo^-0S-TbI zVuu^F|4rkdEWHo6YyL~-ac<&JR9~ncz$)$g@voKFG(V*C^>qJ{m|$-=*`HzJI?NcFyMG(Z8>rUGe*0ay-TNZw=M{iDTmOlX`&i zC%x16RE}Kk)c+G~=fC_q$3hNG{>9(7+MZQ<=%eW;%aiqj&fWQR8wlI^BP-8MDJ=&t zKjX{3i;8p;_ixF(6VtQ&!o+uTrsu1vC|_7tUqXTCIZVDZUeq7b3&Ez>rTNnJWtQik zmoHt1j?cF#wskD8XD?GesXSy{=H1Vlu^)pn@<9>$fXFP7K0e{xds06lgV+FAFGn$Y;>t|@W+xcVq zo;3XJUYQDD>t|rz-rvuu^*f#i#JYsv52f}gzK5$`$|=5wOUpH07t?aLb8z&Xz9}xJ zcpYs7*!mfI?kc{&ThCp^`!o)K-ufBiz}C;ub62il{R};K6>i6VtR-xHX#PE;=Pk;~ zex5-6(sHr~zoPfyP^*+zxT9I!olWWvHmJL+Uftcb>JIBTJ{{EkhU48w`pfz_x{VRp zGK#mo=sQ*KcqslZQT&}M(38{u%3kUGgy+}ZeHy-B$??)Z`tHv95a--kSQg_;Y;xgjuE_KB>QO_W7s2jenPa zc<0VryMHNkxzus|DhO|=ILPik`p@}WT&WSHgH!l*klb(G{zttZotuW25*rV{i1u6K zzKL+CUGy&Yz`qrxa)B2v) zr&emP#lIDpI&^~DfJqVPaooXSw@u|&P7Z$`$vsP62jvtE%XjtcQ-bG-+Y&U2+Z8-b z+^46i$gQ3|m^w+^RKTV&9h@c!V_w@>6DU4>T8KW(|`Y4k{lx(#T&6Rz7pV z{8=9rtog_VRkJP;tof`at;-Wm2PaAV(MpvEeGgvbl9Vrh|7>(85!1tR{A2^Ai*w^4 zzU!C{J}L5EJv$TZA-dJG?-X0UdiK*&oKE%ZXQ!SouBA%_P7i(WbJiExEe~crmEGV_ z88Z;)>yKrVf-PUaFZ(yamapHIvF?V0alVK}%Ga-@K#rELKGNr8zAin1^VKiq8V>b| zn-1QBe60??OYyFr{n~(M2&!lIrg)~ldUh({%9Rc#CB0n556ij<=gNOjb{f0E_sd>I zZk(U*mT^y>_S;GPx!~JnT%V}_1^jp!_n?#cVGT_OkIk4LJ`a)1&pX>Fo`hAJ0)rmTnDI6t2% z+b!7g^U1Ow3AX%vyzFklarw+4oDM!RV}8bp^1~WKdWZasAwNChuAcpZ;Cza=diJK& zVsTT!Qc36C$j7_NxL)PT-&xkqZt!r~edNaZ*jsk3V9Uqb%DAS-_N#_m7$Lq^h5zdtll#Q_)ysm5` zxp6)oEE^GQ`FKs)1A?tQ9sqq@9$n<04*F)yM|Y7Oxb6RNK6<3z5)O5Xn+~o)K3-DB zBjD=U&rf|%+*I&=N#`ZV$Gv5X2Cs=hV1!K?AhL;e4IdvWB1t5_nMK9#mGlza2v&2J^Q(-Tf|KTD=gLnj+rn;e zYEe6qDdVn1Tpl%LpB8N8F~98Tg5!MfOjA0TH)B2y7PX7x^Ee+<(mvVuqtn5skdHT{ zZl`#wXYWn5i<=78N;=0PA8Dx%x$^Z)tOHw7F2kEEsq z$NVoLoDM!cBmdbV{@4E_^Ir@8v*5oM{BKL$NbxfNIf?&6;QxcEt%P&sA4vTRyTSX5 zEPiR`QKZ_|D|2b{|NZs3;w%=|6Ikee1Rrc zzB@H3eD0Djz{PUjky5=kJs(QFeHx#Gsd~XNpR7me;Egl#IapL*|K%j+a~Sn?P+a={ zF!+2R^*rXUd|T=?c7yv<4U(>nBmOPL^*5I1zoxz+*yQ<2$Uo-uR`O2=^wDB^j#eLg zi}>uB&3tYFpS|GoQtg(jj^4y&IkYJN%Pf@vVO#M#$V?HCo z=^#HNpY=uU(e*XVXM^x%^NQ)OB-Mwf`x$8`S=%ej(|aJXfbW1RI~7sb>l{ zd3L0}EjZ@$eT3;d)HCwgU8J8~)PV{M+8?I=81%CWeBLbOoGZUc#$mbOM&UP>XRFxp zxZIzan%>{KUSNN-DfKSq^Qoy%ihs=KBZR5_pOMerBKb-9MU3Ri&<``0YG=E;TpB{f$vcjrdPhrv8EXDS-df2{JAWaer$rb$seG z;tx5e=A;G$ga1@2IE`>R;F*u<^F{}#{CU66V`-f~So;E=HyTIzA3*t!Lav8`uTc10 z`JaLhu^ap`IE&m^Pk$fm7Ho3;t=uCW%k?*M!$49`xm`>LPtf0^+oyv?a(&*#ERQLv zKh*CLHyykgeEvB2SBfuJ{-fY?>;{uEpA+->1D$vDA7mFP>7&lAZ%9lVnM9-YtjB0i6!4rqvb zooSvJ^1K{;-Xrrgx$<5akLH3G2S23vV|l(X;C^4sXC(J{#N{5!mr;{^YWvB(zN7P5 zS=27=CxxT$Bf&0J!Y(}xd_Gs!zH;SjgBMb~xnK?WGI@51rp0{T8N7t(Vm|K(dIiV& z`CY!e%=u9 zxG?6kCD3*(=5v(%(^4ys&Sy|0&(~hgd{#i70puyeahmtNA~=rX&6QssJj8C$RHUDm z!mb;i7Y84m#%Cjy0P`L5$^F=LK*o@sqxD0_irV>SNq>32$dBf;#Z3o4`vb>QT`@nP zZa=xH;KSsm12SUty;>ym?n%Bm!E}(Nzenf$ zKoQ^f3*Y15`vCaki!%ANLzp(|cZbxFh0z zLl5HXMtmch--@Y2T;p@)zd3XTyTPvyP4726ap*(zJ}#GE9agTB!Nxo4(Cs04PgU|0C`W5q6{+&ZSZ$R_^hsK2utDlb_dXr!)pKl)0 z@wxH&jYIDe|G0eEKOJa)>S%lp7V+t*!$;#p@Hq%RUj;rtcj)&NZ?622Lv`#1pFO1Y z&G`KEp>u@~<8%KZp0|wc$R`f59Zu@G_HRBqqde=2>`3J^na>6ZN8>MX(?KYF+P$Wu z+zF>ATCRE)HKJbJVC!1Y!y9#di`ElGf2zyQkZ_}CiW8I{!~3IX-H!SI{6x!@&h9g2 z|CGGf`0|aP7k*aHI#Jdyt7mcPkzUWbPUxy^quwm z#m_!;C>-9e<+5u`-0EXb5W;BlUdea3+xmHz$@|r_P8EAuJ*!dLM^2YmCA~OB{P)em zeOrr|dw%~M`Ej`Wwx05@bl+BmkOek=SV7bjMd|%n^paQ)7B5Omfa(;dO67GA?=mCz z-g0(=@TuZRpPA{Cau}fxzi>V0`o{VH;byAm!(*DyJzBrh!4L-{xt>nEv-=9MYqs7U zWwf4gehxeXg-3KzM&-wJoZ%>=a*ZgUj;xKUje_#kjCuRAV*#{D();9@fPb`Q4O^;FTL>SN7*>3qJoOS{z$rGuvnUz|Qo=LL%wZjf-{ zWrukFWSIdRPxeLM`ga_q7D-a&)>5^)4@+gaLM>a4in$e>f6huzKv+SW#5t=Qz5=Pkc@YDhWhrQ z>!=*}41>Q%HJ;(Ug44lQOZc3ryk0^fV|&>x0u297c5;+EQS_8k`z-eF9>rW9yvHah zmnmvjNAFetVmaGA@*HlZ$azZYX?5AVAZO{0Pm6Do;$yqErO2-F_=4lPpXEG!P}_|? zlN#UbH%ojpZzgj7Yt)zJ6m#h7OOs^K+N)9SRMX?@$?%h}C#@8Y^YQyZswZ2E>dAu= zZE(1H(sLNS=6D{KcBohM%)XBm*AHDUNtRdFVd5z+w`6;?NXo5C^}5X3qi(^;c-v4v zj#O?drQF)VXPdaW*;P`Hlkqec@mEXsFNdfXb6;w2IPVaQZWFKqjSA3rCR8PlUU{|C4 zXFK=os!sO)5>ItTF_pE%bG1M^Kh22ty;FJ;Po)k}TAJi_ypOsSn26+DMuTEEk7q|H zJn<*#RPijX#wY146-eWgKB;GJ-W>HOdP%Q}TPeyH=-fP>g-FC#Jzuf$eZD}NH)%(F z+$&XjiEqC4sat4F&ySl&lMnQG{;IXF!}kRVe~8b`WA5X4te(1)c{Y*wyHFe%|2$6Z zt((WGQTy7c_gJ`j)R7iE2)?Aa$-f_%TN|d|0!#uI+zU(s5!?fO25>iU7Pt$TGC)t% z*apnjjd3fmj>Fsno)w|@o15i*vVX9U-=lvp(|K)wf8MhsI{)3l5Z~?d-xHy1v3}6^ zuq3_sJ`PQv_t$4B3NDXYa_znw)<1sF_Y1OX`Vh_eiqse0_s{Q3?i;zAUeZJBKaw8D z&m|M?RJqvwG-1*A1jFqrS4%$}Qn~Z_0M>*s@%=c_lZBiLy-$3A=A9_aH#i9Ps=U^v>C4L+C`*Sa<_QBf5ZwcMn zl^+w=4SikZg?zZeHx!dxlKF5$U-NXF54TIlPc3I7{W+gNeBYc-xBW4}{@e%gFZMvI zDSZd`(dqPsFDpId=Y}+2CTF+v^Ga{^@hnZhbGeSI+>S@opY%fb9Qv%rcZJfq9ncT* z=W=tqzpC_99VNflf^Jad#O1=}P<&p+&Ox~yUzncWcD2{u?hfmIBCapO&knWY{(Ge) zcag`9ny%@s|4t3bi^H|FtN#ir7oo>^+wJ_Krcd&a{OtOYVhShuxkbadou8ggxBD}S zE#E6ZH>`T$`Q7;0MRtM-BAw29~>+LUzxC}hZi+Iy)vbF--OYM_rE{g8cg?TS{l`+@m>>EtC)|Fi!1kR&hdSs%4$Hh;$b!4Aq}GGG1NpSoA+i~CW@{`n7hzF??d z`#ojHVcua-a5BCvGxVcQYv%rWpM(qdY|;4qc#TVe&Vf+3fmDOWZ&WepDehN=e%xO_ zga6aiALG>|pA|*(p1hvT<5aHNET>n}Ihu~bBGH4+%(GR`3g-yUXKojqU$atN8^=Zi zQ<5K%GsTrmZ=AG6jkoQv?DPH}GbF(v(Pn-4mj<^`>sqL(Xu zgz?F1G#Tob>{Y)14EaAyVOcKE7WwP>`_9b!MJ{&#VLme|IKSq7;ugz4Dfj&>_wA4a ziHqfK`koxeaL+cx_bLyUZ!523TX`Pr^{T(a2ekbzAbzrcMwcQwlXE)whT4;Bly39_ zxV7rie5u68(>x#ePZSz?@qF}Y_z3T(2fXBO3GvURR_S|(^3LddMpE8W zJRT!<>c5%DhpK5XdY=TB{Cw%9Jl|U>@kW_?)qAYd(s@^4U9XKYS>P!x?~Km-I;@jN znNmB%d?f2z4f92Od@U(ovV|-uyU&j0{7T}>VZTi^?I+?V9SqBl(Jp~9@4=SEW&<~CK88}jR_}kS`Kr_Uzk;IU7;~v@nr;E<65@O@pFgIddq;v# zE~&JfKB00enB3YRH(mdZGVQ=7_b$QAcjY-WZ+ed;7wn_rWt=S6HkRkT$_Jy$?}Rax{j7i zcMJ2CsNW5YcW~@97e(dEfi{ta>Jlwac0^l9Yz%x9qK z?ACTHtuP2f*n|5K4szmrPLmg5ej=To2y$g9@lOX|vwW%DT;C*gHa~B2KT>>QzCq|| zd@bQ!{ybpqN4Rb+K-W{R@oubDH=k8HjHhCL^qgSmn$;inBRol<*MlSSvs3ju(&>yu zK0hG&3^#O3MBxojF1~0^ugaxc4NNpg=ciovD&=oZo94T_1GpWy9k>hO+km@)TY-B7 zm-4$y`R(ozIy#yv&rIb(_p54rYns$;Y*v@_ou63Fdd@u5=!5WOWLW44HCv*8oFwc_+iXXw7g#8bxs>PvJ1efi2nS!>r?tnjrfOd3vd>=7r0jOJpzO1Y;|+APR%K& zgZorZS59fa1?^+FNa?tL#dQ0~uCUAN+x#%*CmIMe{+<2e`hMCm7JrY*8|`X%Usl4o zSJbNe(sR|_QYUVH>%&5yU-=Go2XtLET0X3NHV&#=*RSpx9kB4)J549)2s;^O|4Y&>Q-U!?dd;@S7a4WFt zYm{jQ?h*g^yYhp;4e(dJpne1J7Wmf!_aS~=Kcx8{;DzvS0L}t8A$$#RGjJtv09*mw z4;%mw1DD#{ZfXx~-JaVw))?9kAmNhzlM(Kp*V#Ui()Gu2ZpVg1Eu`KQw|i{It({|i zWR>LhXYIY*PZ$@w&h1(ay{G-%645Be_vO^iHPD-B?F7Zg;eYf@ink!-VizSH)L-^r zM*FBs`yteMpeGzQc|lI-5{4(K9kBfpQJwNvl1?JOoPSR5Sdw6z-alwMyO7Rqq;rqF z7Jj*%jyTiwq=PfX?HGCj?dSKj{DyuiII4RL_yF&+j~DT0>AqL^n*e{~>K68j8+D+ZoQN&Hx4`$?Aurz#hdhrU{}AJbaIO|eR5zjW zol63shx7m#>DC=kjCPs!&6LQ!SRbE=lKNr#uIbIBkG|b$gj_Q!*QlkGn%w4!^4DuaOHzA)C=NtN2O$~1u;dG$;x%QRYJjf%G@4tm!>@UiP@x4*>;sE&G zFK#-}{tfrbE0g0pV)|6#o5xpMitZyhsV}~d#1(X$lh0`XH7PH)XB_YS$?+M*%R60p zy>~DXZw<|#7N_&7L^`9(C=fliFVFT{as1ycivKjClcU=L z_&xKz<=ZfxgqdFCau|7k_upc9C+!Spki-3$!Z5$bZ6v!?v@bf`zF+O0t$!_IE&^Zg zlXAF%^2_lttC#dnmDI~xN{`d2emU32TJg`(DM^-Wi0=xesXCWFX?@vVNrf;eqrYDdQVq=`J09Be51-KKWA8Q zR5z${D=44zoicqt(5LR2E%4X!i!!~yT7LP=W?(J9d?p0e^2_^il$M{3qwE}Sl<5M! z%0C`Yss6;{sa`FQOsmlIID$2j?wj+NvD^D*JjAn-W+ zwcbV6@4`JKQ622d(1`L;HwOAK;1S?0zvf!V z2DMfEB<4(@K9Cm7Wzb=A)fnPW2WGT`-7^TB@K3b+Ye4r@Yg^GQ+ z2a3X7s5n=);1IWm)A*%${l4m#XgoGw!0pUiDBm3gZ6|WHn}} z5)M6~a;($#BpmuFu(m7VkoLo)x+AwQyxw)V_T_?qW;u>Sjt9g|2Rg3cen{}^>HQEE z>EZf)*S#w4hj6%MMd7%=Xzi@67ukJvOn>81=)(@QM<-Dv^w>IAbT-Nl>sis+u!lCj zI9u(KZ&%RX`1EaE=4_4E_U$u2&nx1GyAH;Gv{~y#xJlFN=&F?nMqi=voQQV7#{Y}^ zS&&rD>d-uY`Jdg-+f^iA)?ZDH`jHD>CO=K@Y(0JxDQA{^M(s-~ZPPEt7ze?&k&tI@St`dD#dyq@@qQ3`wfpR&kOi!?J{&^kcaQf5#npl5$p8Cra z|0UbBffz-5aJX=9NrVe`sogpQ<#21rt9+y{&>LR*{VkmuBZK;b5xH^Pom7A zlqs*r@Dptv)_T5G?JLu?zZCPQ>|UyT(>dRHa{H>sol2w5hJvFq4n>uU%>ji-u@k?{EjppADdx3{)TDgcL4Ga zAb;o?%RSpThSY9meBk@(aEY|nK%@e#L!PhA4yq(+QcwbUv=acPJ z*nxiSf~*KU?4SamCt84Z#pcTv==-okyvbiHu$Qx?tHES^|4>o7-1X-2rD}Jm<1TGa zIybgSgyE`sag+KnMs!U7YFfnUfIM@l`^5f6IM3woEv!*~&Z;<8<`Gz**$&#c`fzsj z2d|FpG3l3<>?Skro?LXo9H|AsUqF%|LxBKg0_no{xY`&qQcsYLSFL3;lZ?q>#dw(3+d$R-Spj8r1%Da!^XS;r1kzIdL zw}$&P?D}JL)laEi9~SxX{uzEETh|#-yUXd4D9HXyDIMV~)4|TOo=&&xlR}r|ZHku@esZGz#r3>b_@CL%_X%A*F6swvNBBYD zE?~3kTLfEq<}vTYSnYa+_gA|f2%ah@kEz@B$1owcvtu4DgWcxCKQtOwCj#eQDz2zH)IL8-=YGxZartolJe)ncIZ@w7S7<(?<$<=ljTP$Ryy$4c z&W;q>S?&s2df_@bqF67Y@rAyftI8_eHdspz*89cLnh! z`<*+KF5XwB<>dVrn!lCb8S=vTaOa&a*uEFDg8Hu#?|Ov8`FyuT8Svqj5+OZS4t6hq zt3O`e-$j43^xrMja~!;1x|VQ@2BY$(f@c5vW5tc;OvyToyHFs>l`=?=o%3+ZxYb~K z?!D65Z{6vr&zdjhD@*Ug#P={5+qls3$LD9{JzV>qcUaJM!nK)WBwpTk&UE1pUEeI( z?|mP6vj4D_Bj=Y@!t0S{i|1`5UnaK}>rddmPkvv|;Yb_}18SBFYwTIQI7o@Tjj_jSvyKsimXLLQx6;!UY zt_1%y{2PE(KBRBJv*2F?Tn1bLjQxO_gMXl8Y5yVk&FDT0S2zvyx{l}yrvi^4{3*b? zZtDse;9>Zm3_J*21Kbb10Jskra>{H0u7-ava20S5@I2sd;JLtEz}OF&X$P)^e;e?L zz^%Y2pG-5b&V$kXCh+l~uLtJS%UoVr;5opRz}SD834pboqk02*mxEsSS-XPj1&xc< zf5}B0eQeLqYZPqtC8{&K!K2$GoesQWI4vU8kQ)g`X=_0 z|Ip)>JY8I?H|{*$4`J!Kr5CF|*%OJU{u0IXSK?_BNcM+o6{Tl%=c|G7=jg5m-7=l` z=lU!0E#*~64JYy4VRYK@@N`SgS30U+Lf2t*&(QZ2A7w3Y7oI1$1@+d~W7vZgRR5)3 zU#sCu?EDS-{)l#-(&xwa8@nZ!3HI_k|5Cx${;nW1D(T%TuSwo#O{ZUarqXNk=I?!R zOS#vga>%=k2=kAKP`^*Y65u*Y%vAE0|rchutu{o&`3$UJ2~& zI^Al)>3O>jY<7J==*_N=0h?VP0XDn77uf8&o+C``hljt}^?qQp>wUmx*S7$hUGD`p zyWRtAcD)H&3Tql2c6eUgC2CDZZOLo$!C*je=W3^)IpOWRIjiqn%kn zfdq44dZMipVkcR>`6tDc|62Ox?Rx#S^4=}gf{2!*T$eTB{pI3D%cmq?ZmAC3UBean zeyiI1wVPqrcf+nz`DBTL&V#AlB>6CA`^c`@N4rm@#O~{`i|n=L$M@rBwC~Cf%ZK&1 z)V^yzOn!D=+~myf*?!+e{~MT3j)WfHf2ZH<-_pu&k7D09tNpU^L{43%A5#S23ANj^1rQ7@+yw8H} zqrf$w+Ya0YKE4ZF5BiS**Mfcra2M#m2iyeuj{`S=ekX7b=)Vs<0sINzafII`IG_1} zzAsEFUFMU(6H143;Q6{A;=T3@^4LdA{Zh~kYkanUub};jeCAUYPWjC2QMxrh!h7w9 z|<|n|~|H)@Q3tSKSw*agDIkYyT^s`J9CZ{o8<5|MQuj1Ggc5-Ir|lvF9^yhkqaB{|n%D(Ca+1 z-RGXiy@0g-3i^Yf?*jc7EIjym2k;>1e+k?T`Y&2|&_4`34EkRI_kjLO79RBP1l|k! z{{Zd<{g*8~=-&lA0{SO_w}Adp3lI8t1CN3JKY{x|{}l@l`u70u2mP;s`$7Lz3lI8z zzz0D88{k3E>%6{wPcD!9BWb(_`YF&4gC6_B3WJFMz3^B2ozMIhcrWO&uMFS$$YrO3kNDpYtnEiW^LyYi&_8D3LH_|@ZGZBaKLGCs{WmQ<=syUo?N>hY zN8kgX|CWUZ{fB_H9nEL{1UwG^$1ObYD6qD}`HZ&z`>5Z*9(GRvoyXPoJkzD^d!Yij zUEJh)(CySOu=B6U_tYVtcD|sU=uWP1Gm1k8VNfAv#E>sP#D!s!wlhr$g->sL4E1rKzOoak$`M%$-oK-=kX z6V|oXohs?^c$A_FoI6c1r6=RMg#rV&?i5c)Lyo|$&j@Zg)BKs5WMJ`hE92bnmw2-5 zOX1cn5SQsBp1e*7*}X$<9oB*1AFb4Wg4-}x!nK?wPT)3T-HYTZ@vOtT*DCd2L3+wH zvV}YG^!RlfjO$#t{$Tzz-#S3z@rv+EES%Uuj^B=iElDClMc63gR5rlZgLX z!Yv&dkFC$#Me<;}O>q7FN3`b853Qq$zBr86Z5+wvl_h^a|EI%x8P~~s@?+P=cg|4& zdT8H**jwkcAZT3$_zdy4aiiOCx?n$V;&dG4HmZQ#da7{rxE>M!J!@CqCiN?7yhU7| zKV(VTeN8<7Tu+$eZ{YVG^oJfR?@jcc{q5eOsP35(&)VfzX}pk_0M5?>zc5){ACU1@YnHN4Sn)Cl}~ zDo<~JZc@6aQQzBr&E8+l9o_F|<#m|^@a3@nQo**4Z1Y$x_aff9anvU@j6U2tHO#R- zXg|s2u|7fa$x;+<9o8qPy4DhI(d<(Bo+Amk{Mq70jT4&A#;m?~3-x_Q`%^BzNZ)UG zs<>;HYyAuhnlI)nOFrQam4n%%O;jHI-tx!wlkq0FEez z`?O8N**p{Lk>~@;gZ8;-IO2=TIi9!Dd@{dWq$TST^p5q+uS;-Xdi=VCRDRb|*#jLfxWbk2*YSoc zTmh`(6<4?%xDVmMUuG}xt?=(bdS=hMf%P6N+Gh)l`>!(Xz|TVXHsChkR^S!D&A^aL zrU^I){{~>Qm-WE<{XkmZ1HKXTS>PLhYk;*MM*TuGNQUJ$CsU6kGl9_Q=|WqV|n9Ir~QLy zTs=Kp{wfXU%Vk3KHIMZOl1r8-oGV(7uy(ZjS_$v++Q3;m^aFZOEJ(r@ZxXwc++gybF`PXZ@t7m&z0oKu4{h0U8h3gc&*>LiQ0R{ zcCRJPUub$MwZq=7Lq0aIXL672I@%oy$12I~OasTuN=py($3MB2_F{Ua&So6p696TSDO5Up;F&zh`eb^E%Ij=HC`HM1IJ{-R06R6}uzn@0qG_O(M zzk1)=%jo_Ie;>|nyf3G9xuSb1ns{EusXxzmeC|HoXJ19H?3^3F&t6UQAU>bpmjKSK z6_@P+*YBuquhxTg&(-&oX=yLOs&i{Ry|fp3?daQmx4z%LNXV%F{Lem~Ed6rsd5S5$ zTKd(pP$1F0P~XGOxb-hmOmIy zSpsRlC+y0`9`&d8R`RuuEgkW~lvZuKX*3jgb$FWA~s=Q_PV zm$Tb&hhme5^;eu`*xHA12zIciL*rxN(c|2m;u@V>w_0%A9~)G@Hufr=m+Om_4svCA zF+bccvRv%Gd6rg|{?j=KiHFl+ya}$Km&mBU%je0L?ZtX^yEm%qHi)~n4&$vMfUUpK3~c>{ zN?_|R)Bsz50eV-k{z4D@ZCuz6Y~#Wg_q0o%B+71+jwSzsF%)&kqOupijQg-yVI zTnKFA!UkX)7j^^NxNsQQ#)Sc}9~T1KxUg5Swbyj+MX=em(U)quS$k7mrUh*6v)$`o zPUTI-cxV*;@p95j`bYbuG<<%uw)@pw(DdZWpDO;<$LM^rYhY@p5)d(y; zONaN9uwE{{LMtHaBky;qruzr^eL8ps{iV80(G~A|Ipf8DpM5V))UGq1Y+1Rz{vDrt zEi{Y1hr>q%I_}({NC#UahiGI<&Zz2b_ zODqYp%QD`vc{w_7q2nLek#PHzVxkv2eWl8+cpPi?aTCcu%kiS!ru*Ym{@W`heX--@ zZ|zn%tagLv!6be*zVw7UMwFiQoALGRhMJ}Bg-6urnz@&;e&zG=z7O&0{v{f}BHRt|p9H=U_#p62z*E3C17`)VApPJM*6xNoTjf2scOrMR zcj5MarKj>{dfI2FbQGTT#rIRi?hw9@UeXgS9}&9Fx)U|sp?Zyn^g+@km)j+}kKV^8 z=`NJuv~Jlh@58}v4M(pf{hr|^<~R_T4ekt3zY#?fIx%h!*~hqh>Z;DgqIH9pG^ z`sH*!6y^7H<-afjyac!(<)Zu2$X>($Jopd7{|w;$@P7udj@R;;9I%e(@|jx{@90xL zP2US`)A>aE?)yPEX};tAF3S+_Akw`6SjUn1%nIOP_%{ISxHFIYRi*z%QFDEi^4i&> ze3+h~UE+F`CAv*;t-opCsUdkn9*dC9L8QAB82aMxSr`HRIq*LK`tt>^ty_=xW1#y# zz~i915I76`EWy6tbhF880{)GluLWMI82wwZZxqDV=eXX8{y|@&H7`Q=Nrb-$xE}b~ zg4te)oZwo&&DKT94uJk*gl_m( z1OF!AHu$##XW@T2a69}v1h1`o72el^?h4>8(5(_2HNFh*>p^!Va5v~Wfg9j|6>tyy z?*MLs|JA^~@Lvtw4F79@x4{2S;8yrw3w!|hF5oucX5ew)F5q_H>wqVK?*{GyUJg7a z^(UWM1KbV&e+1qS|Fyt9@V_2-68O2my}9t7{Tz0Wa6#)0_bYWirQ#sJNzSv#{KE_s9PE zL7G1q*8acS^(&d*iN9M)2AUq~ugUv#px-G9_b5)L*IzV$(@GuJeU$DHh39l0r%xMj zKItFzclmF8A5zEAe@OhDbr*^2hJGV%zV0%0*EEV74fLs8wr&yE4ZU34d|d~^sr>SF z?SjK0oqvkzbo>zxjfuP?e5WC~&xz-sqB_kN-QTb2U_CD!(*6>yuZx_+p(!a(I==zD zSM-I>SqrB1CvlVVc|OVC_9-Rbx5#_lmy>+Y-=RyQAu6>ud;{HEz$tKflFG_EMFrULuewTRk4o#2aAGnnCW~g1_t@hu6>=K-e zx0U0e_VX9NgpuZQr*`WEayg!pFQRw~ZQ!$2++4*Ag};4d+?mgG5J`E)`=)9|{(j%o zxyo1aKC#D&_D!9P^hivH=w4zepR-cc!5Q@aaO0!sg@2#%Q9TXVlH;RW`2L7OgXAw9 zQoEcE-Y*%9)@1d)!#=LL+5z$N8&%q2Vb1 zCuL(h+_Das^i=TGid~hC&uu=(Ex>*+lhd`Jn@3?y5rDT8GdJX5QkCz`7zpKQ)FnU`{|LweutL9oo@lyV%3I^_EDp1D6 zw#fBa0s}W+?X=Ga#v}gwZ1cJHB=R};bip>i>=uw<=yCH&5bUxcVD}_Sn4YzDmrA{k z8kfOdYrdnpe-Lczr7f=!a$3*Oa<=}O-$$a+`gL@Fo|KZUr=YCIta2?ZPie}@&s2UkpDk|Z%B=ELXwdh#pU2Ln+5J3r?uqt=N&6BOG@RYX6SwboO1TofxO6`# zu+|gXXOXm@canWLT)UCw^^xt$cR3Yb7tvY!p8P)fxv!(|o9K0~m$>35Qz6t)}HPu0iQQ^*b4FQ&GIk2gh^5>$#n4Mm$aG?oxXm;T~(d zmm2CGj5ezrM=ykX4qP>B(r*1{Q9H-=m($~RPV|m&KBM2|jJA%8+-N^TNx6NV^yzSV z)=lvw^-S(B+6g{jCpo?AIe)|5qW^A>o&(6uE)zLXKSbWASI&IjqwX5{O&q(2=6JvY#q(f+wBu$AU~>U>RpK>PL4nn~4@U45GGtrOz9g32SG z=|g>mT>N)bR6Y^z2TbxeA#zf_qs^M%r2j|}|13Y2&qr3X9*rqK!z1G6Dynr}x1jRm zZt-wYc;0_s(hq~Z=XmeFgycRnEb+ztu)TtleDzbjN9%`8UdZ}62>$xPpX#~w!@Qop zO!@tD^zNIQ*O5z-8>?&jt>kNRJK3(e#d{K1lBZi7(c>3c<;ExIQ0E?_MW*HwC>r_*d7vMMZkYU6@$! zdL%u&Z#~KP^NH`n*+bEf?a&X>i*By3hp~s{Z)Ck}5_y#BWwX3bORt3OVXNkUm%dN( z(Z}&8%Bhvgh4t~x$j1}Zu*UXK=euHic$uV=AJBQVXw4SQ@77*%lj*b-rPIqeulZzo zz4IY1Z!MqD?zdYCIZ*$L*dqJUuK5^l({!#>|J*UeFg@W??FW~GKDttIxJc=^AH(tZ z?`X~Rz0)DBFSHIJ`3#HriI9G{OXd5w;^T;Rkp~#`j9v$qJE8PMb&!9e9d9VoQy$5f zp4xbo?Iw417tehfN8`__^Smf^GY(akoh$y~IvpQ&K(0}v>N&SBd_KP89PKbue^ttf z?Hrc`eV?a9FS?07sej!5F<&z1Kj z{gZ)lc^_>(P{PMw(mx4@RL;!ruOA|QcPpQ6SoSL;`8)pAPmf4F{CxLx%s+yOn?sd~lbJ>He*Z|xotx#h~gR&rnelj?8Xr}E`^ zFS?lR;IPCOw|jd_^mV5G*88Zz_5H2g{owE8!rwj`R#26s@x@1_zSz9ild&T$MRtTW zoB5_{?B~7yJK2%i|6z9I!`uHlcH|eE|KHe=Pj~%o?Z|iNdsK0M$dDGp08$0qa z&wKwB?8uTo$Bx{hcC6HnREYhdbqjI1-RnA<9qG{db2{fJ^kIkgH|)DjNxR)v)PLBE z{=<(RrTp(|)BeNmDRFbW z;6D!B3p@d=?KSnsfVKUj`9nSf3*MT0!;0{oU>%S9$*T zzlU7yzx%WAAy@fwyCv&}XvgS$pz2fcJ>?749@_o2Zpj();w~$f^G+9R=MVh8Da`*y z%eB3j`5tn$7k~LZRZqOMm|FYRNv;d*$EX zUr0(T@$Jz3m#hb3ycP~?Ir8)?nUHwhSeGLyUgh89ZRb?%zC?as&*7*$A?t^_yzJLa z{rVy1d5X`CcFuSYxz-2PmkF|S@jc{_x4*Ae+k^PNT5T`l`)cc@eTeU?%>vI7drbX0 z;4rwH2wFiMugZ~KVPX*o!d@Vd|dVIFTRI- zQo}FHN`h|bLUH}~D@yJmKOpq+J>;ZWjfCGEvF zdP$G6h-)R`g>)&=hu*AM&zTNuA-o8_%5&O=8>0x`%@ol2_Z2#?^UE9yzat%|_ zIkp+^A=mcD+LO|I$W@N9UEdEokcJ&-06qq|7TD~14Y1ku3Se*7WuI-rt^=E09|OJF z^$}pR>wAICt`7s7T^|HCyWS6McD)bS?D`g9v+KRUX4iXw&8~L?n_ce$HoM*qY<9g3 z*z9^Mu-WxyV6*E@z-HI$fz7UGfz7U00-IeAfX%K?LB3|!bzi&P154kRQ2!b4Ave3O z9Sd(K{$}@(Tl-LS@5le|?;%%vWc#~H`}I~%w~IaS<#fSqf=llqS2}I@&9CrCH zzK0y;x~xg~aZ4{3*ME1S{Rul;$Y68rA&Ay<1I-$Rc1 zfxp5%X&Bhrr$JzApZbBVed+_Y_DRpdxPrA$z3{j8sR!8Fr!HV?pV}1v z+4qn)OSt$R@+QHwuS4AU9`b|0W77X1e`)XHd&mz0>%3*@J>(Ve{|LedQeR8&A+G_Q zu6KspD?zs%;Z$Gpjo$^X1^vf>v!LGr+z!6K2iySqj|10(ekX7@=)Vs<4*Ut=0|>uM zaC{H>gwpwY$j6ng8dY^@VE$H6@toj$c2#3lI9Y18+h6zW{Cn{Q=-s(C-D-`e)zIrga6-f5F0o z{vE*mi2s+sU7-IWa69N91|9_cuYkKj|0N3#`gZ~kgZ@8&dqDqX3lI8t0q+I<6TrQo zf7HT*{@uVMp#M+cEujC3g$Mn6fX6`pYv4Z6f7QZ+ejo6D(EkRwAN1oE9`qx?2S7gs zJP7))S$NRD7g+6gd=L3B=)Z2^LH|DB3EwJ92mJ?t zwf%|jAs++%H{m}5`VRtY`xW0qz9018g8vxkKLo7pXnYU(0r)=-|NX$Dz}gO%-b1eU zYuNX%?7pY?Uh+0+=acI&E2v*^xOF?;I5KTLhSyna-EL2X#)I)V_b2x8`klXre4Ft3 zm)t|%Q?#B_Nqq2n6Hke7I*-1R_Zd7O@yGX&KPb5L9`bJO*R1Ih*A-Mgd4CUiyZZZk z$W=ZxZz}O6<48hn0rEWW;qD=CD#~xM+y}WFc4$A9_fL*7 zMmexNo=;aJ**VQ{SCizY^d55Uzn0!Z9*AB=jTPdK)@nMVx-Bl)NAu-bdd2$!4txuf z^@O<}$?rLRV&_n}UiSqozUGfaN%LJ>Cq>_*fl7(j-#_k7Wp97)f!lDJVwxY4`5Rsw zqsO^Z#I^pt%j0~Q9%mzeov^X-fh)d$ocQ9$xdr0-c-HAekROLRoR1@}X-Gr&CTKh9 z)@xpEKB?sXafkD79TI(fpBBl5pB1F9GLLtYVz)u}725d2b!$d>eM0ixYIMrDrz^gH z9Q!!j2AoGDxp4?reE)bG;w!#?d;{l_#%-@re}B&ErNATy;oI^>`X-oMeoF2i?=CuL z)-GiJ+*--}-FfQo=v(Rh_?L^&tad{lf@z{MEd`_;OFvs7(?>p%a zJywpJ=so+lKp&#a2@=oR<;Q5ejmL`X@7JPyPf)$8PCb~)Qn+Y9+i$xsxTA2YhV%D{ zV|<#?cDSQZ1%K^_bQH8bitiUc9{$>o=E+B5Tev6z- z?jJu0x}x=n^|cbt*Eh$~O4x}fd;j=`f6#cm9l3aVJl&TlroU3}xbo0ba{u_c3*|lQ zuh5y^ZmiSyRNfra72iLOa(5e-PN#F{E2eUl_&NlVzCFX!iM;Io@w?UEuPeeH`*mQA zp6tHL)6Y*W)NpnWKlKAd-rk?m=O@0G|1!beKIShK?C+H!`y%xp_QAQcrqh?)JHA)T zcb)E2xBBngVjqr6+TYV=_l~bSTl}Ls?N_;tS;20dW{B=5)OfoW;r&xVKP>OpHfsG$ z-jBpF(76TiH$FB|dGdQZw`}&tpC?r_O>)(I(0rBD6T9!W#QwmJh6Uxr+9Pk*pqct2DnHjy0a`ir5cU62@eAISRiX(JZgy`6|*werP>H>oe?Av{LO$wAJj& zeo4PN^^{Z-(bM-(QU8^1T898`7dl#BHh<~Q(0mTCjuU7;2Uy2pu22Tt3;GnWj<0DQ z0$9g|^u0OYHl%0vtQGha_%{P*fSZ6%25ta0`&SRV0RFYWYPV^f4!9crHNa*sD}m?1 zzXEtJZ~%M~@D%cE_Vpm}iSVBUMtNi=fS&^YabUB@I!0shG@LJ&F)f#M*DD?DXUYBJYNqKP)@y~%t-D5C zU#=UQ@cweV-;a2&)c5}W@ez4{M0>tRN-#@O+bujvXL|1zMsJH8yA8*&GJhBvo z?KQib;I{PA4|*u-}J0I=D4 zy%#CA^LmexE0~?vdvIbqulI??b{_TH_ghi^+ttpyg4uWITfywR>H~dG)a;+?O~LGY z7wnta_jX{j?`^>SM%P0>s6Wv`KV5gbyvWZPC94nw z)xpmN=Yrd3QIH^-Gc57!Be0Ng2t8Z8kbU`l(y8Je?ws5M>r>=U3DI*n|9>NY)6c)h z_jj{&4^eX6>+V&&?p3Sv61%hFMs^P=#-ZreQG2si^1=0(>wnbPuky}6SKm{+!KU2o zY{`A%>(r3je8UQ=pJLx_JmGMkIK`i(cwGK@KHl1C@xD;s8y_qCl#dNB()VOXgb&~T zy};9xiKFi(MS|mYSu<++3I|a?H*VH&)UTBItetc{)8p%AOG)`=q0qy<1j$!BBi5fm z;m@~k+I*Jo=kao23#|PNwuj+%*oU4jeNUNapkH>sOUZrW`E^QHR31^|7L`-+ed2kV zG~@W@i9_YwDL+geZsQ$_OXRT1(}`R+bO<)PUUH9k_iFWroT53s%1_v<@lbou@mTxr zx?imHed5I5sURYjOG_=@Q}xQyPdY~^@iE_wi|0$CjQYEEdGaMa2-Og{^&1u2ed3tk z2nV%Y2nUtVwR6z#w{gUvmW!V^((KW_^{PKM?-dTJ-0i+1lPkA-qE~2-xgF>Hw`>!3 zyj}411nruQ-?(3uB~qSGVb{JR*tt^27vWCSi-OuiPM788hSgpckFQ)o?Xt|4r`EWbbei!G*$|K64J!;f;!4=e=b9m0L+phN9^v~pG_fQ@wpZuOx$&UxQ zQqW`f#M=G;+z)s$+5Pfz+$ZkGd(a0z-s@I<^!onX0b4(y2iV4YlfUKk<9>kN zqZ{`FQ2+dRuNmQOyw?P5kqU8TYsP)*!lw%z}6oKfUQ5!1#JC+EU@(lDuJy( zPy=lJfmUGa4;(~(tv@ghZ2f@=VCxU`N_hKDy|u&P;IO>6cD6c&eF$h@lHZ}HVmvf@ zB}w9ZI z&Jq~7D=@!I^rEjYLZsn~Wawz(k*=SMKT)#DnKcq#pTrPt*6t#~ht+H@oAS zPFH{WD|R9)koeL52J{q=HE0_Icf(si5)(UW+& zDz}^~koY)Bepr6o)pHdWl~c6xfa=>7T&n+#FXAuk0w2-2%!(iE{$URh)-% zsi_hYB18biAw-ymWXFyb^N17$qDVlseH~lJhY~>xRW(d29xbX`itd$c%kzEx#$RWK zxSbAC+nLs1zfS9~ol^CQc(v{W5YLK7$*i^h|F!Scl^jyq(w5KXXKUa8+3W1*+H0-7 z_d5Gj${p@`mf?8LAJ2)8>2<Ouaw)x*Fmx$bN%>+siDHy1#&=4= zSgs8w)VTpiX-cd zD2LZ~-FPX2&iP~AdgASfADEy%nVzZ|1}iOD1?`wH#-?zz*c3FSBzHbor{J82nVe1wxf0^r>g-P&5+4pbeiMhU6=pm-QE0F)o z)OXHTW$L>^Bk4KsEo>w9^;hsoD06+YFvfW5yTS-D^<80H_EA$al z-xUUlsqYFi#MF0%c4F$gLMt)#U7?Mb`mWGROnq1AB&NPAG!awZ74pQ?cZJi2U4OaW zYTndg^LPJ#h4z!_HLja!|H;3q?__XZ+JJ$$ui-s)8sB`;EtXEWMUm(+zTea!d?(xJ zPvd(TH{0_%FR^oTF1qPknnQMU()2_+yKL(VIzIJ&dVJh)_X{*P!E_bkq-gu2zm!zQ=(4(zzvTH=8d>x@uP<{S~{f<*80TEyJ!bJK4&$3_5vE%iXYWifnV39d*T%6U4GpQ`s^s~rzg&$JQA-91Tz0$n|`DRT{?FT^pd~Qd-=1d-(fdC zB5_uaPWd5MwiWk%zF_l6xu4FhuFbDgsg-^l{WRCKVSece@N1OIEN40czO1AVzSVMC zdv#j!m3@59OXa*K%dhgi3G}z@583@<@^{8hvQ9|+Rm0f?-m^&g{exlx`%e5ctlU}R z=fgt|7Lz-)*>qh3^%C~Bc9al&(2n+SK7jg@cIsWz4sxz1=;S%87w1`NiT$bRO2V$E zd>>ByW9_-LG-B&d#pDlJuTkQU5f2)_4QJ!|Rb#?h`) zPU|-xk25o%molUM2iLa0GM8L(o(S9hH(0Jkmiv#1PZ2K@=ZG!YiXYN;Pj3w6mvZLi zmaiA7yj0vBs~VL_O+Q50~rZ5%3?|$Jdpj{Ggo4j^2QLCGEWYkK=;#rtUtuDVMxQ&vJi? z_1H#?_cG*tN#aj4K2MDI59Pf{;?FR?mAIbmxI+9FjBg{xd(E=GN&J_LZzsn4a^jzA z{8Hq(gziUKOz?i)aN&05(@46%Vme(+2k+$#cieAu*~AXgH8UOyU{kHD@6?Px~&eil^m3G_6zgxe9QeEy^{{4vZ z^PHAS`dRFRk10L|tnJ?}TY{;7C*?$swcEaiN583jS)G4pO+GV%*PY}1a3$SO+@j|r zby|9r^DMgzSEt*i=}5WG_Z^qM=Se!Hc6%;8(Z=%av+_M5e5>WG&)sM3UpY64{^rz+ z3)J5WSD}15&VIV)+$1$gv^}KxqrbV1yS&`rao4wW_*MMQhakT$_@8U5$hyh}|8wIL z_xrrye~$IK?;Zbh*cE{v+I2fQtn)vI-4X&eS|Z&A|8tv1g@3UBIofl-NMD<0wLspu zf4SRxG2W!K+DYDDFSQ3^KNMeLIPQzf`oE?7E~NXf-~Sx-@_AqC`x~MJ^HPN)3|$WS z`o$5^uNv?EIT!rTFZiDeJLtT_?50q1e}o*d`y*gp9pd{vn1_dw`y*i9F6RuGJucs+ zvUzDJxqspkvHK^UC3gSBGsNznc#0VNed1q4jCsXBo&UMZ2VKFzdaJJUgnu^wbJq(O z{Lf9^K5ES_@10?tVx1h{&G;zCAG8}4IsOL2QH~4JbluO*{RTt0XYF(U&1<4w5letjBmelgo|-}Pd55!lx!&*yjjuiyV1 zDE`LOFh#{Yc(*uMq;bNU;95Bi@M zM*eyH&oB9be;WVu$=2`0|9l*N?k~i6kN)TS(wSW9fBp+K{^xq4#QFWt&D~x6W%?}L zY-kYS#F&NY2)>gZ>Yi=st6zrtUxfPS0L!|bX6^nNq3-HPXMRtc6T|LL6Y5aVn9jv; zoY(ivEgio97V6Y%9{a48&L%{}bB*fo!kMO{@!76PD{r_6FPOPMVram5B5J2uI(0bT z#qBj)2M~$c{g7o>dGGK(;BYY}f?7V*8|QQA`kIyZjihVPSlEL`ckv~_Ua!LjbD@Ff z(@1%Yu94^4NZ~BKQPORZgGJ=>bEX2%6X^aR;^TXUr*s)T32!H|r7CSI^`38SIojY446+v^RY&dYfgV#xUL&37fAqtmU%)tG~u@H_sahn|${lGXk>BKfu{J=dSJhh;axw9bUWT{p}g;Edq%X8T@-jkQ_ty_G5>F4kq&wuDIO%X%C_m@6E3_GE}G)WA*qQCSWV#w|O(l{~f zf&LQ9mEb+1Q1>D!MfEu9Fzn+fD~zJu>+YzbdqEA|2Yr!0B1i6w@s>`*i-DzIEFFjkNvC}+-Ng`$>*UF%0_cR@ zEWORo1(yD`^tKz!g-y4urK6D+s7970b=OBIi^Uu+q(Z9SO>B{%+ zt)1oldJAKG@Oba9mm+^Dm*v0dC5F9U^zY^$0G+f; zUVeqT9l(;0_H;M8Q^wa#c0X*s(ZZ~w9nW8!=lvGmZ)3V>;Lva#?jOzD{ow+}XL@&kx$;QQoZgKSw==6O02tZ+G23$xk62nV(oWw11T^RL)pGvt8s| ziWsl$TsbEf_0{Lv^f`%CPV{phd|g%Fr`GuHF8L!@e9s%hOU}t1!}z6q$__xjWD_n| zAUB%p8tOXb`B1|9iCHpl^Qusyd`sZ(8cOe?JUGpGmj{c)Kf-wWk(S;`e3tR=AYLM7 z`4Y5KD1C_W?w{@Q%>B3VKBc@zVe`CD!uzZ8-UQS889v`g?DDUP_=Ak!Mhv-KIsg2p z7~jfxmzQnC?`M2F@%xB7iQh}yMeOpmhxjKM-%HH?NcxEXJ>v(7T^^4R|2xKy5>F71 z5&t;xII+v`N#Y-4{1h?xK>XE#>t3sDR5{mt(*eUi?kn;f3O35uE%$>C=9Y}>R~U}* z7lA=5a=a(T>$nJ;b_2_JwDIBZ@fR>oLtTykdHrjQz9P?Gw>G_o*8{JU=e=v`E`9*m z?WijZN_lqSew6301orU@aU*mvfPCLM)a?VEj9aTmi>G&AOizZa$hSR){Tz^ZE{HxP z*Sd3E#12~Pe-1hH?dAA`mR{_KO>Z#l{poUC&bKi+RB6w9);_oSWq2;ibIRk*uL7O4 zOJ073x>o~B{afW%l;;ii+WoNkJ#OlzN22@IOKac2Dx65=dG02F3;PDU7oks$n#EOm*-u?F3)?2U7q(6yFAA_ zU?{mfA7s4C^ATc~=cB|f&&P;eo{tl|Jf9?Xc|Jw#@_dHa<@r3Z%kxvjF3(RByF6bc zc6ok=*yZ_IVwdMj#4gX54X^Vzm+_)kgM|GOhAn*xbH(WenWgG{0^_QA%jXozc>uus zHZ|siW$j#p772IooVohkbxOA3dFEdk6o2mdG2_E}EceB85k%jZ9(qC&)gomH>b3qH z3Gk89Y5rM){;z%yf6>+>(J%V^cY2P*Qq4I5V|v~I?P6Wun0d>_>v&(>A?qx$o}bX> z5IHz(p^kHv4`K70fn^+;UZ5NebwiQP^une`4M+Jbjbn2ER=X|fz9rJ<l+{-}RD?$@&%%?2giw?%p@$3>apioQ-`yw#`SD6q&Wt52LSjYc|6 zCmU))z84>{`z{BgoqE`ASM(j%6V}<~vHp+5^xHK3i9FJ89K?Oe)a0oaO0H0c4y^RU zLAzfoujM;`NT+TD@zQVB4x4|-aAkdIAjVre)ISVd)1KLZ9MgL!(p!2B{YWpi*PGVH z*S`_*?3e5S-ZOFi9JY*sUhDx&ul{k+bH3qrNSqh6T6ENVwdXDRcfG@=q7jBIhY((b zjtO;-8TNIK^ceUkJ%(}(AE5p3^ND%%hp!){$IuSG9^?LY=`pmofA`JP^?p)4Xnb`! z%g_48^U!Ip#PzkEq?7TIm!I0d8tVFrhJK#wz){yrkdv;5!wJaIT74Y29-?%bPAEg3 zYddSx`Zx_G$Zaown1fuetw%Nl{gfWZxX3!7FG2}&UZ1yqorOGfzVmi_+UKCV{cwjA zQZ6~4#^kWd{l`UKN_6fW^1osSoc+4eRpxtmU#VgT%rM^PduND!zK8Q~D)xZ;hx>eQ zg!E{Cc^{V8=X*=UZXe7OyM1tqIL`MlzDjN%fFDC#@ACJr+&)<0^KKt-yhr;0ep?}~ zkBySv?SnyLw-2U>qkTZ^_CXJ^+XubGZXYZfj_03Czvz|DLf^VvbG_2c_2>nThXxrR z(v43pY{zqI-wEsFczi?D=gnKRr*pY|TduSC=8Lu(4tb@2%etjqk32Q zamQVffm}K-!TGRtcE3LNe7moDclOo`rpLJF^vRP#N%Pv0Y( zF@8@^Oj($1(^`nWfO^VNT>hK3M}FeX8`~qxvVT;c!}q?k=`Q25Y%9jU>k-$>ZWpBG zUTY_nYuZx&y-hzSG@a{0y!5~7y|mmD=}k`W)YcXL5I!(_r3KjK<`KD{ms>nWBbODB zUpfalVe?&y_xX>Xr={hoPCuPHZS`^b^cdud&eOEq-LxOlV;Fxnztwal-pYM^+@6o? zw^+8wrN=NHoj#qxcvWk|(v|1+N@plHuWIJV2BNZ6&U5VslD$Shu&a;hG#dX5 zB)x`*3lH;t6Ysx{cz)w{m|a3YidZuKpy)}D8961ifS9MAA>^RyNExjw7yz*N!9Y z|GYf!<1wJ7{Mezs~ZhoG&N^mrKqiw)tOuj(jx_TwR`XHS@7aQB+Sz{_m6L zHJ>})rr$f?Zs`vsnWYy>HyJJ_j~gxy9knogU>l=D!D zq0g(!rSn9euV&MnpGvi)>7`y>)}Q%>| zC-Qw=tA8l{5aTgELMaeq+=bEzF~)Hy9VEs$45cFR8K!rL7;-w49wR=@c<_IgoFYEL z_<7*@QN!UxitzYRgfkh!V{bz^_rnNhG2TPzal`3J$Zgqg{gU?Q6EYvs{?4ZJhSQVK zXL7C{@uc-jHr;4AE94L+t6$XTvyK&nyUrmzu#9l)62hUg2#=mYII(Dn+4+PvLW7w6}c!lofnOk5{8l)V$4x;v@w*QXpnD8~%$%H_zH0Z2W!h={(Nv~6s%l&)#uk_XBYL{|U zuSb0JK3$LKwDPC(?H1POu2Azq?xWwb1bSEe*R7rXydXc{*v}J^^U4_yy({)6G4!tF zL!3i?Jbzg1dg3<5L#|cy7vx$>e-+V}Mqgd8NvT)$dChu0wzgN7)I;0-e;ieN{8udf zf#l!W^Zlh?A|5wfnV)>za5hc(II+AgzmH3P8_h?o-)FV;FdtdgavcLs%iuRH&yURr zAIy^vPIefdHgBo3{;IdX+Wr`q^|?=50*>XoFJ{M7*IyUDs_Wm%`d=zNsrenV`oGBX z8AvX(dWX_W4HuIu4Hu^`wNS=C?Ig+sD@+tp| zT||2o?T}5k0rR^pViyv-T{lDQcHI=Q+jWz~Zr6BBvWXr`N510*z8UJYQ01my@<=Yd1W4tKUQdXaQj&$s4B9+h z`E|!-cu?c@+IJD~!mYrnM{;k&Z~fWKd8@AjYrc?pke53yyWWU(9BWFJzof0@|Lmi6 z7E1Gp{()X~`I63KoTanSzv*qr)7P=HyMgyzq@|Gh-G=qDN<4779dx=5q4{L2$3FV? zrrY^kjOTMaZ#JD>`6kk5I#PB^=WgKdJpb2O0`<9G3v2r;y9McMyXhtK6XOrVQU;N? zhO-XvTQ%Qw*6@w;ueSH!d{o-GMEB5% zy_&A{W6z&6Qi@bvzK>on<43wzhk&eKvz*@tJlnUfoLwyEZC|RS_k^f<9Wq+qAuVUQ zi|K4)`FfB}s}RW*`TBd7kEOx2p64A$ZPp&yr5IP)JB>WRy9A?j>8^~!!IsKIwv5f!|`R4*WXQh^NjFywY@pANA1nCR)6`fuZ8tF z2zGgo0Qx1tIP`T`(bJ$WVLdZTFz#g^g7g^oGLDJINk2$DN!&*~Mchj~Lrnda%o9V; z$@-Py>h`X+x28l6uF?Og+MA!Y^aqk}*z^6RPY|yfuGpL1CTFtgUW5}p7FOriE%I<9 zd(-;8ijRBL4vh9D_)Yopj%ne8dGf)@g4rGG?M>9TKKHveFvNam`>dB&BbrZ@yzXKB z|5%>X{PtV@pKJLHB(F674W%D6TuizR7pHfDulZiA*k7!FpM{}>cB$B#Y@cXvqMbIf zH~Xx;+AY8IB-){3Z-T!n_9pmC)*(S(8nynBbx30Hm#jk)gTG|mkr@0{u{Wpq{3zqW zUln^3{8h0x!C$ftY4q9Cus43^Y43`?xoY`W>`n0BM)qc{+&G`T`P@TlZ-Rd+ z_9pC1**~*>>@UI297uMfUr&I4(s_)lYJMIR`Bcq6YJXPSo6nN^WD|XsjH|-)r)tK6kf;wf(i; z-bA}p>`ls@4)9ww->6=z<{RZ-ZRZdDH<528@+aT>58b3^Ule;zzEfu7s$y@h7_Khg679J2eRt`W7A@zpJ(tceS-7te^ZtsxNPhXAsA|F=XqqOJJXlH@HD|Qz2O2y8~p+2QSrr${1N8AK_9CnuMQ`-IN z`u5h0=NamO9a1l?_iIM$a*xjc&bsH$*G>bs>-a)D?W=>Ms((i_jytYfiT?=e>-F;b zcs)@5Y>4`L`V`uA;xwK+iF&5%gsQKM3=< zU)taIs9oNM{+e$^SO$NeZyaXRQ)~~|H=*GeqMEe-ySo!QTW*>8Woy2!y*W1VF zpZeUN(yjxR_1Jawov*Dg`T9SQufKFe=Lh(X>p*g!*#~kyzolDD_QT$p-b1^=>kavl zO+aph(vMj?6q5(+xlls873sGmZzP01MUCU9$ ze|?JQY`EKZBhLv=k4;)Rln*=1&ITV=?Ce+BxEe@aXZ+C5aW;@V0REuda5+?69^D72 zZihbdp|9(fr5&=G?|T-9U~j8l^Gk;6zu>wqR(VxEXpySdb#E2tGi^6%Mv?oJ!<=u_ z=ip~lTaWejC!W*vbGF{eaovG_sBX_%eWm@a`M>&CDtf1x=X}VzpY@x@e_FmDQJqd# zjeJ-Y{8aYmL%QEt?y~V*u|Ip($-#C_N9u4s`|}gmYB@XYIoa>Ca9`ujC)JK{`?EgR zNq%?v#&)RUW39Kg>vy_d_MV|izqy^2?c%uZz_`o`7>^53kMVof(`|#&@I`x z4VQ|;m0T4%tUo$kxKtQ`@%k%Vi478cpJSWg?wd4L?qB*W3u8LX&otb9g9Q@*>=czj>2FKtdZ$x_@+e(KdoWyq7oekm@r_0%>B8?`^R;xFzRw~ak-wI1-svvKeW$w$ z_Lce<8{N%LhqcmJk8S9)b?*~TfquUT7xT+jAtP5>M!W8peC+;1xSthpU;LA;-DCVt zk7vJKey!b5e{JixORq89O}glBjMs;9;c{8fl`GOW$%ArrcUq9kwoaj+n|O|l+|JAY zaQQQgK%Z-sU)^|2`WNylG+k`**;eSUfacGICSyxUcLwQRfr^WMWIj@HxrPhhf_!Iv zwLSB4-|g92zgzdWeMFK|x+4tzy_~d+dJGpnZRz@V?`!>}yWb@b%ccFV{1EvC)sg-| zxxIh=+>f-3dg}c)eNLL8T|(z?EtjUJ=iq33H{bt>=Y>2fH|0u?pS5-vm|nJWX319( z9{3!>qkmzc_{AFCere8Sk^jwgSzTV97rO-QSi*O##jYSmd;0ouD1C665#ZGSwJK0!P~?B$&&{(HucF#m574-(_M+p_LQ%~9sOit<_ zz2EYK7RGe)&okVu56Km_-)W(bo6z!NV5x_t!+qPZT}PSZ$MF?zz(#;D+xL#+e(oWJI+SBp99%7g0UBoWWJBeMMw-dWOZzFbj-b(E9 zJWuTMd>gUL^Cn`K=Z(ZJ&vV2s&sW(VF3-;qyF6bac6ok=*yZ_YVwdNqh+Upf5xYE} zG+dGAuhs6YlII5uSLC$I2bBQTbobZLLC%C02&^a>;-H@ybwxL(-)I>gKPv23W;HiIIUcHzFu>Fuus zmh_G8Zl~M3macUluoTkhP+dt60yx^iH}5gJb@Kejk#4l3sbAK~b18>jPhXxtX!Nlk zw!gu!_iNN2D$wK#E%#U$>92p8VVBR@E|1`a<=H#&`GV z-KQbnJ1EDFQl4zZxc2wU)qY;uy3cte~h<-;Ey+yec^%mt%oQG_q-1B)zBeCnP z)m2SDoPgd6GtgII7J4d_TtA^7L&^0M`a6_dKXF`?TtD%9K_%BuW6am}(!&ti*H5j)uAlP6uAiEST|ec3=b@j% zap07l~&~ zj~1s(9#1@DxVZHb2s@S$&+ly%JARG$H0V3Zpga0W-am_cI)0t_4C!WpOW>Pg@+rnI zlm5RGFOhzZ^o@v5KF#JeRhg;ze&1D z(wzWZ;V*H&bc*FULp%jK`imD2U>#o8^GWyr_;aK?iS&m4iuccu?ze~+N%tQ>H}TiJ zzeKwKm-sB{{tsgCQ8D=&;&Y_`ZQ^Cp|DVK7jQ?BWRpS3iyh8e4AkH)Xv&68&iplTz z^Q8a3h+9ejIbzsx#pHMWd6QSgAyPOa46RPZN)l z-uI(=N&iRwJn4Ulc#QOT??B$)A^jgSzL)gBOgv8duM-cF{!fVeNdI4np+}0zH;6|_ z@B5>Jr2iGhLk|`C-h-bbQB3~KpC|o)BZeL;CVx*n#`OQ3c$D-XC0-)_7V$Xo$NhQY z1!CyqVxp@Avi~9Wh5i~&uCaX)dB4o)#UGydG%@zYef?41YhTgltM_-V5yNGp{pe-g zkDFC$ydRVoy0{;Ga?#TF^9s^A=pD5;KKXOvFK`@szH(l{W=lux5L*WmJH*0zv)beg zJ+5aCB)3`l#sAde2a;P*pA(=@=ka`X`Pc1Fald{_+DOZD^&#Ci#6D7X6#GcUp*Bl5 zl&-ZWTrr%~IzY|Urq4c7L{j67GpPrIo280fYB$ULyN_yK$x-W-)@wB{ZeBkRN^|}9S?N-?*J8SLd?=i;jAY6s?)J{%n_Q`aL zq2-opJefYm{jdY0X#eP+G-g=s+`Q1sI=JPttsv+=ys?S2lh^qbMWmvnos#(n7zt!a25G3@&-aebBjzF%Th zeszx-S!Lbr1;FC}WcAkhmeB>=_x87Qi{yDZU&QEq9vyab-%Fm$%Ol}F?t4l7TLt_4 zJnWGPsK)QU*uvP(yJbQtmz)cMcHb=vkA_bH_g-T-?7kMEF8Ioo9i2hEZuA+RA~q=T z^Tbjxi=Q;?sS0@R%Hkyy`s-pMvNtNHUNB=qAXFex#w0d5C{i|$VZta&IKWAZf zm5v_ar$;S_^K$o(N=x7?IcEybmB3g1rMIEosQ>%p`zCp#>n|N*JmhtMeE%fJ_%}1Y zk$8}}iJ1M8Y%?5oL*O_cg*_O!-4K^@F4;2aZnlajxQy*0 z&+8Q)K*d836i>Dl<1zH)Ek4^yxz&RLXIn>6-X3I>Z5<)Lj`V}X*hk8?_7G#ADcjmb zd_CzqiEkioCw>WW8}UmG`}<}MBBwg#PBuinejM!{_g_$*%6YbE4q0~uU#XZiy%70> z_k}6+ep*Jqc)zRMQGQA3H`*=zsF$zPrsYK|r| zw3E^+hx`7QzyB-yWcGZ6#4oCREl|EDkguw*HEGv-Ivx}sVc7i+0dlR=2W*$&tr(xK z2V5`2eK&0YxzZW*uR`UkbQb-u^)S9x;V0KZ8^ZMXsFhpOwf37mg?1S5_|q|7A5p!f zBcYq}OUtYI9FhAPAJ^w4AL~EnH_+jJ*w8cCQRstgx<(JQz~4*GlcIdWx@IU*PbKHf z9+h*w7{6-suuyXO)ynt*#hF5jn!i;Ty-OwI)(9%pte8`6h8+=r9= zE#3QS_TjeMW1@fd;(7UtcHuspw~K^&g$M3MxcB82X1gE{!ro3|$cwP|E@H@&u=j3a z$e*xxCo%QUUhI2iyLwE%guU1o%XU%!?0p&OA(z8mY&>PV+DZQg#ONm>6eIh67oQa`6f)|q)9a!$^9HT@&&NW9<1u$^Hi!!Cx9m*O8z+{bW`A>^^F zM-q=Q9A`MmaEjp!!+D0M7@lUh$nXrqvkaFQE;BsGaK*wf3;i4Bpm!_!_H2#5T_SdU zyG-o*_8hV6+ZAHhw;aDS(6`|@<~iX6&nZ0#y&6icPnR*?qdukFF1bDhzf|<;Dbl+> z1;2$jUm9V&>r=|7s81<>ORi6QN$>i!huHNg@#D2}HPq#DQz}1_%KDoO z<=l=-p8dG(Mmi| z+(tY@+)g}2+(|r1+(kT2+(SG@+)F%4+(+zugZ563qaUm5Jzn#k%xS(S(7B0~TW;0&{?Lxibx`=}36!Tk_ebOlZzpdbZx?S5ZwIfx z*W2rhdS*k7R{w0GiS00H{O0Qh>HNImxL#GBLcA19<-4zkD1Ehkv|og_%`^0-Tt3fI zzrVcTe$ER966_oGmmr4*65rSI{^+sx%M#z`^?vK+ee6pHzK>eu`3S{?`(+#Sqn=w; z&A-~OPl#Uge!R%~5&bogJlER0zl8m?0iJs#`o-k&K=K|dhp)>I#Pc2+t(^vvA7y+K z@fh(o;A{#RqKah@*(0@%cq$99B~`*&l0y2PZM_%{|s>#@f7h{rtkY_OT@na zwoLqANq>&m_y1OiegCk{>QPKi8+|tPaXy!4{U(WXEXU6iPca?emun^c2N>T-`VSM& zkbZ%w8_&Lb?%6$Genf@rBpC^XCD<7Qo2`yDJY{w(7c8Sj1u%ZztFgfonHzk)&bpZgu0 zWxV?lj4lVEj48yI;UK<3Gmu6~?WQ#xXJM6*&);c%0Ao62o3`e+;n)8NbASg?^NI5b4pr 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 fTPjJRa-T}fU+ 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ëi{{RVTe={IP=rr*HEMKi=dkG<(PuyIkU-+*zB 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 A*8l(j literal 0 HcmV?d00001 diff --git a/compression/cnft-burn/anchor/tests/fixtures/spl_account_compression.so b/compression/cnft-burn/anchor/tests/fixtures/spl_account_compression.so new file mode 100644 index 0000000000000000000000000000000000000000..a5db971a3bee12066fc5e0811d2246f458b1fe03 GIT binary patch literal 2349040 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∾C-nB~IidB;5jf!qJ>SXmIzMhZ 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
$e+kT4RQa#L5--zK`m2@gIb}U_T}4g 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

rHiP4k%L10 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 z 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�(lo1^~1{bP#0~#)z(AR9<=-KYWdZ?DX=ka=| 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

E`%epBjsj)!V~ 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

iJETt<*3(1!rC~iiq;FbuogLCY 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 QN-_@5S&pK6mRkxxXRhDA|d> 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%0AifUtiLcv3##f;SzKRK7g@Ugl!PmBN@$;*T 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%0DRO3mr>z{L%4NSq})y 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 literal 0 HcmV?d00001 diff --git a/compression/cnft-burn/anchor/tests/fixtures/spl_noop.so b/compression/cnft-burn/anchor/tests/fixtures/spl_noop.so new file mode 100644 index 0000000000000000000000000000000000000000..e250fa09254f69ad2e39a74a000e01ca5e3825b4 GIT binary patch literal 41056 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 literal 0 HcmV?d00001 From bdca86850121a7406183b4804c03110ef16d140e Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 20:40:29 +0000 Subject: [PATCH 025/138] Add LiteSVM integration test for cNFT burn via Bubblegum CPI Re-enable the cnft-burn Anchor example with a Rust LiteSVM test that runs the full create-tree -> mint -> burn flow against the real mainnet mpl-bubblegum, spl-account-compression, and spl-noop program binaries. - Anchor.toml [scripts] test -> cargo test (matches the group/anchor pattern). - Add litesvm + solana-* 3.x dev-dependencies to the program crate. - programs/cnft-burn/tests/test_burn.rs: - loads cnft_burn.so plus the three committed fixtures into LiteSVM - allocates + create_tree_config a depth-3/buffer-8 Bubblegum tree - mints one cNFT via mint_v1 (TokenStandard::NonFungible) - recomputes data_hash/creator_hash exactly as Bubblegum does - builds the empty-node Merkle proof for leaf 0 and reads the live root from the on-chain ConcurrentMerkleTree<3,8> account - calls burn_cnft, asserts success, and asserts a second burn fails - Suppress the Anchor #[program] macro's false-positive diverging_sub_expression clippy lint at the crate level. https://claude.ai/code/session_013dpnF6uSGWXjkJJZseqzcP --- compression/cnft-burn/anchor/Anchor.toml | 2 +- .../anchor/programs/cnft-burn/Cargo.toml | 12 + .../anchor/programs/cnft-burn/src/lib.rs | 15 +- .../programs/cnft-burn/tests/test_burn.rs | 458 ++++++++++++++++++ 4 files changed, 480 insertions(+), 7 deletions(-) create mode 100644 compression/cnft-burn/anchor/programs/cnft-burn/tests/test_burn.rs diff --git a/compression/cnft-burn/anchor/Anchor.toml b/compression/cnft-burn/anchor/Anchor.toml index 8917c2a4..ddd241c1 100644 --- a/compression/cnft-burn/anchor/Anchor.toml +++ b/compression/cnft-burn/anchor/Anchor.toml @@ -15,4 +15,4 @@ cluster = "devnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/cnft-burn.ts" +test = "cargo test" diff --git a/compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml b/compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml index e2347277..3c08159a 100644 --- a/compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml +++ b/compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml @@ -26,5 +26,17 @@ anchor-lang = "1.0.0" # using raw invoke() with hardcoded program IDs and discriminators. borsh = "1" +[dev-dependencies] +litesvm = "0.11.0" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.0" +solana-account = "3.0.0" +solana-native-token = "3.0.0" +solana-signer = "3.0.0" +solana-message = "3.0.0" +solana-keccak-hasher = "3.0.0" + [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs b/compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs index 28d55dfb..94dc864b 100644 --- a/compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs +++ b/compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs @@ -1,3 +1,8 @@ +// `diverging_sub_expression` is a false positive emitted from the Anchor +// `#[program]` macro expansion under this clippy/rustc version; the generated +// instruction-dispatch code is correct. +#![allow(clippy::diverging_sub_expression)] + use anchor_lang::prelude::*; use anchor_lang::solana_program::{ instruction::{AccountMeta, Instruction}, @@ -9,16 +14,14 @@ declare_id!("C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv"); /// mpl-bubblegum program ID (BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY) const MPL_BUBBLEGUM_ID: Pubkey = Pubkey::new_from_array([ - 0x98, 0x8b, 0x80, 0xeb, 0x79, 0x35, 0x28, 0x69, 0xb2, 0x24, 0x74, 0x5f, 0x59, 0xdd, 0xbf, - 0x8a, 0x26, 0x58, 0xca, 0x13, 0xdc, 0x68, 0x81, 0x21, 0x26, 0x35, 0x1c, 0xae, 0x07, 0xc1, - 0xa5, 0xa5, + 0x98, 0x8b, 0x80, 0xeb, 0x79, 0x35, 0x28, 0x69, 0xb2, 0x24, 0x74, 0x5f, 0x59, 0xdd, 0xbf, 0x8a, + 0x26, 0x58, 0xca, 0x13, 0xdc, 0x68, 0x81, 0x21, 0x26, 0x35, 0x1c, 0xae, 0x07, 0xc1, 0xa5, 0xa5, ]); /// SPL Account Compression program ID (cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK) const SPL_ACCOUNT_COMPRESSION_ID: Pubkey = Pubkey::new_from_array([ - 0x09, 0x2a, 0x13, 0xee, 0x95, 0xc4, 0x1c, 0xba, 0x08, 0xa6, 0x7f, 0x5a, 0xc6, 0x7e, 0x8d, - 0xf7, 0xe1, 0xda, 0x11, 0x62, 0x5e, 0x1d, 0x64, 0x13, 0x7f, 0x8f, 0x4f, 0x23, 0x83, 0x03, - 0x7f, 0x14, + 0x09, 0x2a, 0x13, 0xee, 0x95, 0xc4, 0x1c, 0xba, 0x08, 0xa6, 0x7f, 0x5a, 0xc6, 0x7e, 0x8d, 0xf7, + 0xe1, 0xda, 0x11, 0x62, 0x5e, 0x1d, 0x64, 0x13, 0x7f, 0x8f, 0x4f, 0x23, 0x83, 0x03, 0x7f, 0x14, ]); /// Burn instruction discriminator from mpl-bubblegum diff --git a/compression/cnft-burn/anchor/programs/cnft-burn/tests/test_burn.rs b/compression/cnft-burn/anchor/programs/cnft-burn/tests/test_burn.rs new file mode 100644 index 00000000..3b6cabfd --- /dev/null +++ b/compression/cnft-burn/anchor/programs/cnft-burn/tests/test_burn.rs @@ -0,0 +1,458 @@ +//! LiteSVM integration test for the cnft-burn Anchor program. +//! +//! Full flow exercised: +//! 1. Load the cnft-burn program plus the three mainnet fixtures +//! (mpl-bubblegum, spl-account-compression, spl-noop) into LiteSVM. +//! 2. Allocate + initialize a Bubblegum Merkle tree (max_depth=3, +//! max_buffer_size=8, canopy=0) via `create_tree_config`. +//! 3. Mint a single cNFT to `leaf_owner` via `mint_v1`. +//! 4. Recompute `data_hash` / `creator_hash` exactly as Bubblegum does. +//! 5. Build the Merkle proof for leaf 0 (all empty-node siblings) and read +//! the current root from the on-chain tree account. +//! 6. Call our program's `burn_cnft`, signed by `leaf_owner`, and assert the +//! transaction succeeds and a second burn fails (leaf already zeroed). + +use { + borsh::BorshSerialize, + litesvm::LiteSVM, + solana_instruction::{account_meta::AccountMeta, Instruction}, + solana_keccak_hasher::hashv, + solana_keypair::Keypair, + solana_message::Message, + solana_pubkey::{pubkey, Pubkey}, + solana_signer::Signer, + solana_transaction::Transaction, +}; + +// ---- Program IDs ---------------------------------------------------------- + +const CNFT_BURN_ID: Pubkey = pubkey!("C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv"); +const BUBBLEGUM_ID: Pubkey = pubkey!("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY"); +const COMPRESSION_ID: Pubkey = pubkey!("cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK"); +const NOOP_ID: Pubkey = pubkey!("noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV"); +const SYSTEM_ID: Pubkey = pubkey!("11111111111111111111111111111111"); + +// ---- Bubblegum instruction discriminators --------------------------------- + +const CREATE_TREE_CONFIG_DISC: [u8; 8] = [165, 83, 136, 142, 89, 202, 47, 220]; +const MINT_V1_DISC: [u8; 8] = [145, 98, 192, 118, 184, 147, 118, 104]; + +// Anchor-style instruction discriminator for `burn_cnft` = sha256("global:burn_cnft")[..8]. +// Computed in `burn_cnft_disc()` below to avoid a sha2 dependency-mismatch; the program +// is generated by Anchor so we mirror that scheme. + +// ---- Tree parameters ------------------------------------------------------ + +const MAX_DEPTH: u32 = 3; +const MAX_BUFFER_SIZE: u32 = 8; + +// ---- MetadataArgs (mirrors mpl_bubblegum::types::MetadataArgs borsh layout) ---- + +#[derive(BorshSerialize, Clone)] +struct Creator { + address: [u8; 32], + verified: bool, + share: u8, +} + +#[derive(BorshSerialize, Clone)] +enum TokenProgramVersion { + #[allow(dead_code)] + Original, + #[allow(dead_code)] + Token2022, +} + +#[derive(BorshSerialize, Clone)] +struct MetadataArgs { + name: String, + symbol: String, + uri: String, + seller_fee_basis_points: u16, + primary_sale_happened: bool, + is_mutable: bool, + edition_nonce: Option, + token_standard: Option, // TokenStandard enum, encoded by variant index + collection: Option, // None โ€” Collection, kept absent + uses: Option, // None โ€” Uses, kept absent + token_program_version: TokenProgramVersion, + creators: Vec, +} + +// ---- Hashing, exactly as the Bubblegum program does ------------------------ + +fn hash_metadata(metadata: &MetadataArgs) -> [u8; 32] { + let serialized = borsh::to_vec(metadata).unwrap(); + let inner = hashv(&[serialized.as_slice()]).to_bytes(); + hashv(&[&inner, &metadata.seller_fee_basis_points.to_le_bytes()]).to_bytes() +} + +fn hash_creators(creators: &[Creator]) -> [u8; 32] { + let creator_data: Vec> = creators + .iter() + .map(|c| [c.address.as_ref(), &[c.verified as u8], &[c.share]].concat()) + .collect(); + hashv( + creator_data + .iter() + .map(|c| c.as_slice()) + .collect::>() + .as_slice(), + ) + .to_bytes() +} + +// ---- SPL account-compression empty-node helper ----------------------------- + +fn empty_node(level: u32) -> [u8; 32] { + if level == 0 { + return [0u8; 32]; + } + let lower = empty_node(level - 1); + hashv(&[&lower, &lower]).to_bytes() +} + +// ---- Anchor discriminator for burn_cnft ------------------------------------ + +fn burn_cnft_disc() -> [u8; 8] { + // sha256("global:burn_cnft")[..8]. Implemented inline to avoid pulling a + // crypto crate that conflicts with the program's solana version. + let digest = sha256(b"global:burn_cnft"); + let mut out = [0u8; 8]; + out.copy_from_slice(&digest[..8]); + out +} + +// Minimal SHA-256 (FIPS 180-4) โ€” only used to derive the Anchor discriminator. +fn sha256(input: &[u8]) -> [u8; 32] { + const K: [u32; 64] = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, + 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, + 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, + 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, + 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, + 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, + 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, + 0xc67178f2, + ]; + let mut h: [u32; 8] = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, + 0x5be0cd19, + ]; + let mut msg = input.to_vec(); + let bitlen = (input.len() as u64) * 8; + msg.push(0x80); + while msg.len() % 64 != 56 { + msg.push(0); + } + msg.extend_from_slice(&bitlen.to_be_bytes()); + + for chunk in msg.chunks(64) { + let mut w = [0u32; 64]; + for (i, wi) in w.iter_mut().enumerate().take(16) { + *wi = u32::from_be_bytes([ + chunk[i * 4], + chunk[i * 4 + 1], + chunk[i * 4 + 2], + chunk[i * 4 + 3], + ]); + } + for i in 16..64 { + let s0 = w[i - 15].rotate_right(7) ^ w[i - 15].rotate_right(18) ^ (w[i - 15] >> 3); + let s1 = w[i - 2].rotate_right(17) ^ w[i - 2].rotate_right(19) ^ (w[i - 2] >> 10); + w[i] = w[i - 16] + .wrapping_add(s0) + .wrapping_add(w[i - 7]) + .wrapping_add(s1); + } + let mut v = h; + for i in 0..64 { + let s1 = v[4].rotate_right(6) ^ v[4].rotate_right(11) ^ v[4].rotate_right(25); + let ch = (v[4] & v[5]) ^ ((!v[4]) & v[6]); + let t1 = v[7] + .wrapping_add(s1) + .wrapping_add(ch) + .wrapping_add(K[i]) + .wrapping_add(w[i]); + let s0 = v[0].rotate_right(2) ^ v[0].rotate_right(13) ^ v[0].rotate_right(22); + let maj = (v[0] & v[1]) ^ (v[0] & v[2]) ^ (v[1] & v[2]); + let t2 = s0.wrapping_add(maj); + v[7] = v[6]; + v[6] = v[5]; + v[5] = v[4]; + v[4] = v[3].wrapping_add(t1); + v[3] = v[2]; + v[2] = v[1]; + v[1] = v[0]; + v[0] = t1.wrapping_add(t2); + } + for i in 0..8 { + h[i] = h[i].wrapping_add(v[i]); + } + } + let mut out = [0u8; 32]; + for (i, word) in h.iter().enumerate() { + out[i * 4..i * 4 + 4].copy_from_slice(&word.to_be_bytes()); + } + out +} + +// ---- ConcurrentMerkleTree<3,8> account layout ------------------------------ +// +// account_data = header (56 bytes) || zero-copy ConcurrentMerkleTree (1248) || canopy (0) +// +// Header (ConcurrentMerkleTreeHeader): account_type(1) + header-enum-discriminant(1) +// + V1{ max_buffer_size(4), max_depth(4), authority(32), creation_slot(8), +// is_batch_initialized(1), _padding[5] } = 56 bytes total. +// +// ConcurrentMerkleTree<3,8> (#[repr(C)]): +// sequence_number u64 (off 0) +// active_index u64 (off 8) +// buffer_size u64 (off 16) +// change_logs [ChangeLog<3>; 8] (off 24), stride = 136 +// ChangeLog<3> = root[32] + path[3*32] + index u32 + _padding u32 = 136 +// rightmost_proof Path<3> +// +// Current root = change_logs[active_index].root. + +const HEADER_SIZE: usize = 56; +const CMT_SIZE: usize = { + let changelog = 32 + 3 * 32 + 4 + 4; // 136 + let path = 3 * 32 + 32 + 4 + 4; // 136 + 8 + 8 + 8 + changelog * 8 + path +}; +const TREE_ACCOUNT_SIZE: usize = HEADER_SIZE + CMT_SIZE; + +fn read_current_root(data: &[u8]) -> [u8; 32] { + let tree = &data[HEADER_SIZE..]; + let active_index = u64::from_le_bytes(tree[8..16].try_into().unwrap()) as usize; + let changelog_stride = 136; + let root_off = 24 + active_index * changelog_stride; + let mut root = [0u8; 32]; + root.copy_from_slice(&tree[root_off..root_off + 32]); + root +} + +// ---- Helpers --------------------------------------------------------------- + +fn send( + svm: &mut LiteSVM, + ixs: Vec, + payer: &Keypair, + signers: &[&Keypair], +) -> Result<(), Box> { + let msg = Message::new(&ixs, Some(&payer.pubkey())); + let blockhash = svm.latest_blockhash(); + let mut tx = Transaction::new_unsigned(msg); + tx.sign(signers, blockhash); + svm.send_transaction(tx).map(|_| ()).map_err(Box::new) +} + +#[test] +fn test_burn_cnft() { + let mut svm = LiteSVM::new(); + + // Load the cnft-burn program and the three mainnet fixtures. + svm.add_program( + CNFT_BURN_ID, + include_bytes!("../../../target/deploy/cnft_burn.so"), + ) + .unwrap(); + svm.add_program( + BUBBLEGUM_ID, + include_bytes!("../../../tests/fixtures/mpl_bubblegum.so"), + ) + .unwrap(); + svm.add_program( + COMPRESSION_ID, + include_bytes!("../../../tests/fixtures/spl_account_compression.so"), + ) + .unwrap(); + svm.add_program( + NOOP_ID, + include_bytes!("../../../tests/fixtures/spl_noop.so"), + ) + .unwrap(); + + // Fund payer and leaf_owner. + let payer = Keypair::new(); + let leaf_owner = Keypair::new(); + svm.airdrop(&payer.pubkey(), 100 * solana_native_token::LAMPORTS_PER_SOL) + .unwrap(); + svm.airdrop( + &leaf_owner.pubkey(), + 10 * solana_native_token::LAMPORTS_PER_SOL, + ) + .unwrap(); + + // Create the Merkle tree account, owned by the compression program. + let merkle_tree = Keypair::new(); + let rent = svm.minimum_balance_for_rent_exemption(TREE_ACCOUNT_SIZE); + let create_acc = Instruction { + program_id: SYSTEM_ID, + accounts: vec![ + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(merkle_tree.pubkey(), true), + ], + // System CreateAccount: u32 instruction index (0) + lamports u64 + space u64 + owner [32] + data: { + let mut d = Vec::new(); + d.extend_from_slice(&0u32.to_le_bytes()); + d.extend_from_slice(&rent.to_le_bytes()); + d.extend_from_slice(&(TREE_ACCOUNT_SIZE as u64).to_le_bytes()); + d.extend_from_slice(COMPRESSION_ID.as_ref()); + d + }, + }; + + // tree_authority (a.k.a tree_config) PDA = [merkle_tree] under bubblegum. + let (tree_config, _) = + Pubkey::find_program_address(&[merkle_tree.pubkey().as_ref()], &BUBBLEGUM_ID); + + // create_tree_config(max_depth, max_buffer_size, public=None) + let create_tree_ix = Instruction { + program_id: BUBBLEGUM_ID, + accounts: vec![ + AccountMeta::new(tree_config, false), + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new_readonly(payer.pubkey(), true), // tree_creator + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = CREATE_TREE_CONFIG_DISC.to_vec(); + d.extend_from_slice(&MAX_DEPTH.to_le_bytes()); + d.extend_from_slice(&MAX_BUFFER_SIZE.to_le_bytes()); + d.push(0); // Option::None + d + }, + }; + + send( + &mut svm, + vec![create_acc, create_tree_ix], + &payer, + &[&payer, &merkle_tree], + ) + .expect("create_tree_config should succeed"); + + // Build the MetadataArgs for the single cNFT we mint. + let creator = Creator { + address: leaf_owner.pubkey().to_bytes(), + verified: false, + share: 100, + }; + let metadata = MetadataArgs { + name: "Test cNFT".to_string(), + symbol: "TCNFT".to_string(), + uri: "https://example.com/nft.json".to_string(), + seller_fee_basis_points: 500, + primary_sale_happened: false, + is_mutable: true, + edition_nonce: None, + token_standard: Some(0), // TokenStandard::NonFungible + collection: None, + uses: None, + token_program_version: TokenProgramVersion::Original, + creators: vec![creator.clone()], + }; + + // mint_v1 + let mint_ix = Instruction { + program_id: BUBBLEGUM_ID, + accounts: vec![ + AccountMeta::new(tree_config, false), + AccountMeta::new_readonly(leaf_owner.pubkey(), false), + AccountMeta::new_readonly(leaf_owner.pubkey(), false), // leaf_delegate + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new_readonly(payer.pubkey(), true), + AccountMeta::new_readonly(payer.pubkey(), true), // tree_creator_or_delegate + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = MINT_V1_DISC.to_vec(); + d.extend_from_slice(&borsh::to_vec(&metadata).unwrap()); + d + }, + }; + send(&mut svm, vec![mint_ix], &payer, &[&payer]).expect("mint_v1 should succeed"); + + // Recompute data_hash and creator_hash exactly as Bubblegum does. + let data_hash = hash_metadata(&metadata); + let creator_hash = hash_creators(&metadata.creators); + + // Proof for leaf index 0 in an otherwise-empty tree: empty-node siblings. + let proof = [empty_node(0), empty_node(1), empty_node(2)]; + + // Read the current root from the on-chain tree account. + let tree_data = svm.get_account(&merkle_tree.pubkey()).unwrap().data; + let root = read_current_root(&tree_data); + + // Build burn_cnft via our program. Accounts per BurnCnft struct: + // leaf_owner (signer,mut), tree_authority (mut), merkle_tree (mut), + // log_wrapper, compression_program, bubblegum_program, system_program, + // then proof nodes as remaining accounts. + let mut burn_accounts = vec![ + AccountMeta::new(leaf_owner.pubkey(), true), + AccountMeta::new(tree_config, false), + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(BUBBLEGUM_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ]; + for node in proof.iter() { + burn_accounts.push(AccountMeta::new_readonly( + Pubkey::new_from_array(*node), + false, + )); + } + + let burn_data = { + let mut d = burn_cnft_disc().to_vec(); + d.extend_from_slice(&root); + d.extend_from_slice(&data_hash); + d.extend_from_slice(&creator_hash); + d.extend_from_slice(&0u64.to_le_bytes()); // nonce + d.extend_from_slice(&0u32.to_le_bytes()); // index + d + }; + + let burn_ix = Instruction { + program_id: CNFT_BURN_ID, + accounts: burn_accounts.clone(), + data: burn_data.clone(), + }; + + send(&mut svm, vec![burn_ix], &leaf_owner, &[&leaf_owner]).expect("burn_cnft should succeed"); + + // After burning, leaf 0 is zeroed. The root the test cached is now stale, + // so a second burn with the same (root, hashes) must fail. + let burn_ix2 = Instruction { + program_id: CNFT_BURN_ID, + accounts: burn_accounts, + data: burn_data, + }; + let second = send(&mut svm, vec![burn_ix2], &leaf_owner, &[&leaf_owner]); + assert!( + second.is_err(), + "second burn must fail: the leaf was already burned" + ); +} + +#[test] +fn test_burn_cnft_disc_matches_program() { + // Sanity: the Anchor discriminator we compute equals sha256("global:burn_cnft")[..8]. + let disc = burn_cnft_disc(); + assert_eq!(disc.len(), 8); + // Also exercise our empty_node against the known depth-1 value. + let e1 = empty_node(1); + let manual = hashv(&[&[0u8; 32], &[0u8; 32]]).to_bytes(); + assert_eq!(e1, manual); +} From 46688e223ff37525409cecc60a5d7b7e36e05fb1 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 20:43:00 +0000 Subject: [PATCH 026/138] ci(compression/cnft-burn): re-enable now that it builds and has a LiteSVM test --- .github/.ghaignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/.ghaignore b/.github/.ghaignore index 0c7d2136..10e15815 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -4,8 +4,6 @@ tools/shank-and-solita/native # not building compression/cutils/anchor compression/cnft-vault/anchor -# builds but need to test on localhost -compression/cnft-burn/anchor From 9474920c41552ee7c4f7fe7cb2f473d94e33b24d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 21:11:14 +0000 Subject: [PATCH 027/138] fix(compression/cnft-burn): use localnet provider so anchor test deploys to a local validator (not unfunded devnet) --- compression/cnft-burn/anchor/Anchor.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compression/cnft-burn/anchor/Anchor.toml b/compression/cnft-burn/anchor/Anchor.toml index ddd241c1..94dbfdfb 100644 --- a/compression/cnft-burn/anchor/Anchor.toml +++ b/compression/cnft-burn/anchor/Anchor.toml @@ -5,13 +5,13 @@ solana_version = "3.1.8" resolution = true skip-lint = false -[programs.devnet] +[programs.localnet] cnft_burn = "C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv" # [registry] section removed โ€” no longer used in Anchor 1.0 [provider] -cluster = "devnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] From a4ce2eca77f53917cca248c1ac1edc25298036fe Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 21:16:59 +0000 Subject: [PATCH 028/138] Remove dead clockwork tool The Clockwork project has been discontinued and the directory only contained a README pointing to the upstream repo. --- tools/clockwork/README.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 tools/clockwork/README.md diff --git a/tools/clockwork/README.md b/tools/clockwork/README.md deleted file mode 100644 index aba2413e..00000000 --- a/tools/clockwork/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Clockwork - -[Clockwork](https://github.com/clockwork-xyz/clockwork) is automation infrastructure for Solana. It lets you schedule transactions and build automated, event-driven [programs](https://solana.com/docs/terminology#program). - -See the upstream [Clockwork repository](https://github.com/clockwork-xyz/clockwork) for examples and documentation. From 96f34b3108bae6afecd24f08bc46e7ed832fd40b Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 21:19:10 +0000 Subject: [PATCH 029/138] test(cnft-burn): use crate ID (not hardcoded) so it survives anchor keys sync in CI --- .../cnft-burn/anchor/programs/cnft-burn/tests/test_burn.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compression/cnft-burn/anchor/programs/cnft-burn/tests/test_burn.rs b/compression/cnft-burn/anchor/programs/cnft-burn/tests/test_burn.rs index 3b6cabfd..21abbcbf 100644 --- a/compression/cnft-burn/anchor/programs/cnft-burn/tests/test_burn.rs +++ b/compression/cnft-burn/anchor/programs/cnft-burn/tests/test_burn.rs @@ -26,7 +26,9 @@ use { // ---- Program IDs ---------------------------------------------------------- -const CNFT_BURN_ID: Pubkey = pubkey!("C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv"); +// Track the program crate's declared id (CI runs `anchor keys sync`, which +// rewrites it to a freshly generated keypair before building). +const CNFT_BURN_ID: Pubkey = cnft_burn::ID; const BUBBLEGUM_ID: Pubkey = pubkey!("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY"); const COMPRESSION_ID: Pubkey = pubkey!("cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK"); const NOOP_ID: Pubkey = pubkey!("noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV"); From 8638f003a19c8f501ed3a787ab75d1e1a5c0bcd7 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 20:47:59 +0000 Subject: [PATCH 030/138] test(compression): scaffold cutils + cnft-vault for LiteSVM (build fix, fixtures, dev-deps, cargo-test script) --- compression/cnft-vault/anchor/Anchor.toml | 2 +- .../anchor/programs/cnft-vault/Cargo.toml | 13 +++++++++- .../anchor/tests/fixtures/README.md | 24 ++++++++++++++++++ .../anchor/tests/fixtures/mpl_bubblegum.so | Bin 0 -> 1329808 bytes .../tests/fixtures/spl_account_compression.so | Bin 0 -> 2349040 bytes .../anchor/tests/fixtures/spl_noop.so | Bin 0 -> 41056 bytes compression/cutils/anchor/Anchor.toml | 2 +- .../cutils/anchor/programs/cutils/Cargo.toml | 13 +++++++++- .../cutils/anchor/tests/fixtures/README.md | 24 ++++++++++++++++++ .../anchor/tests/fixtures/mpl_bubblegum.so | Bin 0 -> 1329808 bytes .../tests/fixtures/spl_account_compression.so | Bin 0 -> 2349040 bytes .../cutils/anchor/tests/fixtures/spl_noop.so | Bin 0 -> 41056 bytes 12 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 compression/cnft-vault/anchor/tests/fixtures/README.md create mode 100644 compression/cnft-vault/anchor/tests/fixtures/mpl_bubblegum.so create mode 100644 compression/cnft-vault/anchor/tests/fixtures/spl_account_compression.so create mode 100644 compression/cnft-vault/anchor/tests/fixtures/spl_noop.so create mode 100644 compression/cutils/anchor/tests/fixtures/README.md create mode 100644 compression/cutils/anchor/tests/fixtures/mpl_bubblegum.so create mode 100644 compression/cutils/anchor/tests/fixtures/spl_account_compression.so create mode 100644 compression/cutils/anchor/tests/fixtures/spl_noop.so diff --git a/compression/cnft-vault/anchor/Anchor.toml b/compression/cnft-vault/anchor/Anchor.toml index b3f3533c..cf08cac8 100644 --- a/compression/cnft-vault/anchor/Anchor.toml +++ b/compression/cnft-vault/anchor/Anchor.toml @@ -15,4 +15,4 @@ cluster = "devnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/Cargo.toml b/compression/cnft-vault/anchor/programs/cnft-vault/Cargo.toml index 24763e19..ec88be26 100644 --- a/compression/cnft-vault/anchor/programs/cnft-vault/Cargo.toml +++ b/compression/cnft-vault/anchor/programs/cnft-vault/Cargo.toml @@ -25,7 +25,18 @@ anchor-lang = "1.0.0" # which is incompatible with Anchor 1.0's solana 3.x types. CPI calls are built manually # using raw invoke_signed() with hardcoded program IDs and discriminators. borsh = "1" -ahash = "=0.8.7" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.0" +solana-account = "3.0.0" +solana-native-token = "3.0.0" +solana-signer = "3.0.0" +solana-message = "3.0.0" +solana-keccak-hasher = "3.0.0" diff --git a/compression/cnft-vault/anchor/tests/fixtures/README.md b/compression/cnft-vault/anchor/tests/fixtures/README.md new file mode 100644 index 00000000..6e1ab7d3 --- /dev/null +++ b/compression/cnft-vault/anchor/tests/fixtures/README.md @@ -0,0 +1,24 @@ +# Test fixtures โ€” mainnet program binaries + +These `.so` files are the compiled on-chain programs the cNFT-burn test CPIs +into, dumped from Solana **mainnet-beta** so [LiteSVM](https://github.com/LiteSVM/litesvm) +can load them locally (LiteSVM only bundles System/Token/Token-2022/ATA). They +are the real programs โ€” not modified โ€” so accounts they create/verify behave +exactly as on mainnet. + +| File | Program | Program ID | Source | Dumped (UTC) | Slot | +|------|---------|------------|--------|--------------|------| +| `mpl_bubblegum.so` | Metaplex Bubblegum (cNFTs) | `BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY` | mainnet-beta | 2026-06-05 | 424532091 | +| `spl_account_compression.so` | SPL Account Compression | `cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK` | mainnet-beta | 2026-06-05 | 424532091 | +| `spl_noop.so` | SPL Noop (log wrapper) | `noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV` | mainnet-beta | 2026-06-05 | 424532091 | + +## Refreshing + +These are point-in-time snapshots. To re-dump (e.g. after an upstream program +upgrade), update the date/slot above and run: + +```bash +solana program dump BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY mpl_bubblegum.so -u https://api.mainnet-beta.solana.com +solana program dump cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK spl_account_compression.so -u https://api.mainnet-beta.solana.com +solana program dump noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV spl_noop.so -u https://api.mainnet-beta.solana.com +``` diff --git a/compression/cnft-vault/anchor/tests/fixtures/mpl_bubblegum.so b/compression/cnft-vault/anchor/tests/fixtures/mpl_bubblegum.so new file mode 100644 index 0000000000000000000000000000000000000000..3b573de0bfe31fac52f561db9709b4c30cf766d0 GIT binary patch literal 1329808 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%0Ao62o3`e+;n)8NbASg?^NI5b4pr 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 fTPjJRa-T}fU+ z+|BsQiD4fq$sXb!#&0KvJ*gx&5%)9x3S!uwO7cqL0meU{xXkb0OgzZ=Hm7HN7x4(= zU*PnNe--g4;}fT6{9fWQ#=nqwg7L2=9%uZEh|8?M*El`nUrgN2_}3CoG5$*8PR8Ft zJk9v4h`Shnt6`o0)ITaoGuz3Suy! zdaB>jTl^5>)$aUtR3_ z{o>%0`^Ag-QahXb$H9l(Kkok6Da(hi1IzvO?hhSjy!%68=j2=kt5;b^&G;7L5n|Xi zImd>$ll2Na=XP1n(PKR9n#>Ov7XN~U#qy|KEAm3~>?Qd4OlKF%Uty%FGvV4v5S2nsvKkBUH@2vc)oD}4AP4O|xjdsek zd<8%1%;Wmq8szT8EJDiTflDs`M-jEsX&K*W*i_nP@$P@gdfATlQvPqicZ&CfKT_wX zyi!P1UL_k(q>rII*&*s>-W#5EKu<+K#*P_FSlSEnSEZcIKrd#K=)Z)a=Np~(+rm50 z@rr(~A@$D6e6;8X9k+yG_-=jwX|{L3(ho!QQ<5(0fZT-P=i2*DABHY99MgNJrYiHC z*aln*L)sg}_oT?B@Zbx8g_+h*r0Y2AfZT?m%MmZ%HTs8;kd7OT9>tS%G`29WKJ>i! zUa|if9^Q)Ql1+S{`-%Pg)K}r*7oANv@?u~qj-@wkuoMPgi0AUJ@$ccpa39!^pXdI4 zppW;7V;Z~^=QmLeB6r~T{i?5}CFT2x`CQ~xpZocDu^u0!zf#IkmQRJDZ?O+*J+#YT zzAro|ujVLEfJ%5gQcT zN-P<%_)W7@ehz7~Fs*FQA@3LTSJuD>p9lAO^&^rUO{edD@{jx)&iAGK`8<7`pPz#q z`@Me6lFc>KD`;HvR+PEPST_bqiG-$Qc~_T1}v zXb#^~f9>a`++n0_-^uo({C-YDvxvtIiOG6VPnF3PtJm!qLGw?1B0x zm44SYeX4p=rBK?A!212re=ldyH5v7}gA23Y>J^z!oK5nEDT{ol&>=g z@5F?07`n;my#LcIX6rV2;{7An&*>b>bGU>0llyV=ebeAu^xIO-d>%iYLp}MvIOVIB zTgz|!r~N4IAJBUAevg+U%H6$|?RcK?`TViNT+f=Gq+C~__oMvHe$e#QLz0|Iyw^*Z zgI?EmUzX>giv2SBo=R-A_jA}EqjXxHa2)$qW4Ry}vc3=Xm343*ZZGUnn8Usrec$AE z9`>V;^;}=x^f>fPgIutGqt8vABrlzsPyI)J+13TfWA$TJUeU|MzVEq4?E9Wah*{s! zpZh+(Kfrk3chy7e`=0xWVGm^8AMtZLy_AjET{Y~k;$~?pj`wy3*KYrlS zT^7H6i%PG^>1|3a^a=8z{Sz6s$$2kGSNkK9WbBVD@;jcN(?YNEy6dtlHJMUcwxHzw zDNRq~@cYY!Aawzb9hl+CnSn9if#UEjHVO1b{Q?QXLa z=S!0A&<*-kEf>onh0vb6^QG9Yu>QiFk=yyao$|i+8(#k*oxg|N2HwYfV9QM$kCyF) zbM>=+?I!JKVZ8Fq+;1A&d+vVIuY5W0H$4;U@CK!Sr~TY_3CFcwCU@#Q$cXh{(o=&L zW>>Jje-!oj5d>2Io0!*_DM5}3=V|C0Dc48m{*{uY=X%`F<57KY_Gt$azOa8~h5BvT zzAt_Q;uYd0;#J}^#F+n<{f@-zjIR-6emkws5^u6xuK$q#d><^~L2SG3W1yv~0A21x#_5Q-j4NGS@88$q8 z=A%ZxeZR>2<$d=FbL8jqA;U?<=w%-}(^+RaM+{59kIy@q zzl?a)=o;i>Zq}YF|Bc^X-czffm-^KNe1B}@i`O^Lx$<<=`Dvs_yV6IynDzc3@|XN) z3-8x-lTRnEtGv?78cv>r)@mkIA3e_Y#!fJJFDYn zpLb2?+AJMy*U#2-Lr>AZoq)e3KQ~lfl%MMj@0T={xUOIl<3~B)+w@Q|UmJDfao>;U z{(`@~NBsrx-{kx8t}?#F{dkACA8&FU<)2xzFjT=OKUX=ef=@oLF8hZ;pLAP##eC^J zf%gY|e~hfZGdlO{=KJxWr`_)$-!VO$`x~IAbAJQ$biN-CdOF{aw`ua@^C#k8U_PO@ z-Ol)Yh|Kdd9{kOo!hSr}<3+vw%fe@sFZoZ#9j*5L1GqLQ-W!z8p&k!+Kpy2>5-Vq= zgZ|>V67tP+Qj7EbDrd58cEjXku7z~mkHzt5)&coE*FDX;zP^~A_PdJygSRU_rm5q+ z)W;Pc2UhvLc3jGJYRdTJ@_FFWE3AK3toQM{@02Cq_2;Cf$MSaZ(Z7-XQ*+~%ZhlVc zgyCYkqmu5Eos)XSU+F%qG34*msD%eE{WF}CD*8!OqVyBjt^N4Ef~L}+qCIiGa`7IN z*YA_gI*{HX*L7(BbLz?b9D#lg?mtbVp9A_`<)tj2*tK(?eQ1&MDcbMX=dvFR?dTed zwsUK3-nJL-@4BNG?-ly>-TK~MzPFR_$#<5d{xaGX?eCW*YS*6Iji5L#7?daReU6)( z#oo{A`v>ve?M<)7dxi8rCh?(F-`4j*S1iwvK4*Cc?w$*<*Q+`9iU6yrJKfdbRvi z4l-X&=+7Q#y2e*OIQjy=!J z{U)j}isOy1?9l!%+P{nktsTel#$zZiyMIxyx}I14YxR?$d|Ixrb)J06_>K7megEuv z@@cfsD)OOx9|S#~pXBrAQfakL4_f^M#B06$OxL-`d(Zj%uRhUKT50&s`Rezy)-UVR z&%4{cMKUJ8rqZV@oxI=kDe#l?6xrmm;i8`Xl;r!VoHwwn<)eK_=b$IGTz7t;FpjTb z-BrFGLTe}Q=QNdm!SZ*ma|YJy_~-qa56S!bozM1YzXt2P@_r50Ma6ziJZAv?ne6DQ zl~?(pGuy+-TN?PR^|@HnT#6kOweS|j?*-QH{*FC6Qi;62% zI+jrng3C(Rv1GVS@a!Hc1ABf3`I!?SKW*>Yj^(^cdoFU$aH@e$<#zEscu(^=(JS|7 zmf#02+If{DmFwX(4i4lM&8K=A)V{71^3x`EV55LF-9Hikj)w9%(JK?oPpgIbI>r`a z=qc%s5D${x?eGZk2JP}F@up$r>)i9Tp4#lWV#%tk_wn&K`qM@EU8s{AEwASH2VS6h z<&4#TdUC>MzPh3P zmucn?{j3AcgO7*ECh<1mM%Vt?ho*7a9jDCxxdtM9K=*njkX zgM73s^t*2SUinw#b_V0lY;p|!PoD1{wn-()Psg2VNkc0-Ozw{k+aTjH{&L8k`z4}3 zXm00d=2Qb-ZPf}uniqB zO;1Fm6rK;e9oJ!85BhM0#!9;4r_sN%y%?W{%b$nmp8h)wmckX7|8@HC0{~t_ zcDfhgeWn|>y%<>XV{{La?lP@4`MxL<L4a2&~3mCIypUwwL_A zOc-T&0sOyAGHSR6{DLbDhs&-)c)4m%dB1lW@t4bo3{Mdol=ul^Q4khCZrJ;a_5JJg z80Qxxdu5@2NdDLG2*bWX`9pr`3GhSfu`JlvXZU?VeIrUG&!re;36C&zdGz}7`zyV_ z*eu0ZGrc};?fLKw{Xtvdr%GqR56zd>cRCM#^?@DIe*-@?zEl2JdF_($g6lCRxgKNh z+3PX1AFkioC3C&{Ybv20)K1j*3qN;bzHT8sF>8E&vVG*M1^Q=V{(4m|@GJHwf2yo{ zf6ell)>bWy{mBnlapQe?G7beD=MmF6$Xz-I`O4R+fd4~toCjvR8LGjrHFOI7$Dxz( zXAZG{Hgp_(Pp>H3hl}UjYy0tWNl{K#3v#0Mq%COI&R;XR$qqp-yq$Wx&L;a&&Y1y( zM+Xt|JaIX{&ak$N-;wl(uF$V*JA*uGzxJhyIgTybvGesq|3>GxqW`9B`OEiT{0#D& zEZKMSbLUFL%VzJT-$}eg+)8|gxQ*E7>&wJ7#?yuA3-Je6d{pb$ptTev``UfY2$Q-YI-~xQh9f!^!KdpEFebpH|M{ zq^F_3RH{o)>p|0VzQ5V{4*m`&|6t`A;y#yQ-c#c9(8I}BjBg@$Mkn#a{ls4)Mtd1f zHi!oq|3%^v;&tL0G1mVM&#c*V?WgJ=mEjJ1u%odzMY5ub>{; zukm<4XRoQWY4Q2^i|u$Xa?GVFf)@O7_)C!gaw_yO=eu7mFf9=uYxFZ^#<2M>J~;yU=079|Jc&0aR0;hmQ73GKub$WSSRC? zHmhG9UnzaQ4*qJRJJ)!zZTGp>XLZ|md_GUkVKJ=lpFLk+j&%0@1bivl7nwE_`vU&x z`)AMBQ(sptd$yjh#rg{ymhR$7K9~9$ljlV{qw{_~UR8bl3$o5k^Q#)Gcpv!{f19t* zN>7a#f0|0q(d<5rb?q%^SO4PIwL|{Sx2`>%r~Y|{*0pCdW$^83uWv_xBn)XQmUb?+ zsrn#%-Rs-Ye+olrCo#RRd3`(jabc)ivz6y-@K(dVj#~Ai=^@dxriUJ|=%=v0y=46J zc@UkaS`@t@{#fvJ_!X9rtX~3->)WwDqj7yZ^i00K9s0%fZaRnZM7=lzy_lXtJ?87& z!M}W+JLE3fORl5v`DEpfnHg?@5-9jeH`rmuVtv)7xRc}V{5lK;Ja!W{Is&O4WtuDT0!@}71feSK4y>%eoN z)AEGlF9G&)T`Ldem&SD?uwz*->`j=vA--?&I}bhEu)dDvO^-wGG}znA@Ev`w`OtY% zEnmLQ9dZ+@x7zpebH!+1lNIB8s9wwXX=2)|cn;Q1#*Z`pYT{91KgVN?82p#<8S!gL zzf4TKnoJSnzGNA%5$`4a2Jx$i+0Lr4H?lsA@i#M`@?Iss<2hhAF@BKru-`HsC4L3t z2Z(PZo*?EqD#-{j?3%0>Cw@8Udx%lbvhK;S+jC!EDeKRyoyvYigw&62r_vKW_I&%r z>J829d&7E)Zi|-rK(y!L{G^Di^b6Q;*xF*_`Fx$nt=4bYzU4YgAc)Uaf7%}r^D668 zs2`+#iHOJkho|rP(DA6s@2<;q^d$0ry#?o3_l|rN*SBmIzH?f>Bmc=d7>qlzqg}?g zY%BCzN_&;^UcT%g+C#Hs+t#`7)LckD_jckv@)nh=p!h3aT#>re7(EoQgoMmw|@Tp&tIO;zkB~g#}mS$Z^*r=Q+4y{%P-dXhiQ|W zv^E8~dI9;uc|y9K3hOhvt$g21{k;#!`j>O{_g2N<+f@3r&2#uYcXB=t+vUoawccdi zG4U$#AhDnSGeGR;|MV04`9D3xe*O>mCw_F3J2~%w@h!xi#I3~b#BGL){pI?8?wH7< zwl80QzHq0`)1Kh_<%ajqC(nPP@;nE5ewgcx8t1Q1fo~mWj4xs*5Kb~gTAhxKTnTCFWb6xp_lnTd*93F`&H$9rgNt|I|zDt z*UG0Klb@{j2fe5X&4={I&Q2HVP5K3+pc8&sek0$;BYlx?;%5ZC@=w#98v~uZr!Bmp z-$4F)Kg`$R$94MemzU%x{;9L_A^IbJ-_qq$l!v)b@Nn`hvm--Q>~kAVN`~vl``$0> zy9?j(b@chV`6+z2zP{#{@qH<$m7nF1ePMO^oIPhg#gA}Sy5dg;oz#bw=QiXgJ6N|) zUh6>^>wfZ->zo_pX?`8))#s1%q)wk6TRZ1>EndIFb&)D>Wy#VJhTiY=ex|RJFSdu3 zx_MXC8$~_w5^E2buaNnE6&I01^f!hR>|aPZfA0Gnyq`RrV4sAnAF}qF@56w-9Zq~7 z#sK574@24?@!R>ml40MEA?vsei@(9*PfL0Ak4o~8$&cu1(qnzF?}HFOgT)ui|B%fS zU_DInx#_=oEiL*nBdRx!11~;^Q1!*|d({5|eHc!B!t`nGe-S~DpX@ua=S?M^?{o^d z_`Qibz0^s)^dWg)zw>1|GGM6sNlRxqd7*`&`Y8)5$yEpsB^G8g<5o^tzhhyjf-jYL zE*tnF=hPa#@B5Peui;|8R35xPnEN%B`5x?`oaaLfJ1Bf6_Va=UiD3uDk3;O|1;H-* zJ#yloWqirxUi!tvEyS>kA_v59^q?I|Ev5L<^9)%&nfSZJe=xPJil@^DAL$@kD4^x|*_ z_K7?^2fcZ?1Ls*5%cFAZ`v;28ZT_sIeZ%B&t`mIX{)2R`i`e%Wz)nBeK7*w?y`lZx zqQBoI=ve5$9t;|w0sQv3`F^B%Wf)RzqR67`5-pzdm2W!x4@!l8slXZT!Ea_&vS8&(1_vvRue(~LGX4<}=as8gG z12+8h?|<23I(6&#-o$l$EN9p+6I1e2JEZn9^y|N3ugVsb!o6yhC0^{GRGr)>fO&GY zV`i^u*F;a@d;jL{e*vGPosWJbKG%MsXb73_GX6wA(mt-=6F!!eulI8Op76O{u=lgW zewh&0_uKz`{-@In1EWx>9F?}!vf@z;L;%ZBAg=PlN3J^}6Q z@Fdsm^>W?bG4MhAr7F?Vzq9x9`(IEW8sDk;5_WWHer}h4k-eNu}<^3308}vjrV%g5u?YTbo^-sJH)z?W3RsW;$OZp2|A4BmT(k^1G+w=PY zhT^@X?Tp7dKH1MrJi+wZh*>X5+3OALJ>~mh#z?PH4tZDk z{^z?NW)=DAFKc$>d=|9V5buYXV*F0VPY_>CJWi~$CHnpdv96X>JV<;E@c=O<>a(r= z#J4cMhxk^*jrYUQzMlZ!8`gPC^R@9L{SoQEf_v_lRKIpmzb4SHzV6!ZN3I{wUif|( zv`@DKZWq)~Ulz{ysp6GiI*a;sJ?!(q+7GdQ2h3S%QI)gOpMbn*x~A{_p8H{shrDUL zzM^)^^!>w#S398XA)Z5Z51y;pw0h2&bg9tFfq=-%Kbw) z*Gl%?Gv4h~C-DcFpLSyOBjntD;0xX>vk5u)C%ac>4e5Qu@0Ef63{Ux9nK9;Tz#63X z(_pvYNRQ)?9cZs%KlWuux_iG3?@9YLy|I&Y{rBOy{A=m$KL9N08=Zvu3lH3l@V?hs znDs)BUYQBT-_G};*FwBkW`yytXZ#@Xox}sgm{`qv`-$Ji_#WW% z-YY}9bqsuu^TRNUrD(^vf9YR?-I{$mc1!F-SvVWVC*;fFt+ZQWCp5mnZb3}MAAtIG zd(vRH?vR(|x9I(ZS;&jpxwGsR?M*rhdDHl_>=uUYaUWc?TeN4=eUphR}cRH*x=m%r7&(m0=sh5r(4-Cm2pKoMt%2aF$_>;W)zu zhG!TqF+^KbK$Dv-3I1?dR`{ z99lVLADG2wM<)NbP)R;X+{yT#CWbwzBs{-@>kx*M(~K`O{a+;R=KCKfZfE>25qA>f zybiZ_m1No9XZ$Y{_YnUIaX;~|5)Tk#pQzi#O7iQBpJ4oN5Kj?fU5oqYE6EDuXBq#S z#5LmIB3>Z=ZQ?V;zeBu4{JX@<#J@+pLj3#0tHjuEB<-L04;a5rjQvNV7l=R0_)X$J zBrX~ME6E=bw-95$l8&D>qLO@+a=32svQChAni%IZ6y^S-BKPOo-(>n`UbPea#M9b7 z=qFBjPM_+Z@yA8~oS^=x!H;+T^HP4o(#vL$zjK|Na;B~w`aZo+$ea4TJ=P9=-(+U( zIq*KbxKA&hn*zO>($AG0g5453ZhWaEQ{*T3*xGDIOsP&Z~v*B z2dDZ^{kc8lbF=W-?Nz={4|*=&rw2Xg`}9-}^;bzgZ+ua#k7WMjFZFp*?mln*g>u7l zl{=ZIw&&5`m$VR%nckOmWW)=^QyZFo?!TTUUSj+#@iK9Zc!hX@c$N4J@fz_GaS!WZ znRtMBg?Ny7m3V}Bjd+xJop_9RgLs^HlX#uqA1Cf-`~>j^0UoL!CGM(_d!lozE z=&x^s{)ztjvf4_ixTm4?f>7 zO5Eo2gH@~Ob3PY&)#tv>>goIG$>->&9|Yf{pMC)NyncGLgAo1nXwSKy9`-Bu)3;lC z-cE8qJ>>ktetPi1=e68F6X(Gm1HW`0sx1G<^LaY?T==TvuRfhTm7nZ;u>9nHdbF>@ zlQ=gk>&3dL^ceV{^JO-EtAbCtpB{YFc>UB<_tU@8?Dpa0P7AY+*F`&CmUNzqpZ>3I zDEjHq-k<~o!(Z*!fIm!f~e=hx>TSE@!$@3U)=b?~_;9n<@B zsF%KWq!Z`kech0D{^ghNgB-DP$9<4~<+=fMZ{Uza5v_p>Oye$v;W z`#H5K&tYzs_$BGL$a+!hpBzr0KXX4k%AxaFn(h&X7xu%WeY&1^z2E4ENBt^4M8$|+ zNBy7Q4-a|C{qT^dzF~P;-#-C)d-{HO_}8-pb|gCreV@(L>G>TfXQ;lN`e_>SSEU__ z_xjw$_*TZd{wfjQ!FbG{gzD|Ym_G^C+lVoL5~`j*%%6nnTNyvW^j!ar6Tg}9W5frE zM~NRG9wEj#J8}*W@%@Y+ASPdue&Pd+?;*aAxSJUB5aO>U=6Ux?C-FYgw-aOCv-qot z`xxIw%=+LtVxjs5#$!GxMEimHqEP)d#$!GyRC|dr-xR9%5TCJeUx@dnFA(3&_!=?f zK<15rFX&H4I|~0~{&eVv@D2B;m!N;2vOm3r^aIu&RsU$a4*UMO{OQmKxj&uuC;HQ& zPjY`c?azI;TmG|N+Mno8--P_#=l=8!;yX#dPJ9>f8u8nRSAoy#PpADk2EIpo1M_wc ze>&vqo7w)%J{|jWUVl36kM!%y!ubaKbGKE8_|s{BgzlX7=MK>2{&dJowBNiZD?hIj z@}}{f`d#s(YfsGY(^b2q-?^|q-SzwV?T_{YcI|l7>~@%k{RzilcS6h^{0F^(UoZ>nxzN_^k#3)^ee?F-v0&kxKJw%4lL7q-``+m~sU-|fo;v5!y2 ziQT@85xafqCwBYNL+s<3Zr~d1OE?9)lD=tBYWH0JWa@|NxRq1=qwpu^^GhPi;!o!J z0!Pc1ezvt8VQ(kGy3mE>8BpCbJ= z#7m_A66sq>-^6(6!%A{3@iOT*Nk7ZCIiZ2I4j1t;GGr9mMOz&n6xtehKjg@pFjBiC;>*N&GFu6U4iSTgb2H5>GS! zWyEca|5jq?%S!Tc;xgk~iJ@OB@jj?_#y^ko(8rZzH*qK9w-G~sSCSivyBL2NamnPn zlDvYroAH+u!#-4!J;XhX-%bpBQb}$i?q~cJ#IQe=GJx)x_hBe-Uw+_4gX5XZ(wa+Zq2_;wi>o zN!-c!TZpF_e-&{T<8L*reoXzNk~FiOj9LD~Pf6TE++w(>=bFu*3IA2`x!IR_GfQ@! zOpC7Xp+71;)o8PE%+w|{e?K`4>tz4n{dBc_DwBgF+Pg$7Fz@BD@U`In0e5!EYwXEj{ z9nYJQby~z&4^+&T+S%Ms4nE|5a`(r=&iQ(<+;8vx&~eMBtaqY65_ZnliOIfh#`CJAO`rO-f^jCh} z=hKqU@qAk7j}XtNEu;Piue5q-JfF4&@$r1x60woXd9QXu(dlbdFz8qcSNykF2? zSpy$@9^B{EkBIpwOZt89)33<*zKQeV4E>xRpQn%W^SrllaR=Vhaod{d6|}d*TkG~0 z&w?Lup5Yky<>&6Cv*2f(XK3a;gM|9ie5oAke0!&a`T4ZmU);-mtVgka+5H0Bx4^-g z-+zJc3>}{~J2W)Mb=n=^&(O&!KIi)B4&-}iZUT0z1Nk1B!}ru*`*|sMem*VA@8{X+ zdJ|<)){Al^n6;SK6iY# z#4nP6iytsDp_jutGV}!e^#_VYCn7(TH|@PH7j?K ze#Pi#@%*IbM(m2@cdgD2*?L5_XVv$A)^YCh&0h1r3+LIM=(2R1O4nLR!_Z4C{iqKg zguhMYS|y~9ey%Xo5$SY3%I}L0|KiWHh5VlHJlpK(n#osqhR(AMPx~C(736nFTf4M> zsYR`ium2p|Wu|xa+39`F=h!YWo$j;K8NAhSpDHQ&MSUgnrKYdoE_e#(*sfaoDfO%R zGZ$5_c66IOhj@-H^jL`J*q%YY-iZxZVdy5yN7ey-)GYI~x5<<25cH7i=X4I`k#onO z-?%R~_uGPR(Qi8oIrDk^bPn}&;qz;eKd(nWufy%}{h~+BZr^L!w)0cU@~5t2(eMbv zKKiMLdH+Oul5)-S*ED_QcbNU4mFFS(+vclTFJTUPUE95;8>-khqwlGv^>f9-9QMg5 zoxU25WB-iStLckt<)Qr2In-Cy!Tq?sut#AI`)l-lliPXNkA`#TSl;yby47EUUDic_ z^3&&mOX=2*nq(zHVkMrwfd_(N}ulk8$4`iJ* zvG2c{CH8YGMu~m@)flnwzXJdA{m;vchkf?-Gx`22$ZKK$73qEdRTr`EziKD;{a2mD zzW-{F*!N#`6Qds><0)d_e^n;-{Z|u)-QK73Xs2=>pFK}$hqhk~!F4X;{ioY6-D(5}F5PAE+qbCnik#l2)M}rR5AC1GuuaaZ zr5=!WBuU2p$obE!z0%T2%NCsDyjtX^@w{4m=d^rB{*&`+w_5_)))wPOHq#2e%%k43 zy$oreQu?3V?ka!m{Ms9|6=}Ix4k^TQ6q7H-euecH=8W9#A?=j%Yro;6dahmEFNOKj z{M_2Iy>PDcWS%cwh^EpDE&iLi-}FgYZ>Ra!kzw&3fbFtgIrbCT&$?geM0CC(=kg9p z|E{0q-IjU}2sQOzaB<1?(+`m$?^jweo zxjag5dVB}ckL#i?xSws==8eQ}Kz+MHyhOZ8e1;hF-?DFmc%AVzV$5%+RrJH9d@Psi zKjc5(&(;DyRXH9>S`8QFzkVLa_p|vqxxe}<<@f(j-kU&2c2#Gi)fiz}2|*rY6dXW z7X+{vf<%}EAt1;k2oOOaC=7|RGKt~+etYll+xK3TT2{Ah2><_T_3ESV%xCX?_St8= ztyYfmSr<%{9y-2+Rp>t*H;q2(DZg+Add|ju#eA2;>F)Dsf2U(xzQ;PiC$Wbt-*YV6 zOgP(*ddRq{^$>di@uWV=PoIB=wJyYyesA>^*Xqmn{OkEC=V=jN?F!Ae)`NT{o#nd^ z<;Qjh$JzM(*ZUYQO3dsMRc7)F`F%w@pP+bZU~7Fjj|jPrp1co=d1LZED8`3F*+W{r z%%Q>On=5i+`T4t`!Pu+mzh?ga{%E~jXDG1dXn{r2-VAKt!RYvb88%G2>&=gq$E z8rE7ZKONtmce{*l$6%M0?#F&h@@}gnl%MPio8ED|q#?s|1!Itxa1P<=dTrFr$NgTO z?-yJl`sCmg_HUB!=bdkKiSOn4_w&Zq(f-Lbb4yd8Q^4;}%DrjQ2kYu`kC?dA@=MoC z*9qJn@cS|H4w}XDecj|<9`tl_FAsV;*>8ZJPWBt1r;~em(9_AiyiJoIUq6xk1=bUK z+s7GS50Q0#hEs2!!1wc1kL!Mc>+Q3I&MIH>PxMf;mB0O+Rq*k}dB~%jo3-&K$aB9q z{@w=m3DWERDrf%AYFKMT`|`Yx#rfz%y`QS*>(lwE-Id-yc)sEp6GOX)^=ielz$(Ar z(*1*D<3=Z!&)(Cvzn@yED<>!Q-u`}S(l5U8O?^MLV)-WTr;Zv<%hQnL`%v$v9{jrA z!x~2Yjt!aHd)jyKeyZpvQ8{8KuA_hPUO_|V9}O=)5$y~wRxKxX`a$hInN07VM(ddI z`IJIG?1LWc&x8jpS|;TCf#Ds%J}*%DPk!h%H#c`+z&a z|I(Gt_hFNh(v{~ip9=B0#G}N{_i(1)cfo$t*IcfPk0JKuA} z&i6KA=X*P`^Sy)E`QAzFeD5N5zV{G2-}{K2@BP5P4!(!9zoIta-cuf9dPDWDs9~EQ zs~fg}Ug0%}x0{}cx(AGIQPU9Ii#-25mVZO$-)ubgciY38K#wp-m-riI z3fiGqf2Gq=@sRbG@=T7Sc7*pn*30`A#{V4Kaf118&*v+aPw4^_==%e1_qROesYdvy z++*zy53;_R=K2S7K@chr7Bc^^S}CH7bUE^*1r?_oIF=jR^666!7MO%|^9iN=t3 zB{1$yA^cSFZx;EI`}^jv@p2Y#)9RBRhdV9ahWTqe?GbXW)v&J5{Oz|m=`jB_^B23; zTsaqE_0V`1??3ll5+!r$M`vgKoQV1Nea2eOTb5*Pow4^9&tWZh@DTv#M%O-;}GzOr$;@)5l@eLgd?6F^$15iJ?bIvHj&=o zli1tD;AdjDgWri=54lLrr?#0qBBk_8bzFbnDac|!z~`?)7W)NKKgP#CfYhHD`vm^}Q;@~FzuYTj_$bS(5@TP&&#MMm zzPH7Be~`sGz0Yq0zMC!dW_qmC3%!Z4PA~K(#yY*wo4CUA*N9(DyiWWo;tk?g5^oaU zPMk6R23fqj;`5szTV{AO!$aa$;$h+(@hgbih+j_JPW&?B4r1H~kau2*1BQ1I-%8v= zTq5ox9wHt#{TF0^m$*XwJH(^JFCiW$elhU`@gQ-P*x&z~BOYM*Jn@T&7l>a-yhQv0 z;$`BSiC2gZ5w8;8M7&0Pka(TApLm1#`NW&VzfGJWe{UpiB>pYpX5!x@ZY3@f=ZJ40 zZX@m^ZYRE;xP$n4#GS;w#9hSK5%&;ZOWa3%4RJs5)x-mAUk~x9@!!V{c}I%!fPEb4 z?~MOai?8F1{^T4U)2*1le?P{*DwKr&b zGu+|?=+He5w=fEKtYWUOce~vd<%i&ZkaBxA<>}A~wrdjOkDTkZ{ua~k>Gg6z{q~6a z*>9YrJblO77c~77+~T^qQTH0$!YbU!6}W>KU!%cg;QW%gex5jdBKyVJpx5FY=_F*U z9?!m|J*f8Vi+)M$-6_VGPP(G&h}q5!^%1_9o|XB6VL4w*|9<+n!+)?1ZaHUeIzP3q z{aka}U+wCh&p~frN9X)wTmHJvnqH^W?@IZ)r0!E%J7%C?w7oa~vdokHoO7)T`Izaj z_JjuzU-h_D@4@IY;NDZjLw?}_$YByrxx9Y>`K092(o^2TqdmxfW*G5iyMU{m=EnIS zs>}cBp8wE8=g)q-Yd&a(>0_&3dtLiZsVl#o^y2sv&QKrCLO;d% z+*wzC2g`rB{Hju)Kiu>O>gs=@{a^<^_nvZ#Wf<CemGNY)RuKY!tAGCvo+CI902vEEbAUo<#O{fTi#<0(mk?56oE&S|{thGAVVs9tua z_~0k@qWP!m0lh^%J?Q!w`Z&Fgpn6a9tFQ0OmiB_it8G^lz2Lqm2|+et)xVPjYW0z84$M6T$EJ zdylXq-(wQdvgg@m0r@$-@M_pq;kDeK zyvd@)`;YOvlsDxpAnbu%7hVs$E-EkEygj@g`_EB%9k`eKmBkgqr52=*iYs=HuheqB z)lZBuLH6H>p}SzHik@?E6+7#J+FUPVDBw~MQ7QIr&`1`dI05^0}NrxtEjA(xA zG5K7^`dI05^10l}aPqm_MNB@Idx**BGS(x~ zn0zje5|hv6abohhJV8u8m#f6&b9s)Kd@j!e>)?<01;_Y*tc2Z){TL&VPaVPfZdh1mH%O6+_eCw9J15If(i#Lo9Q zV(0rjvGaX_*!jLh?0jD)HuhyoAY&%n3ml$7zT`PRpFuk1IZmI!dhHTc2m+S*r{B%5>$ED|MIxk7rOXp#}Uajh-`Q!A z{d$%3hRk7WPc*g!KKuHvuTyhhR_Cpfoz+2{S10#F|IO0t{<_uE)7_!D%X-tDIdjwX z?&rMV1xpfM8-P4=f23v4_qWCGVf?lRnMbfbTAtP?Jlco!e77R<^5@W=hRju3E#u?m z;vVAue7ZhLr^TaItlj@KI^GJbbo=U4jx#^ET$L|AKf%03=Ygt;f;{Kvf^&l9-VNkI z@Rs>`p7Zk>%G2{2%GW5rM)`nTNxudEQ}LFx-X)~ddcJ$V&dX7;hKx<0ek${+qcU{u zG{2O6E8|a^-t9Zg6PM%+O?b3}{A@S3A@c-lP_o`RYW_E#@iL=_oL5Ku+Bp4hHGkJj zVU2osdII75e%HcP{`J?80ru}bTrb|rzm`3(wg|Dlsnau>|D_V|;mFgy|BJ}ei%gzi zM>J&KtK`ZYti9gocPRg3()}*OQU2eFZzuj9@omK4G<@hd@-Vc6JRC837)Cxk@7j?0 z3#-RZW1ZlwCn?v>JGA2k){a)TqZw|Mv8^}7G_cyjtPv@Tg+-_y6~zu*3; z$;lr*gq$cpJ|Z=FG}e=HJIL2LCSProubjCJnE`9R+BKt3hmEHmI!^p(UwZu!deP6P z$vGlR@8{BzePE1pzF!xgosJ0kk7XAanH=#6;^UE&|gRxMt-Uz`1&vgfO6C#UTBLtFZHC+frc`+UsbS$j0> zc^zLLjy-?5^=nkDAp<)rdFRykM|}Us&;6l2$$n8Y=$Q5WBG?JiKARwfQ#pnw`$g4< z7|)Jp&v))HE?x&Kr*|BL5)Jb$|5x&-Hg;ZAm!OeodvZ^(Qb^?f$VkJk;jzToQ(EqkyYwtbz4 z{VzVxR5AL7JeM!u!vc=iV=!Jt`Bm_N>j+WzvSI&zjoWp;4j}gm5ue|=jOT|_sJG6K zmsIZjT>Pn=hn68P>HhNdI{vA=s=iRkQ@WSV*8RJ$8(rjnBKzY%5qtmqSK=zee?UCJ zbp`FM!gsbiSr=;qJ>qpS$YU68JVV z%A(xMwD>w+Zav?>g!=Kkv)s3g<83|P-0ekeJ0Q+)x()FQ z2-kk{m2~~4+bvx4`IO}Y9H*~!usrz7{XO6;{A0cx?KJ!ctDo-kRas8&cP`}$yKW*=~(&4op3s-); zU+GW=j_Gi;5ACME#=BOsit|6(&v3-k@XuI2^zQ~A;{0X?5WgGYy6$;Lx;`^QaeXe4 za-uSDoc`!A%Y(nH>j86JRNMcn>H1Ao5S|4cq5`n2BcUHi{Af%3QO56t+s*oNzgOkx zhw1uGk0V|aTy4*)gv&i|^N;B?GhtZ2*Qf?&>_1zDzxdsl_OH&tU+OoLE^lhV{1>r2 zF8UDI*ZZ~ohquIEviM=G4fzRwhSKF6T`~WtjCi7N<9L!)QqQCF@K?{Y|J1VihsRbS zhm*8lj;#=PLQan@6L%0V5w{x-nm!A+_~&rDKLfY$X>;YhBr7K;r~ z#GfGUC+2zg=|19*F}#QP&kP6IkHQ^WLip4$!n2F;&wqse?ezas;tKJHiF3p}A3xPf z{6U5{6MulXk$8c4oEYyZi+&+~Kf@u%LH2#b(1Stty@rD_-es0|iJ9&_j0e3QWZzAk zVfZ}pg!PZ)9Rt`4$vXyf44+{91>$ky72Cf{?n$i@`#q^OV!tP~PVD!jHi-S6)F$z$ z*VpuYko9{~jl_OWs+rjDNwpH+#q>F1zbDm3d zJ*ht8+nK(f*zZXV5c@r;A!5HLHB3Cr^c7;iCpAj!_oT*&{hrhWvEP%b68k-=Ibxo_ zkMEiJJ*fqT53&4p%8TEN+939OQJchmFDgU+`Msz{V!s#FOgzB+TZ#Q%RF2s1MYR$8 zy{LBLo0-0Y*zZMk65qt|E@HnI)kECR@IGR{7u8Sf_o4=f{a(}%@ozExFtOi@su26V zs8M3S7d1}Y$Mh4#elMy@?DwMPi2YvFJh9)4S|Ij&QA@ZTVVL-JU+wyUe&Vciy(`8RkF{__@8I|b;ieh#`i~q zZmi4bIHx~vP_2Jpd7D>pm`@zUq`Y`m1Y zwEncd`U_{VFJHPo2aIi+Omcr}hx_%uKYFJn+x=cs5#?;ZPlI)(@PzNvoZ!8zu^jB$ zNzD7it_S@N_Mx38dG9DHuNc4M`!oB|?&Mw;zB3TtKjAvXZuj8)osRAI-oAkPo-kcb z@LpCK^GM&PjMu5+ds&=cpCo;Drpp4_(JT{6`GsPi>Th?ttQo!ioTa~O;P3k-bbseb z(&+^6W0f&4@^#I4e?GpC)nV-jPxe0681zs~ucuo!nWR1UpgkwszjzKUn#4G`y`SBE zl5{%3ds$;#KjJ+szn3NY*z{+jzc7A>=iod?`kaKWv!vH0bR9i?9^t(g37!I-bUkY8 zy{uK!%kjOevfs;Eh5TfBFKd$LclmCcd_QYLb4=%}^U|N>{j7|(Ynttleo%iuOEq&i z13jbbFY}k^xs*nXZ^trl4>G+(mg+tj;dr0Czl4qz9)#XkIw73nz(`#>utCnvU>pml zm!aQg(C@<8dBbtOd`BV9*WYovqAp*agNxH$QCA;-SLEutbU2on3Aw%+r@y)`z3ZjD zb?G^7#p(9erQ{VI+|rEGJ*6()nZR=X1N3>gdT20X@zedZB7&XP zA1dhSeVO)4)BCPfOCJr+(VaI}?KAB$kL3PSRr{Z>5ASmSDXq^M))6Bh)Lt zm&1By-OgtHW4pJ)_#L!EM~S(PF*Qz%bq;OkknO`@-lABR*reT9&lCI9_@AcleBC-A=8ao>!^g2Va+az)B}AuU;Ob zL9EY5gZ)P5M?;R3E+;BSy3Su;-w(APf8T!n5$@Z!UXb3mM|+d~K+++W(;mv5&(Cti zE~jn8E~o9piJW5J{`hjLbjCS3%=Z*uZ2ZA|OX>2g^!Zr6QyL9!m+z%IId%E|fYd0g zEkhsryFmV4H}&a#Ds1u#xi6O_s13MFY<9Fey0j{>*5H)bzD^qSh@o^ znjEltMEQQWg;u!y?y;=*o1X7|%#$oZct@MLzW*2Akt1F)I)^+*8|9aYr6bBO^852X z@5_Ua$-Wu*oY--YgYa}15b<}%MtYE67JLs!`iQ~zaHO9Yd=Ezkh%vq>KlLZ$fwi+C z^A^L8yj`qkegN%`$1%1e-XCN;<8h31sH^ApcGS0XD;>05+B9!hY2;t5UH(3HY2=@Y zVTYAQzE2GMwKVcQV%TS;k?#`29x09Be7mfJntf0j`6q@?5U&%D5`UX`nD`%w2Z+B# z+(-OP;x6KUAnqXk25}ql*NIz+*N7X5|DJf$KPSdKp)~RtV$3T`BcCRQ{azYbCayBS zPZ5t3f0DRD{0ZVA;*S&e6Mu}jhxpHkJBdF^+)lhioFiT&ZYKT+afbL$i8n~E4->Bu ze~5U6_=Cht#2+A@Cte_~5~6-f5Pw{;`b2u5x<+bpLm{l zfLOJG>VrnZ;m8nikI6$gGECe>Tp{ix9wqJ|9w%-mo*-@mer?ro_?kJmcQ=}wwu6@J zos*o!U*!0scG@TQ$^3H`<4;ihy4jmic@_Ciq5eVk3&had0qsdyFExGZ=X~UyH{x~1 z$GGJ8!{uB7!#5cY{hRDdLqGd_jPec^<2Ta|hJN>V_FV7EJ6H&>H5kdG+Oc|`o~HSMz+_LHh`A43s}R4D;lsq- zH|F;!g8Z8pKFaU~;wte3@dPpVrEBxVZ)W%$G54{#{u1OT8NR@9?tAn5UqSv48NSSL z?vvNnh~L8SRbuX|^E*jF{;dpOXE^uaYZ%{y{M#75$#Cq~%RBYf|APD2$u7xgCFN{yv}f?>TAt zaumaU8h+_sEeQADG^x#N#7oDCKRY*>C)U?H;=ID+`~1Vt83tFg-cp|a73|egP>zzo z&)22LE1j>U*Nc}pzyE4U&$VEj32PW%{JT!)@3U+(7oGCB%=z+XIzLUXbj^vsw&%2O z===Cv^9iRho-JO6e4ar1hx{IB*wAVL(RFac2FXZ%(RFY`e>eR)jK86rvq3mqy|0&( zKO^qz$+&28Am`m6FL#YAdA8JhTQe~kQ2cwevE=p8gY z8*Z`7+^D+~F29EsO>%r5Y=eIu<8e5W1D|}|{Mv+$8sPiZ_3xC&{MnEA$^O)RsK39n z7o1pr{(Xk+`<$;kNqUq)ho%s2aTx9G9)epKfLrc2*WXL^b>_&|H+-G(QKQSPYzO;M zp%3_JCrTgMU*!%<7fsUM=e^|Zbi4T^>2`wqd1dHLxgUUf__=UjCmMks+Ub0O%Tvg4 zr(Uk)yPc@FuQxrTUcR1<@Uy8m51k!Qm;0gq{g)`~`=Y4#@%BY^yglB&sE(V*d$$tn*?3b!<3un5l{yMHb{z4hoc#qZZ5r#kEal+@pVHN$;-wW7v z{JA%gUuo8Z@p$0xMDFyCR!Z(Ioy)hUJ5)E``TLlB-*cz;JKZkawcaVcZsqeHO*n)8 z8>bKI>Tx;8-D~UG?c<2o|Ju5A`Px^(Tpae1fIrQ79Q&N$r;<9q1uQ0{17JZN@$ zL*_?jC&c@zm!KY{(wJ4SWzYMqKbH3942QRx6Wi_KKI(%)7wnCFBFOTK3Y>56Lw@po zQ-oiD^znQ<=rE7-o(ij6`-K+R@)#^whqv}wcsPyu`FZ==412r=+g*@(#I2o-hjMP* z_n)SB!dtuOkNVuW58pe9`(Mz5@EO$q#>@W2()qlhAp;!Vigx*YC299kUAsB2i`&h4 z?mjC<=rV`+x3S#^o@W8^{@*G6hEF>Gn6At}0Nu`e>hp|$3B7*XaCj@rnRa^pHR&~g z@~53%Uo`)OUPB0v>Ge6%3+Ker`fo`0>4cy4_t38w``y>Ev;53(GYTf!QzKgIder{NY3IPbgCogdXVppmmNhr0`|8V^n)8On?e1Ri5mYl z_P1Ho`^GClN4KXMGQc7AZ|M5}W~A430j+@E=TNsr?)K|XvHrrR!i}B|NfcadBV zYX16@_Yh$Rg3XzTdQI11Ko{tXu#@yKV1)P+edC%f*prsncjFmc^Pyb0v*FW zq^Ezc6T`%=-&-nOnP>gyten!7PbQuxZX;em`>xCx4u2i=iMp%s7x~a%)I9+_vubX1 z7W|WXzZ>;_Ea`9s!gr;^*!T|lv40J>TSm$Ee^yYB6Qn~l*lO`hk0U(>2Z%|J!69PO zV{jPxKQ3qGMuQb#dmT&Y&@>8Mv0%adz*W>M+Qv_OH#V%0E+;Ar%`V1LH%5=_mu>8m7v|5=` zBkEgfKt)O!v@d8XTKu4R1KhDb)T_G(ZlMb<&rwH{9l(Pe=W3u&kk6aH@7DzRCliA{ zfuE;~_iHfD$@~lP_&w%ie5CyNIvw9Xi`VJ+J@O#?L+G)oA)`l-{Q)uLR_q31$gQtG z%6%@-&%YNl)kVC<_^ZUL#1q6ThE*S`Wchd->qm~q$#-nWnXaGh>>(Z?ULqbMt`ZLu zHxpNg=L`qgG2(gR*Ag!fj~Y&o^AoD~vl##N{dASXXb|IfI$lQNrNJyLC><=O3Ji0=qQ_gQbuF8JVgm%RCDe8CQKJKU8 zI$-g`=>@CDjr*|Ax!pcpLilAE|5_gNABNNIbo=zfb?-Wz()P1$pVrs+Z~hOpPrHmR z$9r$y+gX3U?jPkGc49ZcUQOQBpD;c||BZHdeSJS*?cDy3kJ>|O?>^jje9k^E+2@gS zn`n0ydQQF*M@)V9DA@Hl57=q>D*fy2`n|%*N5igPtJ_cVe*A#kERgf@)-UBAh`9}! z3i{Pgq5UO0x4U!uf8|kXfAbD{>`m7GR?`Ra-EVUnGW}?Otr7mSt)Ne8eqifGoCmmG z3ul%sUc4T&)B4W=%Rc!o3-{Z4Pr2Fx8Z!S6%D<3yz?F>8d5)g$5mCvs$Qz&f!)YJU z-`5$;^h&6PG-PG|2xjp>h-_03-#{?{U0$Mu0TFJ(czMMI&dGM%vy`IoZipW^$49`Pyays;U@dx2Hf5E^+4|(*Zm-mJFSz( za=JtMXoqvbi)UN0ndIKZP3F$@jYGcyp*eUK);lr<8ZU1a0?aG`wnB{qrgY6|0hxZ zo#-LOZJ`H>KaRfr)8o_OlAZMJm#sa)*q7jzSJBR<6}ZJ^xZRL%pI<};^pCV0RM^i} z9wBMZ~Ndvy)tT-n);``0I4!reUXXw?m99N}2e$LnAFt+&^UTiOZv)pv^Y7nK(v=Vi#b($nOJ z-|2clw zd8cS>)6y$F+P|in0zY3Tk?;Rlc$&`j`vpG!{F2%;Q*9PMtmVvY$h^-oOzs1EyIp?_ zu^rGaNxMhQKWX$r+59*EBa---E$4;0D6bD4dj0T%8%}W>*tevoif@B|A#8q$AM=Zw_FU|ZdYw9 z_ojy~SI)bW4v-UlbMcoqIwd`#TpRUa}8^eO&o&obf&C2Hm43^5G7|4=-RjoG<8i zYec-PkBIZ?OE0@vMo`&jIg|TF1;|zDOsq5b{%`5bHp?(7K>ousbHwZy@%_^wtB=3) zsd`Rp;OpwqGg%+LFA%?PaF))p#ct|ux4MO-Pt@H;4E{vjIbiM^`aVoFiF0i7e&~kg zqx94q)8mhhbLsb0TZI6Au1)Rh-XH2Y^LeYk&if?`(VJM`ippK+U$qIi@p}u?LofVbgzKeQ z+OnW^RQ?w_6Tg)6uc&p{{9inQiIj%xFKVrrt62H(`+8|PS~Ge#qP}tgafP5Z^^ z{XEDiZ#Dm&zkB>`+m8I+0RD$p7);JT2p_eG zm|lYQ7c~tVJxV$1r>1sd>Zhg-;x@+b1pRV3;x^z5C|7p!EAOe3!zYM44XeJ=p5^EEVttl{-cHW@L7w~`m)!F;y7>Bo z>rX#-=;!DBJ$9cb%ecgPv|ByoJOgnD@ehd6AN?F;T8}o`_=a&p>#Oo5=iMz`I$l-B z?V5=T#&t;-PFJiPIfrhp>i^r{Ao{g72mh%m-21Ul7+nm#dPnY!dR};{$1@_j)&Xq+NM5~ zSL}z|J%D!lzR0e2?Ox?<%C3c+CU!04G_h+tk^h-Ft9az+!ehI($HIRW?b`8O?Ajl0 zs$Dy7^-t_tOpKy(8`{l%m*gJeD*WSnh%3aDGoI%S_ZqpR-!57BPs*+h2Hl>`SvkAg zvtPD~$+-xNAI}rw^AYGLu5bK%8gBo)9`*M)ll4y5r_jqMW1k+q2;Xl|lj+5+uSNat zhn!!}b4|g(sQJ4-thZNVz5a0RRO-R-Ao%9?M{IYU2LJF9xUMe~J9Pwl-RD6w?3V|a zpXg21k5O!=_8a|w;&$pq)H_#iZP$)=Y762edgp~`*Tb|^6Z^E;+FQ!eK5J?vZnFX- z>a{SJBW|?tFt$%Kz_EP_J7v3l3i&%}`;_+Lc02W1*8Yg^CHwnSvAudH=(W2YNc;2% z?Nxr4xO9Z{$YP(rbcFQq_eqYB9)3Rh4YZeCzjUDd#GYh799%H_CFJ?_kn-UGl`-hFr5$8v}(h)RXL*^pLf$tArk`rGUM|^+yVzi?apF^RYI!HTpl6Go& z3H0QCx$J`iyPeAK&B!`+ot+B$1X;IJR~SBldd2qIIP&Wrg-iR?&qewBxUzmu`)-Ko z+pXP+o!UX{c4{ZF+o@fkQ*5X95WAg<{+;Z1Kp!M}bBOUz)=q^SC3Y(KoY<+b=My^> z{U)(f(XSFa75y@?Q_(Nw+%4(S$98WTPTQX+YNu9?Yp3Qc-*BeQT(uwXoK!n?6#iVV z38x{C?nc~?@OSD?#9m#gvqwi$_Ndyq>viGpYf0Iwmz$Vp{5v6jZYE6!U1v(~vp@UG zYF8{-J6iVKZW%;_n|RNlwqpKKzLD~mF?aD8$~pBk`R+^|y)t_K=m^4HZ!5jdm2Vy0 zQW~~^^gLiq$C-RH@}EThFZTV_koicvv5wPf@pSymNszpwfci`!o{oc8*PVaT`e;2g zz1HLBq#ohaEhsOG_d>#{gTxy@)||qr8;J4VNH}#hG2SZ)`QDSS6NP6CSp~u~(Z2Ak z3h?Q$17u$j>AU;k@*ca~n>Xy|UJng|4{3h&)U{_#zmGU$+1q-o(qG$`6EAI_j@t)g zem>hGD!sJ*a;|e*zfk(8&tWVnzSWXhekHjVt?A{T&>Q@T1}P7N;G2d^74)8*$xFhY z4Z|w8Tlde`%|G2v<&&>}%KMU#JEuo#-e~exO6vD4+2=pr_cg214lVcLp39wnV$!eV zoTl^NTv=BjUL_`7d>ouwGdj!p5r(f5FA;ALFB?{R-D>;C>oHb-1=%6PqLHh5f_j8Ze^Bd^zy?g#I+y4ru&~KtFz7w8&j|u%N%AQMoGH3ld5dm;VjxApg` zjvLaSt`R!v`2uy7j_+!cv$8_Q!t4Lzu+s2V4`z<}IXLw{_q~VhG1ce)=H*8suG^~r zm;U_g&(ipx`)>G7x#wf$s{iA@`k!A{|G#~~)V)$~)Ms$}dljm$Wjx=|xM{kW+^6(^ zzm8AS8Vl>$6~(i_i?W}sKW)e3e@@2vTd7xabfrG}^ZBydC-J;l2Qm4D+^3D_SEuYV z$TS*P&~fzh{0?&ec9Z)B>Q}t47QGzxi(X^J$KNqNSbK@-%R_#DZ5r>> zM1`EuF`W4=3y->6foHD+E;buJlt=ogz;xY=Uqrm))w{Ywz3;Vp&#~TBjtdyq!i$A4 z@(T~5{=3mPUXO_PY5ofJA4Y!;UrT<`j@&K3(nY?ng7*hY7h!%U`wY+@7qwZ%#k{*R|V$!29VK}@yXB7!Y zN&iErS5&B=p5FfWUi8~g&+cKQKS(;9fpojA7cbt%{F{c5|6bsPzWiRxO5jMY{6cZ`luG{2s(Vx@I`B-x^h1Wgm4Fa(xB{(#Y=>oUv*2_jd-v(>H)QpNR80 z9da7qL!Mf=_QQ`k7&reUbB&TD*0XOv-&*R z=OcGJmni!YDA(VO+Go{D?wLImI9@kC$@7`Jm%qgF7yet?zuiuP9k|_2f<3t1PJ&&y z-A;mi8186qF0h|M@5(qu%>I{${gv38u)D%i&KTnJtmK^^_WSt#kQLsNlC=mPLF z{=UIByLz*(UK@4wqP-B?)oT`>?r&?_kF)4U+TZkdJiD-dUBv9bRDY^!f15#iJ-4R% z!R57O3CU zc5dB!6JZzPMHo)y{Kx@Q{0$kr&wa4=e_J_+@;^2=to=I5&GY+$wO=Ft9>Xsq{-(Ky zd>wC!^^wYq*V&iKZ>7go|0eW5Izjt#9PSC~x6tQ>{tnusu4n#t*K_IA;a&v9uP*!ul}8$_&kxzmkz%2i{Iyo&kymtrbD#r_54XsFZ&CyZ?4E04xh>Ltd~o@x?yicFRqi%{{q^&F8PApA@jPF!{=$plMn1of z*Et?Qe|$3a$`Qni*9~^aFY@_!oX@+EkJIsF?>)3pkB(I^KjXU$(by<4_2}3*^k`eo zDk}3_V(Kr>_vM{9^H1(e_&)rbQO}dTC(%8G{4NB2l68SUfPNZ;K8xSQjO|qDvG8f6 zE9t3v#`xstT?Ol}bT;WQ*k$FF&gOVB*h5S@4E7lg&(2vo`A!}1>7awygTUmwoX0dA zJ;kD@zC-&8(8KS2UxDyl`QP1%{LW&2u^jvk=rIO;AC?9zLU<y{_#EFH(w~m>yUNcPzT+O-1x@(AZ#aW|wx3J70DR$kWjNen z1%(yJ)rsCCC|yW;b>lnlr3*=~?q$%6=W)UdbI70a6N>KDUsPPMc*#1v^Ys@{zwRo+ z^K+p02=yxU(r)XJ(c}cu%|QO-Ju>2D@PYhE^bg)Gmit+V_wr7wXS_apg7dD@T~3!# z%cpcV=u$ci`3djJA>Ru1?0~^cGEZ|leBb6t(b$mXBlpPQc2`ipn@Ep+NFSg3+Cd*K z4kKPTTSfby3Y@&}_xG5W9b&z1&RK-g3sCRv>$3PROi;%6V}km3HVUJ(w<~Zbd48tG z_T-0PFV{e)AU|k07`ui3Xm1dIuL}~G377YP7FDebEl3$$83(6{X5%Ayas+{n~B#A2iYd#4dT;?H;EgGGt56j z480=XL4>}TqF&^8Y32LjjK9wC6_&q7+-l)L7VGKZ6!dTT0!jtv)9%5gA?<1aL`hMnDB_1H2ARZ#7-9EL-_Kq@qnBf)T zis58kew5hP<;RJK8GnN5hlrPm2Z-lcUO#b_;eEu*#65=7>qix_OLto@R=Y-~$~J#G zEN=rJoWiGHn8)qB zemRVJKs;|4BF6Y4-(Lgf_~z?t{yhkvPbB;K6LtBG*X1`_mmla9uZOanB)^5a{O0TO zo2$#OYB*W1Y~E1CsOL`9?u^D-4J%#SzskW${g1Oxpz{@9|E%X+5=kAkp2+bCruHSC!olEDZ z*E^9uzE?ZdYWXGWohV<{aj4f&KR+K9zKr9KfA{GMwp-|{^p59a5T}f09@(0Y?jvos?M z_!^BtUxa-*t4G)iI>h_f7n!%%P1LJsR_b2hw^7fF*xsuVe^>jldlhUitOue zyB+xn%P+ix^w^7dyV8U6Klz?C=-~5JcJ0Jo`~dQQ`G92{+llpZ#(8SUb+}l5#b1Ak zz1W5J-{p364>9GVyAS2vowIcDem?mj-?y^xSbpPq;CfdV%HtXS-8_Lq5Fi@Kl$GLII+|H z`1X<7D;MuS_g$LlsUMx4O`ik2xbHKj9lkO!vNwGW@I4pa_I!&*83guiTdzp8|;m_9NhR^_JcN0I9Pj&@#RqdT=b{f8w^MJ zvxr|${PVB|e7^8$m8-a(-(fvJY<5{v zPkhfdspmT_Jj#1L@lJY_-?^UsJJjtiMcB7d_X;rY z<3@!g!;iKeP4l;2A8JdEr#Dr8{r*-uJ@jO|$)D<7=+h3v@@|9CE#P-gHC*ZK_rB8o zT<0;-L!6uHm+*9aJNJ>&3#Lyw&+&DBmG5_mZGMp7Gf(vAuNuE(9R&2{JqXtiI**d# z9*ozie?sR8RIh#|^?f9rXXsF=_15ykBmGuS#lQSDp<7ck=<4?^o7XJdtSI_T#{9_;cm;!N5x%3PyOltnGm-F&Yw}Z9Y zjZTSPy3KH+mtI2bdg*53o%K@B4tnWd|5^2UAN5iX+!K^5*QXEvT--BE56O3Zt)C_H z_+e{La{hma81~zVoLg$HYp?V1FRi_;Y;QB%cwD%|>a)oC&n3dI3xrqt{)YebPv4i* z{nktcA?n}4`NZOW_$^ZZo_`^*%f$l%RWL8T&cri*hd!K5^t7gkzsD`cl&+8IPs_RV z04n5iuX59ylArLJE{of$Mi_sZ!tcSWe$n3|=e>(LgPA9E!Yw^+ul=!zYe$(UTt$D{ zA;I0iA&%Q-qPx+Ku<{2J`pv!Nx?$kiPV_VX-q0+@iKy5JJ7yN+i0qRQLvCeV1M)jN!1T++{lu{6 z!`X4-d4|KDjrje5aJItmD#JPM7CFzE<@j4fKauYnS-Ybm=Q;ddTvX&dXSUh$DfLZS z`&xv*Dks6qRJ)11a6cq!$Qcf+&DO4{0rC}A(e9|Bli_H0)Byb(R?)7gp@-pUchmsA z7*;`-sG*wztQ zV*Y;KIBLOtz<52dWt!ojPt@{<#ORl$)BnhD&?1lG%g@KH?ei4MV>~~kJSOK!Adl!4 zVoyLGx7Z~z-|~B^+Rt-R-tq1US7qFhcj30#%Q){1`fGaaM{XA-b`9w5dPLSox8<{@ z<7G_}%TMRe6V$_eOj7yps36C}*dGKR#~Am2ZqE5jA&MeSIDoHB(-X_bf0=?y%HYnB40YqZOD9g6Y}xs*Ry?xdg?9H@Ms6?(aw5&+3Io9^LpBo z$vpm($mfLT@i;ddl(CK)@Vk^z(~$8aq8$0v!-QAfr9eKtSci>@Rl}u*^HF|rj`$ae=ZViF zULZb~c!~H)#LL84;uYd^h*ycxj;OdstfR7wcg1yLJYXFaH;6Hzh>DxUXEA=p^h2rP zOyWjjOthk6Gco52#a3bw6!}HP9Ptx~+lYUGxSja%#2v&xPuxk2?@~m?F5)JJ_Yiab zQtTrJ|Ds|)F$N&%C&Z6q`XOSS5NdsgiDiOexI&D1o1AYaR;knYd<^Pf28KXI1juMnR@yhnE%8v|9_+zm#&QYPaN}~ zIOacb%zxsT|HLu>iDUi~$NVRb`A_WpAAr1G>HHrecK#0&JO3-h&i_$j=l?jd^M3-k z6Z|h-3BH%E0>4YoGO}m3PDq*j>l_Zp^*sY*nw87^nF@^rNlw zGNqHY^XBi#xK+dct*ob+oJV}$)!$dXPcxTacqaN+_!Qvyyns|%s+OETfw;=NtH7VQ$VqZDQZ@wF_g;x2|n6fTl@|Bj4ew+6ta+kAsneYP0+ta{glVLPB^`ZeqX?TPdEd;CGSsKd^rb;@O+N(&^|e@ zZ#a2>p`Cb?>1g-I=OZu=k?-L$yo>Q6XQEe#A%~(@h#{wPevlY)EbHJN-}n(^|A)sX zewW85{$t`L;&&1+6TgFah4}5ntHj5M*NEqc*NKl3ZxG*4yh%JuoH6?#$j%Tq5>FF1 z6W54aiKmEj#8u)p;y)s8Cw?1o2k~2pJBi;y+(rC{#6855#C^nXChjMmARZuo6Y&u7 z8;OUB?<1}dzkzs^_+H|1;(LfEh>s9giN}fOi2s0ip7{5P7l?n4c!~J+#LL95BVHjM zBVHwbE%6%hDDgV+-NYNjuOZ$fK1`f3`46&p5jPUwN!(0)2XQO$2yu?MLfl6DYT|a{ zR}ps*zmm9<_;%th;s|(d0P;Fk20l6jTn>Tn9|j&AX8H={`xS;4&k^M#Kl#oa{a+4$ zsCn@pr~k{~&wUut3-rGY{xF{Wv_;Wm!b!+-I$YbTyycn9$k zaVPOIaToClG1evGdus7JF>`G1A2I$s@!NGJN_>PkM?6m4MvQxg;Z!^E?=!rE`1goA ziC<6LMf^JA9^x_LKH}FB_Y;p24-nr?JVg8&;$h;$#1-PZh)0R7Hi%!&@J-^E z5ob)EgY0d@jl==5>%&`#T_2W+bBsSk+(!ITV%LYiOYHg(_bx?WF#byz-bMUk!@<}f z-104O2M6Fzz6fs93*i=D0Jj_Ky+Pp+aQ-H9!~3b12Jud9I7huS){pR`)Jx^fI=!@E zc<~tYl)l%yQgP}Z4-vndc$oNQ z#1-P(h)0P7;&I|zi6@9l#8qOhL)7Mo`F=@lp7?hee}VXSh?j_8LcC1O_f2Xm#Dff9 zCBB7tjd*}~o%lt>8^kXp-XwkjG4)mcW@75A{2^lMtNcyG)K~d~#MD>$eq!pY{PT&a zukyc5OnsHVk(l}_|69b=SNY#09>DmTFA@(C-#|P}jCGr^Rw3rQF11nO=P~{`aWC-% z@pZ&K#Mct{5np3C7`z(pSP#Qjp(pZP#4E&|#LL7T#7o5OhIPHqe>%?%F91q^4@T#~ zm+pgM=k{H%%!T#0cp2jBd^>YH{?>e2`0mZ(6%3bhxaDf|=}Y%wJ=67n&D z;X>pW`ghE(<9^S5l7al9>)?j>aUI9+cX8n@x(?~J{yB}GZzMf3a0{E@`~CeUN8!yH zOZYZrj=lTZuj_x)#8Q9xtj>c*U-8m*+}NV@=r_6P-E%h1OVwJD-(FvTYQs8Qd>=nY z?CVdh#3;wVKNuctGmm(G>)xau!n%x~2l4Z8e%>ssby)eOOL9n0xrm;D^u3Qg%jBRT zvlruYZNTau&a|Q42M{kl-%2?S=h`hiK8JV!^-tmfhcmf{%%}I1BFfz%eM9DX2yZ2S z?@a3RQ0+vH<>suMMJTm^uBGND1D}rjV?nlPd4@|B!Uy`NHI0)i;pO z3DafF+7&dt7H)AA?d`6>Eeyjg55b)rfSd0(H}rj4J@_WS^!F(rs@^dj_M@Fi{XfI{ zgAP#vr}I=}%9RP9L=P22CG;>)(Oto(DY&b8yR5bHgdt z!`Gklp=h|49{ z=T2Cjcu%ismwS4Xm_Nup3+u;GehvM33i>VC4}cw1|6a=C9O))vwhacJ5PX#JWiVc=i*NIu62dk984^D#cW$VUtb3cjlXoHvM`IoIZ>E2{#{++|Z5~dX zGn^iGbo`Zdp>6)yN5J`obbRbXY`;&|F6}t({qVYRty$YUi}v~W7S2E)X?vd_5#;;` zo1#xr%-r=NHuFcljf%N0oZ;;kM&i zv^Q?Q>uaamwRQE~&-xyyOGi7S_mt_I;YuSUNK`_NBh9J2o9@8QLA--G@dH8moiUi4SFC%>urms)b_ z$a#@Y3oo^tPuxZPi^M&|=Xp5OpG(}w@F#hEhG#vT_#EP4;#OkJXG<+lbjgqSWH&MIgte7C$f2%J_a>1bU>@;^#%$ znLh+y_{scqR;2CAF};bI;6{WW&M_S81*OBz|2E`z*!e$-^oO1QSWhS&cK$CjzVjdJ z3#G%(|8b^w{$stNbhwq}uQ2@+i6|N^S?su{2wQF{;v`{|Et8#{|xKr{GVXB^S_zl&i?`8 znE%Aif2_Zh4mfpFcYb3&SlaLW#{93e-}%jX z=6>gQC(Cz!cM&_kdx)LieZaWnV9@9v=Wp5g&Z;YUuYvH{|oKJZrn3()8REWv{!YDEMUl=DQ{|ghuw&kL474p}GbgMJ%@Jf!XKakZx}fxp_zZQqymt=fde_kCEskD(UGkyJz%z}g`9DX#OQ^2eja%v=_;}|OUv-wOTS>FDWilW5vF7u$d`|J| z)}PEd#doFX_OozKu|xQfKBxFg#vjakRUR%n!E=hXPFYi~;{KSQQ+)2XWq#`Gdt9e% z$Xsjk7fsID_z@n1{p|O+wx18gxps$@D$+^r`#82)^ z5>vnCmw{t_w`4f2UzSAAh4&!7?_-2}QGQa+Ci3CA*Ql@od=|^;Uau=>4R{vylY0ZE zpF)2Zs@O@4`pLY681<8PqzwDHzNotoxX=$bKY;jCpqH$#6N8?z&O!`&%Xw^K@Wam~ z`uhc{N3WA6N7;6(cQn|Bel&&t6qWnUPHcG$#ud3=PkBUqIZtHi7BS4*I|iQ+z1d$??a4Lg(6c{e)el1;(=^XMcAfD!XlhF(QaXqFnzmf0x zA$}J1()h31lHaDupVH|o>H5vIvb{<8F>P-*{Nr+_DwbaQg~iu=-m@j24TN{Y)$l8| zd~fdz=5cCYyfR&{`!TpkV? zr1L*Igmy^&_iH`J5I@Pc3OUKbU-e8^I{nl-`zzu-AYu1uK27jX@~JQ%_-j5NR=PQV zrq-Ab;%T^Q=7{f#C;3b;AI2|Cp#BoSb4$HeEkBjRU(tLDz;Qm)Ugcz)8)20kM@eZzF+HC z25#~4kIpka{G%-7Lgo8c)A<~oLwob6kIL005-xU&`N#Q9%^^SfM+L}-#=j$7@2P%k z*WxvjiTqT)eyH^;z(3A!x{vb3_*W+JBl$CK=k&0}Q+*}>Wc)q5)QkQaZ#7+? znI5DUxjL-%7zB>f-`|7u^jH0NW4iqNyO3VwYDmi;1CGC z@tWukvfOUgzkqfM-4U-${^cPDa$m{n5l$^zxSX#uEbpfflOIy9up|@CL0`snthO`W z1oMF&38$*S)N|qNFyc|KhaA5`jt_Evg!%NFtJn0jJQ-&Vt32pW>@34^`BNQ+-F}ku zf+k-<7U#dEJ;XToE%R?;ocESO2xpXWn=*r`GGz4YI-`pNlC*7Hy3-^loIgY0|gKVap#9U5fc zP5(~DhZ|()>5p~0AnW%yux=M*?_)UD?SkwZh$n2_E6CnUjCH#pdk-U0?w!`lwG?PAm!|)vI2{*{TpZ>!v*YBTnF(1G0kYPSLtCMs7`3IP8i0LMXJDJY! zO*AsyD#K}K(%uZR3-ljgK7K!@gZbb-Mo{+AQDFfIkzZ!tc`ks$jC;tbRKy|xU~`#q;Q))Q`!{YR!-qd(jr`$_t5vVMMVZj<@@ zJ*s)O=i7|G!hGNc*-z1bgZa!kWWOzel*n{CKbI{ywyC@H>pZ!uIkU)zm7}`@O_frsqAiY9GRz zaQ;lblVUiWT4H_R2H8LN{F$HMdt70Dya#u*2j!Q)$M~a+|5@T?V!ubZ%=ElhM>{O& z{=UVR^Leb#GV233$o>WMTVj5GPjiX+@!sBS7wS{|XU6ZNK7$)%KexqSzPrTy{2u56 z^W(k1=`Ms9{sr|b0EfqxQO@M&nIG()AiKw~+B<6UB=^I*tR8-@Y5RH}?inZRvb=8* zugmg2M!cTq=cg82U)wrk7=M?snRt%jjl@-AtV<^M!2BNB3d7qOf0?+Ac!@YijC#v{ z3Nh*}>vzOF@0IN$M!o$z;X&c=%|9r94Q}^W;g-Jwx9RWT`gh*PzGPVJH1chg*!%t8 z61zV68^`P?e@*Oq@2`kmfBq%0>)$UDQ@>}w;PFj9gX{{ik2{|yUS)ZoBldCcFNil8 z{#oJ;;y)+$@%uBx6Ab?}aUA@=_Jr^KU7_hDk!HyZJ z@i@cZPV9D{e+LQnWbz$>D&rqz{2cSUpSXi~me}V5GsK&0-!yR}PH? z_`OlLfBfF4+fjaRG)MjK_eR@@{obhCjpNL}!^aEaPGY||+C}X5Mtg|;-e@1O-y7{G z_IslP#C~sdhY+DD9gqjLX*823kIzlj+4 zNR#!50hT|^aNH|R)=zN1G+94+0ppJ|{>{V_#JG2wte@P(@HzIcgT!sb{lLfO4M&rk zb#~7N?4tYIpq~c+m3C5}rStDY$US{xKSvKcLDnU)4?We%aGa-4p94Sceby13t>aw9 z^^Lfvq;^=u@52OxU$^|sK9hj>K54w4xMAV4Ze)5cx#v1hocW)cfBd~pz9S>{GsBx1 z?siivvD;NS;#J1yJ=ek-%k3h4KhJnw)bF1o?qT>}IA-`~iTfD-|FQQj@R3~Axo^w1 zY%zpb9wS>WY~14q799*4V;fnJps_I#;w58*g_}Us!A=1nK9#poSXiQ zUHb1=?e|`L*Is-7xijrQNgk&CC&**uMe-co{~5W?`thgEwEsAHf&4M@Jo!(^bM*gF zau@AC;_hj`KrS*q$H~id|6%e9`9tJ&GVZ02a~H_}o%SwAeULm&`wx&?_`Z2^j{E?* zmHd8kJNb{uU1Z#YA$s8q{|{;3N&EMb^W;Au_mJnvi}e5dWS6IY&+VCCze}E=f84v_ z^EiRHQHCnMaHi} zc6sVI$z!yC54lYK4e|u}-DH=iew{o;`x&y!Q@=)bd1{(mq5F4{U7mU;+2yJG$u3X5 zgS^i4-A8tL>R#h;{2UR@wlpS`+BrapUhiA;U=WZqAG_Ua1lCmH@K z`R(L2@&tLEOnvrhj^irz*{K&32GnP-w$lD?`fn#wpS_wV-$nZlGWFT3o#Zm@yU5gM zPu2se&z_veLVfn+d>87oC+E7v3~!j>QJ=j!LZ&`@wMZVL`!O>0*{fwT_1TkiX{gVh zoJT`__T(HI>a$lX^nVA#ual|IUY#QsX+KYa$l@ z$fFE@m3%vSjXXkLCsUujnqxhtK6|x=Onvrb-SXA+-%fk#vsd%vSJA$MOnvs`e3fC^ zchR2u?A0DJ_1UYvWa_h5U5=tYd-C1oWejha?y1k7$Whd1PrmC6()}3SQ=dKg4n=+T z3)Mrn=Ls6eS`406WhF@p{ON~Wm-}MsPbP92 zwl$kOP0Fe0xu5lt)1&9!`KPC#=k9tPuIH{9pz(G+_j`1ghBBVXz2~|aO@1fTbFcTB z{21NcVeYg0`pUAePrp}dIc%lxuI3t@w?0PmrEK9O`tAqvVw={VbRS>`{06 zfxioo&nK;C%X=#my+S!-Tk}W4L;O!#5B4PW%}0AI+)aAs2YL|y)23JbH;Dg*%#YB5 zPx4*&Lufja{73T@y(q|=oAsxcPBA}DP0!r-QTjbaa*sRScOY*Ok4{^@Jiv4yUwj|q zsq33VE|mSEXop82&uy+p$4)WdPEzlD6yw9TdglkwFPup4-24Ac^?>IgB<)Z)cgZi+ zJO96su2a-I-+T_jJ*SvIJ8ZlQPgdWYdgiWo?)QlMen`KkT=o%LIcC=vbYIpF(=&hW z*F!(p81Wk{?d4^a<*TV?D~=QxuXjDtLPBsWr<$(cKY2nrSZ4- zUki>7Z*0d&INO|SvRyi&Ll~D6|J&)OOaAFE(X;LZC;qn6Gq0fEi5{;1ZPK5-cf0iJ zCPVop@x2b5_}fk|e6}C;_j1Y!=fmIqc!(Uw^4p{j-enSjoSzNl-eFgZl`@fuG9ZTxJg5d{RB|C8p2yLYL{@^+H?d-t|J!zm+(?$K3zDy&gE)SE)@l#>&s{ z9p7FLe2wwJ{#)O#ThfcP%>O#a_RrpC)_xSI8IA{S@Et<-b6CFaJ5Rm;WLe4NcNR|6cw}w1=P`50z=}jlr#-phZC?0UhyWH0|kvX}oH*~@>G%>H3$nT*+GaxTN2m>`J05bDpJUj7So z4*^!}Sw83>_VVrlKh?5Z z^c#A?i5_@AndRR-NM`wW50hE`-6Ld{e|M40^6wraUxf1QE|c5I6J(Zu_Y|4s-#txc z`FB^yEdTC0ndP78wX^&ay>^y=qSwyyPxRVZ{)t{Y%RkX;XZa_3?XCyD%J;MU6TNoV z17D{-%RkX;XM0cd+FAaIUOUS_(Q9Y%+;!(`Y zf1LGjf9_v(p49Sv&3M_*YyH3I?UCom_+GuO9_|4vwp0)I0NTsua$H7u$-3AQnf3c* z^>FWk`$TVP7v7()zpW$O|I_qv??5_ro%e}WURXy-^r#a3HkhkB(<=>n(9U>%S?a#a z@=4as&Hng7hA-WN>XXLZ81LJf&_6`8kSE<-^^&xwi@Om{5^kc`33GJ^JzU5Wsk?T( zpL(6@4tlsSPu+E)J$1ue-Mtv^HS^RRK99UwD+XxfE+91nVG9Q)2sD$ z`y=xv=jeN$ZSMi6{vjvF-7t?w5uS!)ddo>Tod{pL<5y`oTt7|Y+hg*W=nEqsMiGAv z=W=nMd`CFaL3_Mc?M+{o>uG6tkPqW-xL0?kr<=s5mEpjhrmt@04D&P`$dz*cAmT5> z(KE8~Iktj$&)})yyd`Vzdff8<3CsT$3nvNx&=~yp!Cdqvjdh*X^maYIhjMtogk$=; zqu?Z**dy3a-T#p#*pK3=`Ej$x)Ad1*EaJT~oW405|D(%R{&64UIi9-f%KAS# z5C2lWrl0HYJ-m+kBl)(d>7N0o@h&pnbSK@JWMS?Baj(yK2JcVYADV;vKA8J?WJ&#? z{;ldiK3Dw@VIG?LFVjEF<4J_4<@Sr&^vq)ZqW4v*-fTPxPQ#gCICLlPQ+?hfKM!NR zr0M9jbbwR;bIezm$K8mRmb>Zm_Q5`NzexA=H-vn9K*H7$Al?D{)cq9W2XjqFkGM7ku0nS( zS9hkbI|K97T_@s0b9JYZW;_G))ZG-rgSom>i8!8tdFrlAcQ99X`^_EFow}Q#JD96G z)8CzO|FBQoC;GcI_wj<~-p2*_bN$`8Fk<0HHONUxzgio^dugxlRej!g2Ih&oV@1Xf z=IZWNO9#wTcl~q+bA7+*`4(WFxT_8Gy)f7Co^Ij6JaKnykm12x-CbqwV4k|`r8}4( zf4w-8pT1x9eB%P_6Zf@g)LWV#e+}JBzodGH9^rNz*^u34c4-{wL8-MfIYYN0qWYkN>QA zlAo-z8*4u3Pude$Gf#d=z8>m=|7yFHXR2qLC%c|)2if&(JIStR+eN~ zEtY?&o-Nvi-=8GkHR%40?w&kG&XHZu7W2q3a6Q{Kn^%T`>)EcD`V86%bThGE#lLQ{3p6=`#{kxv-65YF=F62Ww|Bdy9db+c# z^anlNumJsBnGZ9)c!mM>b!#hdU!cBjZ2|Et9AG}p^S#j5mG76}ao5{jhW~(iyR~`x zcfH*?`lsIR4(jdJmiS)R+r{`P-~ZX}U4M6-`HN?&zq`oyy8dpN?(hr)=t;wvo^EHEu$LJ2vFmQd|C7R82*-f4z&g!wehaDItA$Z+sX^?Mg-j%TXhJH_x^zjun^xqk03{oxq~uID>Vb39W$ z-wB52dcG43&-Hxkte>vuTW2_UhJow(mKl!g`IZ?D^?a+-3i3Q?JlF3X zVR)|JJB)a_e(!82+;_Wv?=bzle(x~-Q@{5}JM2fP-#ZF+Jrmi-$N0E@?;yi-{oX-_ zNB!Q)AmX#b^?N6nPk5&Kz5NWw^?Lgm4)uBux59pidc8wnxij8WFU8emo>yzsNd%xp)z`eA0J>W6&U(tV&?0Ufcp2S_8+19UdkN{#$li9|9U(8Fx`3k{t(=CyWX$&L$3F`!1uY{ z?-bwXdcSqr&of-_=Uwl2k@l|lJ3;@h_q#;<_tF0x+4X)`$?v6ok^Wupca8RQv|lH? z-fx-iUGKMt?0Ua0ce&oL%Wbar+e`PZ_q)vSx6}KD92^F&_Y3(t45;^etOxzr%wfd$ zNEdkY5aW+|NEo=@ug^QE_sjci!k|j`JuL4E+51=5`}KbNJ+$|6;Wx-W&bZ!h5%CFJ z?{|#sdcS3|>-|oUry1T9+4X*>$*%WXA-mpho%{~^pCh~8?>zZl+Aok@?{|?rMf)Z4 ze@;!9lLB5;Z zNp`*8F0$+W_K*+IeJ{C8_VLv9etn#N3+-JFcr)4M3fKEBGCbG&9V5HmZ<*|RzZ2v! zhBrlaz29lF>-|>9uJ>Cfzn=c*$gcN0Prifp3uM>(T_hK2zeIMu-(|Av{jQK*?{}5# zdcSLA*ZW;3yWVe(?ceo&TgW4Pe=FJbe%r~e_nRlbhVDDauO@erUGKMx?0UaFXYQTV^{X(T-fukz_mihd@3*R}OtSw_Ub2w3R~91mRYx1IK`_d85`*Za-W-t~SfwEyG}G~eW$JhJQk z*2%8-JIwNSz28By>;3kUUGH~{{4s`KB)i^kKY2U7-!knN=zoOldcSjw--l^GPyP^j zjO=>9OJvvkT_n5S?=so-epku!3~z<(dcSLA*ZW;z{9NyMf%dNV+fR1A-+8)!FT-D_ zz3ctD{4_`V4wj$m{Z7!o>-|>9uJ_wX_pbLlMSIu#T_FD!!=K{&UGKL}d)ND&CcED6 zBH8tRC+OexewS!}h~dwXUGI05?0UaN`ggtGHQHA^f5@))Tc-Q>(7uQK8)TQKT<_QA zDcAe$rF+-=U1s>(>HWGq<$Av^PeJcDoPoY?IO=-7E|?>kI(ecutX>-!eTuJ1cWp5*(>WY_ndAiKWr6xsECr^&AGTOqr?Z=HNM!=EF& zzVAHQ^?et}uJ5}@F4O-K+4X&w$#0?k3i-|CRkG{*u902ecb)9|zB!JkuJ7AIc75Mg zvg`Y{lU?68Pj-FZ4zla}c9LD+w~KrS-+YTUEg<*?E1dLWY_l{A-leB zk?i`uW8_i3zf5+0-wCqo`%aNv-*=kq`o0yi>-*NpuV(mjWY_ndC%eAy0@?L_7s-*}ijIH&3N2MfOKXb!=O8M@))qOUH z&iRjZpUoQ|E#I$m*zcOvuT}jk-50sP;ohI8Nj|m9ci5%Oy+7@;&txsbnqT^b((~=d z;Xa#tB;MKkY<3C9!J5g@n$EL+#QSXS{2TplJ%V-8jjQysGzIe0l4wC$LeQ~KjU_4K#FMhNi z`TY70^N?+qC#x_1f#xmr#Y=e$Z}Yy`hp8`K>O^=at1o^J-;eF?xkSJ8g!Wi0p5dYJr7fpTfQ@y8s2=kcD_q9Jl`r?yC=nL~cn@#%SULQ|ezMLj~ao*$oW2-M- zLcefAeR0YUjr!u->xut2l-H@ALokE>YV$b+kC49jIL0-4%{& ze$Nkn@X+yN)@*a<$Udzt^~JegUFCqciu-t`XH9*G-nWetoAt%>H2;sUFa9Q3w>xe6 z;vw@{_SK2l`Ha;o2h_3z|dZhm)#dY#C}_#V3by?yKSFE5r~ zTtL4QCE=~YJ_&CHe31P!@7;@TH1Bp!kcz~<-tGIsmGu|trfK=bSKv8t<{7rn)aM!g zj9L+&NcOMlPvyxU7H-@(Z~J@Vyg8Tp=jY~p6aD>tU1kwo!+hoY&yjhMg)8!_KHKEH z9sTJ(fBnTf=CE(*Jnv_@pKmwqneKsRf8Q7JzH1r(o8j&phW~(|y+_>ZPg#HQDE2MN zeNae;D&NRY?~hlP&AI;<;a-P$M4frH&Xul5Ih4Ad2!3k8o?&;v=KbO16Y(7FuxGp@ zkLOT3o_(!&7FzHOa`uc4@;$B0uahi?2;Op=%i&KDf0u9fSv2kYiKb8YZR^wb1uN?> zW_=kDeG=pY&ZCL$&6|C+i}8c{Y3{`3$$eLsoA+G22hX(peh=}y;uOno68pE}QSASV zH3A#`4zBk6i#BjC>+H)k(@t)avJKzv#*Ec)`e$xr#(vt z7c61X5!5Ho*XG<1%nugvtf4($vh#VyzQ3s1w7=xMuBsVZISv0{>-Cbi$UMybiGHJ{ zQ}6H6Up&5G9FH%;TnbUUf{^F&tG~Ru<9Yl#&#q+FA^cqaY&_<5{0zFRABx92_-wal z_Iw=eUp2f#f6vL7yhr<&TOPIbdWnw9>i*%bm;By$vg;*Cuk4>jxmTGF0na6?BA?`( zAKGIbQqK3a@{@CxS*|(S7s)M2K86?SdI;vVnvYMH^z9Go=1%#iEMF_enyzCE28uRV=0odz!*eQQ%K0aAKB4^z#Xnxb3+JE9NMNZG;zpm?L?LRK|(HQ!bwiXOr z(Hq30{F-x*x92%hzWP3mm)7%vmdBZSsfzt3ZB4JT^3Rt0eexdfm%{@0rQEBbY&^#= zC+QSD#x*sUd5Jx<;dH8fz;ke_>?ecVCU?uSrEtQCyM zHSU}D{_Tv9S^S%G$hgwJ4hyHPX$AFbpP`g5@+mH$yf&3*BKNSo6S)WVA)BtP%2(rg zpOi;)?o&xS)gbl<6UJHp6)A`8d0nc4jSH*By3W0!Uo9YCvh_;S6Bm}veH<+EiGC{UPW#{ECFG~Z^Jt6qr%h(ioEtEI zaxOgES)T0i_5RQMJMaH0eBZkHi>h^Uj{fJ!E%wxWIMC4lNfKpTnd5smm)EM+uNvZ= z?Z@8#*V>P9pGa-h>Q{5_ZcC89M^C!gAKY#4&6b~)*HMNi<>uu$!E*9)oFaQUPLtDeyyq0ladDe+ ze6y9~68ncmd&WZ4(81s{87V=?Kshj!08QN-f+(9_0e}-$dQ2K3oTDa2Q^f%B%e@*n4 z*wf!`xJ&$Th)ewKZt!z=5YbzWIXEQCdS8jlH=li7L2W{EXtq9-$9o7>bi23EU8j? zEZeWyx&p^h?VoRub7D$I(I2**GidE#UzPhtYM3AF=XuHds@Na0pYl_5gyUcx^3L&H z>3ek~&AzuT@z8u)7IS^?`I1jAmub1kzisDv>QC$UruLGw6ZI|cV?B;^gvmkAEEZm_I$#6jp+YpJNAC-l-n`(#Wd$W&2neGtf5{;v#bY~OU094 z%>GQrTkH2(Zyxdb@SpwthVk!&?c%ie_t&t$|5enJgHw1W>l|7eq#u%cp-r+mhjYQA zgVSc7&P%@w`R8DT<~}c7H*=TcqI>JGPv)gqZ)|J2+TxMzrz_IGsT}@04eJpvIdcm+ zKUqJa+&o^i@btYp^2@&FBp!L;I9N5-`RoQcKUgvIY&=ZP50=f`*Ja}IdAQ4re>xs& zc#ZLWqU?`J<$c#{Lj2P8j?*vimw$+ysQJ<_`S5VpKeG9=zKwjj`+w>@A;cm!vjey-MYZ*w=|qdw)ayr9F^4Qu!0yoU346vcsa2JI?j&=$Bz1 zmH0dl_UZaWKjfC=J5Mhe?&AXG8v0A_;V5DJ+x*=K?K55PK>PH0hn#PZ@RRTcjZ39T zi`W3?8Ku&Mak`#-n{ia?!m|c{m+X9waoW!!g4;w#`ylSoTI+g{yVLA+J8RW_2kb#m|agsdZnDLpO$+vkPks88Tll7 zC*;O?dELxqeUA2XMA+9;HJ!x`>&tV9-+0}g z*>dk_n6K!(LFWti{6E^icAERB)?v@)+_@66n3sC=A^Y=CPxtP8AJS3krTK`t_w{5= zkN%=NbX1V%A=Ll9SNyK|8))MEp;U(b9b@)P*NtCi9Cu^AIUda+9VIh1Ilfc=^!7$oK4i4XwA0^RMjrf*L=~*H_6m&8)jF z^>+~IQ2X!y`Ns9-!3O(pi+%L=cJt8oD6TL6l6aI~b53i8^s~OcEc-~b-VZzq3n$t5 zHqNgt{)|UKX8OZM{;`K=O<5(Bpx*y-FyjrwgXXJkG zk3aKQ(*7FO1DkVuEuZCHcl1v+_EWQ{=kW>V-_5y~ntxyK(eL{DOV)LsRyGzn8|8RV z3S54%uj?Ezl=|Fne?+B0JQKMC6<+I?hMdgrO2c$FY~k+R$@yJrgythOU$=7d{ye&) z2>WFG@cA9a;l_Hq)%mauD4nq_`bbh z@lk%b@<;nN_5Dt(?|G!R)^5)eeLuM0YKPR{8}LWtKCs(lxYP-z&QzNKZt!2%6WOOjEgou+5CMF z-}SToLMP52H}@j#P-0D+c23h@-IZ4ltA|IE(m64CRPcqt# z_YO35*dNhuJbj;??>~$7L7tHP7P4zY`ni4VX9DPfM(l57U4`}t*U$57&N2Kd@;469 zucY^14YJ*!T;iagT()vf=4;gnau4mN$i2o|o;6$dK>wuYQfdzuj#91}U9$4X_Crf@ zpk=l^mgGCWmcvC>zn74n+Oj?4ZT4$4=RVS6`NDBNl@FL-$-I>LmBddh`<=C)0P9Eb zDBI8IinXI`d1?F6cF`E$56buCRGxUJ)e~9IW;=i6>L2EXtbY6Ra4>5mG zkD~L&tQ=%MVE*^+{D9eOeDxRA=tNoM3K6(TC;kL6muN)H# z`889YQTHo#3hVq*n(;#eXIu8?q9ZIX_Ty0<`909|eDm+~p3=en#%)a{dp76ZZO_ty z4w`=h^@QUy&eg3f; z|2Ono4{@A(S7c|12Mx)-I^=6pX!$DR3G(aMn3*@{{)_bh zI_^AGygrCRjKn$1s}KOHsa zIlUh>FXKseUFq5%%O z{gZr8XE|&h$EUVQ$1hqsrkRc@rsD#P3kOio+M2rUkK=CuYkgA5V?Xr*PNja{@*kvr zUTO7H5-PvuT+_cRzj>Z@c<<)A@ z!?pS>dL(4ZtJPuh=6Y`Z5!ZFJp62B}vi@Q2v+>jPdc0*nzKuVx3)o*u?bm$rbNI6U z%3GyN(xdJ*J-17G;_>{Zep~x#nLllchmOO(4i(KpPPj_KyG+89c^<~oT>|nucQ>A% z9?`4b6rPo14eoS4qxr7!`irC4@*Fk?I)C$@yfWwVny+K){@{wl+vTIH&xZ$JUl@?R zk^1v>DOH!Lyw!|sox$(*xJ}}*uH%$;8uHWkS_dP4>wB+m2Wfdp5VpT^Se_d1|GJj0 zkEL?L2>Yqq#nl$)njA1=saKfq#D4xl74^sUdc1ze5G(CoB~4L0gZ@_IBcITu{;)ru zL_Zx>xo?K+1-|cI>J#g$w+pYYD5tIDb*-AKRMrb|J|Z$tJPNY5r@J zo9*@<$$zHz+kY@BUFuqyOsJ$PPP!qeNC>g}q_tM|aY>+!07r~Z!bv`5a{ z)u#5e^I~)0?I|lC?pjORQ*^Au@=^4qt)J0*uq5fSE`fCjspn=s(Ddt?l3e^w)~71m z#}}YJ>3h^)c!9doeA_8CL-QBq?B&+h@-Ozj#(Zvj6g+10QM|VtzfVJvd^q?S^QYyy z{cm1_Rdzdb$~Q;$sD zPyg5QSJXVZuH$z3?rrX~@zn9Fv470Y*W$~NA zIa&ivXb5S(puD|&y*!&asz=ohi;vffsG29EKFB&a8R?hr^JJu3-;>vPaNN!25AqZ3 zB5VFBT_3J#tffv$XQcHzJAPa*?XpzG{Q^D?l&ZLYK+4VXrBwZlmA8}^8TS{+`4eQ^ zZy@`{$hiMN_9Kw7k67;CAXDB5rpdTpLGq1^`xhkt$heXnn}?LD|4d#Xe~r9IM*EfWGL8;tsM1~%{aMuG z^t%M>XR2WBK~kT|xbH{C4e|v2+!G_^L7w9Kr^vVmP1*w)_oPX_lW~ul^ebfCvla(qWZc6h?SqVa z+N6DuaUYtr5ArnMKS;*?WYRv!xMxhxbs*#3Fu#|sRDC!7chMgAeaU(^8TWU|epWK> z<&yFxSLnZ;jC-@>dn_6EVo7Nlph)QKS_C!>-1kI zA0t=DzeS!V<9;ORzsR`XNXm=+yL4YBJWR%YeKHP^aj&10 z5BYs`-%I`@at|5z;mNuh_!#cBi)UKF^?A6TYyltr0C+qHK7xDWtAHw}@ao-Af7WcBry~W_#akwum8H=0<4qB|=lKChZ>#0!{@`{eIFxHO3!0&@;A^UwW79u}6y$`0JTw!>FWWNt)nC$n# zjFA04m?HVz^gl-S`(VmszYk`D?DxS;k*Dc@n(X(%RLFiGOr7la!OWBWK9~hE&)wiU zTNwC#Fsrop`(W0{Q}+I_fO}xVZruM8_Tk=_a0vIkggbE0OE`-AUBYqP>k>{*!2irI zGaYFEVc_?;pnnL1duWgTBMj~)qkjnlzsCjrPZ;<;F2k&6eviutxlI4)-@?G}aT%k% z-{Vpy`#mlb8 zw@&tZTrfU`f#2hT@k{QdrF)ETVc_?;VEhXMzsCjRV;J~7E*L+(y3!Pr5$RP9C)NgQ%J(50g8{BjiqUp4>(5Aoq|v$-U$*N8~Lowi z@0^`^9Em=65$Mbo!SM!bIIrhz~`Nr|Qp19vQo>%x@$UV|8k|7s`L2^HZ z$wgt1+)qJ%6Wv4ZlKZL2kjv!$YI2VKRB}HBd5re0WWS%Hi|qGP^pO32ie9qcPti~I z`zZ#=em})9+3%+qAs6}nBH8b!7$f`r6lJpCPccFE`zfZ#em})D+3%;Qko|s&IvM+i zMBjnz_fss8{eFrivfod!O!oUJ*2sQ8#X8yVr)XtA;`dXull?n*p6vHibdddiicYfM zPtiqwIrFcF?DtdjlKp;)ezM~Q86jNmX&Oc9nA=6VKzkpmPKc75Deja(5{9N(^xsSX^ehztwjC}*LE=vAc+OLqG zOrKhtdEc}9?SgISjQLt>H5BZpZ4!$+3(ajSvOC< zPuq-C+#g-C_zZ}Sq5hKZ)Ed~E%xL3xxyxau@7?fy`g{cFa*VxSjC7s-fv^6M?@_xE zp8CW68WR|&yD{D;asWRqDC>7LUsunrZ#RC|*L84x|7Z5dIzQzF|L*Jgaw*eu<(X&a zE|qYz;i-RJAJ2=qeJ}U}-5-GXc{tH5;_2Vd&b>k$%P+dW-JZ$48uv>?WgJ!MkyJ|XK_-#qY zu|a(It@Yb;;Ees>(|nC;_^uJ{V*Fi?oZrbsKC<%h^LRymB8zAFiF^gF%vrsP9))!J z`B|DSjgRk}^?eeN8pRo9>}}4AZb3dqcfq}f=if1saJBx*FYdt8_mOWpFZv9m zGdeSG4ohdjL#Y`NDdl)h?~Xo8S2*+>Jo|d>8F%;KSztS!Wc!`zfVrOwyKmUSkNg}n zTltYTB=OXwyZpQD{RY>W_nfvE!(tc4%>`F8tZf1>c>A@o1-^^M_u8sVMK{CI5M z9F*FaAFa%f^OzsOxVaB^M0gI3*)#4d;@Lfd=jgCK<@=)52mf9b7y4mdSw=lMi}mD2 zrsE9e3-hP3T$B33_Li0_^gW_8*xm~0f1}GzE?ilcL_8-K5wAM@dp%0u^E-(DN!K5o zV;c?~Gk;-U-JWrG1<%4Xo|9Adl>K9fM_~fy{O%i#F`w=_$@Gjee@k$`IUV=meQ#j9 zdeupWJA-jAegfR5`SNyzcL(cHm^TNd*Rvko$$C`ucJ&>bSA|30#PZ|;Sw{c(mIL_T_p*QP!Sew9 zOT5MVL%ttt;EWrZq^Zcc7ieF}zM=!DC&@WAJf}I@*AUJH;HZZ3O#D+HDDlsIEKvpZ z(%WBRkLr`|ioXBI*H4H}z(aQC5aB`m7H4G=Q2k+zi_7_@g zooL^ANbmmO(Z;3viaq7~g+2XyespZjI2#Ys^Qfiq&~veLJY5zet&e{#nuorB?l!G| zVlL-Me^=|>zAE0gKX|HzyRVA)><>COy{Az=)AwfI^GSJ+oHLI4e%_o#C^_%qY>o%= zQi;N*`vWu_&A)+$a|WWL2rqsb!i!2B7OtP;8kL5@=h-6{ar}!pensb_V#nPa$9Udg z+&zeXj{ba|ZBxF^B3vDpZNG)c#8a$SUGY3tDoys+Jk;yzK`2`OM5ULh#YCOxb5kDS@8LKi`KG_P zZwc{z4R}B*2-5#Sr2j0Y|JkrVQGDV8`YE}O1L3~9G2GurxMwpS=j6>nsRi*YozW;K zc4HhX+<@m~7sjt~uBVQ2owbkauS4x-AJv#H>gmhAO^Z)h*g<>bPgr;q8SxGaEeO9m zhbQ+>%YG-MC;1MFepvQBSiAIni?Z)wQ#;K|JIaou)<4WLKhMN|X_ecx{j1!nPwglE zUfulpn|ER|N-zGi}Hy$T?f5`D}Uk&}_{#{y&CI4#ZNB8fNjFn%^ zb5VSsyPt2T{i5b?ww$zo&Gx5x=}((;AGdJ!)o?D&{=&P_Z`H1~XIyv(`AOtoAzwkp zdFcDM*msz3(5om*25UXI_%E~{&!Zo&b>KORa&0^}Cfsk)6Za=qKTcR492b-F-i7d! z^58g}+Ot0Jd&rMmAGUq}J1iou|JnHd=G+wQ5C4dA+#$64L=M@<`Y-jx>c7izdyp@Q z{6@Jaa=ES2Ah&HN2T8d4OTt0-EA1WqR}zn=hIstD$$jV_qHWTj#CN;&?rumg*QExU zo{oCHyCI#F7n*ZVgZ-`v3qa;~#+U5W-c$Nf$w$q~=GZA}M^ zHC<}6Kfw2mY<()~ci^Mu%=BS;lNRf8U2M`SfFKIV*OIOT$nKU0QeY`JAIWKRLeU(U`@Wyj!n7*n-$NFPSANQffqmXyx9s={< zm_A+4Z#;+Q%iq;@^Jt`Rmf=dIL_PgSI?w6Z|HSol>0kVOIoZF;evSDMU_CLaq8`Y8 zRoWMkPu%w|dXZ$#&yw>}vHqy}hI4JOj;3t&p6l4k&yb|;=Q_6XrNX|Bt@-k28_qlB zdi*HX^Ct$$ST8HJYp%fGLHi;Z?J_Qm zk$2F(Onwx3f{gxK@{f$KcapzkbVPBXLdF7t+@D3}e55c(*4|0eGf&o5rMy6vhGV=4 zMs`TMS_1DudCPZC&;>V42MF4{$C(X%EXks93!(?P2)`bu!C8m?N|NgLyK`KfpL$+Qae> zFn*Wzu>6B1x@Y+Z%Vd^+utH|}^IW?U=UBQvRLBa-OX@@bA^BzR9YUSE_HaLiYN*3{LA4xHPd%cvv4v z!^_$D=kqZ6zSwZ;>Q`dCjp~EQ*U6>C-9|mjiPU_9o@F^P->7E^`9a^eQO~ky?z8Dq zd8%=I&+1vKe5>m(+A_3!5B;5v@ADRp^mC|p$#@UBQ_fMMJ=O(Nc?a@Zs_y`~FV%;D z-0OOcvi{8Q(SGDRD;f1)^h?O7{~}M3QU68%hm86!`ak3@Yp-GOhvXjed&#}zKOpy$ z=g5O(*H0KGyMDq5+4U2OP`=!(IrOVu><4Y&m$CnPWho1+RD)z=x-7iymXWjzx?`ZLL2shm~b1ud~ zKkwvius`v>8RT!=)fiqg!aM1GGuVe5?!f-zaA?HR8}|+4**%EoWIytu%J*^{miYzD zOZkVDKk+E)>Gt{a6@-7v`-)IMH}5O@9Kt*4{K3A}a0m9QhC|clKkl2tvm4`kJX%J$ zRlYYEgM9(xc2uJLcG~t^E#iI2_h7Ww=&2`Lf6)Hp(Lrlh@#L^Qqr)iQ=m^5woPQtS zdoh2B9-FrpZoe<ba=go0Si3-S8mdt@7YI{%Pa>qnydVJ!|Sh&U<7z^cu%AT{NeB zA9TWeyo2V5hwKA3&dRB}?j-&2CUdL@Zr;zNa;x;?o7_`A-(+6V^`Tj$OZ&~dru#71 z=PA*l5lfGzd+KYlpQ%maBtP|+ zgx3j9-gjn0dOG>O3i_4k;rhP`?@8W!ZNqzSYIyIpeD5~-n8f$i27lLq2jpG^ozfn! z^SxrM^>$PHIRJZ|S7}Am`gHSyx}G|QdbA7nvX8;qZMrXcl`J0QC+i+$v|E{H8Xw;W z|HtpbQ{U4nJ)gd(OW(tGx&Hz+)%O-nj*9r+8TK`(w{dn>S`4aLl`C{@Q`ElfaazO4S`}$uO*~=aC z!qV;w=^pd6(r#b>gFIi_jRh3ZGqCiOcKiAt=0&C5=hHvtDW%=M{x?SVzW&$4_j^6W zytuSGS^uN^Wc`nvtpAad^*?g5{zp#M|H#Su9~t#g+5tIP|05^se~fRk{zp#M|H#r% zv?Yai~2E+MlZ&=8QqF;G8(|R7?twou5?j{J=-3I`W4|J_g{Pcf*cVg z@&e?E=pbI?>st}!0{{LJ)sdb{4j>=3AJ803?ls~%QdD2Jc<*iJy+&2$QyuTw+m3$C z=WEds=4&1C+B@=1>-RL>8va1jpIdsOH}>GkbJn6`jL$*T6OT_@)2@x~jvyZ|*@yb; z?)=U-X7No<~t{_Pzn*h3->SC&{`ilAn9wm^shg#(ZmQ8G`>N zFZV}T_)(L$^Cq&F`?pd5`2INfI_jUW8p*x@V`)!c*MK+6b9pltc@@v@7CeV?_LT3S z){dpWT2ucb*ORBo=(psYAu{?k`L0ezzbD_<$>ZRCdqLy4xC;Ai#>KX#OOWsAzGWPKobmCe zAz{ZMF6JWcrz#!zs9Cf%>5M?~p@4Pv=%sAm{cP9Ceh93~N6CJOCCm$ML3@^SqKr#> z@*149mpSsKr2}k8fBXF70u- zd64!lH&2mWZXPDP+>CXM(jJ$ai?F{La&!8&%!pTqiSF+2?y=0e{Tgfgjx0797 z&XZkU?jXCo+(~wMxrOZGHuNJ(d(gp2zx8d6SNgpi`(#UdTwcch+tMDFm+K7AG8nHtW|BvF6A`h)5mnf*r<-~U8!!t6C4j#xk3lJv`3lJdRI?0r6)&F}Sw{h3Afr&nly zTEq7=(Z{fI_x<`VXZyV{y6@oCn!d}~9=o}o=J&96Bi+&Ethe1rcXXNNik1i0$Ib(% zdQRxSQ#~ih2@(5opTGM)4Nu?ZeamQ1z8^2D;r+?|tK63t)ez6UI~)4r8sjmGbnU$y z^OUxxD=or)E@@iNQSK4%_wx9q`$#HQj_JOSX)^PN`=H#PoX-gRw=sWr%v-yRhoEO8 z>*vO8XTAgR;dj*1dAq=O_27B;pglL;yX5y#7dFdlBibGhnK!$4X+k-(o~rdr$KU(D zr0b|f#IrhLPrY|S?VEFNu>iDwUMGLa{p}d9s%C8aL9Lx<+P%t4*>?X?(T`RC@=w}1 z+C|##yV|S+|D4F* z?C-|eKTBak{$~FyoR=txJYoIoX8D`_bCvNH_trlL?4QTkKaX$SKWli6`-q3FyfFS| zzZ+C2uRmP*`$J#K%HNNCzmI*yTlf3gPM#xKCh~bQPF!XAjQ&*frTt4>BsTLgj2GiY zduGRr)osR$S6IDSvvI=rZTP*#G3C)j?mkeo0*q?t*S77i4~)^>l-0wezdlf=Ir_~_ z{q;3gW)6G^Bv+1#M`(ATy{aE?8b^eL^)7JDFvxp}L(cg~F;W>_TpyZqt z$OGI5EbALKo@eD33qRA&w7&X&eO=F&the{hEN`6OYWuqV-eJ7omszrxks|!i;Q!RWZWjBex~Q4Tze9_Jp(`OajV zdn9r>8Rs6!{x&ksJ(6`^GR{4cbzm~ugRB#ian7Brdy#R@o$Mze3Q96pnIJARjT5gyY#$poO37h z0KBh`bM8tBYp8C z&dZC(aZaA-r#z?$@^jKeU)SO%`f7Zl+~ocOGRj%*J0PQ8$o<)5)T5}{OYY}$n9mVD zi+qmpS>|(s&nZ4DeAfA#wrASzaGqbs(QP_ zd2FSsw>zBwC+Ebo9^w4IQq|jC&hocZ^>&Bz+DcV#cdfMdcGph!c9$o6yXzn)?T+m2 zu8ZvLu7~XHu9xiXuAl7fZjkKlZkX)tZiMXZu1NNFH%8`omz-1Y?QVkh-tMNz-tMN! z-tH=7v^(iH$!LEf*MN_r9X7T*pHFGOtRtAVoA?`2pX-CDFK^3h_0F}O`DA-${ZB|c zi|)ew!P}+J!=qj1JbQ0~wbOL|fpIL|caCs?p_%Qek>`!vOlAVWWKNa_3-OBfe$UT;8`r>T9^h&;D{n>bY82O>|1Q{|d zpTGMB9rt^!Uuu*4QgmF5YW?h|zL>;YeJ1f{|CfEAj@ylLb+$bBXn7v!(qNMF@X~o9 z=ACJ|K+aF|8}op)Trf}2{M3>cxxnI?jgQWwWPDEIpEq}C?^$;`|B`V!ao23_&@NOy z+_>KzHhE9JyI4Q2?l$gsha6(&8}_?H9#->>``s}=Q1gxZ-6>a9B~tR!Rm?`Y zO6xczYrapaO8G75F?mVO&!c@88TDS|1@M7Rd%x#@T5cn- zPujsS8SODH43f>etatQ-?~;hgZ~JyS(GYIAA>1)=(!Pqu*>Y{nC#|2FAD91DR?aP0 zJmk9w#?R9z*FN*FH?~LAGnBv9+q}HFQJ%e>=k&<=%2uy_6uI^(^8V-m`lGfctoLp% zKh)E7oeA-as9zKJp~h02 zm~unfZZIA+ws-#?nKf^m|7knS&Obl-Kee6YwHnF&VRI&LY;kYcmi4hYhwmBQKGJ^i z^tLM*pX~jadjGE)-?ZLW$X@TK$zJcL$X@R!$SyCJ$u2LCkzHOcl3iXNA-lXhOm=yB zknHuopX~L%m+bYvhwSyfi|qBjlbqChve)}O+3S5f+3S5P+3S4^+3S6d?Dc;Ao5)|U z_e*52_iJRY_lsn&_p4;D_X}jN_bX(t_w!`0_sif%u-?B;>pkz!Q+e>y(k^@*KT6KM zTC(<__WG0WM;0&9n}=Lp<9x2h`CV-h>tKiK)^4N26?+bxfdJBQmdstLhWUW#CtG-> z8q;5>pr5WWe+tuN=3ilo%=|4(keUC5GMVL57$dX%3Pm!@w=hCx`4@)CtRICzGV4#F zpUnDI=q0oM6?(|5pM@?m>u;fx%=%sEAhZ4#@?^G;LOYr5r_f4f`zo}M+5QSSGTUci z9rc^vbL8GsGTV1ymCW{ESRu22C@hoNe-xI;>|Y9tWcELW1v1ys3iD*HvlZryWnIPO zHi-}9Iqo0!`?=-23hh^D-$|yNQiHrI`tY>xq5YgawV&4=G)cXlT}FKtvtP>Acb=cA z_4C23d2JQ$0kihrI9O8{UWS z%rc)tJE}nrPV}K`y-eS{J!PIoULX&W7s%3H@|nir&>494HQ`yv*;C8y3meL< z3+XN(pVZ#wzXg~_hvu#PqRO1d;U+T1yRg80>@|$XVWAK9hu4uWLpXO);}u)H z5RWuo{frmPH6QGIPXXqMyV@Y!(OlhqQtM{{=Bc}3x`Vm8yH(#?fO+a}gzjLj?%r?V z!8~Fw`}3TJat#5JD97xr(1Y1Pu)$>9n96;T^1h9Q+HEz z2XoD5-7yn)!#r^}I}LX<*YM=?nB*VK6L+-=!-KhoSCsJ5_Bvi>}W2dDn$=^y5D zE_dSo9&w+9*rzcXfou-FnAuh z#oA36`~(^DW*9u*-P8Ut#*9h$|qZ#9ztsGN-TP?|`6CQoMP8!&edHY6C+AHR(fbLgh2zik>}`tmvP8*dee2-X~;L#PR9Fo`WvCY z0y)q8!!x~?ZAqc!t3pG|$uB zQ^~`0hi4dsG;gQ7YsrIjhi4ePp60D|cO7|x?(htQJ89lRch{5q=?>2@cmvIIboVsy zv9h@fXWnQW&w%ASsmViOa{fy%!^1O7&ShDnyBiQ*eH!6SMhI^bEZ=A8t{d)-j=|md zINXhcqv{IXJss{UQ*gHM(47j5nVL0?AxEm^(KlxrvchK*P4lN+OzBj{P zb&>Wz1D>6OefL`sPB&QA0qE|TaK~{wEWFiN*WGkHmHm`#XOt&-u8HiIMYsX(!Itj{ zm}dm52rtoRUm=gtewkb(FOfURQ{*l()`jJqP;!O#oEIhc-}cjfj`oA(c{1lkyx%vf za$dxHfWyKs+Inr+{a^6x`vp9Qejd*qufubE6wk@q?HL_q{TUyD`OIr!UhQZ8{2bZq z_iM<5w0||(+tYsX2<=}*u9NqXJIKT2F7hkMJ>*xATgZFKt>l-J+sQ8@=gC9lPBPZ* zr9E-{7^M9g`8M(*-M@tFgWOMkI(d-XO&%uS zKpr7?k&EP~k;ll_lgs4m$P?si$y4N~lBdbnkSpZf}$B{?K0l7%Nh&)DaCzr_=k|)R)kf+FPiPv?c^qMo}43hkRRfB*Gc{Xxr_XLau4}?$s^$C+Ep)>lMAIXE{FO!GKtK<>#m&ir(7s+GfFObXR&yy#}|3IE1|2=t{{5i6Z zgDcLQcRZ8z!RJ9gL-u*lPm_Hf^bE4kgPu2sb8PcdwBFak$#X;Iqa2xi>HWdc3y-zl>e!}co#_JG2CB`{bHj3Z~2nQX-tQ* z2JPoxWaUBIUt2?XnqJ*Mrtgoh(R(rwu6*yba8Ks`YTtjBmmoEqqcz=+x-pz+7V+G4 ze{}_NXw=+p5lZf{ZkB-Lm)v8``~Tt>b6>n}YBqa3H63|nzuz{PviQf{6R0>r*Z`~KlNIN9f0 z0UsE#_-%I%Z5!*I-)|W4UZ+w%4}W*{+cPdKo4k~qk9nOL=LXI>D@l*mFHM&|qgoI5 ztDb4|f#@RSdvqWC={bFx58K@v9q(AO_xbsS@eO=ma(^`Me>&;&GiR)wp731O8O%Ro zp2HfCLk^9{$I$LsKC+)3`EdZ{FXs$_si%|Z zl=E(~=L~AQ$hx=v+Xs+8>i$x3A5ZqIsfp+nTmFmwn{hnu=ljf?JS6+p>2Ag1DSB>X z#M{s3lyGS8=ldZ2qUUDrv-RKfE~qb_es|iechRAG5VMH4)`yCwt3mG~I)r*)=~DfR zLnx1^)@k)i^s?~0DGf)0c__XXoSYN5&3S*>`e^>Vo}KwSmOs&bXkW>>k~e^xbC55i z15@^*=!ANz({$IUr&^);c6zFH*f;2@wl)2>#V?!hx^G{{jmG=K{_Y>Mdht^>Zh3o; z$EPul{X6PgH^%q9|D4s2zXj#+Z*VRK?mKI-e$&S}KNmx}C?#<^^rHv0-q);HH|W)W z@I%sGYs0M9gX}+FhH`!)+#kOH&-6Ys1k~2_eiH}M`+?idVblTlO27Z&-)>d<(7O)b zcuC7M&BD*oYioI)akf7B`B~Eq=V#r&p+4mr>Qf8rQ!C6R-=t~F_b`0_)_lwhOTS|4 zNh-%|JU^>_(>jyNP14Vpc|4xubIrof=Hr^UGrgdO_>OF-Prr+Nsv>@V9*FE~LA-+z z%6CYY=oOPW?)!Zr$$3}(w8wZW_f{BdI^TAo))$N$X?@Bi_CF)}us^^$pxR$;`GR#h zO-FHqzCFGV#^WoS@~7BPpH_H(UhzXxpN@{9KGln?PfgZ=`MFP8FDmbO@DJsYn|}M> z{>0vv4?%9|u&QFWe0}B}hyFtCzx;Pc{_njlA3*y+H<*hqLp{^~f8s44)+FREf7#LA zy=T17+_kkxLgXjs+Ze~)OEwRSUc__Y`Y|p8~kD4tw|zrp;Px{N1R zF|H0$zi)C4Jb>{i9$Hyfccm-y`jGo<7Ri^AG5(dVd^~x9_Lq>czEHaIVlvhjN>@IP zjQ+oLWk4>||3%~payuF87o{tuQphhJ!g@&QN;GJ>Z-?&NXg@-JEP0rGK6#J~!8{&X zB0~U-hx*CL$9Slh%yX!QddNJ7YN(6MbEt+o$vlT@sDsRNsD|=not$a&YLI974*2tLG#6xp*uf2(eze;-<@Qhc;sBiJmGPv2x zdlmkhy}Z}RUf%0uFYlbmO{Hcp?-sI`cPrV;yPe$5_~gkKk~_#=-koGG?=G^JcMsXi zyO-?c-B0%N9wd8t50kyTN622@MY5Oo7}?9aO!o4gAbWXFk-fa9$zI+SvX^(A?BzX2 z_VS)5dwDOAy}TF6UfxUOq`b+N-BLeRz&9u5Pfp68oRmK~DSzuvN;fCvPfp68d=bmH zot%_EIVpc~QvT$m{K-lAlaul%C*@C0%AcH+KRGFXa#H@}r2NTA`ID3KCnx1kPRgI0 zls`Ese{xd(GO=xrfX{v}?>VO7{V4 z4mRgh`VhTa%9SdAJVkhaFl=eahOcs9cD_2Se200rb&OkO9Yg)=3q)`8dupSsKhe84 z7Wob4@^X_03zP?i^XjfZc~E$RJXoMSSkusC%}eY}9xPBE3@8rwxeFuTkU!Lpk<4c=SM6(DmQj?q0dko zP4|VLP1pZKzuo*vxqM&kW!;pFe3boYIODzh~M|)7ix%&Lb z-rv^r^JlAhX&3G@Y-@T0>tEIU$vHQ8@2+1X^E>pegJj6L(XO|Xkw4Ka-havNpR^9c z>znUuZ_eG0_muJ)on-wrqi1UMI$f9H`WWvu@bx{{PZj-bbFc5w9!>J=2O4g+U1&Ry z`fldxE^qFTzN|ZKKeAqG=~j1|06CAxSj%hUxd}`!?=_S8hs8tPZ9F%j-O9(zH=LV* zcBbYV&rLu(RP&AJCZN4$p+v1ezyHn zF0Z1#$vTqSHX;rv}16o!(Qa|D6M}euk`!?lv8?s0LsVxc|RH#m~Y+8 zuRhNw_iv*r6aEzcVAL;F*$pT18+%kwe+L(3E6rLI?R)VqURt?oDI z!OlYden2Ysvn6P6m(gL!=?{q6Mm<8v_i;DUx~Zu+{GO4G$1LU_njY2TllANd|Cq11xw?Bx)_<)X;fi?jW_^DjIC=k}yxF_C zu4}6vUy=`pFn@~s*1sj*r5@&(z7~6mUKn^s5znCt&5=J*jp>(oeKs3ztrPDptXa6F z+UL-&3d82VRQr4KAo(B2{p8P+5l*T01v27Ws(q1+^p$E~A|t;_HS}XrPc0s$+LvjM z@+j5*k<9sA?JH!?-)dha&oe&%M4lu6Gr3Ow8hM(GepSwgC1amcT$mtZA5>f@ld(@q z?wuxMAC=rwO~yVex%ZlkeOPjD9U1$yENR zD>-kbhW=LKL;rP#$NsB^{#w#Qd-Ug$UNZVuzh_+Z-|4@L_UNA_KgsC7{oZnIcdAF5 zw3}KN>-VCiPwk~?OZ$Pjd`~pFSoESPABzL|MYSIKgFE%NVC^2}NxQA}(jCmzo$8B9 ze9Sy`*H3paS9j1`gn8<2knUiv?rydC!aQ|1Om{F>cdA#JrhA0;cxr!km4uVn&lb&I z{XstwoQ6L}|EW9Z9l|_ySEf6dYk0B67v`zE3A%&1x_f#yKD8;tNBaN0>VF8F_&+=i z|1{TeLT7qOdJb3MUkpuuvk#p3KU9Z*nrr{6dXS0#L-X)2VXD4kyaSy0uPnen&Er0V zr{NT{@i?@|_wd<0Z2Z5udlUG`j{4rW2P2T@<^_2XmKzK`3_L{NkceOhq2%5tj{^}y z78!f&M&Qt9FbJ8Y+s7Ck9b!d&Sl)k6dQ&p$dfBh?-9aZ?wy&FO`)4hLA?nijP{G{Ad zFMrSFlk?)o9rEuhujhfqv_5-I-=n^)@bU`Ro!z7ZaVUj-N7J#Z1O zz@zXh;SziUJPyACuE5vBlW+o0!xQif9K%(39B#lbhv(qy;Cc9E@FILIyaY$^GJFlZ z0+-=cxCE~Sws~n>D=5FSGNbJOz}+yG^;emu(l7}j_p%KixMAsm@e_J=&rg#IJS{s3OVoy;h^!t+kteIH)M zoy;ivJ)Upi?z?aa{!ZX%=eK!Y<@vYZRrs6m3cL)fpNg{IF#GTwMA@&KfB0*#`oSps zRapIGl>G{=9Q;Xm9{vQp2Hy#)eej3jVdDJ|T!23a7vVX0Fs!#m+5PYkJPQxQby(}$QMLvbv9H3T z@a=F3eiy9u?I`upMeJ{d zm*89AW%y=z1-5g8tMD}Tqm;*=!Ts1DFs2=R4O|ND-To*3{wL4-@ORJ{e>cHJ-2WWz z#r+{;+`kr{#QmScIovmlaX$%HNSDkgyT*$7SArpe&BDgUnl)r0=s!qu=nc> ze%uqWzU$JjaecNB=3_2h@G#6gBRd2$&&UqK%rjWOZQf&|^^WHK2VJ;lo{{Z=nP(tJ z;PgThe=qjTGqQa!^9;^0M+1Kno<}=>Ds$u~GPnL1_cP?%k6^1OKa{)t4|s0%bOpBh z{(ZPeINyWqd;2ativ4%s0{m@w82%PK2Y(YDf|ubz_#1FP{B_vI8()KMyzy1o#v5OO zd+`5dI72)BC3pq^}pq!gs+d@S^!={IFp5 z@Tbi`{3+PR7oUW?2=5bc4}2$_gFg=U!t-z+dPKG^!9x53t*&A`?lz7@9q z^ewRU%eTRUw8yu?L+~x|FnlvyfcL^hcp4ss-wc=FH^JlZ8{rE426z&FJvqi1m6fR!>@u@V4X*F`wnmg`!)EL@H%`0yaB%g&d}do z4|l=|+yzg-J#Y-?;BmMYemUF+UkCTYFM|i+YvCa{f`{R2-~wERi*N}ZgV%fg&Xh-;5qpD@H~7Kya+!JUV?YS%kXpI75GYc6)wVS zf!#i17{4^fE$fVL7Ww}FHgM~{$a35LC)z(*58?TJk!yd_JkRRRArQ|R@mjb)3moEg z1E#CF7uVhE#`t6%_pGbherS5%lh$*cyfyB%@96Z7z+GX#u{qx9fo;5#gKfOi8#o$R zCEg|8{~Ne#z+Z>w;jh8d@K@m(_$zP~{xUoce+jO@OYkK8MYsrm0WQIxhezSh!3FrU z@G$%tcn-b`9)cI)L3jb~hd&M5_~=uxjgLMF+xX}ca1Z|PgfsL2QI=DcocpmT!L?a$KhAN75I91 z5>DW0cmke*W4H=S4%p3e;Fn`R2VV!z!!Lsu;cMX~ID(hqYv2`F=j@yPV+s2;>|YA6 z!!Ln1;1|Og+SeDso$%Fg7d!^{z%PVz@F?61zX0xopAYxLSHXku^WY(PH#`hK7cRh8 z!bP|UkHXJ^OYk4V2|o*-hDYET_?d7OF2D`=a(E8D44#K~!He*v@Dh9p zybM1BUV$%$S7DP=xAoT#n0w|!?>G1G`(T?Ny%+AHJ$Vn@1HT*2!H3~qxB>UUhv0tr zAUp^kfQR7y@F+YBkHdAi0@vV4xC&3hx5G2=yWj@=PIwM}2RskI9bSWVzN~r9|83Z3 zXisP0PWY{G7yK4D2j2$w!neYG@GbB#@!t#=;Jt7Wo`yFVM-0KXZZinmx=la4iu=C6 zUVg}aek;r5RgQPg)#Uo!K3J$ZU>d&_-Tz5aLpc(s!Lq%S9sjN5?>TBq{pY@4)?z|)AOye&XjM5stUHyD z>3P9SSNa}q8@YL&wWj$*Jgf2k6=(g8@*g=iC!ZL`*H@hNSK)c6Z!V^If2YRXvm3I% zXf4=xZ~4n$c4VI6lj-DkheCdJWL_&a`QjTxa+~jE`_Fc6*KaPnpF8gm!b_AbnO*5Q z*`F)FPWYUx^wdOK(N8l{2>z3u!!iekWKIn#+#30p?bq{spPrY8Lb^6Pcf8rT-?Uup zd~y07UsJeUu7bH=?CPEW9rqmZi1Is`Qa_ofI%gJCy;}0=E`@)>`7{;WM_XSfb7V4@ z$Jai=%p;FY38{7u`xw?1e>6;Jr4_r-s5k>3q^S!JV^GJ=!#%-l6bM zIG^qe?xU?bHx`Y|2Tpd*$sAC6-93#8m-Ex^UL)DlPRC^>C_aaLicT`0o+S6p@8U+q zce433rSVvNfO@}aKD}JwpKv~H4ef2T^>mpdoxx0YW@HYi{Ya+N&Nz9n(4Hg{YLDD~ zJfYm;y399xQQ`Ep^=DoFJrC%;tY3@wt9|wF`G;;DC_dC5+UvN{ClkG}-u|E8 z;_T}iDvxdMf&2M$ATHQnB*-Z{Js#LAo~FHc*A_K!@ix`>rakrlFy%`Ar}pQ{e>|)9 z&dK{J9y>RGK;L;>RXtAQ+1nP+xx{mETl#cdDU{Y8Z6=`w8eXtxFa(i z>|5)nug`v5+H>b5@$;{P;dNx1;;g$3y$;^WV=4-2QjUPj-AN&TnTnIqx(7Q9my1q@Bqy zK73lJH}SUlF!F1jr+a|8kMch||8}{1>}^brwj=ZWVDHoAr$qPUTx0)# zkb3+pp&qNF?#Mhmy!VOpD-S=``-M|yT zH%|Z0z0t4y{`c=+{mK(Vebsp1*I)ld*!e-9FYi2-UXU@h>#gPP&l9)itLX*#>yNna zwC#LxN9MY)+~(tR|G9Bf&i$Lo`1mrb48q)>emuP0KX-$S()kQ_9Q$$a+gjG)?u-7p zagy!mW_nV-67pl5_OnDkduhlIJNJ_eXk9y*>JRgm_+rgFQavV@XkHNyGq2g&BX`4^ z-;}#^E|>f|&1iUD?tUb!_1SXwBjDaJUN3i_2Wx$|+^z3A8R^6RVc3@lFAMi$uZe)u zD}ucmT&D*GJ_q-cxPK_D_49IfH$08~*|6qs!>?l!#ynrD@}O)r7g%gf!Smq7EXa<}Ov(DYZyjFTqy+LyGS)R{pDs?=e>XgSdYf;aA}-JO`)c4_o;+;B#<43a8}{Tlp7Z zEB{5<%6}fV@?V0j{AWnNm45+yEB^-eR{m?Sm45-Y@~^^H{u{8B|2k~tKMym`N%hWH z`LB~6D}T-Fn|f%pj$M9?mA}T}<;Ph0&k??re;4Iv<-aKV3#`1SVJmO#@02gF^49)N z`2s8N{taJHKtD|R4-CST|G*G@ zuF7{{818`!Fy%i`gem`lQJC@{D8ZEfz&K3#4^&{ve_#@({0F9C%70)6ru+x0Fy%kc zfGPihIhgVvn1?Cfj6O!*IF z)LvXf`E$Q&`69}HpbPu7{Kd-d4C(>gygnD6$D8UkU>!fzYry*W{ZwB?vUM`FYspsa zYxr^F{Z(JZ)4t@!zrVCT3f1qU_cK>Q``_HpT!yKSrjJ6OiyPN3%D$}nvJ3qgagF+M zhWs5J&xZV+W#8Gln03u$=bAW;XEm^$3r_}$|LS8*b{1r2hlAOaQ`EfA$t%fUwg>w; zI0w(ey|CWL>6L|-u3$m{)jc{UgPcXKbg=}Wff-raNk zdu03D+^Ju;=L=U7uKSF=9*Sf@_UZZH*@Du^bAR62w@AsrQ20*M_-DItr{~_?Uxo1W zyy;Hkf@DC?y}KU-cZ#R!E<<>F?%iD);??t}yFuLPx!*tadO4Dvdft4GKHTZKcjxtV zBs=xI>8=-ddhXpl)yKP2&ztU6!}})#dhXNb^>icydfs%mj5|H|?zV^b(DSCdp3t8< zJ&?h@clS8wF4e;_tMQUQAO1W3IqN;~ft>s?e)sk_9AV$1_hCHm?Z4;KIilxjK61aa z)6)^$dv{(RNHd-;(x-IT{K4l>!@GNct8nfY@6QBxKK)1N<1jrVu6sE`|HnbiTaq#S zIs2#h^jmlbHI8-nb*JIJ!rR;X&vsH?a_8gq`ox|4@H~CL*@D_(p8NMZ+?wtK8bAB} zgO|GSlL@7(>0jeMY`xb-0W;pYNqvzh8d$mlm zkLM#Qx2F41+{@mV_n>p1=KpL3d%5%Wzj1{99QJbO>%njN_(t@+8P7QGa6hJY%ZK-m zt?xJ6z@6OR;p*=#{yoR^ycu2F7`Z`P`&i- z{ZOiz4}&2-Uq5&Ia3;iQIEQAG9-e!5LBGd@p8I_9oQB8!p=o=C-W|KIJK0%Od~W#X z_s`S%UmsRHTMM#x_2USA9{Z>D+@wS5iOf~Dd*E5pFQyo^j)+IJi`Uze!kv%JtAp% zhx_$jE*}$TpNxppa1M+s9G?69c3IO*&w)Pqcl9ag{TLIc{tuSqpXUot@~Lp?aPGaH zk2Dm;?A5 zBb}_bCHu%f^cK7O3>5Ax^(0>k;U^QTdS2J}5ZA}UbGJUL_+1)(kCUde+J}49!?>>c z7Sk@qhxDDqvsJk}I4ASKJpLAC9xep)a#x;SZ)LKtH?S{X|4a5Mo;2RWL-LoNw=(@5 znm@UFg&EIj{^af>hBbe3_ZY*O@LulzW4IH(2JV8(a1UI9Cqp`HAJOS43-dE~4>9(d z|3z8TKce|zlr{Y%nmx{o;PmYA zTxOIt{S5`4%Z#$7$DxboGNbH=h!bmpcB5C@Vnr>a1T5U&%vg*M&rdO`~6@ajog7dtp`Qf8MuKz(|@D! zUsGR75BVXpsYhcujMI+R2Vr`3G|n}BEYXDN zj1vFnN%tt>n7)uv!ZCdzOT5473z;WenNju&gi|CO(<4$O9MdB*OudyEWlf)mIIfM8 zt}hZ^f$$o}gf}T}^vnI!T41-Y7ue~YAbm2MdV_`u&-9NB6CV0U4ynJ7CQScGh4g%h z_=oUs`bdWGk3N!veR4l0JtPU^9k>2MdSo{B91Rkl=_wf`JoJ=Q$Cd9}O;3r&8BM)O z{rES%CH?qEZ^`~%rDrF4OLmIg`Vi@n+0@I_M|h^sq>u1SpGisSL7$1czcrL+l>M6J zPvEAWA=7WtOE~B^nJp@u0n=|%QaV%pQDUdpn0jY=PjZBV-jn*M?DOb7IXtLv_I*S3 zVV~IP2P2#<;koUPH}#;*Q!jh|&5xUo)?3oRo^t@{Ibh^y(sR8z{4e3Y7hZ<@;1#$Z zUW5nR{13JHA8zws2pr}AMCQOxWttw8ozjC6ZI%9$Xbin46ViJUO|1}~eUGN^#J+da zcQQ%&d>8lDK79wC#@_UuSbO;`?1#vI(|0n1`(=wCHhm}SxHo+#Yq04%>7<^TzLN}W z`c5`*Z~9KGA2)p`UASK&{v2%jPL@fJ={s44Kacx$*z}zY6QAij=?&%S`UTwg!FR!f z@M7R--vZB7?_IwM+xKO9PV9R%Jtx*4n4S}BUrf(Qg>;&plR0>v@U6WyJtyG>{qZiJtrHm={Z@0P0vXu`DS`fs)T2HPUc|K zbJBoK&xwuy8pJ=3z3DmWC;U{;348$eHvTp}Ck5IkEQM^qg4#VR}xie=_^p25fpxGW18L=cE&U74Ey>J+RGpDzNouuY|3iyaBfU*YuoN z|89CtY`kE4PHa44dQNP7V|q>sq-UJ)i?HcA8HG*HNeO-#?#JP4;R%$@H9b!q3Hh7knk$0~f`IC&Txj?AvG?m#k|%b+A|M!`R;jZj}o>ww{wh za3AkiyX58hzW1G`zLR9%T8K9q`&lrc=?3Z9051D?GCES~SlS$m0ev=jKKZpNm>`lMPGWMq5 zWC%9>CNsESwD@7uZ?cYi({Hi{n|_l{+9lI(l7UUX$p-FCzex}Frr)Fso+thsZ2C=> zNss9_S%po%$vSNMO@@ij^qbgt=tG2W;~~>;V&kDX><0&4Q5Dh zmG@u4-t-%6z^30|4L1D-HZCëi{{RVTe={IP=rr*HEMKi=dkG<(PuyIkU-+*zB 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 A*8l(j literal 0 HcmV?d00001 diff --git a/compression/cnft-vault/anchor/tests/fixtures/spl_account_compression.so b/compression/cnft-vault/anchor/tests/fixtures/spl_account_compression.so new file mode 100644 index 0000000000000000000000000000000000000000..a5db971a3bee12066fc5e0811d2246f458b1fe03 GIT binary patch literal 2349040 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∾C-nB~IidB;5jf!qJ>SXmIzMhZ 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
$e+kT4RQa#L5--zK`m2@gIb}U_T}4g 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

rHiP4k%L10 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 z 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�(lo1^~1{bP#0~#)z(AR9<=-KYWdZ?DX=ka=| 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

E`%epBjsj)!V~ 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

iJETt<*3(1!rC~iiq;FbuogLCY z4eROQ{Y0G|-d|dDo!x|`TUvCT-8k8Gc4K7M*^QE2XE#E2o!u}QpVuCUFYj?Puk=DQFL}%A8Y^fiFd^Lnd-+Y$$9JP?232B{SK$I)AMF;WBPjk zjN`?p%K6pv;{9^;3>@AXhN7UJ&-C5qq{(3v?hxgZ`&JO!E*4cSK8v3T|SA8G$ zhVyT;D#oE3_oEkW|ERM=ep{}yqkU?qvqOG)Bz1PyE<^Q|)7hb2=I=@83v|kR^Zuy% zNp+8?v%_ka{2or7T|xZWW#%K#|M9!0 zjr~AN?S=crC5v0R`r6KVIy*df)Y&mTDz39@Li&XD^pJj0XNPoFot@er{|=n%XOb%R zm+!RNdq}D)kk0L}!%6idawp?YCc_RV)lU_Cr|Z;`>KTk5W&A4g2>DF%F!?O< z5P3Cuki3RGKweAkCo^BS_kj+Cphd^6{hUxx9y@_LMuMV%e$Uv0N*N<=?8>}I}w zrFOQS&Q9&Rd^gpe*T)r)MrYS2>o*;}&JO9YV>Qy#(<7@c+I5d!XUFu|%=EYn>5*}q zsJtHOb~v4#`7`LRdt7H{#ig)c@{csXgKl(}RHCx!QK7Rlzicb+bN!0v7nHNT$WI~v zz>MT{cF4~Uzs|1L@~hi&CAt+41fNsi(8k6s@PTd)aX8pFMm!JErHYc3UT4Jv)p$Pu+m?YyWWYt+Kuys&TAu zCkxyiyY6nn=9x_O@w^hW+$;6dX*0Hc^{F>$_c_15oo&ypZ%4-alkZxR@qT4K7#Z(h z#?Q#eA2NlWnE;S zf7VGx`4U|L+2^mdk$rw!iH!0qx;L^~KdtAR$teG#nV9$l-6UB$j`EZ5 zhmi69W&D!ty1N-N<{gNxge(K>cKjUKUZb3Eo-7&2;upwTi|F+h$%euOyWf2KWbOf} ze{Mv4@blnwSZ_}Lul|zsP15ezgZ;E$+$;GtLo$bcspjK8-F`mybG@1Bv-)-WQ+OZu z9>jgz!}H1G4QTvTj6Vk5UP=8^b?*0iz2AiAm;2Rv_OYkin?X9=jpvBEy-C}CpKSh` zJeRDGXZ7J7Ob1yX&*E1WkWWsP>{XI|w@Et4pTgD^;?$Dg(tL0t=BaDR^!ZkCp8Dl_ z`P@8|c|51x)iJCG+U=V>r%m!on7LK7G%YX!6gwBk!^Q=GTK^QMC8# z^FnrtnJLMhyBJQvtXjIO1-&Hc#d)?_a7ca_lj~`@|M0Kr{Pb7a4l@31>6o9NuJ^UF zfQH}{%$l9QBu9w-v3oud>%dfAn$xo!w_aq@(pT+==F>~)uUuIewwxv72zLL6SyvMI zYIBRFPx&&|GwW&Zncgc4=)b%D^m69u<@2=Ee(HVfl&~bB_6IbS`D%6@wWHQfpdEcI z>Rw;|FuXVK|E?^2MN&uX*aa3G-TIPJUz~W|>zgd!`1(p2nkR+qOyrB~Eaa2y4Cb36 z#{J6IPN2MOgicWWdB)Mt(6~Hld3D{HudkH1@6!^WALp49&g;XTChsNcUtxEm{uTBp z>R(}}qW%^3E9zfi*P{Lv_AcsQVF#oB74|XeUk9vQCKcDe_LDIl7ru{Bas6vA<6ZyS zLw5aZH`(>CU1W?GivNa;@kD7Sl3oAWMt1#ciR}8<7P9MKo5`+!Z6dq=wLm_I_wCMslTe)>6t^6lJ|B8A}z7J=|C$)DW-1|<1`~C@GW!gfqzjnO0hq5tndK&Uq!*wRx z!#b08eAK_9evSH9v{Rz~75AUEyZ#mRZyNNkc>dfvla?M)|BCdB`d6fH)W0JAqy81| zC+c7E{?c~WzvBI-?I>SawTstt{VVcE+V1+-9>%-=wU_Mr*FN&!So(?|nC$x30kZ2~ z2gxYsS#^l)`qyEy>t9F6u74dRyZ&{I?E2Snvg=M6%v-$vHrUY^`EYbr`t83>3-#l zSufrtAV1%(^_0dR^}2Y^vBR-0o}AnL>ZilaApLX1my45DPNH59&l~l6C|6OhhjJJ7 zdMKAsuQ$T;d4C?|I_mXM?xS80b|Lx;26(*t6Z*;SZ|EbtKcbiH{)!&5`!l-9?(gU# zvz_YoUR)QC@o2Eb@A_zOLEG~s#=AeJh3x*CX0rQpn#k_&DUiM0gL)x;r-}969YtL4 zX4F&3>*;U04)soQ`#Ffemi6Fm^jB>}J(S!Ef1~$<Vxo@N`;3(-$aFTV_Y^-~eP7!C0BHJ2I(z1NxzWY%|UI>>nLbj{C^kuK?)pCu#R z(lwWmk*?{QCzFxx=^Bm`R@y8b(={9?taOmk&yaP@$Zb5ni+m9o`669&AsP85UBhw0 z3i4ID2K~CM(#PY`&=y@G85KoV86dave1qf?d5C--d6?{e;SsX?jYr9N&$50l8TmlI zV^1#fd=un#`@{Zc&sA%3#$77ssQy?FDNRpA$`7ylAF9)7}l@xN;E@Eg{P zzuw~EN30kBD;5vGV!ilZws`m%>&0JZ@$fs=i~l8yhaa+Dy!jEU1+*_c{WfW;i~X1M zl|O|Yc#Vgo>kd0_)1k-hvBT`RU$gk;hVd`8_?Cw8FSGbk!}y&R-_|hR{GHW~hVeJr z@tqChUvBYT4dY*7@!bvMf8FAH8pi*I#rHOh|4obUYZ(7Zi|=n3Z~olsK*RXNjvs6o zf0M-zHH=R!ez;-$t1Nz`Vf?EtezalyYb<{3ka+#>`!3yH8OQc@$ZzufPGkB0DEBW} zgnVzEOuJW|A=B*xFyrBv%&H?~w9m5YC>i4|S(Wun zs|-lk`NkQK3PJ2V*{T7#-XvMAl(ZXA{foc!cOO)CzjwXwTzug6IBqHHF4}vPbrAqYKigF$GpfBKi9klDp_^5@_{vnT$abGe%O73I)kcHlF^6@br*U|LQoVohs zt1Ls+TX*pai9clBMLEXDk=^hA}J@-u#;g2!#0K`hAj-688$I2Fob;;zbwi({cz%+CBy#9xUg~5gZ^YacU}*w zHA&Qio^i7B(da?d&UrcV`9~*U-9>w^Q4cz2EbA^>DC;iTdz5t-!IcTb7e7NDCx4ba zM*bXml>B+}2>A=-Ve&kAi2OzJAo)w=0rHp0{p7EZ`^aA<_maOx?je7j+)Z8}cagtA z?j(Pc+(G^pxsCj7a*6yMatrx>ax?k6|+f&5{$!u>G ze?Ufglyw)$D3@vRAu|1HwK?N+&qRf%_FN72%EBAvU#ZKa{!`v2VO@LuQroSNTX)eK z6k7|MEF$U%as8+x#QjAbA?`m3Izl{O)DhzOqmB^i6Lo}0zo;Wb`bHfg(m(15@qUsm z&$Igs{-7e+{{Zd^Ne3yqVlbzKYyW zel~f4d?k61jC2m)>E6=C_+iHDTT_462>Ds$QSvj%W8`O$$H`A8Pmni~C(S-A*AY(I ze%GIZ@qv|vSD~FC&C-$_xl{gXi@C8LxYzdg_{Z1Xe5Ccj7ux%fej>u!Jl^k_H*-73 zp=t}OhhIqYf11BkDj=exeR^i02RMEs|XaIzV{iOy=2|>7WKR*qrSZ4O6Fr>{cSxNJar+sMY{E)zlHznEwT;r zk@P#F4s_1aSJqoZ*uH?UIB#LpfnvYLI#BMve7!}Sr=boM*Uf5+mcOG86!~qr4ix?8 z+j zSJZ({<2h>w`Mfg-_sv>(EILr@-z2!7Ohgsssq&`CEtg%a_0K3 zq>BB^?Jaiyvfd(}gYDkxJIQPpSKmc0aQ}ZMH(COyU8CWcai^-+)4f~ zatHap$!+9WatVCkBM8Soig5qO5RQEu;l58GtbGz;^-~r~`k@|d#W-wvBkW5Wbf7KR z?>e-nbL%Z)`)RBfgATL_+izz5NgZhUPS&rxFO}RR`TpK{T-SAK1ze$ zbC~fLFn)x5K6#YfN**JZ$m8Vm$P;9aXY5Bg%f<_~Jv+eu_X><}q+8Ch$2&q((a z!O1#=8#r#ka;N4{Ui6= zNByIY3X45CvkT!_s1UL9nueLRn|WBE(;4to;Gq)xSR@^Z0Cg-VRTT{TAJ&)yH|euJuJ$nX&xr z{{AU+qs>0AmG#M%ri-Vy)&p|s!j4wEozU;}dCS=B98N_?*kqXVanA z(fhD;V!C-cY5H0Em#}{}*2HxCMceT9?bz=1*iJc*^_$rrdR%vk^w}@zk}o&A_`bJE z_(-qss6{=l@3^I)ob5&V4dwPpcn*EPS~RnL$mj0&JsrcBg=`bc^_5+AK=y2w>#LA| zkF-ve=R420p5KCft4^T4xKwULeqp`GyU>A2ZxsiiZhrv`NO}@FP~J{VgASE;HLmw) z`8o|cRNCdBL#5qb#c|QfF!$%UX@z!w6~|Tmd&_aXNAAyYS)b1n*L!5VroOhbddcX> z$oG%P92fTQMF$;f7vnju?DLUUaopMGE3M+Vw9jV>I@A)6N4=0$STD!*9+B>Gy+`sn zykFM;alJ>z`+TEuGV8Gl+Z(G&cD(yxq7L;#iyEPJMN^=j4t4eJ*gu>?v!$^8RfBfE z^{4!=!Y%T@?1Coa^2XjD>VGnr`$AS~w(VOjH%l2@iF_madfRX7$#P-&>GfAgR$5s= z{Pqh*?FC)(ROCO`d)a=n|0`PUu)>=Vhz_*J&R4#!>j%22d~G+ly$fNn+qUQHmp=VY z6E1J_qUPi{?XM=kC*#I4?5;UFdkyZtd~=T-zxoNtH=2(6#FuPGzV~@pdOo$~nvSJ$ zyaPcy?{jl{-s~pbD*dw^2-SXTNm_b;dOy#U`&s>j4m)32xX zocxjY%sRX8DRuP9Pjy@Mp7V4R7wZqJ{q}y*R6mYWou8iXaL-$m=k@!_*#FOJc#do@ zpYNI$J7M{0e6JTV-}3sap9uS={qp>MY;F3Qv_&L8j3M1Ku8*CaRI>ABC$}LyrNhGV zwY^BMjXen4yAc+&xU z`Q$~**U1XBGo*b+_HmGTvX6tzk$oIwmV7PGH$#37`5?KQJWalaJW0NqJVD+}9w%Q# z9wR@SJW9TjJVM??9wv8@hsalu2g%PO50IZp?k7Kk+(-6tkX~@pMvG5Q`gw#WvwmLD zYn+|Zhj1k_boPV+za}Y2VgALd?65+{a*-WC{yg_BVj$$F>vn0mTUkJTto|%5LD@AZ zH`xK?>+9e0fZca?4a!w^0Qvsv{B-U4`zNLyyHo{aaN7T-Wd zzDSFAkdbfFFz*HVDlPst46^d^dTHd=Gh^3_YLtt;la?{37`+WY~=~%nO2DNsE8Lc-Wn^crO`tDJ}kQ zGVE4bd@C7tEiL{b8Fnu%{t+2=F)jYF@yY_qk(LLoanDOMmuSEF2^R3l)Y(IN_lO>(DLzZTUA389z_{4tarm zKY5W1`;t{Wf1;kxDxN>T$NfEj(oR)8fBJVKJ%2vP{XKvFfb9A6hh)#6(5?qP^b`K1Z6j--jVDX;&oAlA$6Q%R zEI+<|kDb=)>yrFe{RitLoYH^fw^Q1)B?)&iT>Zos+i_ED_v&{Tq&r~SbpMyUMgNuk zCEsaAdp_-Let-G=TiyLNhu7PGp~3!=#p~{`4FZX>U;cj7^42@Qwjj9sA@{GA+xOou z4a7~N59cfHB_m&_#eL)f#=nh> za*-CPpRS8@}H7XZqwqQk;fVT=i~|UUyxxJ(&F36(~O@W zA0+=Jd4^2=bY+(O*NmSdzk@ta{u}ZF8Rb>_+2s2e@AcLs+3PLprz>7>{T<`I-lBfG z;`P=)Fy8Ae>ZdDSZ&5#8@p@~@_RsgHr?p&EEj!tG{+M!&d@|ZkI{)4B(LU5W>StK_ z%i8bmwS2Q)`o-GcV1BoQ<Q?7Uk~!S<<3 zvAsnaeT%Qd|MmQ9XO4AQN@0TnK!}x4qBMg9dP>$x8pjRe)^N| zB_h5yi+HX>wS2xrH}d@|92o7*9k$)mN&A7i$2R##^HEmA`}caR?B5xw^f14jWc&GX z+kTqQ#axKOUDtnzZu)z4|xlpbDQKtxlPe){E_XDw+nreKAz7sy-Ko&%&Wlt zwIkmh&v#mG{S}#4A?c#m%__)G(vCtpRFMDVJ9}j0({hpN6ut-2XYo3ZMei%vk5fPR zkS2NjPAuPFt8A2C!gMdU4_UrRs@wTIu&+t=1~T4PQr$rw=KjA%M*WmjUrI*(l~i9w zhW$;dJINjP{uAnb%I&bZ?_h>CD-x+-Y#*NmWbW7nDVK47mKa5J%knQib<1e`h?SSlUIN!N9;e0C#|7hp& z?@ejFP?9Z&``(+{!<7Zti>YhuaBDwlJ<{m=UDsc(XN~ulReSBej&|NgdG*K{dVG2F zFv81*5UwAzaAo0FH2RS50cd@o?Tb0tuI-&~%BK>8y=6OV$E%Tko^H$Ut4B{O^GUQ; zlkluAglBYHSYFNh+06U74EIxBkNfrVwzBXX+yCu1SYYFCCHb$`Pu6c`{k&5eX}WzE z!_}v35JGz_-(U6m{3TDdXxm?2UE%pxg0=mY@2}R|UoL&f{`vlDz5V5u4%uHD4!D}6 zJMTY#KiUMz-%q~3T5o@C$@u>J<>vDFX&38ft*5Qu%675mH{EXiRyj_eYn%LI{niU` zhu)6fCEN8mPUm(#&ibtqTEA5fmP^~e^3O}SpI%=}oYw!+6fc~|>#skl2jiw3-*p|3 zzE^Q^6+C~R4l`58Uch|x!Y+xG{PZH^qiiek*%8}2ud>5rTy7M0Wd8{5Nw|PpA-WGT?5%vigbX_@>tB;O9#t72(|%X_$*}8LrH_0r)4P}a)8rm9>y1hm zxn%L)Zjb$mAADaUrdlo9@~5`@>dk9-;I)VL-@d;C*U%$1Uuz3Nk6YLux2xU!pWJcF z=R=&X<@Aa;9|GSgKk|GC?6-VA1oEMmYyB?fV(s+8_NVAwN`LmK=SSfC=;iDB9?;{; z*Y;aFmAS5ow4-f%-XAdZ{X^$ROv|ez=116l&|kQ8Uc#}=kGTJrPVD>$Ez#K+(*5C^AJJ?1G|rFcA^SK+H`&KAy2w6` z(Mf)RzIJKHb&$7^u?|48qKAxi01{ajLVxm|bnfrt7|moK$7mw^I0n`UNLKhb#-f#r zWQC7oERfOu@p-Sw3bvn$bBsqrQofT;zMA(lL*7h2NWO|ZO@20cl6)n3g1m{0`FY8T zF7g=TuON?-pG6)aKa-64dC7`rkcSxmbn+nhgwK!Yv-gngg`I0WKLU0(KR-gIT^}+( zVqO`|fx_wDzIfEmkHGWPn;)Ui)p&jc-bUaef5yMVudjd=uwK zAYaA#5y*FOe#E5Zi#R`Gn(Xr<4w8L-#0=TzN6eCae#9JkKKuQV`t`&o#EW*ykXtrf`vn30RlNeF537AM$uU6~y zU}i*&HydMj?IkvLWl*X7fvwuD#UEQ+sHCz%Wm8_HDi?Uyc2Kr#?)$#a^PKa|hsI?v z1Ku)S(lnp%obT&%dC%oL=ZE*8U&(v~`kl;2jEB8uKB7+jO+IgeT71MLwfKlB>VFXN zi+qHS%bAaO|BbE>!$-t8^FA*wtc{u`E$>{EP% z?DKaR-sSz`BV?agpGDLz8>`E5Q= z_9;F>_9;F>_KA1mE9WC%C;j+{=&v!{2OkmrwNLWhZZT|Do@wk@?`QqM#hGX)pLzMT z%Sz@WkiJIZBar?^;vsN1*%~iH{hG-)$s50_C6ih#`iT<`s#L z7+`p5UXl0+*heGr5wM>|;v-;Rjl@U5{xTl{`)o8y^NPerz`h%e(!8SaaFk>6FPr!X zw4X-eBbLH`8;v^Sqy04+s0Z^e#qiR+BJmOP3@^~bJRB4`25Ma1%ID!UzmyK#Cp-6^Y`vn zXy+q*{3`PT>Aa}|A2DPL*1itqAAhd5!`*zubUe2oA2IaBxHY(ktKlPjeD!?%;tP4b zO!wA#3VI158L0T79TNAEk0t5T71L^wfKk{wfKl3YVi?+)Z!xssKK3dMl00fBQV}& zJ_6%m<|8m(HWtN4U_5OsijTl}+gKDIf$_Mp_(F_79s0j*EQ*g-jqg!X*Ie9*=+?VJ6xzftJF+3yyg z@AdF(1NZCt?)+h&VlV!pn7_!!smq_2^3f-Mk)J~TqI_z&zkLq}G=9&rn zv~M84abq3&9ppD|f}I}7Z#3gJ`}+lqFKvz|$v=MLH_#t86TiWJPW;Aw_7Y;B=0oH+ zp2WVnamDBl6TdM@jR|l2Ec@ZaZ?K6mG}*gV~OA3IG6Yhj)RHc;5eE14UVJ99|gzR^mqOohfj*%=wh5q z{wNlxZ(;i8sWI-@x-K=wBYU5t#yFME&pF9)P3P^Lti|(o^Bey*%A?3{_>=toa(oHT z@EiSo^q;maf4@8|zj3i}-)?^6-Ide!`~tu6C;oef;5Q=PZhixH`OKZIFn}xIHR5^3 zYy7eQzVRB+qtp1Vf}<&}Ps|nnp2Ei+yU)w%{Wk76ui-7Dz-z>Fi@b&}q4(o8yd`=0 zmwAof{c3_;U-qMx>{hpG}_!eAXh_$M5^UK79bMVb6a(cnweY zzPyH~;~MZ9tCrv6^k?CgX}m_1`!(b>!afVU26f^!sIh@#ezK`Q>D6q!1vucwiNtF# z{0WAGw=3`(4F3ef!QW+n7U1t1Clas0_-S8-I`JA&9tB>5`r~~57B$8>`#T3}Y&;pS zLH#ktU#EVQdX4%K>Q(B8slnehPCP`t%y3ND(%-F~s589BaPPIe{JPX1rCy+Zkb0i_ z0qQyG`>9*d$Ioj-xf`z$-}~?y5nkjqydy38v)FQtZuYIfYeatf@fx15eRz$imjbUr z{nuXeipziR|JSKe?*(3i@qd}&u$uy}!SKJyaM)de*I@YHVmR!!SxvkK!xOJTop=rE zzsvhKsS~e3op=rE#A{F|UL(q}z-v%{jn5}{n|Td}f1Tm@`-1|n!SMfz;bYX_phmw` z;58VYcn#{rYfvX%gL*fw;p1}VHEz7o^`UqTA7`$f*NAlO!)rwNA$SeePvSMG6R$y? zcn#{rYfvX%gF5jV)QQ)iPP_(n;x(ufuR)!74eG>eQ2$5Px9l_V8Vpao26f^!s1vWj z`cAwC_3!ifvd_e8F#JC;T=toG4TdLPgF5jV)QQ)iPP_(n;x(ufuR(oeUL)@B$7@7? zUF0?T*thW-cGdc^iU4T8q}qEMdmdaUYb{AUW4JKc}3k{xD8c zb6(N-C^hF5nb+X+O7n`$Yask8c#W$4vi7;I^BPeN*LjUaya!(euMu`x;5DevvmeHM zxxi~MJncneMCtia(@fy^>&gW~~O1uWc6R$y? zcn#{rYeYX*;5Dd!lh4<6e33F^daP$yo4 z`Ut#+&7YjB@b`J+HR3tG&hXzp8N5d5EAeMBWa|}&;5Fj8eR+*9qfOgV%T@Wa@b@9l z$3(NRK6ADezw7C!TdbW_}kP? z>MiQTYfyiI;TzP6*Pu?k26f^!p!ec64)kX+9rqV_4d~?00_%0n#A%@ZI`5i8yyVYf zCA4uGxSsr3pgucaS-|zoYd~jS13LM$Sfl=-Ft~Q|NAZKyD5nCi!T5>SpiaC7b>cOs zKgj1*q82N)em8ZE`Y!4b>N}~&sPCYLon~GGcHA7UF&uWD{aK)0 zwJ&1+C%*{?`?Hwk@A}(~t^e)vXMueq_h)h1!sVC2$A_+MF&dW<_ZPT~&~Lmyi_80? zgSd>&saYTP%%8;!zCSXJ@4KhsyPrRc*zdB*$*SGw^NX&XW0w6{Oh-99`vsJr%B|c_ z9(3ME=M>ZPDAV&1q^EN?(%U|d_O_oti+FE^*;TG{5njuc%A1vo@cD79#};@9*TzGH zJ-vSZEYM%KUqSzDJOui~#6zIJDew@HzJvW)OfjDC_FBH^f2^7OS+JkWJOtyvi}Be{ zCVv*}M>7w>`0r-?A?n0KP)Di1CZAm5pXpnfmIx2UlYp8N=B9)jWD z!}#me*r2s@)~JUVzDk{V2x|1t?Xw&w)A=0p3{N}+^=*7!i~4)1XQ^+e=J-?%T~nxIYVfZ%gNU3`P16<{=PoHxJ>dw{Z-^Zuo(m z`l|VD`r){I1^z4sBORTmE8q4zJC6@Qk5=$q9f<2ip1{wIO7G`3Zq%%;`?&G{+4&~U zN4N!MK4LKLFY*y5ExaEe;g;HukNDq;{v@BbNcNGRy?*C?c=|j&mn=Q*&%&RZ`3R(^ zn4dBq@sFR_pO5h8zaD&qr+Ys>BGPdU_=s;>evgxn@E)q&L%Cl&K4K^AD)SNB)Y`|` zqQ-`a@debMwAA=}_XhQo)a%qwP_I!>Qm;~ff_jDeC#aXH#YZerYagRWEk2@44Gz@K z5vSHZ#yqw7h&gKQW3;G0#^0Z%);`7z^&t>Lv3LsJHCT0`;2xS)krC9|60_{w!cOnU8>7Wq%g1yUa&SgwtA2ClYK4O7dd_tFO5wn7;#R@e#|^zryepYVi@P z)Ln+JQHzgQrxqWvLH%Dd{wB5fh%IXI5!=+_BX+2F^ASESXFlTnH@ZFy9}(jWriEAG z&w}%bJOSxi|k zZteIY=DEB12&6Cb5lDabXMy}>e-_Ap_Gf|e$^I-*e%YS|$~XJ7K>25X7AsLcjl@SR zQAa5~!%OpuT%npY$~Vv^ydc}1h{ z)nN08I>Wv83iFD@M~pGNG_Pnp!1y(Wm*y2$!AJOfRr^ZU`G_dy>wLuGK-k&Q`G_Ih zpZr=_!#u+X?0_`UIvzTDG_z1MS?9XC~;o>8vsl`XkP>YY4 zr4}F2q81-9M=d^Lo?3jw0=4*vF17fG9`$c9zf08OBbKSfN32kbk65J^AF)O)K4P6( ze8dK|_=rtv@ey0p;v=@H#YgN=UpXJ)^C#yc{C&QC0ppIZPyF&v_!(`+J(V&v_pMu)96^2$YjJ2j?T)j@su?{~E_K zAA$E^=Oa9x?#p~cC4TQX_z16`&NqwW2`#^u5`3Us)jYaVh z7!MkY;v?4heDM*h)Z!ynsKrMtQ;UySq81;~qZS|0r4}EtKrKFEo?3jw9JTm}7Pa_@ zS!(eSGt}ZErlI%ZBM$UuQHlFAA2A4>{8>zd?mRw(>xq+?!u6+XxSsr3Oyc^BBe^^b9i1l?_-`?e8d8^_=qm`2Wj6u>JjQC z>U*e{slShUh5BylRcdThw-?u_?_~Ho^&Qk3)M!xc#ZBrO!?&q#hrYNKy1i7#_u>x2 zu`jl_KMS`1La=k77C0{rbJQ?#m71u4~Z!{8_|&(B?(jH~U#T|19wq?01XL z_j=gv&!U{a$@sy;__K(7^zmmA`RJ3s$WI}EQ9jIH``kp>-+ulq;(Z#;;X1eR5bWa3 z%5Aj2h4w4Hxp*FluNSw^(eB2OkLPSo=3K||`LmcpKX+l0{oMfiyTosxKg|3F`?&-C zS+L(s{w&zfCVqqcaN;-EPbYsC?8g(ov4(UdeuLvc@@KKaaPb?<)ZRL*T(z%|&LinD z+-F}N-lax|Z2ScEdl^1Y{XXhBYBY4?&8fw2%ufLTyg!t#-UXk%l$q6x4r~^ z!-=EJZ@^B9{Dxa>KYqh4yC1*twHI=I9Lm3ir7zY;EIrO|_;WMAf%FvfQ|34R>Yv@8 z-|+mu9{h%XcKpUv*k|T9CaJ}5Oi+Kye%hCm23N{S(v}HwykO7%qMT@56=jNTNIn{w=7r z&$2}=eq)nb`z#yO;y2c*wa>Cf{Rq>yO8qeP3N|_2d zsKswAP(R4`gfH`b`d zZ>&>`-`JoQzp+Uzeq)PT{Khu5_>CQE@f&Ej1^*UdM}_l9sKsxfUnrbM!f^2$=vNBo zkuY5R#yGY3jXJgX4fJcxs`w4`d(Eo&jVZ?8&2RX)T;w-gABNwEaR$@EtKc`#4)^hI z5$Qgd-)OOZ#Bazx#c#+y#c#+yf9Eyth|)Z`Dt<%uDSkutDSkutDSkutDSkutDSkut zDSkutDSkutDSkutDSkutDSkutDSkutDSkutDSl&s^)G${<5IIKena*text_t;x}ZU z;y1<^E`CGyDSkutDSkutDSkutDSkutc~pL*73t~6Z$y8M;U4Facz^8+D)uRyM`Bma z4ld5bb9VC^NMGhRkp9eXAb*+PK>jnof%3`x2Ffq<8z|q*Z=n1$zcCc)%KXM4wfKzz z>e9R-`?rYpQSfg;U7A-UegpPbIFE$!OY@3+9tp!s^NM^P3BybCihLdk!|PrRHjhC2 zE1XBd@Y1{@`?p~D1H6BZx-_r23Vy@ikhSl1o!^LJzRqtf&V-#Eo!`*7b&lf@>^Aco z^LTz${D#J@Z&*^-_W=venaDy_>E1* z7r(JZEq+7emiP^gTjDn=(T^4UTTqMNK)=_lir+xLSU8V_@x^bTUoH5zV7T}V^vi|w zNEj}D1O0m8JQ9YB-Bs+_zjGAh4V<5AMqO)FAL|9FkJiw#@oVqBn%h7u|_R^1LOHsoJSJR%lyVH zbmBKqUv?e|t|xwDCA6JKg6oOj!2HAfT;O`*Hx{51ztM$G{08!o`3>YV^Be1kKm3DX zfbB(;Q|31|8U6zd-=Y@3u}v+0V~1M&2I{fk-y-U@a2^S@_zl=e;XD$CW5c?=2sHz@ea>##D0>$4B036 zjnmdYvmfyOd8i)ek;HQ|zk%O*>+df)9eq+n8pFw#P%VE>6-;3+M z+_2%g2HlU}i1}b)-|W5@3;lO*I?`QyzSqNUexsZ}>{A?u--vwl;Wr{5eexIiDdaE8 zhxxPfNWu>H<2T}c8qMK4zky|uH?7|dJC7vn&*$&4UVIv=ggZ3AOKb z`Z{xs+Dp;(5Vg;yTn|!<-x#2_7pe%aP``(o<5c#)fpW;_kx+}@;5eB5Z!lc^2FKBS z9tp$6Z*UyW=aDd6{Kf*c_>Fn$TbbTD>f5MW)EKAiJQC{L89q&23w;=V!%MOszcKcg zE`Pr~EWh#o!hL=D4O_C#{Kj~s_h5bl@eadpjDP=)NASNf7U}3bjq`6hkB>l)*6>{& z`6DmTBJWTyo@eTd0QP@>kN>4M_zg!2GQWXycZ&Rm6FvR-4Y!8GoAECh_*^RHvx5&oW8U>>OJ!tu#3!Zz-}_X z0lUil2J9~L8?CU5%x}z5i{F^17QeATEq1N~OBDt-g~TIM&6fI z-CEA@f)+$;x}5<;y31~#c#}0i{DtF7QfM@7QfM>7QeAX zEq-H}TKvWewfK!yYVjLu)Z#bRsl{(>P>bK#q!z!iMJ;|~n_B$F4z>6V*{Apo*{Apo z*{Apo+2>LD4cJLve#7jw=zk;nYhO^YPv$qqea3412IjfD`3ex5isXM|j^U+wMe@Hf%ka{?BKhB#W_W2{k^FB=GQ2deNd7nK48Py2 z)#fGR&{x54*tX+!e#6?0uOxh;;iYPRUTs{kKOcVW65lsouyDIndCI=y{9DFTxL^Na z`xts(v8AAj?<>02d5V`9-@|Q)NnD`cce8!m-`NTKaDO+(Qj1pkslxC3`_WC6yEx9y z@&)vNpLujP;-5P49sY9_k7r4-eXEhM ztE2N9u*-Zt3G6oW8xweb;x}OT+5g5A!^Ll)-DG}ahT-Bj(C)JTjTXbjZ_H7P-6V0HEQu2>(t^mHmF}^{7vc=>Md&d z-`J)Wzp+F8Ta2%9OZ&cf}reF5W+uTQ-HWB%Ta@htca z3#Yx?f5oy&r60es;m`9%WuLwI4a~Rt@f#ao#JxTco-#iS{&~v2?6I$1!nRbT!|mQb z9`8fngLO-958ht=_kDczeEi1e^Lm-`6X~pnfw#}0{&({mW3dk6 z{x>|H?#ui}Eq?Df_zkb0&NqjHS z-rfrQ##bLJ?EhUeeuMpo@f*?3+_>!1US$0ZLuYnx&Sfa*!q%+#17QfM@{srE@K#h4#XLO#r z#qc@kBm3W|#r>Jz7=upy#!TqWC5>KV8T5#Ba>v`im2|p7@PP=)`YKK_`9# z`N;eR@|pP!ltcEvfpW_HMi0+R{x_DW#cwQAi{DtG7QeAdJwkh5qrQiFom%|H2KC(x z-=w~adW-r_>TT*fsCTH*pxTSDB?2 zeg@@H~DR1_IlXOZ^t74??XJDui)3?ecJA`|HXVg-luv0CB}cj0)2jdGq3x7@jh+e@jmT0+fT>8_Rmi- zp8tNlpL`4L*XQrCUd-n@zu~%lj&?VOCmcV&(Lz6WVV3>fNPIUFzk&WR^Be5v4&*o3 zZzg_Y5dCQKzrlVu@f+-?lm89&a$D@*7^-{rC;9S+9>;sXp#5`saM! zBH3p@e#6rj>m!yP=QsShncqNqiuoz?8z&##pWpE3YaO9|7VCbUld^lP6LwNN#Cl>U z^$VNPcXnu(r@j;Re(9OWR(hX4b>ah&?)~_UNC($5{r%R*1NXyK^YWSD^K2Q?$A$g! z`+JWZFTdeAH2)i62iK0@K!1|?4fH3C6WV7%f6_Q1egpkU_mAK{BKZyoWH+CJwd%m{TTHI z^~b2!skP6tM*RrGSE(PSUZH-7dYSqR^%8ZRx<`GQx=Ss7V}V-xEc4V4F#a6%{nRb! zW9K)}kD33CDF40r4fL~@@f+5biu}fw^-XUbegpaG%Wqh|_U1QGFPYy!y=8s_^_uw& z)O+SPU>BL+fZb$%19p}94cJ}gH&((fGQY7(Eq-H-TKvX3wfKz<>c1QPtZ`}73)EZG z;y1Rb#c%9Ti{C)IE%@IEJ1Y3!pccP@excxhgW+BN{s^`B4fH$Bs`!m@hKt{*Q;Xj~ zzn1xpNrwL_pFc&to8RzpxyWz0J`BGRu z#c#+y#c%BJe(@W!Pw^WVcbZl48yJ@g{x@hJ;x}s4n8z4LPAz^z_9=ct_9=ct_9=ct z_9=ct_9=ct_IXr(qZR4v%Wrspjo}{tH@v^LYyQdn#*SUJ`N+kYc+PHq1L@2B2GU>f zzY+Hp{BKZ~<`s=6{b!6PK>1~U1Ld3f4U~W8H-`AU(!8QknpY%#1NEQz4cJHKH()=F zMrmG=_zm=r1^*jiUya0Xz`gfH`b`dZ=l^btKv5{82;;}ach}+i{auo(C;*> z;x~2}E`9_3R>A*9^n1;!_>Dno@f+wD3;s74zQW(vxFvoA{cf`=eq)^R#cycb62GBw zOZ*1<{bp7C2F8VE^~(7TpFcTg;p-6Qel6R#jK6ocLSK>pjYIJp)A8JX{Kn81 z(WZSMyc&MP--kROU;J!dFH?Sk->`*yU(YG?8-M$!bNs#e4V240ws;ZmT^LUH_rJmP zY&`#V;x}f{ZuaCiP)@$joTiUNQ{~IWGmRsgG zIFDO=2IW19{xtI&sISa#V7w~$-w3-a_}`!wzcCfRTkyX@Eq(+2dFD698J_%aQ2#}y zZ-iR>MvYqh#t^mmjX~<4Bc7M}jalf#Z=k-+{|2rneq$xH`QO0x#BX5!Vg5I8J@Fe0(23vZ zLMMKM^OE7QXqa~X2*QVdhPEDyS+HY_})rw zU2ji*1MTlh_>I_4;ywk=PkHUM`T-wrhU&K)zcCZPpZN{^&Ku8fv?5(c^1osGX#Mz& zEx&#yiaGU%UJjdny}&nYxUL~yKYkR-e86{qnH<#w&&U`tuu>k92+t{IML&Zy?@b_>J+uT{!~3G4{t^ zVCH}0+wuK4{J?ZZ;s3?3KgEGCe~*8!jYH0FxJ71u13Xlb-*}IO_v1I* za=kvv{Kmg8`saM!Q)%xL&*J+ziywb4d=}crQ%_&4kJx!O&Tsg0GrxiK6!TN&H~x8j ze}2QC|9bEnp6>nljY!8e;5UBT@_U^AH@wF({~KXP*N)$SKcdWUz#mcOH{g#b^BeF- zl=+RFNKfWBwyB>8Lo)vx)RWYk)Z#ZbsI||sPOW{GHEQu2tJLB*R;VB6^Ovc$&$2`< zexpbI7~^-T#cwQ7i{F^1);`M|^~1csMU4rCt&>n=0%!g=sOyYBO?{eriu$9}lhhAV zPf$NVU8laEdK~)L`3>}A=6@slxxM)f^s_~N!*g2XH%6?Vd+YEU$WK3h!}GN_zkzzm z{08bR^Bbtw%x|FHGrs}5$ovNECi5GxtITh}?lQm83cJYs#vHZyjd^PE8w=FpH@ei~ zH+s|yuessb{yeq#jb&=_8!Ob}H&&^?%KO)-zec@IEq-Hz`s)ner0!C0QH$T$rWU`k zLoI%Te$=x6jj-d)Z_p20IzI*dVn6>IJ}wve4cF!U?dNR#jPdlmmlpkR_;`2K{08R} zd;8yrd>zbhjI(^iZ`7&(4a;|eTKvW&wfK!GYVjM>)Z#a0sKsy0Qj6bcQH$T0qZYq0 zPc439fm-}VmsFCbi{IFx7QZ3;6u&_~fK~AuvQP0Fvd^RP8|c^i@f)YjUW@!j^w+!ijdAP6tsl6E zdG2n01L@2B2Im#o|3=tp<~NZ4g8z*upMw7l>e9TTQJPmYO7n_FX0r;x}3hFU>0wzcIt`x>tkk&rDN$ z?YW+!F3l?vzcIn^2N=IjU7A;11-}vVZv5FnFC9@f$nT z;x{yIiQmw;C4NKWmiP^gTUX9+#Cpj);LoOg0ppIZPrUM=zjtFibAIErHMKI&(AWP) zas9=fYg4w$hu-V|!XJl!w=ZD6)sNrU_>#wfUyZBbH++2cd_3|O@_L!_$ z=>9k2{>*QTK_`A=CbaqA!1cs$v~d0DI<6;v1NGN=aRS#9zcC4&_>C#(#BU%U1^*ie zPy7bTq2Pam;UA)Xq8yvq{|3XwZ!A-b-&mm*zp+X^!so3~-$T7lEq-Hz`fi4AQr|_r zMSUmrHuW9UJJe`U=6@sXx;b29IPAROe?fT>IQR|gpV<%ixH0q<>knQ*|DE{_wDUKf-?+S=x+4D@wvX12-x%@h zXHXu+a;W+BdvV>D8-`rhp!@L~F(0&jEA5+o#mZU$VVT3Bl6KFf03U;{>BRVGyfZ5hx_pxF@B&qT<13)f?d2~bD1}(|BdJ;eEuHm z#rGk-&TqJGpQGK4;rj9O8!hy67iQVtjl_56H~8Lm(h}_HJB$9Oc_6>RelzhK>}M0d z!G1XL8|bJ~qfY)es4;%D&rVW{-;KUcV~Kfm$XjhWxr`6Ey0!Tbi|9fsd%J$%a%_>JvI zN9SqqI-SS2phq|HUEK;UrpPQoqwfK!`YVjL0)Z#a0sl{)!sKsy0QH$T0rxw4lKrMcwOD%q*M=gG1iCX-|GPU@P z6>9MttJL3Qd8|?YH`MFYze>G9{SQLlRGEtQ=JO#Rmy7&{>%;IHG0t2yzp)wV+S~ue zPJ|!KZ^%ByZ&a9H@f!ow;x`7Ve~0BWL@j=!MlF70gj)Q@7`6C~acc1!b!zb&6V&22 zCaJ}5Oi_#9n5GuLF+(kWW0qR{MvGef#vHZyjd^PE8w=FpH@ei~H+t0KHB$fqw*U&aeqI4Bl>F$_u+pd`fKa!{FD7}w5%7m`N+ks zc+PHq1L@2B2GXDXZy-^NPf8%rd+*uSopHG{Z~tisXM|lHsL!MLIvF&hXN_BAuTy#_-a-qEYv1uz6RF z;isvGs7v#T#BU5Ryfm*!{x>+UxC(ybJ1iyI_qxt+M73P!Hx}_8d~|+8C26@f)ku z;y2c)#c!-ri{IFwzH)xU=TGi`!{6uI7q;R#zCQ7DKjQD*JE5<{|36!HkKgEi5pCKB!mHsoe0=qMeD~9Ny-fLu^&xX{(2w7^^)osC-uwp2#rcgG$MKrJ zum26DXU6{C=k0TT%H{n|_9y(yvCgjY7Kh>dhR=iA=TQF|$Fl#8ZQ9#j{x`4=cpUtO z*H7mgsMpMIpglbM0nE#G^BYL7^BW!`^BcG>&Z2z{{cptk&P!+`Zv}qi-~DJ||L>ad z8|*)f--vZc?_})LUS$0ZLuY=Y7Iu~S4fLm(-#~q3eq)63#czyLi{BWd7QeAUEq-I2 zTKvW;_0Pn3*%@7-{#oi}YVjLO)PITLJ!Bo_@f&sMBl8<*_nF_odTlfD8zb@j&f}cNBz|KY*PpJ$ zcQf%DW4Qj}0Inx~V-Py=8$-~E-#|Vxzkz(_^HWd`ncqM;W&ax}$INfc;Q7PiH)g5D zZ?vdCNc*0n7QZo1eGkJIsKsw|sl{*fsIg()UR@)!9jpWiS+KrZ^ZjFn!|N|1KTZc zV*eXxzdnDD_2THhHt%xr}I?B@>TH#XvV z&BSl4Q`<|6eT<)=wuxux73z0UFH?UP^%AxCjUM&88Q!H9zp+5=RE+=LJhi=0g`T5+ z4|R(g9kThapccO|LoI$|np*tE6t(z`Now&M6V&22>eOEAp1vV!j34c@gVeV$e1Q5^ z>I${^4bB@*ir?V;;v~m4`AI)ni~A45Z+J@l{j%(TWAeYa{QdH<{KlUt+}EGqxVhke z13b;a{08D3hTmBEwHuDWZ-C?JJl%`(?mWKqZ7)DOj}PC~rMOTKg;m)Q>QK73znnccNW3PGCaOscuta z0%!h5sOyZsNqw4ngIfD6>(t^m)~Fv~{8j4vsaK$no!{t1zT4-Q<9ly@V<{Kho3_>CEA@f)+$;x}5<;y31~#c#}0i{DtF7QfM@ z-pz0LxLo8nTpxzth;haTBm3OU@uuAv58ZCp@jZ)vs{I1{%b&+Qu=5ViM|-_U*WUcb zN`xQGZ^%ByZ^%ByZ^%ByZ^%ByZ^%ByZ^%ByZ^%ByZ^%ByZ^%ByZ&X;`;x`7U#c#+y z#cvETT>M6jTKvWcwfGI$r}&L=hKt{*Q;Xl2p#J@meTv_hVz~H?X=?EsGt}ZYWS`(4^Zu60gOYxlD z{07pO`3Dn^m*y3T->5LWG_Oef2HH;}`QJeMYBcIz4K^=B`^)F2 zpnWzPrFli-H_*NtjR$x?+J7VQ8|WVzSHW-i8@TqpuJapF%-8u1t;6&0;C+3;{#VKS zsi*$LORD*!z36wFqi6B`l|}Z$u*-aYipH(;4A;1Ifm-91_zkp+?0-Y!))M1u+!DW` zaqHI@zQcKy_zkq%%x?@tJ8o9RZ=l_0eq)H?;y2K5G^^q_Mi?%B1N}}uKV_WZ;y3El z;x{I!f0OB*q!zz{elee)GR<)D8|YV?Rq-3M3>UxAq87g~M=gG1o?86I0=4*!F7=i3 z8$N$>e#56w?F&os9ABUKGavEy?v>ENZ&-MlXXxjDW9m@;H+u2he*DJNm)ugX-v5S= zubz+p2;1jS{~E_Kzp+evGk(M3>AviLqZhw-9Q=mYPv;v*Z{|199-jRG z=4HG24W!rk4Udue4O~ACek0y@UVUZABi13U9r~xe$odMQdb7_ajADHxyf`6-+?E{fmihTZ1#Qx>SjZ=gTV{x@0-7r!w} zEq-H$TKvW|wfK!GYVjMB)Z#ZLsKsy8sl{)MQ;XjiqZYq0LM?uyM*W2t|2m^X)Z#Y= zsl{&$P>bKFKp&akK)cWU#xnYy#BZR!I*)T6llTqPTj%Lj#83PN>aX+S8m=dPV;ws2 z8ynDx-#|Vxzkz&aegox@`3;m)<~LA|ncqM;Hxs{sdT0)d-#|Szhd)UBu17iM^HV0M z#cxbfi{F@{7QZn~Eq-H$`c6K7mii9r7Bw1FdvT7s#_$E|+o3Pchi)&Sy|ov+49C9M z-u%Wg;~k#gi2WpAytfbhZ`^ztw=iTKdi#~7cy8u5@H=ljzp)bOItstBZ2M^a_>CpM zeg@@Hhoq$z^_{7wIlO-|JyFzfsN~*4+-nZ$v)& z@EehjKKYCM6!I74!~C_+p-C30T;|Q`e*^8;=kKvzd>_*5 z{D$lHIojPAt{*?Yf$^n%0pm&H;S#@r{xI_!?B@>TH`s3`eq#asWAeYjemMExXfa&; z#w@k?4fgZt{1lD@$^XU_upAl-W6^}ncjfML5 z*&4O@jUj6B8-vv1HwLK1Z&awoZ*ZJGDSm_F_{m%N`yA)f`6-+aoD{#Yf^k0a8_U!j z*UobOak3WAI}E?!Iqk=93>n1k@1@?p{QdH<{Kjj4F5kDC-*|V$Q=0v6bYs2eV15Jf zcJmvyAYh+o?i`90>JNR`5^A5DDmF0K$J?J@`HRCLD__G`rSqjZ|MEW<^DE$cAuBeU;Z3;4NpntH5TIjBCp~6T|ZvqCcEB`*LbYxkMntp zWS{+b4Nsq^=SM6(&TIH{Gp~X46!TN&H9l-*cj=kPc$x8WYr$46jqm-^Mt#c#Sb??W>GXi`S@8YhPuETD-;}wf0p8sKskks2^i` zcA{N1PKejorhb&+ThxzGZ&E)@y+QpD^*Z$#>NV;*^(ysg>J{pbQZG|KNWDb;0CkW0 ze(EmtvGW>pQEu(?3-P@-uhEV0BCp{cX_41hbB%7ca`VqeHY)AMIKEx1zvfqN`?_@y z_VINkYogX>F`mEE?(>-K#|Avu_6sK>{%5|j-aOKz{o18lJDcc@5M{<~2}nnb$zQW?lpJo_P(}MdmeNH<{Of zU1eSac9(gLjj)T%Yiv@B*Vv-|FOko)+tlJUcBsW`pxtC%1MMpF8fbT!*Fd|>yaw8B zvnpN#?Yde08h;<{zL|K9@vx(2RlG)>y36)teHdON#u-cluY%W@i*)VHYjh+0U|vJ^DPBYNDPBYNDPBYNDPBYN zDPBYNDPBYNDPBYNDPBYNDPBYNDPBYNDPBYNDPBYNDPE((`Vy}p`xLJs`xLJ+#Q5Sh zYSiL2WS_rZvQP0EAv z{(ihh^w${f!{0{q*M8AHnb+6|-M%;<&)LmuAbpwFK>9PUf&67&1NqOq2FfS%8YsWa zYfQxNW?lp3pLvaOhL`3Q>AaK?hL`3Qjncd#@fw4SUz%4WUZcYB$D&+1RoG`fF9r6S z&r5-QHxjP_`){Q4QqVpciPu2;$-D;ISLQX){xYwz68(4PHI}I#WcrqW zpk3wjQqbHyUnV24fM;+s(6iQK3}}X47GTT zS!(ebE$S=hHGKZ$yoS%v+ZX2JIlew|;$DC6?uK?=!-uLeztE4@7`OR;@DLW?pX=`# zyU$CRi|6*^HO9YeH`vGD%df`YhL5kFk6(QvuX8Cso<4um>BnpQqfh1d<@{z|1Lbm$ zWiG~Xyr%EVYbZT`Xy>uKeRz$_`<={($=?RbN!*1kRfZk4&!PS`j%8kBf%bMo#M6D5 z*O-fTejL1p*H7mgNN?sf&>o)s0On=8c@3o3c@2+|-iOcP`f>0Y@xJqt{g{1@&TITC z?q7_rikIiKwcE}p=K0<}Y8KQP#k{*SiuVuWSED~Gu1~JoeZ}=hU$1mO$M%S5f4_KN zVZZNM@fsJ{e;BV3>yB6!GhT!BH;jBW=;x#}it#A(8t7j$uYvl?yavXr%xhqL%De`~ zuSViET4A@D*O;XiuYvwM^BPkO7q2l%EnZ`STD(S`TD-Y#_PsnE9|8+it)U$7q8L#V#I5l{}R5> z{UW{>zs&p5?lZ5kfbpKZM(6P^bmBBnf1P*raQ(!G!ywu{)MMwxC0r+`(S8N>+4;&c zt|wk&1v>E>$VcWikk8C(pd2!8Yt(?YoH!7uYr2Xyawtq^BSn<=I}kp z-y-awIV@fScG4Wao8k4S$L8=|)DzTqQcqIfK|Mu{2Gw4ip{_A}mil(+bJL;Q7gwX) z+KVlQe{Y008@J*6#I5)~<8L!I?^s-5Jn|a%Vjr&gGS(HJc@q0Zci-^k*q6G*_U_}u zlx^6wUzv~lGnawq-S#}5cT?q`#P8VO{e?aGep}71*!v{xtBU@u*spnicvIz>2)~5a z&*&%Z@@tn+T$SgnpY!Lu!0*reX;;=S@6jI}bS_Hg)SyqZDxF6M@coe(1}mMrcYIsQ z=4e0ZU%U2uyua<)b)WD2hv`Cp%YO3NFQEMPPS>PAwz3yb(K*HRJj(QZ1nKGAjr6w9 zqrKf!!F&9#e>NT${_bn`pT2J%@2xPq>wYaBLixO6i6Sx_z!2?d;}{n6Qu6tB=3pj&4RbQ)xdr9^vgz*75zR34DJVcGh_U?YeWu z4AwrKdk6469AA}7+P`3bt^T>K_uRxopufpH1p5*35D$5(Z9m}#Po;f7AI-?#YuGO( z9)kT?;vv}2B_4wPU^ zo+ciG<8I<1x_sXEGW`qGw^Pqi*Fx{+A^!M}Jm3=T!|l^+v>y-g2Txx9{&rX%;$If- z+s#AVZ0+>M0uQnCZBNg^JOtwH<{@B*YS-_ycGvo*@ex1lPqp`D+w=C%!FecbrCjT?R*iCbLeBfudQ`3SeTetd*mW7i;tM4);`7zHO9T{PXiOlbnbfM zBPJRDQKol-`Vs0n^~2QT)DKaQQJgHwDR z&LfH6wev{gdv88sC&G(-gy*!#N6c71_txPfke_~hgy(B-J_7ZU`3Tfo<|9zAnU6rd zXFdXUk@*PNP39wDSDBB1-DN&vJnA9y5p`)jc+Cy3eRhWW zW$Ib#zenAo{`=H()Z!!Nsl`VuQ2z?!cd5lk^r*WGU!oQtu}m#KVuf0K#47bSdH))< z_=t6C@ev!;yZHzomop#n{u^B%hL4DG2Ghc;;3GC8U3>EpI}v^`A0hh`A5md`#YYTK zi;ozj79TN0Ek2?~Ek0s|T71M9wfKl}YVi?uYVi>h)Z!y1sl`W3QHzh5rpCHLwoma9 zvkVs>(V`X~F-I*vVxC%j!~(VWh%UAGh#oc8G1_OBsKrMtQ;UySp%x#pO8xDUeTt7* zXSn!?4eF!v5j$~zKR)8L+cSoHoJZpQb*zFE`G}TXwSM5@Ry=1nAA$5`J_6~_e8gJZ zm-z_fKl2eNpUg*~{4yVb^38k%%0KfFT|U1wuSk5vJi|-#io{2>7+#uJG)nV|#79gs zeraBj{8>ygyfm*!d_XD)n#k{xxdx5$n|ABQ~h7oR9GN zlXDFIKHt8u70>bYiGTS6{@%S4+WCmn7GCBB`tcFn;`)m{*H?OW^AVfz+h}D8e8g8KbNq6CGarF+aXup6yYQO6FCU@w{GWE- z$=ipIxV+!l%}1b|#5p)0;dW%_kwpD#9Ls#fHtp?(h^PB9AAxm1-_LiudKJs+6<<$v zed#Xy$3CZSaAo26iuHcqhxqgfT)6a51XntD;`<(37xenE^GM?NGarHWVCRuos6GE> z#P@Xh4uI{qMSSNYJVxdtaQ!&=hAJL;0AJL^2AF)6!K4PAFmcKVgEk2?}Ek0tFT71L| zwfKl>YVi?M)Z!y1sl`W3P`CK|b?CkLhzket5oq_BkHC6u;XIOfzMV%B>$uItNsQzA z)0OxxoJWG|FAm^(@@Fv!o%o0$=)^}LADNFpJ~JPIa>#rH$|>^^D96l4pqw)wfqKY% zL<_&4{8`LVkA#8Sej)We)C<(#N8P2qo4QAhj?(`Ani?HpdvTfi4#r=hMuW2RNT_QJ zU#Gqu`r=w>JC6k4iyI8bzS!RWEVdbse8geSBl)K7Cwb$y5Byo&c)34|Z`e5V%2qr# za})TTH{PGcPNYlw$_H^1mwYqOKK^HBvzG6E{w!wv`WeJ4`kR>c>-XZiFE>oNu0i+n zXA$#3n|x{CZ1pD#{WtsF;`4o9Z?`{-a{jPSu@`?)%wOaK+q#$4XXK+#{vtnx{6+aN zf9-Q4-}apD=g%VEr#WwU&gQFr>kIro^$tAP=ZS_9M_=a8(>&v+KI{tdPuREoL3n&~ z6Sr@CpHLLzZyylfl5|;o2P^DSeEOxwr$)u+JBh*QebaAKBhw`v&qGH`e1q`yJTFYTpDqJ&@mM@;T?n!@lf15`61DJnP~Peop+xeO{}!-|-L{c=Ji|8yoSw!g(arnDE+pB-A$Xw2%DjH50$F%y9huYg#u= z{07H?#BX#N-&=z}Z-H9;#yquKiHFZod#Sr_QKLh)^GK+DH{HW$sIgGrK08eBo_@f&q&@f$&_mE`Pr~EWdG~aNllzJ;^p)RWXtP)|^Ee5ux{#cPaH{{-WYQH$3Yq1L`ijat0M5ViJI z2B|;J=M7L}oa(r~%r>R${ zwXd>F{UF1as2`y2QEOkN3w`|lETY`ZpGAD{&1-ZcyvS?#NK)iA)~ug<>+l-LPd{G6 z^R+jxfqKcj2I?*I8mQOIYoOjUuK~Nryawzh^BS`;r>K)WgUvxs^w__LrEuYq=1@Mpnr@fv8?1%DO{7q2l+EnWltMzh*|%^O1d zEc%sZRlElJon}?M#uV=tuQ5$6USoz@yv8iGc#RhIKZxJEsWRn18|$h*E@xij#v5Ii z_p_ff8~2&*rStZWecTUAj5C-9UIni)7wOuY*XTz0!Muj-Q@n=kQ@n=kQ@n=k^LJSO zvQP0EvQP0EvQP0EvQP0EvQP0EvQP0EvQP0EvQP0EvQP0EvQP0E==Ymd@fsKxnpN={ zL#$u%8Z~P18nRFE8euQ5(7UZYOEQ?gI-8nRFE8dHofUSpbCyoT&kyoT&kyhe-h z@osDHCHUR*_&dJa-uE}c?zBH}Q|0f3KJ^{`_U-Mb8~69)HEy@?BCiqswJ)I9r{K@R zEZm-RaXy~2o7X`4GOvO3XI=yO%e)5ipLq?GPv$jHewo*ph~Le;2FgG48siKv%_|bG zF~acDydv=$Lkus?D-y3U!0^(%qEVVxBwhpdTkvNQ{cFLW1$Aj&k$4TXpMpON#;UTjDj)?lZ5UaZ9{LCHj$qKMQK{8iUm0HPA0LtKv0k3>U9~ey!log5lyd&@UGJ zSulKs=|{hs&mTd*TkvPW_~JFtZ#S#rHD(wtUIYDpvnpPr#qdkK5zak;yJ!P@ydw5cXvZOuW`GDm-&T$yvDfu$G~v7pFfLuZa-dQ z{1=fnOWIZO8a}>yJ|6jaULR9_Jbg9KkNrsb{E<)nc#dDrZ{{^nF8A1P#5j)E^nG~^ zrKk7j-%h;7Jo*9lJGs9}{w$)N#a%pQ<>hu{{w(6U#<9$6EYRL=hS0^i}?M_YoI-tKMM=Barb5a7w4jY*Fbum*YFsb*TD7T;5FiX=Ov`$=)A_S#siA| z!nE}Z$H8mdHCov3yH>o$1=!E0jn{~ENGyxFKMT~~Fv=(M8W@i zyhe>$yv7ie9N3tZ3sEJB+<3tZ3sEO7lRoYy2?V+HXNufciA@K_jFdlC7}yawkb!#~Jy z&P#?rM2&LHyaviS^BSm!%xj>Y3jQpj9t!>}sPEzPVFv|&77V|e;jp8EKMRK6$?!?) zJE*6q(V)zq1$B+#v((|xs1-K_1GWlJi3POkF4VR?v?oN>(9dHZ$6K+ zvhexNSEma7E&Iu5zku>nxt06L_Q^@q-+Q@_{k}T%d-xuHis^Zj>G=rK)43bzZJ$Sb z+s~gxytm#JkG<~C;vtm7o0W_3`Ejhr-iLI$KMU99&jR-R5!R!{^YvKS_c8dhKtJ-z zI{TCP_--a10{u1CsJ)b|oX)bJ zO+3Un!~Yb+$Ed|aj8Izxj{9rW;vt5pPcnRv+FO`?H`H z55aLR`?FwpmA}VvGW)Y&_^k}*xSRc1FdXAR=0P}aB>tlo_wVK*cKfsNd0#&s;+v0O z{{D7Y9^#h@_wD8(+@HnG1s($Pf`fSo#M{k7?Dl7|@(+*V&jR((dAb+8Nau0PYdWJS zfBUGSmbmZit}2!C$oBaoir`o^ZOXM8pu8~OO3?4^9a^FI9fuLmFD z>E4fzh;&>7KB8;+Jx)Htdz^L;<$mq>h;H-;nU7eY79W9rzH#DHQL&xs9K%0J-J*Vy zdX`#z#0)j&HQAqp_=qWnYae5h`p@!t6VyLWU8fcwF;1<0j4^8Q5hK*v$EZPHw}p?;Ved|BhfL)75Q8Yj+BOJ!ju#3z`z-}@h0lUh41ne&J5j$ZQnU8?oHml+zVAsv6_z2j2 zvnoCU?V?!~AAxq0`3SVD%txTz(w zA2CBMK4O+yd_;>{e8e2J_=tIG@evEu;v>4$yZHzomop#n{u^B%hL4DG#s?$&+|2Q& z-Qas(yB^ouv*@SVFR;J-dCUVl@34W`KJ8vF(zQ1qu@d12^AWO7@e#65@e#65@e#65 z@e#7m|A+M_`xGA``xGA``xGA``xGBhVR?&>7@!s(F-R>wVu)INM2%W}#0a(ch%svM z5#!Y2BkI)RBPOWDM@&+SkC>tsA2CfWK4OMie8eoZ_=py@_=q`b@e%XX;v*KQ#Yc3h zkIF}^#QpvFi0H2|+=oAl=&yJ25i8b}7!is$U+Bapt#M<|9zPnU6sEXFg&o($#2`<`s#Lm|%EmUXl2SafX-X6^V}+VR&g?k@$!qhL`3Q zjncd#`Ln1neraBj_z1M0%txSoKYZJ_7AK^ATwOnU6sKa5a2{ zzkzFC={g_bt;P0oZEetAlU}>T{{IDQS9YoLlzoTa)J8f28O)web5s!rWB3i~aaKzR#l{|IGWak6`NrypI0$ zGw;KG#H)C2rG1{`@&)vNpLrDf9j8v<{o3PMQfyyn3G0)~_*qhx01&5oovBpT$75<7QQS#31!Q;{E6snpN=; zHHI%U9Q{f@?_-SN;v>*6Wj>22%kSWAK_D|_JyT*j;~Mr(p~=Ey%PFL{8>!-dVP#y zw*F$zbyME$&!QL4?Z-zwlq_#f&MJe?lT{;jQIlji1s*ui{UfWcT&$%-$C7?MuTcE&QaGGzCe9D^u_tm?IpA~+lOa3`G_ZO zi+Ig5x8nQWTlk!1#>4(w^AP?lVn4|j@9hJB7B{DUz{i`RU$cJrm8E!Y<|gnvZ@fQ? zl}MNNm9NB~#j@?A_48-3 zX1`l}zSqNUe-`EZVcqR8{wyLN*w($QJ|iD}@)!9j9#zZlnDzv|pdU$9nO7NU!r7uG{BmcVoEzoW;A0->BjGwex3z@kQfFdJj+h2KvLy zZ?K;ezpjjY(?p z8xz#_LS-N0Kd9eBJx+}dxqWtw+H1w*k5Kz;&2^1h{KgQq{89mj z;5ePmBjGrn_zjNp={yq72NJ)rf^k0iv*7&VB*(S0oPV6GMf$ZqlizoC`?K(z_Tx7` z_p!_0FAvLa{8-_>{`|&kH)ekpv`Y;8m39sF_UUL1wkCFyuWEUFLA=B88?AHiKFWC{ zQLc6#$shXf*?A<;qnICbs#|fr$U9VgJ;K_pf1KZ_+yDJN{?$){-|!mG{Kj_NU*tD@ zM$wPosM_^@{Km^gf0xf&B>U{gZ+QA*eZ|ZjT4{rVzIxgM1Rsa@gz0+lg5cBsF$K0G)_!Xqkn0f5Wmr7 zxb|5VsKsy0Q~x;cpQ9GP(W2Hq%Ph6{jTvg~vrJPz#^+5@YoBG3TKg;$)Q>QJo%&(w zaq5St$EY!Z>r_Xm>kO|^pQaw77QZn_Eq-Hw`T@qTP~T6z6ZY^roJSJBYv+-~_ul-* zPJ|cv4Ld&SGJa#mHM-@>%|9R6sI(vBcz3ZL@6oq?9UY^uGkLqasencoc3AtNBvdmd1~<+3)JE_y3}81{2q0edWl;6 z#xk||jTLI~8>`gfH`b`dZ>&>`-`Jqu&2RX)T;w-gABNwEaR$@Ew9j_s{KjUaYj1vI zC&CZrH)NmUH!94p_>BQ-@f(BG;x~q<#c$N8vF~T|U~2IjW7Og|#;L_`)Tza9Oi+v8 zn4}iJF-0wYW14!K_Ax^(eq)we{6>pf{Kg#h@0ILR{Kf*q#cy<}(Z94cZ|1qG=2ws5 z;y0G5#c!-oi{DtK7QeAZEq-I2TKvWa^-=kaow&arzY+cQr@R-e;5-uVuYEzqKH0xT z%dXmdCgNI@|XDye9R-@f!mSFU>0&_w#t><8ae!8-e|zZ{oi zU#MpP`J9cXHf6rfZ&izr`4}_zkqnW>x$~o#FqG;|AJw<~Jr8E`DQ* zTKvW|^>S(4`tPY{87_XKMg2cAe2!ZD#ys_JGJJs=?bZAyP`}FX9<}(5C2H{-%hdmv z@mHwDZ>&;_-&ms-zp+j&eq)3B%J~hSKRIVnwRY6Luocho^@$&=`FrWi|a4;Tx*(r_>IkYZa;pb`$ccjSI=+w`;g~jtDe`(l%H51@^>DKQ}%DM^Kgz| z&Tr;7P%iga=Hk5zuj%{p8%ob3_V+$-AAaNVekZSI%D)B5$=?Ir4xHa`JF@dgqW*XD z8{4$E8zP?W%l<8}4tN~=hS!gsM-soE`3pfdbr-``xG_PFYx=BU-3{2e-__gz7yY1SsE?rl~XsKjSH^_zp*x4 z*#Em`{093E<2StD(tculk@Yu>{APZm7WI_*4fLm(-#~q3eq)63KNtP8okv3b)6`?s zpQqlSevW#bTKvW;wfKz{YVjM()Z#amsKsyesKsw|sl{(BP>bJ~r=Dec=BP2R?2NXk z#c#|~HyMA1TKvW|^%odEMg0rZlhiLzPf&~Bs6!u_-$1+1{07!*3+Iu<^X)tm%wrP2 zF^=m`SK_;H9tp0$IDqSk-x!2W{KgP;;x~|w%x@r{ncqM;WPStXl=%&mW9Bzd&Y9mp zJ!F2Ph2PKTkx-9>f!lc`)b~&?P=6nFml_*6?ZqDTT?}8MMh9W%kx<{k@D*w_C_9gY zy2kKz>f50&u7$SqNbtS5!SI9ljcvyB)@x-*Bz{=$prI{rLHf@vtvDj|AU~oDU~{ z1N~vE<1@f%CjPAgeCX$qzhq`TONz z`HlA$?%RXkDEQw1Pjj&U4a7SPzcK#F?>GX#0gk8hbS=ue^Efyj@xa>0E$;uAmSWi|;#^<@Ck+ zh^5E*4S#OtH;|rU{4&4svD^3OH$4BZ2fyLz-jCmibX)^|W5n`%ocxCO80{X){o3&x z;K?$-0iG=L8{o+@zX6^s^BX&1mzm$#rhdXw>+1$v)R-4_s+-i}H#VrX&$3P}eq)VV z`z))};x|^Pwa>ClEq-H(TKgc^PAF17Yq7O2H<%u_$Y_;b_`Q@5xwq3Bd+sWE}; zRA;E`j6Y3%ntF;_`z({x;x{I!wa-$gzMuDxLm#{U4RDC<^XTXH<~PvKUdC_Ogu3W| zW5oKJw+_F7{Pg8FEMI%`8>pAeZ=l{Xzkzzq{08bh^Bb^>%x}PMGQR=4%KQfGF7q3$ zu#3!Z%u$Qqn5P!Mu|O?;qf0G*qem@%V~P6ZSO>Acg-} zuTXDLi{IF!7QeAYEq-I0TKvWiwfGHkuvPIJHex(IAI&t*Cy8<9s`(AH!@ce_>DfbHdr}&K(hKt`=r53-j zM*aIG`}~8FeTv`MWc(e5Z&8cikbR2Z*kQQ%4cVvo4cVvo4cVvo4cX^W`3=}fUw*^; z>jJ+K{k1Qs*eCNFhLxx4udq%ZRuoL4l&g>qiezz^BEVc+)WWqt$Yllcvl zU*}V}XINwio|bBFuXLcNc_e)!mong7_gLR z-|M>nji{FE{Kn!)*wxYb4cKMoH|ls^RsJ_%*O}j#WVrYZw2RDdpxtDC1MMpN-rqsTG zamUvu-g~RRcVj#Ye#6GEGSASD-`FUwzu0r_wm$p@=3D*vjg2p&P5VH2>Vz%S+UF_z zvd6x53ENVU4i25+r{hE4gLO;)yD0m~im&hb`0Dvseju-xDL)=wvH$yePMP0WJ)Ps1 z^PBk%l*>K#dohkb>8Z4F9Ltv#=L=$eFUcUakSA8(_ZxgQdceJN&aE0sf zZSno@2tIuR*DpO3!IjRP_`b*Z3$LHfH;~@UZ=gLq`vJ_$cJmuZuk#xoBl8=$ejNNp zyzjh(biWn&jfL9^`+wJr-(de?{6@4hRIB-+V*L%Hd@{c=9d?uX4bGDnKO6mdXB737 z`HdOI7r)V>7QZn|Eq-GN^Xx_O8-vv1H_)Hw^GVR(Hx|WjU_59nir>I^(O49}f$^lV zD1HOuO=D5~2F9btqWFz9rceCFDz*5H6>9Mt%hcjGmZ-&V^r*kU^6FBH-&mj)zcEiO zeq#>$$oxhv?$7+j7Jf z@{#!sV*D*?bcF52ZR$H1zC(=$)n0@hH-~Eshn+WvZ->5!cGX^*j{Dk+Xcx`l zgZK@!zveLZ-wwlX#C{UTTln92Epc2vZVXL+hw&Tezcasq-+ANtjm!I~EAhWEX8UOU z_>B?2ekQ8nvT~^T^#b28{A?u--vwl;Wr{5eexIiDdaE8rxwYxdB#lG;ePx^yicP!T<149FM9Lx8)&~i ze~>H`vb|$ZxRUO#H@R%qKFx z!G1XL8|a2!bd#s<=TQv3$Tk(1&#));OtR9??QD&@7WW^<|Awd3-!IGj#_v6N`TONz`Hg>3xNkSV@oxBGy%R4) zogdx!6Hn;D{08Ff<~RH;+RjV4b0hxaLmx(me^b0|+k1|+Kfm%9ha+0$Yxt^k-i32> zI!`Z!y>=d7k92f?bQyYd^N&4hr;77*F5?`E=bBo%O->3N@}$GHuEZsslL4k$3{MG zzGZ)I!=JD91LKJ>&ps)8$No#_q}m_$gF1=l!ujbP&WBEYC+uA3wCFwh)QJy7y5&FP zIWw0spAzZ7&sO}s*58}oY4K`aKF=XPhw;1dyVXN*8x#1U&N%Yb8KM31_fLJNm$J<> zO6mCYJO6_(4_JSXa&Oyz?yCZd*7oEd&j6*~TU8#zHK4WP?HYgRb^REIPYEHW=4< zLa4?BSIA7F+ZW@yzJTR?5aCIP$b?XF7*Z;A)9Ot!D6=81OlH%{>~2;&v)O2q%&wki zp4ljy-Hfu659NcPNkY8u`~Ls$J-17xk5;#g+ei;|`FGE~x6V2D+;h%7_gCjkllh)y zc#2GaV|bFx_bkJ8^1Jwb6XY>+jeI}3O6Gf(;R>1l#_%}#UhY3ezK2{U-%TDRA0>~F z%j6;Q5ps$APVxYm{>E@0`A&xSlJ6iF$hVW%t-gqEeFu4sJW5_ASIAf&EV}g{k_Q<6 z2pQ{%MYsMVGS(Z5Zv9U3DEEIqxlH~p@)-F8DKSZvR zzneTsMt?sYo+9IhPKT$-HSXUae-F7y{s?)F{JrFP@;@fG$^V4BK>j}RBKiBtOXLaT zXf(p-J5Vu4Z;!!m`zSs~9>?cxAH(NcpRmvL*s`4`KK2yu??+bcK8+vwB>3tT@YSCH ze`Fc_k&lC)TmnCtf}dRkKl>#3nFa7O33#{-9>zFF(n31oVT^+$Eu=FZ#yE-m{sHkD z#yE=17fZ%Ci~N3qjBywlA0T6#CTZb1#KRcJNw^+wJdAOkq&3a`F%BfZ?;vBGNaoKZ zV;m`4KXe%5Oi62k;TVU?)*~IpI91ZBG914{N?H{%#<`N#I2q$$No$OZak8XUCSx2; z#_Px!XG>Zm;1^MK8oFoa6TM*CQQ!_80IPHbUE5SJ}jS_u4HBv`Ba=lKFzF=pC+%9 ze}IhoGk8|0UxR0b`Zsu1sGoyph59>qR;b^DXNCGdcvfg1f@f8>>k~YyG4hWxe&ggH zBUi|uAy>&iPOg!s$rI$ylI!H3AWxG28F`BQljLdg=g1B6Pm!DC&y(lK4e~tMJ*zg^ zJ*x$>dsd5NdRBAjf5gwwvzkT!B)*-VRjYvOIlR%c(tdRCtbXru<(+s|)-S~4+l9=N zWAWPDvs$)vx@Q&2E&8`fR&IZv`RL`A^FqxOm{0Cs^^)Dc>La^&Sd5(RT4F4*A2HsVCJAA8nc(nf?6Y1eyK(VvT&i zrCUkCWNYFOHGf&o7qA?B^Fp$?WGBN62NKZ-{(^Tq3`dJV3sS+(*8X z+)HLZzgQr%pI=0M5Jl|g7tzi|T#rq>d8>bRGEdI+@{Rs}`Z0O_ED1ls&qFVJpWPom zU(A4Pm&bS8rV;(X=k;INU&@`f!#>YUet-2DY$y3AzrWVU-S%JGWPk0VblYDa+`FB> zceDNFfNuNilewS&v?NAO`%SaXQF6N1%FCf1=}5_+juU8A62DfjDp>z3eyyR5rF_x$ z5A9ad@-(ztGh}bKT4a>t;9sGfhxv1G9|Zpj_eos*5|77y6#OgPXTiV1eHi>J+^2ET z{j0LwM`8Y)G4jvz{NvIUW%6D21)tW{UdoVMMnQg-dmB;zmoO#$oKR326>F!B%}W(^Hq}3zmxtq8RNXNo){V9!17*> zjB(;*W|53>ShDzomxHqg8x9fbr{mJPXRzvKzfVTPLi&pllXj~ZlC#lEJ;2-+zY?>Q16RB|BhSvV>v6boXxPD6hUKj|VC6TO!MJN$M1L)s!MJQ%EHND8wy8h&&Cs7L4l$hmWD)(b zXa?iLX%YRcXomh|5&f}f2Jw>l?0G!rzbc}C7tPS0EH)WVf3nyhV_Z8eqW>7pVB9+` zPB9$g;;BD3&tTkKes9ch z^33;{@f%(TzP%6i@Y}9879ZQyCYh;_ z`?-IW>|P44TkQQBA3uAIdo6YD@7~K4`4v3hH2LLZl&knP?$tCIel^4A$Y{T$eI-l9 zA%D_8FqZc~*!~98Bl4bzEES&a*P18exikJ0`hoHLq=AvY_-$H?YrCzjrJi@d_V@9H z7}=@wE!p)-PR?69eE5nL>+hY#Vb<@f$f=VrE!pvJ{t)^V*MA5*94M6RKl1H_J;z8i zs`9wNKa(5eMRJq; zzmVt1|CT&Y{&(ay`F|xZkbjfBNdDi*OXT13bT=L_||GOVg{%t>={5xd!?*@OD z%>LcrzbCVQH~4?}{`~&`6MP!w@<8D;T1@Tt+R}_Z@4vrLKd&U)pWx^FKX_Dklk!x; zdHPUpvVMOb%auPD^s(Idb3-4?jXziPvE2A`K_APFKNs||+{}#g`&e#fDrA8ZG<^@tr_En}6VBw{tMj*THDI%MnQt&y)|{8!1>ll#c8BNxc% z=ZZIp_N%{S;W|#Bf8lqD|Lxx>pB>bHQ9kubck^_g8a;Pha;Ki|hjYhm^mGqeH4xUx z8@2du@9AQ{jh-&b;aT2yS4m<+0`Vw14_ViO+84S^McjTl>0t{ujd6)jP?(+sEW_L2IJ?xP-+6w_osN zWxtZ{SCfC_&->l^<5sjE_CbVeKBbag>Bn1Lp0qIDlgwhACppP+Ag%|Nz8&>TdNZDD zQhxsiUzhQCsP|8w*BWDgp0$O))f|s{@SGLa>GSvZ^9)D-CoST46H(8YU8uC!WcdAL z{B9!Z`8G0sHxc#RN5=0aqMm!nlRW+&a-DoPd4hbDTqBpsRq_!ses>Y|ypuf6@Vm(P z-9^-MC%MeGrFk#Ve(#TN!Hd`nqz`op?MAnG)-+xF^Q?Uq z_1*qFYj!`nAN82@o2;EVX`A=wS@Zdbi|+ZM-i(Xx`JrBoi|+ZM-i?dy`JrBpi|+X~ ztR9Su?)f#zY;Uu5>i)c=e7fh?=Kk*aEs)*wTO_;Zw?uZ&Z<*|#-wGM+yu7y~yXUt? zcF%8}?4Do2>esmVcZ_c@8NQ#qZzjY0lkprfo^j>*3&)*A|Ks{sf65A;zxVd>qeEBf z)1yAupkC|d{~eL={dv|hEVTuz9X-n z!uY}=jCb7LwE8R_hVK_Y&;o#lV$Qr@)-FP8U5+t`BfNxn&DOQ9Jxk5L!KbJ z=T|5H9K$Ec?)goT-Se9!yXV&+yXV&=&+~k9^*3w@P-;Z;kAp-#XbnKX14GHIMgp3%*}yx8VJScI&L|pMRcS(C6uvmKG^1 z(o8j#XUQ@yqtEH;=jro&ex9`tOIh;vOufG&5-zXqvp+es(9QdMvCXq~`CGzxnWsm` zf6Eg8Zr*N@yPk-);pzy?q3{KhGNTAesG=!4jFz&x1FBU&wjZ^nDUu7y3GR=gcoQ@NcD^c`44b zCh6`v&zf#OYM0@hd?@L5=m++!FrbXfCu3obLQ^4M-m zJEVWw9_f3%i#pGm#t*M`H>RUY`Yb)U^o``ww?EGsu9Nn2)x-eF_yKPJ!UyP?JR$vm zeRKBiyRpY<=^vZ7foh@PUW$4a=55fM@b|mA-MkGsPX1?phj|-3{$hC>$(QgxSo`n# zYA^3^DDTg+=DsKE@yy>~J-JqSe(v1YfNz*SQnly1 z^cZ}^bQqqZ`09A>o6)nP{h0iE?stMxk1R-@X#RZRD141q$bP}sn6TsX^Q)<0)NOt> zHIcO5>zrThW4Yh;?Zns6_-TA<5+C(7^t@qyHN+=B-m;?OD<71db7jK-5-;2rbB*^d8 z%PPM!DwE$s9wk3W9w9$K9wLvEOJw}sEiDd^zk}iM$)cYBhTO|={GLwM&mp_7v2OQ8 z)Z@O!8rgjf_|U=ESYf#P8p~w&HI~TkYb=uQWqcOM_mJD6x~$aj(_$#;*Aqa&ClbcDb4#Dt5VOs_~&tQ zUjykme_sRFCCt}^>lWr~!gUSvHQ~C4`I=BJ!hB6AH(|ael&dgb6Utqfuc>Y2BFxvc zK>pF^wcupGBQ5?Id5PhlAup4EoV-GwCa;p+*H|O}1jEc+!^@}p8tXjXeGM<4?rV7YbYH{Er~4XSKHb;w^69>Y zmrwUKynMQ^;pNkP4KJVWYk2u|U&G6%`x;(8@oankz6Q$4PJ9ikuk~fC{JD>GJX)7K zLF$n+HM>u;`I@4Kb+fceA{71_FYC_hoQE*{EPSQiiFFUr=%L-~xNj($b9E*{Ev z6m|3~vUTxre?(D7zam=~Z_dhZ6qT9Zxc{Q)2)V)Vj($b9F5VQw@8tfIic_cc)O#6|Zt)*0@;2I{T2 z=)Oj;)njqdeGSxmanXGZ)QfS^eGSx`anXGZ)T?pPeGSyRanXGZ)XQv7S2jd6y%uTdeNwd;`|KUmQ5gBI?SZoY>0pVZgT=lSGR&Ca9a3?u(QpS$bE=i_S( z==@KY;rsNw+MvBz-r4G(vi>Efs&?LP^E3^768p$d%LUETr0uJw<2S!GjE{MGw(>Rp z<1JzT&3z5z%gyo~){f&beam^8JU(xf-}k(9e2p6Jn@!inLq5585qu3?e{aWvuQ9>$ zcA0q{eq8W1s`hj8uRmm6JR66^u$Xv@yncho zpRg_-+M}>89_rU9TNe-4E3Au$_9|*|UKh@P9v1yL+o<(1GTP&)^#pm*?$fAMCoh0ETNkgnov(rWKCFv3fqI9& zMtZCc&ep@j^-Hgw#P%M%m`s{&Hs4jM$>;q&^<(-zNY1S9v-R`+Z_|I}`D~N= zXuI|A(nD+Zek{Fj6`!}Q;PddZeI6)$C(fVi&sqOXzJEdTLi;<{zcW|gvYveOapd3T z@xptA&DO0;4>3OXF+R5;KIvh^H#v#>Et}8cgBHy&pM|v7_S||Cw(I;BCHYVF1oZRJ z6}QO0c)xbed=}h4?-fWgGp|73$DK2uMVI~MtIyg0ocS!e>@QI|XMcUMDx2)Do9Cdv zpK#CNrQ$_s|JcT3Z$-LwJ`3e!wr=;?!P~I?G1*TIUZ3ypAhfVT^5CfLki4gi&-dbY zy~#r;XXyjDuhXMaVC65pMRQR;2koP9_M`ap`r7MfS*HW_;ZJBOkofp~H~o5*m06GY zx^s8y)s)|VUZ$~>&l6YLr_85?`X-ytg7sK7pT!u%rDG?5;%AfHhZrG$3&UBDWf-&~$q>Bm60ye~yQ_4|Al zY=`=NJ`1)}{dhr}y|>8L;bJ@2@AFwScs|spGQTJJTE=IJd>wg`d_B2NejRy&d;_^k zE*b0l0R0R8_t*bcIX|C;=A_RrrdF>momA8A_tq{mPXr^8Kb=kMyz84u9kXW(|R`gv0RTicDg zth=Z4S-eW}HTV(pcHX=np(U!DAE70$n;-Gu+r#zPi65~b@zeO+EAdf3LeCrg2*f9! zo)vA6KPWrNpB{JQ6eG>J!AA$NL>Uogis86CEbiCXPih9Nwj`}6)aX+GB_ea$8 z9Sk2Q`+JNrvilKbvcJa|CA%LnLVg#|H$+CemljK8_ag?#{vM-`?0!Tq`Cgu{K)#1e z-@oT>@|xYJQO{8_{Jf~AOopc&^&BC?;|}v#Eb;ie7`{lple|E_gWLx1xgXKAbSIqG zadSVSZTsc@i07qF&HE8^QqNsFegx9f&5zJ@Z9bm`u1oMEaNU9*f$JLl2weBzN1$8; zKLX_@_!0Czi=VbWvGhZ%90WgNo%~N3j&d6p-H$-Ijx#?3ATGKeQ6{?|F-CSjVw~)LM1}l$#=lB-KcYr*x{`nQspvqs;Y+AfF_aoXCzP%se<cc!pr9$@_KmrbU(t&r~46J zKHZP-^67qrmrwU23e0c!BYMg1NA!{1j~F1kA5kK^A2CFBKVpRJe#9u*{fIKz{fIHL z`w`=0_aiFguXU79_akZycRyl+?0!U@?0&=~+5LzqvilL!WcMQ)6S~fZ-keip-DbWq3!wBJ(3~ ze*`}Q_fM4h5xBpCAA$QX_z}22qv)M_nWW!_`!~w`2;ARMbSJ}c|3}dsht=0rF}obvUT5&Xw9Ktvg`RQP%gu|Ro-s-d=@Cz!H@8E>q{N&mirOjZuxu`xUYgA z;q8|D5x6gdA5pOTI4-&$f%`fxx*yTUaQ7onFT_RnBT5W+KLYhiTy#HTgyHT-pk9iL z?njgv?ta7=+5L!dvilJgvilLJH-jHhW4QYfsCR=OQD?aO5tC&1Bc{miM@*C5k7$t3 z-;dD#lX?rm|^I25#zfY0#>QL84KcZ>p?dC^R zK7o5$zV3qj2yI_A9cPAf<1voixO+ch#!m1;_z|D}mfZWg zi{(e~dF>(bBedS~buf|^uiqf@C-@O)kAfe8`ZV|vxL(1JKzkMZ2((YZk6^zs^CKEo zZi62&O?E#5^?C3k>I`>3VuI{`M2+lzM3wA*M1|~r#5mdgh%vJJ5oNOb5u;@HBSy&X zM+}kOk0_Ddj~F1kAJIp4KcbiHenbJhnIEz3d=|LxgC8-E{!TWZ1+G_mjQyC*lfZRL zA6dZu54_b1Msf<*FMVkO`JrY@W1ofQz8@I|si2TKO;|7l(#C!8(hV^FV zZ%p&JUfW-Ow?&qYr~HZcO}?5uL3V$G^?c@UupP+!jSBZy>p;&pPIiA|jNHfYGWnI{ zQ8FrIS^t%+S4Gb^MAqJ#a*6Ez#sJyts{^U*PK40$C-}v3! zao+A6|7hLfbNCAJH;zcYUbOivP!99{#`+)i?84uGuXHiywOrJzK z&-)u%V!QbpTC%(O8^yPT>#-AmLw!UWACdU%W`2vSUbeNrVg5V&HL?zl^)u4UTf%#o zwBPSTycbF{uM5B1O?mvGm!Z6$J#NJ$n;-H}&o%aYn63N`i^oOqH~y%1Z~YBzzxU_2 zfKM0JBU!ilaesb`+pXY7m%Rg@m$TjPsTe0$RPlMBhR-V}>@)ocpIaZ{^E20Pmi1!o ze)Rf3X;#0k2kd5k3q4WZ->~0Vp*wI1tVaS*wyVD(>Dt`isH5F3{-EV!){iOv5P6E> zKTMt`e~R27{|LEBo+8hY-QSoeKf~}g+5L?Lvilp0!2 zjWx3S8|!5EH|W8>^IJr3$c@i1J?3vnUE0mxc>0ZD|IYLVe*^h)vz)`)@dr^4`R``*eU6Sa z`nZX{FVOvT+~+rCy_1)YzfnWI!Fp$-zkz(x_ek=;g83Wrnatw3*W0n+Z(zLdaF6&K zvY#Ip{Ee!8-(L6|dVRim=C_!U+?Dd#vJd;+c2!+chHKEDN?1A@PSau@s!i~|IJ1JC`z-@v%Q&gZwlb4c(vM(sHxtVe?9n5gCc27WIa zwcOt*aewzW2FUJj^pV})!0%9FSATQ7+Ur|Azg~xp{zhl|#_bDt;%`_w zy7(KGjxOo5^yJcK`NQ-jv#1xg@;B^xdf(r;MAjogJ)!;gE$81DLHSlcXK(!tv@gji zv?m+q-#~pB{0-J~+xi<7)Q6eB!Fo1(Ps@6^-~EkI?(hD_2-*D&^e5uX-#~vN&isu5 z?(hCaAKCp4^e5u%y)pU|@&5c9R?rRJah`Y^lkH-77iZ!Ul17bU%WIseAKzoG9*P#^F68+TZJ zoEGc${1NT>{2NtkCwJv<$e7?u(%+DD?fV=1{)YC?cQXHmd4kY-FJS%++=rXbzk%n` z?dRV>y%86E{tb>B6@C7VDU2f(eg2JUvd_QKAp86q7zc@q`~HSj%;It5x#CjvH?+Rq z_cze4?ypZ`{fy`Yz0eq5=tEcH_xuM67-#?TXKgq8U2jSL^D!AOv+*YU?4YpkZy4La{nhJT$Na#*GZ2% zD1SHW`Q?xAcg?-jZ}>p&`}O_pfx=DnGUp!TerfJ33EZCI2FMjqLMptdo8I4USKJ z6Z;!q=;`n`r2Xpj87>8X;~lThjnCx$4Y{$q`5W QN-_@5S&pK6mRkxxXRhDA|d> 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%0AifUtiLcv3##f;SzKRK7g@Ugl!PmBN@$;*T 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%0DRO3mr>z{L%4NSq})y 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 literal 0 HcmV?d00001 diff --git a/compression/cnft-vault/anchor/tests/fixtures/spl_noop.so b/compression/cnft-vault/anchor/tests/fixtures/spl_noop.so new file mode 100644 index 0000000000000000000000000000000000000000..e250fa09254f69ad2e39a74a000e01ca5e3825b4 GIT binary patch literal 41056 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 literal 0 HcmV?d00001 diff --git a/compression/cutils/anchor/Anchor.toml b/compression/cutils/anchor/Anchor.toml index 1e5158a3..8876afb4 100644 --- a/compression/cutils/anchor/Anchor.toml +++ b/compression/cutils/anchor/Anchor.toml @@ -15,4 +15,4 @@ cluster = "devnet" wallet = "~/.config/solana/test.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" diff --git a/compression/cutils/anchor/programs/cutils/Cargo.toml b/compression/cutils/anchor/programs/cutils/Cargo.toml index e647c32a..8ded92cb 100644 --- a/compression/cutils/anchor/programs/cutils/Cargo.toml +++ b/compression/cutils/anchor/programs/cutils/Cargo.toml @@ -28,7 +28,18 @@ anchor-lang = "1.0.0" borsh = "1" sha2 = "0.10" sha3 = "0.10" -ahash = "=0.8.7" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.0" +solana-account = "3.0.0" +solana-native-token = "3.0.0" +solana-signer = "3.0.0" +solana-message = "3.0.0" +solana-keccak-hasher = "3.0.0" diff --git a/compression/cutils/anchor/tests/fixtures/README.md b/compression/cutils/anchor/tests/fixtures/README.md new file mode 100644 index 00000000..6e1ab7d3 --- /dev/null +++ b/compression/cutils/anchor/tests/fixtures/README.md @@ -0,0 +1,24 @@ +# Test fixtures โ€” mainnet program binaries + +These `.so` files are the compiled on-chain programs the cNFT-burn test CPIs +into, dumped from Solana **mainnet-beta** so [LiteSVM](https://github.com/LiteSVM/litesvm) +can load them locally (LiteSVM only bundles System/Token/Token-2022/ATA). They +are the real programs โ€” not modified โ€” so accounts they create/verify behave +exactly as on mainnet. + +| File | Program | Program ID | Source | Dumped (UTC) | Slot | +|------|---------|------------|--------|--------------|------| +| `mpl_bubblegum.so` | Metaplex Bubblegum (cNFTs) | `BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY` | mainnet-beta | 2026-06-05 | 424532091 | +| `spl_account_compression.so` | SPL Account Compression | `cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK` | mainnet-beta | 2026-06-05 | 424532091 | +| `spl_noop.so` | SPL Noop (log wrapper) | `noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV` | mainnet-beta | 2026-06-05 | 424532091 | + +## Refreshing + +These are point-in-time snapshots. To re-dump (e.g. after an upstream program +upgrade), update the date/slot above and run: + +```bash +solana program dump BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY mpl_bubblegum.so -u https://api.mainnet-beta.solana.com +solana program dump cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK spl_account_compression.so -u https://api.mainnet-beta.solana.com +solana program dump noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV spl_noop.so -u https://api.mainnet-beta.solana.com +``` diff --git a/compression/cutils/anchor/tests/fixtures/mpl_bubblegum.so b/compression/cutils/anchor/tests/fixtures/mpl_bubblegum.so new file mode 100644 index 0000000000000000000000000000000000000000..3b573de0bfe31fac52f561db9709b4c30cf766d0 GIT binary patch literal 1329808 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%0Ao62o3`e+;n)8NbASg?^NI5b4pr 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 fTPjJRa-T}fU+ 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ëi{{RVTe={IP=rr*HEMKi=dkG<(PuyIkU-+*zB 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 A*8l(j literal 0 HcmV?d00001 diff --git a/compression/cutils/anchor/tests/fixtures/spl_account_compression.so b/compression/cutils/anchor/tests/fixtures/spl_account_compression.so new file mode 100644 index 0000000000000000000000000000000000000000..a5db971a3bee12066fc5e0811d2246f458b1fe03 GIT binary patch literal 2349040 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∾C-nB~IidB;5jf!qJ>SXmIzMhZ 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
$e+kT4RQa#L5--zK`m2@gIb}U_T}4g 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

rHiP4k%L10 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 z z5xF0`3%~P=2pk86{$qNwt-qHRn+Wr$4_W_7o$PmVuI=c!8%q1}qi%mcS+5lWFZhF6 z(EDWlK?#93%pa6^ER%A*+#giwmqNK7goBdwNqXMn(j)$$0uKl-%FO?T6_PO47X-2c_w_1{~C_F29G#L5Zh2_x*s@gKO^(s;%ut@CVhR zo|VVxxT7ZZebfuo_ft2hAE2&Nn?I-;^@EJBQkSSJ)abaRvt{as7!M9Ja8M=2e}M65 z_oB&1sHYkKSE#3`KS*7mo}-?iHh)lK)F&A~N^Sn2a@0S-_-(cC(c}+OZ&8~+s7>f= z<`0VNJVoQ6+Is)kb5I><&q4K|JqOi?_8imz+H+7V(4K=@h4vg&Tl1g3u!iH_A5=?^ zyM5(w-1~z$k#}Vm$;v&8;O1gL+aS`7iIgW_&7?(Rg zY1H_BDe2;Q$3=YKWbTpKFq!g3j5+U8NZu9D6}idd9*XhIkY>w`-A$tG*`I`AJgiYyA^IG zbEh11@0!C)IH*;3=8eNab+jD!_Xh>L>ijmcy{=vKbCc_Pe>kQWzt}P5^R8UnZ7*86?BJj*pLm^er`#Hpei!DhlYE_Wp?(*}cw0Y``$#@+{Y&mY?oY1M z@4{TD--V$(Lwsyx)*9#v2DUN^Klej@mdV z*uOY$92D$h@COC^8Rw0If_)7f6zp&8IVjlYIBy&j?01~EbzIo@IBy)(KlqvoBs7_V1;ZhR1S0>fVlAE`G9udUtk_^{Ys5?R{xBHD)D;bpsfBG2W9ooI4G-s#z7T$eV_T6pf(Q5 z>Ys5?R{xBH%JF>TpsfBG2W9ooI4G-s#z9&A8}Rq7{uu{l_0KpctAEBpS^YB(%IcqS zP*(qpgR=T}L4PkhZ?htHyQ_~~{gZS=FHy_9l+05(BP{bM&QF2nTjqEE`Hz8zy3-v$ z2oE*m8balZ-1){c?DPxO)cYsBOY7w@zfd!uL>gTZugWi!jCUkI&wM7#k6HU8=`FbX z596Vp`?<{dCy4%Q zi)HHHXZ#%XA5fR5|B!ly`s>uw)MnqOsLj3?sLj4lP@8=pqc+ZUl-lfjj@s-y=LfuB zD9#^v`_B0V@9&TE5Z=CXzQS{^oX_y~o%0>uzV|U7;q7~m+Uz^$Q@nj|Gv4fbiyHPl z`~GaW_sRB+m3sF7xDq{G>7Tg&<&vd!Tz?fjl#bgEz(ZMmf9`*|5qK!tizUo| z1bWOsD-Ji9)=D+D$?vJPa-P8D;3!g@~(=Qa#v%g=cU)39A+m)(&4~(ZX zyXy99)92*;5h2W@-@8})B=1v}hsyoG}c3XSPls_Q%^$yA}LGtx{v& z&h6)>&oB6eT46lq{eqt*%nLfci1C;=OpB-w!7o&U_rtuS^D9M-c}eG2iW=jIv{7SYd&x|kPEi=&Kxmg&h+KS#aI@@Y_SQJY_=P3X)0LUlf&=SMF-k8tUe2)m!+ zeOh{5@C((3_I{!8T+@>s9QS^q@I2F7dN@AvUaj}(NBhv;FVwo~^y~n~y|p-&GYg&{%$Pz#dpapf%60P*t#xs9lz;$T_3i2 z4CSBR=j`semR=wHK;eFOd>HpRmisNePfGq<+Vz4v;`R?f{USe{wQFJzkL6Bl`~^&_ zY5&_DzG(h)o^kDf+(-P}NchzIkWWjW*`s6}^I6GlC3luf?{{DxFL_g0b$a`n<}ZC@ z72&-r2#*gmJeGS>&&%3t?f1Li?YO*1za?_}EqVV=w2x;#f^yrL9{g@{8`Je2CB1+0 zCZsF9o#}Xl>9`l^NRK0($%}Ze_TrLs9uC#&$UoCVTD-aI)jyN8_c{-k;gLk&`f;RN z`WbEtFn8-+(6_>TnB*R_uK#XM{vL79PDq>qrF{%Jx{vqcYD7~ zu*19iWuhI~*Dn+8lHZ?>cFXTiN4w_zGSTk&{pn~Iy{8_`%4z5soz9BMLkYkpvHhC_?5!KVel)3iQQyzl;@jYrW`dUWF6mub}#Jr zMGgDu{e6$;`TJ}q{r+@pPsd@`-F|qy{tlksp@w~Q`{7Zuomgy97xesNxxcOBtqZJg zQa`1iH;hO6$)645e3|F?^E0@o+(@pwm)C8b568t`p3Yo1)GyPg+;cDvsetG5gnni1 zj-z>e+Wr6I1@K718wDN-^()IGNe+hb zNKylb@kn3Fd{1@|9;r$mspHZkJd)fu@JL8cHa{{>$nr?P{L#I6B)R{q!6Qk!_u`Q> z9e6ErH;-anGyKE>M@KC#X+Qk5NBFJxcvBb&mQ2)Z1!b0*{3G zt7y{JPceTLO@5H)WBwwVWdCRu?NT&p>$8~OiY9IS7V}%tq^<9+@b`Xz_Zv|EAT{Q< zqDfmn#{AZ`+n=tizZdqWt3Z1msS53Rq#Cs6k?PQ%M`}QO9%%vE^GHo-&m*C}q%X8^ z-1A7NH(`G{j4Q+ba>gT}yyBwqNGQ+1BcZ$lkFmJ zjK{b;@KDAhp+3b$OM};eCmV zn3qUA4|Rsu<9&;ZnAeD3z_=woTV*`@BguKRGs(G*=5Kc%>2t1iarW$E@?Y2QL$^YC zBzYsVewjvH8+)N3XSwsH5hkz0xGh;O>F?k1xI4-H$-I!<_*m{+Rl8|F_y={|ulyy; zb9(+$k8@q`b!c~! zP{xDumvW!5{dpwVRr3p<=FwkE^XR8JzfEY@U!(iix#yti_dJr7Oa8{rca}$b(A9?> z^&HbGx!{)xo^N;VPgg^G6Ol*q`^!DSde&h4ho~2*AE$0olSlIV%gr;s&G<5Phx$?K z9yQyOe4m=_O@2Vl_Q>xq$M!0}%6PVC`88^`clmW{wugRyIkuO6e>t|Net)?~n7(aZ z&-R%6IYtrN>paFQQN;E`ymAUE=-lzJ>ki@E(T!>F|C=(E~gm|BQf6AgQZ+w@8Yh8N0M<=;F13IO`;FNBk8yR z!|~j$7UZFgQ2zsug!d!xNO*q&kA(Lt@JM+70*{3EGw?`we*=${)BFS;3GaWLxAp2ReRMgU8BCMv1mQh%A+>R+FFo$fD`P`E|L2Y z_h;*DXXY`!-07DI?WwMRJKK}yD{2qTk94w#_`~3kw4Zw#>D-+|LVEV+kUDy!?7FtB zyB`LJ^b@s1;E+0~SHdCbx`8xS?$6f!1BcX6yBRp71#07vP+oyUYBL`5ePMq!%ajShlKuB)HMzX{j13DPlx_h)HMzX{i~>J91{9hQ5W;2VShX0 zkhYn=I)8tQ+Bl?5YU7YLsEtEfr#230joLV*RchmqR;Z0b8c;X*`+aKTkb2OUb4bhk zaY$voE^tT{XwMFUs)Lu%o?vke^g98yzt((NEzM*3sF zKOOQH`~B&V|9JjgS|5{Tluy{7ZWZ_U`_rvazk}zmQM35o zO??kF```2Ake1m$_kNjBzvB73c|Pi2JU>Z|`WgH(q5j5xf4XUmFXsz9e}?)_YS_d5 z_ou^q7|&y!JHCuVvUwb}yFY!|{&b%T^E?{=X*b?KH>c?cToUg8TH2p(%;j^KAEQw@ z&i-t+Tyk>!-CFFrKi&3ENk0Y)rkB`x>F2vn`G&KZ(%<>N+&)RRZko`pX74-U?t8}C zoy+X(mF!Qa>E`@Q_WqjgA^DN?XY-@wfokURh54K>{{r$W`H?8$Wpv)}ZXAE+^*H_< z!`okv0+R7U_WQ$OevKrnk3NL^$objt4~L!ae)^L0v)>;MJKrVglJjNZ1i$9$Gt>X{ zdvQe4KYIE3?t;C}caPTJ|GZ0_tjicb_nga*T6lb&dKC>MFHyP!(#n zQ}!LuctOt}wm+Sel-Plp960ke^d!nZ zEu!2VpZjN$zbr?yBL4iu$hkkUw+rsylK<~>?T3tiq$UIo3hzmlgOZvsjDwOTZYkHx z{W5)9E0pU&I4DVwK6?BR#qN$yXs`?HVi%|XfiUkwgQ(!Cc4 zrRlf^9Mu2q@_U#ZlvoPiZzfNk951+|?)W78t9MVUb{w9zWzN45!YAht=D{%-ClF0? zJ#coQ^*3-(n16~Ujf2AcQ#5%W?mvrphiLMCYS{H?@&RhhPeqf)L1BI>ntYJ)3;ewj zb%Pommvk2MQ_g_`TKvzVU>9Ml}+Kgjb-)adu5voqAjK}}N| z2Q@`)98`hYIH(C~DghTF)`748$4aGoV_P%M{xhxctWY%y#yTwvH>SZ7#c zSY=pYSY|lKu*7hN;WWc3h6RQb496IbGR!f2W%P($lErgbtL)WFsLVf)jqYPmUnD9FN(_4$afSyN{#Y}BDN=alv5NL2Zi#B zBIBS?u2Ezh6v{h_jDx~+h$7>l@O+|(?P0#8-jf1LCvpptf7dWUI z<39yln}$Nf1d)bGGSwe>!MgTng}IH)G$ZM_`tSKy%V{sj)I&hu@(9Pe-7psI}j zx{fQ7#R|1?P-SXcFQ23S2G1{1Z&A-so8OLUYV+GMMQt2Zf!a8z32Iv}AEUPQ@=Sg?{eFv96N8M!ndFln~9(9A-I4G-spJRND@y0<_ zslUMZ3bk=iR{xBHnq&Nzd47qyPd!6z9F)~R4yv!^ad~|l#z9q{M_S#_Ulj)>;~dG)y+0M^#j+ff z0Jt)bwtoIj{2=rH$luJIe*#g`&Pl=U&q4KQCyayYP#Xu;rZx_$Mg4oMCrxVOpcbgj zt~aP*FOtPNwQ*22YP0KAYU7|P)MnSq)MnS`sLigIsLig=P@7$!rZ&4iMQwJyKy7w? zg4*o*7`55;QEId6oPY5Cm^e@2{V{PK!~0|6Jcswk#CZ_!kBRdn-rpYQQM^AU&a-&C z-pBk0?fOoCOxqeS_3U@PZx{!K_^aWdbi9sX#h&}qS$%)x@7xF+6zv7awaHRW>&0Fi zl#Ktf9F*w8DqM6eHmgTnZ7CkNG0`zPz|az@JUS^@`!_`~3!w4Zw#>D--z8ff~i zCl2ago;eH-3iV1jC|x&j&qMxpa!_c$0|&LC^)Kog2Zizq9Mm@Bjf2{v#(bdjOGRxQ z6rOkR$JEyHkGeH&2LeZB98{C>n6GsHoTxFMnHC$=nD2D{oT!b1s!HFLwT%sEvb~pl2$WMxn2mgX(L! z2M%fg?Kvns*YxBHj(ZLY&og~;6~{dXwFd1uC_Lx%>^hEn4hqjZ;eG_kGSVM7DC942 zP{@Dapin-6gF^Ymo`XX9#`Evc`kO4H{Ns7!pzwU+dE=nwwEW_EL&GF)Gg`)b({K5>JBy5pLg}gv^?N>dA)8g z4r5_bRziGIKj24wvIjH_E!oVRA0-@=FPO7bN4x8?apO(_DVP?P4^HEO4B_gKa&1zezZIa z$oF0xl+OF1Iv@FgdI;rp{c=!vFNLqr`M>udy~06>K70-e?L%@7_CM*--qU}m^TU8~ zgXf@fuv6oB5o{hOmPLQ}mn_nb?aM*YE_x2C&HIk>KD4WzgQDH_9Mu2M-n)RubyoM@ z<2Y`V^kT({9eGIb$c~932q*~&!nuueLl_EjQsb%5$(M0l8qw{zJuXk@rGx8-i zaZ=5bcPbHCmP>-F$GDAxPI530!h-4CijmI06*-%q}j z+(*WP#dmS*?pV^Kd4*edC#REl=?Hob)@^*{~i?lMiW0M_>Crh zQ1BZ~{Gi}Bn)pG%Z#40PLOej?2L->;#19I7qvaiWc`6zAbA6)n4s={9T&F1UgPOPc zD)EDwBj3&AXUXmdHACjS?XGF^>$v|ExsNYJxJZ}`%r$c%qeo#oS#19JTnfO69aNe*!-8dQJ?zlcd#<)DLPmwWhkL%N9jO*k2 z3>o8o`7R|Hb^-rBaPmE9og^_Jit@c4#uEPb2-s9>^E& z_n`9jUQX@@g?hD;?O=P|PT5A8pxeJD65pClp~bGltYw*lqJdm$|7ZfvY)cgWZDm^X+DQpC-H-NN3Z05 z@q^l&w~U{xPlxj*>(k*n$@+A-ezHCt?kicJ4)>d^PlxA7)~CbsCF|4Sxs&zjhV6Nh z_31{)-rkIoy*;Xuy}fFXy*(QzdwVxQ_V#d!?Cs?=+1t|@vbVRhWN(k>$ah&fR(8#k zF@To#o$T%XA{pskVZJLzckp=R$8vN#8Tqsv-9|?KEl0PKk*`~R4=Surm$&PBJ-WgV ziuRT8J*W-Rx0WmT_qbd7LBYMv_D#o!J!rWr@e^vc9-K@&o2^$LB)z{3>BD+(eto@{ zbbMHP{|j5}uMSJ1vR`_C?I$<8AN6qJ?n~}RM<%}i`Mf@zj-wJksNcCj`BeO%Y+Qih z_?i1b)zMC`^nYTz&3ZZbK^;eaj83{f9rAbL2Zj8f_(7q3Bz{mRKgsu?P_HL`P$++i z9~8=G@;xY&-^33JW?UVH)P7nT@=0>GC}tF@^P}ymp8~h zUtT5qeEBHZ=gUXPK3_gec0Z^gGW>+%+927#8&V?scS8oq?uS$)`*%YMWdCkRKiU1D z`p76t=Z_y$uiaPtRFBD1U!TtNpZh_1{&PPl&wuU*<@wM3pgjM%AJih#$Niud$nFO< zPj)}3IkNjf&63>@YKH87P}5}hgPJ0{AJhc-SFNs#YvW}1gKCi752{LbKd4diZ}9jL zvim^|lid$$i0pn)gJk!EDv{j}YJlv1P(`x)K^4gE2h~q@Kd3(Pq}^ZIZgVm}D6I$8 z4@%pI_;`=?Bh@bSjR)WlrTwZ?@rRn#^JpU`KRur|g)6@ch59mX^xFM;zHH_XHT!Nm z)pPzXl#X}wd4BHQiG3{X52fu~Gk>VDBdPt-jX90)LUr+dxIa{m?EX+4WcP<^C%ZpX z8`=G#GGzCM;`o&7qQo_hU$gEH#qn*{{h{VCp3S;H6vxNmyHFfIhwnmhd>!g{j=w|w zKEd<3Kh!wc>-PrP>-Q?z>-SNz*Y6`_uiuBsUcZ;fUcV2Jy?!r}y?!r{y?*Z}d;Q)= z_WC_f_WHe-?DcyO8TI>0f2cvzYd-t+k2Ld#g8sSqL)p0f6#St)zmNU*7lS_(>kG!& zCw@>rYxP|Edr(?WrTw6k&!r!fy^jcWRI)xD>d!-$VVt>geLA$OdSAMS#AjN4oA^UP ze=hu?tiO8@_uJYZ3ioqzf2d!w6Q%uYi!$yw7vF_?#e?U-AL=;rmHI-5+X>?EX-*WcP=fA;T_P>7FLLKhzZ2{h=nv?hiFi zeutIUN_T_o{!mr2`$LVA-5+X%?EX;0;N|{MCtaVe$Bs+BjB(D)%%XZ>mD>95vZ&eLCy+r{<;qx2(4m{F+!l9(pU% z&C|>4$CLRnRW|cJ?%{phg!`!M#C^ucik44S^Gh;29J1A#UlPo!=k@w@W{11MifKmu zk(9r4>(dQdeu^6<$gu&)I{V$hA8E+8xBe~@>yeZCBe7lz{z$C1!grZiuLXZ3)_cJp ziS=UeM`FDh)~92=8vK!1?*@M)*2|l;mn-#GjrDf;E)(nZ@LeX>`{BDxQ%nb|9_085 zvil>AlieSwL3V$nD%t&!M#=7vG(vWNq+zoABNfOm;r;iMuO#=8uOjEkXa~f9ip+K* ztjCwL{hO^%r~SNU{zy;0CmH9fo#Ry3r~BE|aV!0i@czvoNzQrh{E;y3t?WVmll6aX zJmKGKNZWyOY5R=S`#HHU9j|7j-q-Pmrcd%+CgjhwKhh!kv^J=Cp#5? zB)vbqpFjQ?_#^3g6MrP!Px^W0G`{a4*-3tS+(-WN>i$T2{_li8lHT`f{z!HoXTcxo zDS6&=>5ruKcU(uhpM8I%4lBQjKTZho`n><1G`O$H*&!0BPujBqzavyn={Ce^T+2?PE$v(e3 zME3dLL9)*em&opqGypzp{z&b1zQiA?104L3a^T>P)CCUyNIl@-kJJke{z!Rn@JH$c z2Y)2wm&(z8Y!CiO$Tx8v&ztxoAw3d*B&1j3kA(D0{E>!n-r$ckLdLjPzH3Bwf21ne z{gE1E_eUBhyFbzd+5M5G$cSS~{F&SzX@+|DN17$OKhhl8{gLL$uq!0~Ot3qMUpDoy zOGvr4@|5@^p}e*BM?$+2pFlekKUuW%oeh7aK52(0b5;yq1pY`lOV^Y8BcWcE?F9|_k_{E={9i9b@G-B03=)K7-vN@Z7p+;2Bh*;ORJnLI%D_M}Ai z_GXam?a>g~+pA%+w`U_{Z|_FQ-X2!T-d;Ay-ky$=y}g|vdwV=Z_V#+3?Ctps+1vYB za-PpSNA~{0JlXpb3*_6l|04NTGV=Aw{gHBZoY$kL;*X>wEVsX``6F3!XU=DTBppYk z{gISU#UIJW1sIM$2Y)1v|02Dr^rLw`&u?BYC;mvtk0LjF$tk&yore^^)BmsfXGZ~ej3^GBLU+q>j^+R<9+kHm3Jqr>jk^JO!Cq=|QHP4nE>sndR-KF_*G61(H6 z_#<8VuGIeM#+-&fQXAig`y*w@?vKRrVb=YT7BF7Sx<3-fm)TD-Rj_>-S!=*Y7=Kuiv}KUccwaUcYycy?$>exAI3Sm|pYQ zCRyToL*}*izBT?@%RxK_{d4h0vhmC*_#=6Kzf{&)j1Qt;5!nnM1lW5269FR%msxsvY-&U3$MlMih2bY}jj&u}}g<8kR?C&6)J zv(WEAesF(A`Tnp`A|rk&s@A zKN8yQ#2*Rme&UaWc0ch)!uwAAkru7qNc@o&$nK9cPlnyH(mh9pU9-|XONQOE(mg|l zT{Q70a(|>L>S0%{bWe~=Rvu;D5i;zui9eD1BUPz)f22|Jf8p^XWcNoJCc8h<5ZV2a z2FZgwzC?C^qyg}0`y;j6afv@t2RQg6;k{P&~ntJy~njv4!<7de`$aCcFdg4{V_vY9`U_4}nA z@_Fg+{^_(o66(i8Z$-L!dU^eLa(^V=$347{n{XeMow(2VSl-_AYW_%OheNhn^GAYN z^}O~+(w^qFls}U4cg`QFVEHL-^h1vILDt#t4*p0*+uqtAiS@`y{gGHN1%D*gTfrZR z^;+;pV!apqkytMVeVO_nP>6`f@X+N)-KhouuWSoCG{z%_S+Y^%cCA> ze>9Joee1u=_TP8m29p}kwNC!rV53Hf>rxiYkD|HE{DSQzi$T2{_li8lHT`f{z!HoXTcxo3VGgh z>5rs2*1zL&_WhCYUAx2|3E#I%zK?|O+$G;f!uL~??<3*+YKcD*zOR;i9|_-AOTLeU z@2e%>N5c2jlJ6to`)bMeks4NhlJ6r`$#+Yt=(v59?DL}|WS>7BCj0#A5V?=X50YO` zE|Goyc7W{jyG63k{}#wTKip6D`QtwDS@TEY_tCrGgK^m|es?hVBW3J*QSe7<0|$Sk zc5v`V>Hr6Sq#QW-BXxm;KhmOcqz2jjk;cjHk2FDc zf21k0`y)-0-5+U&?EXlzWcNp!Bl|jW^JIK?Iy!pL-gESL(WLt~#V63t#82jJ|JMFU zt=EaWLvnoj`$z-Q4o&8)7`zDlkuqq1cMVy(xn1vR?R?1ZX*BopU3Ro*vfdZl>lw;v z$|=eT%5lmDWtDQ2a)ff2a)@$}vP3yRS)?pb_EYvz<|%tAdnmgobCeyF?UZdML;W1(EaeR4H02cK1m!qogR)9FN;yI~OgTh3NLivBpe#}rDEleH>a(}aR;&8rXoj6>lT;8X7U*+=s)Z>23 z<@?BZj&hm)NLf5zvQ8YHJ6R{L&z>h)C$68&_J->dChNo%sb_n|^$e4B;!4!By$kEK zu|3QVQP1`=tkcH!l7q-}620~5mN9_a6&cEdQ zNU8Jdt^58bOY09pf_#>hGCH_b#pNT&b%5UP2 zRORtLUp-3p`RWm}`y&mLeZG2#%=yULAlc`uOJtv~9w7UCb&>4z)djN8SND^BzPgX> z^VNAW=R5s-)L}iL9_oF*x{K`ds5!FFS9g$ozPg?4^VMx+l)dxk`$&t{Z;YQ>FnQ|h z#Le+}+#hL{?EXkIWcNp!Cc8h<6xsceCdlrOG){JZqz2jjk*efhwz@2?jgo(bJVJJV zq+#+0sUISblLyJaN-mMzA8CN>{zygguXFzb+5M6F$-hZ`AKCqp^5hBXd&%yP)I)ZE zq%N}iBjw2MkJLeSf24M@`y;iHC+&J^yUmo=+jXfF<#&-ZGF9a1x9@P1NwWFv# z=&ybNen@u+t9{OYx@)YJtNbQeZ|c1IXxh#t=g~t}`XMdY{l$%?`LUTF(&)SF63_X& zNIK5Z=PA7-v5Teskn(aFwWBRxCvHf(hr%!4GM|%5hS!kCQ*keAXblA5xY4dFn^WUayaky5^k-c8ek=+legY5NsJK5{? zHnP|28M4>ww6lbD;(VPt)a&VTGbb5D;&knJD>q+m=7$9RbMZs6@j8YTtF9C0`F-g9 zF9ts())(Ht8p~TcC;mu3WBED#eWW|2e5SvTqHJAf_Na8De9HQ0 z_MXK4Vsf>1Nz2pIQXk7Htp2_DE$6@wsfv81en>WNAn!weKF^-`A))^htxxcJy6!sAj4iLene#06UC2+411&a5s}>wX`1YQNK<6@Lz*D}7}C3Y zoD6%Y_z{s|FRgS}$*`wZx<|>dw%_H#gC9~4_Itbo+k+ocmvLOrLmtQdC+o!F`I2?w@chX-aY&zJ zowxyzGvpk3mb{HTN5=ef%kLr`U*vwxzl-Gd3afYjS7zBdaqEL!M)e&> zrGNY6yqz!cOTzhINbAIvXItwoaUl6Qq9jdF)8m zD+=FJV!gUNy$>B+dOfdaPv*}wDRwgbT_n=(8*ULR@4LzK=>4ak$I>Hbr<3P`{qut# z0Bd`rs)wb~F}okK^P2zDok*YacbzztOYLvykTmTFrF`z!iR*nvQ%Jt62HEI>9Lqu0 z+3yd2P00C&=GJX1yN# zpc>R`>Cp36$?gX=N>*#J>PN`>7L$PPOyU{}? z%nr49*S5?-bT=|Pr2&@i{~a6TO8T?=l5;Kb%aU7K;g^*i|GMr!S=4`}y^#Mq^4r8; zYsR*3zUb|CN97}UUzKdbwwI6KeO9tnGTwJ3J4!}=sANaT$S;-bFd6x&k{u!=zg4n> zWITT*TOuRBR|xoF5k5x<9$@J{bZDvO16)T@+9A>Afvohvb|)ymrAyW zjPhE^c9Bt@E7=_RdwD+{WYh%fCBFvyC;Ja-Po2~4+p*u|&vAb_$GmR85nMSs zjr;g{>gDkkRDU=1dqy!{*);;$Jq($JUqkx-tKUj}hdy<`hxC5SJipwpl&5D;NV2PZ z5ZN#2SIpnJ{_Qw^zdYBC@;fZYYtrl&sl1W;$xiI2=g~Lietvq~M)_SMa-IBWKelJl zBOXMy%^ViJmJmPB!*U+Y0r68aNGGP_Mr3>O|C+GvPs=|4D9JOfDKmB-m7{Hx?UWsqIm#}|9?D+IJY^qcKV^ZkNI5`Rq8y|g zq8z3ip&X^GQZ^{ZO?F6iqVHLsS$|iJe8i;N)wDfDjg9xa@di_89+vda$)B2URZeb} zf8?j>zD?wH<%03#eiKXbLshP)<^H4hT_Er4CvAtghJ3YAj@O^sAN9UAWUe;$_pay9 z$rh=9SZ-nWO6RvB&9}6JRUU`^JguJ+ecG-zC!Ds2ow#59PiJxd4&+Da?~$2bYtv-r zmSlO)!y;{e%J=M$gXFhg zc%8`2^z-&~*5}R1_EvUD?{`RhV(HcDeO4YneLH69EWEeLlH9!fHe|kFa+1%xJROv^ z>PY7+Z7()nZ--@K)~B1-OM=Kx^OvSq=-*w2_qcC8`*)Y&{q9@8tbcbo-v7P}y?^%$ zmTq3IV%GC9&lg|L{CO$!O?CqLa?d#At_Eax)nu#mU-Dd5p76fBT&49VD^It{dnwmG ziR)%j@04qwAfrAi*Z!W2da7LeI2rXa}w1qh!=~<=WqoQ4f~A{AN)$lDo)%Le7!@nA}1B zBXT?W56NxhKOkqwte>)IpUSn5P>*)2T>E`8+Ou-)_sD4H%JmN$m&bk=^4RY{9{+7f zukXBlWq&BHqP>kSLH>#k)NKD~PaSgC7-aV`ld`_5wVzQp{T=GKpQxMu4(z9FWIs~; zf4Kh%9*^gXx{PVlcoBj`Vq+irc|A#u#H|qXno)76Cb<_W$j`tIF z)BmB4_ZM~3|Dlfe8+D_6#q~U|PydH{ADR9S^?ow_AL<1%{U7Q@@^A2d2FUb(sF%o3 zQ$I*XIT!zJGW{Rw!{p!M{v%}iKh#IbAELfWrvF2|L8kvheVjaL`&U?=wcl>-i^!bR zbB8JAdzALRwEeO6WxFWlr!3XVv&-9~_pm#Cz>9;>s>Cc3ILzeBh_ZzY!NMG+aWQWO9xZh^ukJNLnc)l}e zAAcr&e`nmULAj3WEN^4X_s7`Iyq@jOYuR79mi-mR1^Kumt|A{v_tD<7wnO&5Gw=Ae z<_~54ZOBB%@l(i0@e??o<~QACzx?y8oTRc9+v5-5x;w?LqT4l}>3)@K*)D!S&zfxa zc6sv!x>u_IFM}=3pZnHh`y{%dnab;Jx6C!Nd0yJ|$zKF-+yYrX0x9EjD<|b6INr-i zS=Iv6pV&vJmy;Ny+?9{$C{Oh$m*pcqUPrktAMx=#%60jOrl9VRa$i2e^!9cy*b7R$ zp4$@!$Zl^alHDFrAiKSypX~OGKC;_8@?^gEY%lpz-d_(H1zhYSWOS6oK0Xph>%cJRHlSM8dy zdaV4Y)^d{G90w=%t_jmmj+#1ik-P@0?}osYOB!Y`iMG7PHbgJG8S>_vAn$!OIcZ%$t7|p zd61kV50ST#hsk(PVkalNoq3du_bhgHvfHT}WVd6FlikieK}J5CJZP8AXnoWxe=ZqU zirqu&7q@eLb4cP*QQR|!Zhpr8ijN^*9J+VW*vD~tzJFA^RULM}2#>$SPWBI`haIq) z-t1*{*ae&EKWWFqPS{NU3Dd)F*i8TTriUG|nf~LZhh4Fm{$r+xow1qzqo#-5v6=qw zOblu_EPru#C`;sKi@Uu}%()FM0ylqR5dm=gRQ>JfkssCrwceK=h+Vr`W z`p=lYtEJxTo%NoU`p??&y)E^hGkw0L{`02qYpMT&>HAyizi9eGOZ}HjUu>!Wvgrp} z>dl^8FSXSFiyc4MQvVgx54F_)tLcYZ>c49Gk(TdKO`=e=jZ&XkE=S-f06GLQIGzOeCMCc`B@)Vb)tVHak13Pi;-U#S9P+V>Eo(S z^uOXd+nG-E&m=CE$D{ui*V)c=qJJm-XX?=)NIg$R|4`mHS!=0GCPMQs{o$W|M%nG& zYM*UuAP?wvwX6R1+mrdu$^qo3${w6AKB9Zc@tj|b-^=uTAKq(a&#YayvTFvidm1u3 zWpc8COZeJ z-0k-Iyq|xQ%*UjT*ZBswyQ=ws&yV@Mj;4p^%+2fXwl^|~+sSN1am?%&*6~t0e%Z!14`(fXVcQD@_$8$Y!KkS>{KZ>{eb&w7Z z+y}pQ?H6HO20wp&F8#?ol|8?F*Nw74Sw*_wHd6T!^{J1`d^{%e)b<{I{3Yp59;O_k z9HcB!4p0^;3zYqoeUy31UdkTIF3KEb2W2~D8)b$P^|RQ~Eg$(jm)K{?vy^BjuDTH8 z3>lYl`#8_jpsZ4kQjSm#Qw~uMQkEzOD2tQ@%6`f|$~GMI+ zfqw+o#-Y#t6S+bD6uCr6U6lPM z8Rag@ev8chRQ4G%%3+lKcQVRjl>IiD{kQD1WYkmf*qrfIm!ZM4_Cj*RhRlDne36dB zZ(3h3%g+b|_>+t$0kK)fmejWGkC*MmhknbTE$#;_n$S9xUZ$!S6`av?%IoRX&=BXd1 z{tog8`F8Rs`8INud@H#@zJ)wa-bJ3k`z*ZHxO^Y$r%s-PwMu=l$+NTto?NTS{(keIDBm^`SHl#nx6aRfAiy^-oG=c>8f2XZ%6bv z^WzcO)Q^Yl&0*1NOR^#JGJ78~PJ|qrw|wxxWsh(>`akj50=FNw?OKoMFCIfah>tBo z|7ygQY+i?Pi}t6a8z}pse;Vz;fnE=JeBFl3GvCznMcq?&{^)Vc3q}VpPblkX*!iO@ z<`3n5$sgu@B7a9&%sWclG4+_240gLL<}Jm)mHKHOKSaj7r}(#$F)u3pW-{hYf5ZT{Vk&<+zsP z@tAjxYaL|FOUwEyWXxN~wKnoBub&}f-aFWZvzQkTcH=DO&EuN4PncJiI5?{>qAcd! zW!{R6d3pE8iL#itcfVG*PwZQ#xm?PE&8}#^WIg>O({`REuIIyOa4?ca~q6 z*LfMZL%L%f{}q4hE}QAMyI+chen(_-fcwdLwS4GL_q(nO_5m#)TCTPH=(tJ8oqzh{ z$vE7`DS8djEsul#WGUHi`Eyks)hlJfd{g`+)Au24cYi=1Z~1s!pWE-_lH?f56AjV-3qsoAu+7^7DGg$ItHPABA!B+pJ!Sk0HM-?=MyEm6ssDofmU{P+p(r zjLI*ff3AK{$~sT1Kfm5)&I9`W>ie{DsQ9VrZ}J8cnF{mMHIf-@{M?7_8<~F&4bskk z1lxVyz{jCBZzT5+{0`l2!}>JD_0*@3&STS%$7Udp&zh{9%#X5`T;IkwW$@$&AeYa} zAN(om4?(W<1N(JTr0q6SVuz7%U9RaQ_dJ+sVI2ZX^Fbd7S(aa)XTfmv~b0 zA5cF^{zLKz`H#rM~{eD>1Zzu1M%^8Y`+BKrikCmkE?Ci{s`O8@{N{X#D5XjVVr8^=sfrd7;+PPc#rL$ z*uy!G8|>kn#|`#y&f~hDQ77kdgFXD^JRjae)X90=U=P2Rdc4P|vx|)P9CcnpF4=QM zov6?fd-zW3hp0!xE8mGE@1TB!yq!Es?j%>qIdX%%jXX})(kSKe1jkhX*TY(WZ^*pC>eF<+uI)u!o3ZrQ zeumC(Pu`2`YQN_ySzl^-x_EkPJ0O?N9O}gWo^I~9d^+)}mM(6OWBK&+>Gdpqb}zk- zZntzoF_du*(n*_pOaC19_j0`<1N+1W4`REwV-L%Dv_10g^DOrd-n*XySDPk*_1 zrte>SPQL#Mc^K^%dAT_(H>=OLU!;A%t`lc+y>7R0v+ShLwO^!-o7tc9xRt}QU7y4I zyL#N|#J^~M*P3EmC$7J9-CpDP7|L%bx2Vp79XLLYeD33QpD&4bvs~Yqw-d&9v0UGc za(yzteb0AZK0UvM`i=8L(G7Cr@{43n&*TRr!^kgsR8vFbedrfQ7krm-72*F*gk0sw2AGM&);uiJ62V$A>K$q~;J8knf1N!0Da4`L_-?YOsfMw5M}DKmq1yH)aj3RE6^Ba3 z`;&P-GTyJu_mT1bWuBFswd;vpmyG-)aj0bEFR=@gk^dwPm5lr;aj0bEUx`B{BY#UA zDjE4-?ABzI53y^LQGO&2m5lNwaj0aJKk>69!!JVoEXnYTknio1;TIu(mSoK1ik~GJ zei1TG{WndBR2(WN&ALkWv3h|AmZ# zB>fk%U0$xAvHMN;W9HOP;cd_dI}=W4^VU;xD($y){nur2sFGis#-Zx=?Kq#$v#Z@; zUbmzBpOH9J+{e#jKea-S<(*J{jCy*isxkg z|F9gBlm8D>>U@m;)W5|fvcI(p#$xZ#pTwcsc_a>%a)EM@65rXAI8?iz%29lmuX415 zjPLkWj^g`%zV1NfXfO5n{#)f}AGx2hKv|?5pe#`iQVvlLQ;txMQdTJ&l;b8f4prYX zo>Ka1P2x~dW1&Ck{wS-(p=u3yDsiYk{e~rRsFsfDI8?o_=OYgFEpJr2H|+hDGmh7o zu=Lgbh33;Uh(krbI*W0rdLPTj(-Mbj*U@@(QR+#4_RHo6B>7)Zaj4tQ!h3s8aj3c; z5XX~iaj1#i_zP0bQ*o$PE>dx*}e4F$W$srDv%<`K>{g{eFr9Q-= zl0zISImDroF`p>?L~@8jC5JdvGUh9#pGd}hrt}lZAr6%s;!w#U4wW3@P{|<oY@sMLozRC2@G zu(+PF=TF69aG`u@(i zUqgSnGmk^H@)}o}ZzL~BR!Qc2TgRc|xbrCvRc?HhI8-YasW?=!WPJIF-!mBl4)K2` z`*?hm?BjKm+f*DX^*-K5xlhHRQjY|_nImz+Tys+~6#hf40T z6UQ|?cPb9m(jgUxO6L4!4e6SSL#3Ycmo>bXR2(Yx*YbLJucaU?5`6AlF`O6ye zO|)ev^#$&KHMvOMK^`EZp%8yEawqkJl2AYVuvs_~LIRJB{xVfSkmXZa7N zpFqAs@+^s`oHIS_g3XTqr0HQNY^MK&>0vi)rvH1>!;aWY|8dj9uGmcfG1J4&*i8RX z)5GrAO#gSLhaIw+e%AD`O9uUJdyN)1tO?#U4%LopLpf`buAeeJ?6u*%PbBC4XVZ7I zJpR+B&$ZNl#`Ik+^=9v^!`|HN`k%Gqds`m=In(D`>OXJ#zLxqgn7+TI{)?tBwA6pe z^u?C?FPna#rQYnh^-@dyzu57EE%je9{ZLE&znXryrT(j?A8D!on(0Sd>c4LK>Jq)h zq3ZTp1KUyE2#*`fJSq3jSw@pMR5I(m`V5)%UVWC#dapi5X1!ORC$rwGFOai5|00?7 zo{y`NI8@YwNgOJf^MUmaGUp5HIWp%H>s@5D{}P8v=6s}oUpR?Fr5^o@xZX$Re5bF^ z+KK*2TrW_M{)@yPlF`4BI8-wFKXIMyOcIAmJ^D`)hf2nLi}>A;(f^V-R5Is->uhH_ z(SMUTRO->clQ>i|`hQZ-lhHqv_f6JXO6DzTS4zd9nqKEEm&c*L??;n)ONm3Z_b73w zw*M)_q1t{DhYHy}4Vj%Xxg-u%>|O5nx+D%&Zdu#AKN?&ThsyITP|j1%;k-3_OskiR zGA>N}z1Td`d!bi5y}n_$+v|0XzHV6@s$%l~cZufr?#i62H(0<|LF&~G?{ItC{ znU|(Sd6#);@*ri2a)7c(S)lBv?4!(6_EPpxc2VXiJ1E;J+bA=XsGntCmd}CuT;_4f zsQ+bN*fHW&{i*CTWcIhR|4v4ElsHr}%4L*&mQ1_a*qreh#i43_{Z`i3H$h4qs%+JGq20D2 z6^Cm1DHVrG-e>!HJ(7w;rT%{E@%*VcROlJo47yTPbvqd zyZwGG4%L#^(nFHQ{A8D`2aWFi^BISV_q#Fj`l4%O1v*AJBVL2!27q~sTr+xndGDsiaT ze`Ophw=dXv9@x}s{EY3XI8=MyCUK~?eU&&=yWaB}hbrkmiS9=x6^ANYllP?a=Dqr! zeI8x%i1yf0ai~Z)_V-h9sMtO>4S8$^^7yRD(~3jY@l9FpO780ekjwqV&L|F5>@c2> zH2>%1)DpLe`|C!&l76P~YW0QMe>6X9(a>`Bkl1^g#G&H(lQ>lJyyZ9XhbD(ORO3_} zs7ohf2n{K;lrz>=)O6mz?4LA11exe~;Wo{(Un0b@h*s z8`R_eC61E(2h@*}|ByUF{v+}*`H#s%=TgnPnwkUL%os2 zp@Ne*RP1*E{pnO3Dz;z3aa$6HitUeZe3!(b;=D;5DmaNlwd11B9?5O$CxhpVI$uRb zIz*kXBqN=oPR`@jk&aOkhsyJD9yi#-LmVpgoW~9J@GhPo?>QBR%KbTyTOTCv;ITMS7lo9I73s^{)9NU22y@ z9O@m??w@`fs-4frPj0tAqc~KV|7jYBs@r$tKK(j+|2n_BBo0+Mhy5hZ4e4~e-DD~b z)mZJ;x~upH8cV!~$#gwDCG~F8I8J>5K=bQVYF6+`+}+w6R+#i81`nRdaoI8>zb z2}xh+-k+CosAm7|#C>WUs z`Mn_5L#PBjkoZ~x1(I8@26P2*5?JG!-*C2^>_ z{YI3}rg5mM$87X)AdlLKf4x(iuP|U4pr>VQeL!O z?Y;Z_j6>aEc5m4G|3k&0N!(D& z#BWeIZ8!d(@?O^BP}ky6wTBk1Tn`oFwzW7^D__B1y8A^KhpO!h`|lTtJyNQP7gZeU zx9>`|Kj&c_>gUq;_hO1el{w0$>!Hea&1W)1J2&g0%8A$FP}ky6wOx~ShG72~Rg!$C z{sdaz4H>S*p{~WDW(x96OYIlyPu4@#YH9U2RJB{J7Kdv3RpL-hze*gc=~szEHT^1a zsHR^f4%PIl#G#sgl{i$>uM&r9`c>jkO%Ji^aB!!7k+HT_6S{nt!C+EV{@ z(^r@1Ee=(;uf?HSfs5DTP%&THY0boG#i8E#L&?15^BITwNclSxhx+>b>T#$)x?9I( zbC#ZKaj2`Thbn!OCF`L|)?151g zsxWWVLlbvEKqe_GblS&KuJ`dsqOlJ!u9 zJ)ZHLtcNOX#abNdf|c8|8HakQ*n9lFrPf2W>!j90C9lPyYI{?zuf?HiI;_Q^uEn8h zKCrk*nQu9GKEE`KVaj5C^TZ==rjD-GZvQAaA^;0zh>V>c# z>RKGCjytQ?FN)UUP%VGQHOwDG=W!frTujD?FXZ)53$ixk!E4Yy?UV-W*=N^@9Z3w4 z^0Rh9#$zX64;B7ElSMl$qxE)&d^@LdNxRMWtXvNj{zb`psPIQBA3+>(vL5G^cEV)6 z&XnSj5utW zcO)ZDTjn3h=(xx{B-!IoOJw)U93Uf3T-IYHYi+20iv_Z;KhjV3^-223zJAHVq8^v5 zhq_2coV%c#-shzk1vfw?Unr6EDklV+qdI-={VFr-5%ml+blm$$~OJ! z_ptg^e+F@=dHqfs9^d>2{eDY&zh$0Zl0*IJUwCn-D7T)D{=HxM9-6(!r{(d!EYBt1 zud?)fjOkG6&KRH0dZ?NY&P5!mmPD~b*!{F#548*V0om5(U2<~VVfkOBe^>qF>!Eho zc`8S9ls%NalzGZN%6`fMWs!1#vP3yZIYc>3IYK!~S*2`Hj#ExhPEk%%&QQ)$&QZ=& zE|}EyQ1v}aQrNHAdZ?)3Fc0J3MPF?_RIM>jWj)l-+?tL<&Di~<*F)9&dOp@e{q@__ z?)_ZjP#5iawEob1div|3q8wJv;(DlhAM$Ap%lC&Vfu z*I9UP&m|63+l#gJP{lqX87Ccwx<}qi5{HU!G5aD%bGcR_P~N{w&vg zJyg_d<(jXDiu$fx^Yu_s50<_BGCm|(4|Sa9^Yu_0WXuQ3dI)4+4|SC6>!FU2eLd7+ zvag3aM8rJqRlIMfo^*Fzm3`+BHFvag3)Ap3f#{bXMcwU6xUq2|f>Zm{&z$oQ^s z_+CoQ*F()w@9Uv-M$`byPZE-54FcQ>h|?e z@qAHtgK?aA{$xE=q)*iC>!Bk3qHbRgwZQZFdZ~W|Kvag3aPWJUsC&&}L{uJ5QL!Bo3dZ;sGUk`Pb{2?Ac zNA~ql=gGbv>H^u9O|z~ex#5f&MG^f#I)xms|7azV+BXd9|rC6)d-qxkfh2GE1w(p)T5UChMW%dCN!S zAoDV~FhbkU_H63i`YyvfEPz$Zl^bk}v1}1+v>~`pIt3=_9+n zCr@^JP%n8a&({NfEDL_53;cfCn-1i_VLj9ia99tu9URs}&49ytsOYb!*F&}XZpbbt zcCvZ1*PQ-(sJQQBJybkbw57*REZ^m~`$*P9MY<&Gp(5R)E!S~>q-(MsYLUnDJGwQz zmt;NE67`(FtPPU8c)lSr42-fKDVg8Vt&Na(a{o~>3Y6Hz$vdcTkhhb^$(`g0a*jMj z-bS7#^ELyvkk2L$+HN*4*eidg zzsI6>53Nt!Zgi2XQ|I-|p_~7+RRr-dt2*p{A&&Bi^c`j|YNo%{^sp;7)8Arx*cqGYcbOh`$7cH1 zn!dN?_05i0hg~upzdK1ksluDaq26WZ?Q417yG`HUQh$%>3oZ5cn!eal|2oqTwA7ou zvtDYcf4v<)*iyg8^g}K6Z!rCEOZ^*7KhjeF{iYvnsehB{t1b0!HhrU|-t4)n#Aold z<0o1kf1l~6TI%mN{d7zH514+YrGB63XItvuV*0rydiAT?uiI<$*uE9{RQ#%pWxYl2 zpEE^V&!ArFWW85!C$rwGcaT}{)pKOld-X0d>%FkPZkFfor5-mD*Yjl5d$JxW8SQUe z?(QeB7Kim{ z(Z7qsdbH^ONj=Z=p?@gvo2<1|v-MD+Z?+!lKT6Z$-_NZaKz^$1!Tu*-50&w6yBPo0 zy)^zUy&kICyL|nX^m?e?-d+16={VHhZ|QTiin~kC8x^JBy}TWre6JoY{c}k^%@J<5 z*XLa9T^fgK?XD!F?x*_fE*+P_@B8F&sE7w#xgKhd-M{41XZ1c-uIGa1i&w0NigaJO z9xBT9`LrIYj+fGLs5ZWNNS`*7al8MEXFXKZrzel&oUw8!>#0yqQBF{z-jMZF$*5;! zewjQ%IZTOq%Wh>G%6`f|$~wg|{7Ui&`Bmg$GV9se z5czuQ2gx^(OXM5L1LRkei{zWg1@g`0e)4O`ePq_-KCaHbmik`mcaeL@w~)KYw~}+@ z+sGZ{+sPU79b{h*74Q92)ppz+3}Su?mt-% z70*}Rdq4Gf{$xE=q)&P8Uh4Dqe93yKNZ({VRHT1-@0+-Pf%|_yxk!E^d4T)|a*4c$ zJV=ItPW*Mq9)~(iejWE8A>T_LCEr7?lJ6!r$aj&)$#;?`$QWSyI@HN}sMFNzTho5f z4Ec8QEcrI_9QjuAJoy�(lo1^~1{bP#0~#)z(AR9<=-KYWdZ?DX=ka=| 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

E`%epBjsj)!V~ zC&xo2#(bFU8&8b+GU+E0V?Is3S3->WHu+u&F}@2c{X}Bc-y-~Dj)!XYp5vhsV?I#U zkr4+TDskYU5(geCap0j6W4==OIK-IGlzt*{;Gq%+9x8F*p%MokDskYU5(geCap0j6 z2OcVM;Gq%+9xCwWd8l^2_lJasYWNg*s5rmp2{wQ&Sc#QZM z@dWY5i6@CaK|DqLN#YuD;Gq%+9x8F*p%MokD)DD{KeXpbPvD_aA9$$5frm;Qc&NmI zhe{lHsKi)jBI~8i{&PH3V&4xH^(V(erT&+hUev!F50(1BLnRJ8RKwa2w)RD2N!l6h z_o@^gs-;hPr`Epgl!NknH1bey6h9aG4G%*e>dW%!d+2zmW)H$ch24lPh^cIbhl=a& z*66R;k6fhJ>9|S_x9NVUdY;&wp7&tvhbrNZ6Y)^({c=21V!24uQ$#;Jj8{Q+~WlpFXVWrmY+EuDzV2S7KuGxu|Vwc4EVJi50!e4 zhs+Wq-Wb}wal{*|#Rl~rZ-L*<@ldJvcn$n^jOR>Hj{&vBABa1dAEU%Oh)00$ECSy; z3>$Xv9C@g~k%tN#d8mf-JXG^{WA-?SlQBNo@m+Qxx%9b^&wUQ$wav$G1@+HSZ<@wK~eu|j$mvy#xVLw!qOOA)i^ErQ6N4e&B zsMKG^`_B_|{<03cNjf-xSzn}{^OyA{;){9xGBFwoSyw>ZMg1yqi5PaDL>{WuizM<; zi9K$N{$vt)sMLGh8TB%WJXGp;@Oc>5ZHk8~agTi5=okJa&qMuXa|FUewYb^-YiAAT z`E;4at$aQLufK+8S~or8;7#-vFAID%Oa7YcKW5h>PM9>g{-;fkxM4H>PnjNZ#Af=B znjUe*X8NBrJ>rbb^oLB3xMMT@Pndqx@~@fR;)sDi$M@d_>FvjUxQjLUGHv&rXnEhm zrk`x7KVtf+mil{4Uu&s9YWhY?y~R7j{)rpQ^_X2h+w%I4n|`jP{u8F3Z>j&J=@(k+ zKV|yGminJD{ZdQ)r%k`yQg89xuufv*`+vr+Uu}8)&zimfKhnhRKWqB7mio_`zP+XX z=S<((QvdU&FRjt*x~hBsfA-!5zOu8d_umEkVdUdE9R{b9*|c`2r8Gn?Q=l3PNJ?o* z%cU8xOsLjoTCqVCv%8eZ>ITWQD1meQ|HDQ9an4b*cV=h?Z_&fC@rY;Q<>)A)<2_u2 zs3;K;BVHJ}{-5Xhec!d#Bs-FvJK5gHr`%3fA z(l}|>+XzSA8RYjD!NYK&Lxm~#QopK~@wCnue#*VhI9%s=6Yx%W67GSgVAa2QXBsYa zsIcm9TMrcWUV`@v=3&+UrbC6*KFB+ZFyob-C0OkXn|A{jI#ihP(9SZWzpB)ss$M8{sIbOcY&}?5?KfKw7S?!+=}=({yhVDbJ)HHbeQ3`c z|2g6BqC*Y8k6W(Sp}zaC%5h86p~iif4mI{a1s!VaXF62b{vp}=VA!e-)#F{=bf{^Z zjOGe+% z{lEXeyW`)PV~RVbcw>q)rud?bKlA%Ftjd!VKQtXG+mB&YUbX5f$5LD{ z^@~z}$n;n2KZ8}dYU9E1Bz6Kjjvd2}Vn?upVJkXRwtscpcU6b#HBD8A>U=6X)QIb= zntCvGs8LQ-bg03mLshwRXds@O=}^UOJwMZ-!qg}A?}Djs>aT%&!kP{h-U{CiZ-G@V z=j|HI`cm!VI)D9p*kAcRtG^Cb{?F>)3$L*M_rc5X>tVeYS^fKAy&qY99A0AoCcFsW z0WZKAJP-c>JPZFIJOjT0o`(0qQ!wRtdlJs^Pr!G=<8TWegWm{`!f%2{;2(kq;WxvD z4mJ3cbg13R>(@|TE38o4JFI?X7aeMxzoJ8hZ;S&ZeLzKrivN}Pb^jF|D*oO0m3|c+ zD*hYrEBz}vRQxZ)KMTJU*7GgbLtVgM=uqM7*nbI@5X8O%0KXXjG5A_|8NLQyfi-c& z)|-Z}#=i!?5IzoH1?&B(=uqRiR&=Ovp+kkA&+qmAR&=QNpNn7be?^C?^KaCl#_vwH z9;&y9)BIhZAJQ;R@%ytn)JX1!vkq0yccTuK?VIXQ<=^^?Xm%lb*QM0)I#jsOp~8g@ z6)tqBaG^tm3mqz~aba7(5H576aG^tm3mqz4=uqK8hYA-uR5-1NIsq3tRJhQg!i5eM zE_A4Hp+ki?=ul((Npz^;ug(Kpv3Wcv)1k&ZJ9V2whq}Ih_nBYy{@Xz0pU|P&E4f~; z*=;@4kuRN|4t3;Bde^;2zWr;|58q?gW!>Db92t|(&#Mua_`G24>3xb1ct6*B_TKOG zev|h*fApheKRo6U+CJTMs6X}ba=-QWRb3C&kDI?|Na=g4uID_3OS-Oyny%whww}%@ z=ujhlO@}JmuXdQ}P=m|$P)CDLqC?gG8+E8`U%QX~^Ktppcbw+>;(oj6P-AN-^4qoPAqy3yXR z=uowNZbNYUhZ@)8`M=@!*`M;4@|CqS!+)~!!sikD zIEo!2-m5z--jkkNxgM(SyP`u?dXzd;SbAz(wRlbf~f2 zbf~b(UDKh$p7c_621<94}3km6@Cf41%4@9 zgI@-#-fVVW4%4pf+yJj~eac^^Lxp$aUxr@+AA?^BABDdSrd{5-5njaqDtH0j1JA?c z>;75s;a7*>bf~iTe7o%IcgP;PS$6I_WjnWoO*-C+4mFNfu7^4kY&ukJFLkKe{`f&{ zKj%4?ODvzv>iMwMbf}Tu6&)(v%kh+t z%kd25^NJ3Y{RvWLfYJ*Tfjjo*2>8{_jDUO-kIo7<9Mn6l;ZYhqC@p@ zt!_G0AMfj?L-q09st(o1J6nxNUe}>2oeoWht>{oAUA?{HyOweJvDjWMhX<|P?WRNZ z`oeUmaojY%UDcs})YgGF9qI|`lG5Aj0Xy{rqC<^z(eRS3hpPKb&%w_Z>2sCRqq;rP z>2hsP>Evy?NdE@gd9Tl{y*xJj!d`7p_1Nup{OC6m7d)#&Rr=gx>0-_0houhHAJs*@ zx=z=jI-3qv?+N2==RH||f4)9)mmg9-e-L!2IxqP))gwjumcC2-EV~ff=(|n=< zxX_`(7je7>+z3wNp=E!iTo2Xnu$vC`!+%-!4^dFlSI$I-8uL0%(4pD~ zf6lIls`tyr6F=t}t(=#s@7b5@hv@tF<@zEs?C-Uiw+Hln{c>LD6#hbo3ak8hG_8mF z$xofAL+!Er+D(Vr@a-2za@CT4()Ch(zWv$S-s-jy=XWXHDmv8Iey?plyB=yK9&}(N(xr8FJ=DlBC)1(sv^`Em zhdT7XPSBx7`c`$Q57m08+avCcj_r)~8fu?-`O)L)LA>-~y&kHSlY1#gABj5Dk6C^y zbUYsghZ^Hc*_Cs${RhM59o4I6*F!CI zsF8oN{z8We7dlk9(4oSMq-QPie?^B17dlkD6V^lZ`i1uUqfv+YpR4uH!%&C%`CqyJ_2a{GJygqY4}}gjzIXiNc5?eW zPhl|Y|BJ1E9`8j(hYDMR(Eif;I~5%&exJ?Ye!Z8?v+JRf9@2ePbf{78mERqkguN8< z^qYWp!qT%f->P_H>&`LxOC74X)S-$?9jdt0p^8f#YH(GD8gaMDIKAsoBYtysJ=En$ zr|f(M{EP1+o_|RsRNh8^cD^bKn^(a8z4+Ch%g%4W)OV#0HQu9&4i!#uW9qw7hl)SN zovH6i9V-5voKNrdDd|wxt%o{h>(oUY$&Pf}H=V+Is2;aE*?OqqA5gwh@|>WjjCk3} z)VH!B$2RrX!#}>Me`ok7HuXmw@l4i3jpHi* z+D+g3BssD=b_iXC_rtmjT@cX=~Z}#nH*F#k~+gT)iG*Ki!yB=z!%el25{i6Se&C88? zshbY<>JOLWmJj86sBiz|2|CocUR#$QtMT8YcRA9I+v~1FwR*IwL+!C$t2)$I|MEH= zs@J>3U41@q%Lac^%5@trhv%`g z*ct3Jb_zR*oxqM`$FQT=5$s^tst$FBW#y_4)%jF(s1euqNlW&Z<|F012ZHnA!LUbe z4^zuurHSYHjl;2_^~xUE+cZz$$Q!g@>#;WB-2Pe|H)q}CiVijM+u8L{&#s4hj^&ec zYyTzk%X(eKhVpuY4t2n1F4Vf{P~-im=uqK8hYEjNoY(Xy@GD`xe-#}n{@wWXzE*Uo z_zN8>ta+Yk{paTHLWhd~r5sP?L`8>+ztEw=*RlT+toJdkN8Q~0V*JPO7dlk9(4oSb zIFicu=I*Qc{Tluk!pGsOVAT^99csMK6&)&E=uqK8hYCNB<0&q2c0JTcjzTxv@eF?t_t-!2J^6H8KfiA` z8{d<+|F))QZIAswz9*0WNaeab!kg+5|J`}^cbVC9?61d9VyBLO?VnqiXT8t-J;vwO zo)W&i&39Ml)QY)8Iv+JQ2I@BnSvU;IIg$o@jT@6XD9c+4ZTce|So z^<~TDekaqRdVkDxs7l{km3}AFq5A&b|NRMDPv;bLs8QcMs@FrcB>TUqLyi8knjaM% zs@h{+bf}U3XV*j3{Gn=jv3@<&UW@m1(V<5ARdlHEYSfpuE)QJjP?g>$Kx$aN$PcP~ zIlCSz?b^=S^-#Tp%}O0=l)GowL%r0K#l|JozsX7+YP?Ss9V&b=`zxOIuv!n*##{Dk zc;Vr(9;#hWHyx^v_jS{u`uJ{Dhw9^34QL)JQnBN6Y^55#p7%T%vT{XKl>rH(xHk$I?Ce&3qqaAJ2P_*|Y1R zTKhBQ*LCX^n+`Sd;o0?26_?9O9crXYwyn^i!b-@zy$EXpo_+rb_UOKklPYeQZR>$& z@$ZDk;6jHAr};o5FyC)}2-ZV=+n<;H!$-0X_4wR*>vgCvI5*VZ*5CJX!pf3!qjrF8 z+v|GcG1Y!d#^&`c{Ja0>2|Co-^K5?IvDm(GJ=FQwUap5a3u``@#hqb2U(;d2dj9tP zSD1N&^+{Oy$L1NrJ#mFLz6~q?S=<~xAO9$<{M)LJz{=mYUMQ@B*7_~53RL@k4y=ZY z%`=4+khJkkSl{QiaZOm?=eF@pSUPf>X9_1B>Q-1fbo>4;oOGxQ|K>N+EY>$!ggx47 zQGmG`?I-@14nfo?-u*G z&6@i)oN!t?)Y&hbs6$QHJL%WkCe9vxBkuK9PY{0jtD z4}H#$xcPdhtGZ8R+xxK|>T(>XbzlX%hCPn0#dX+vq}Z+49&7{Khuwu8zz$-Eu*299 z>?n2&JC2>ePGYC9)7Tm8EOs8d5Z2d2_2;aoQmb`a4^<_$`VVP7%E@%77sc}!i9;UQ zqa#<#g;_hFzxSW}rK%29`Kqcz_3L^l)R7;jP&*T)${4;>rnL`wjRLs zQ2jb?x9e$`_5Oj|d`{)1>rSJcKsowI)S>?91MuALj}F!Ai?ce^jXKnu?75UWRFylW z4prq*vz>IPDyN$5q(fEt)odpns>-!yJLynW-Zk4vhpKY0ncm;J%EwZNIv($3sY4xu zlMZzhPCC>PIO$M_;iN+yf|Cw)5KcPO0XVIPx(iP0q4vRPJ=6xA)bd4AuZK$gN_!}u6`%Tgs5)P% zL)G<^>!GThQm%)p>(BbrdZ@a;terd;UDt)v5v>vL` zKkHBHq3Zc${b@Z^J-@6!t%s`ToAobfen8TF^#39}6wjkv4|Nz$>!FUoNryTLCmre- zoOGz;aMGbpz)6QX3I7V`pMsMPbsA1O)EPMGP-o$!L!F0{4s`)O630*9-|_ff)GubE ze!=D)>KChTqJFv9DjoZKH0n@)&Dt|XyWwG|Lp@x*zBBwz!~NHx>V3{4`OJ_1V62C_YR5nF<92ZSJMVniQir-2?@6gc)%`a2+XdO5 zt$%~x4ic>Qu34;ys`s+gq3XSD7VDwvy>9ML{e8Xn&0;-Nl?!FOV4U-%c)}Q*;tiv4 zibssVDPA!Qr+CH?oZ=mWF#Wdr0G#3_yWkX0>4Q_er2(gSOb@)B^w|n4p)EcF@4#P! zQ#^=zZ-0sxQSTKxRMk_>LWfE{Sm;ox2MZml@@=!wp{l>qEOe-gQIA%2s8QZc#^qU@ zY(C;8r>{e$zB~W&IFNn+InI-vzYErVXT^G`N|$myRHa*X{?plC>6)GYG+61L73-nu zxs>an>bYg-Kb8IUT+8)P2P56H^Do0c1V05Hh8e$XkHAmHKMG$0kHM-aY&}@G7yks@ zfG6RL;3?Q^BaaVE!%2ra1E;w1ES%!b^KgnwFTg2oy$CCx9oZYFiE*z1`_Jn936FcY z?li@XcGx;~r4IFr@#5zPl`n3)_IPl0J=DMUxK&4SzixWPzY4$NfZhBNFY72S*v3vc5sU5khd|v0+e|B3B^>5<1TTcAlJIddEBK%u7_5W@7dp7m|UHBWD`ac=|zD@lR z@9gZ_)c^PK`+-gUp9=rrrv85j|InuXPltbaQ~y7Pe`HhtXTm?assEqCKenkq;<=si zP5u8Izn|FD|Jm?QZtDM+@K0^(|JU$OZ|eWI@Xu`O|M&3Ep5XU+RiE?i?Rjliabvs? zoOc%4zY!VHbeS;aUgsE0xz|~SDfc=nFy&rn6{g(ltihCfo#Qa&Ug}r%s@%&vTT~AA z?%;a1!so+1u_OPKHecE(|~kMhn0Y!Al%@8gH@n zU}257*m|&V6#HJz!)hPe^M<{YviVS|{%xEt=}_hOd9CZ$L;dU@m*bYLo0Okg*K7ZL ze;lrs-^G30O?tkCcGLCCao*OI$7K7D%GQ^{R@X!IcvqTFc|@0e!nn@2tWW>!GSVP4SD=A8Xb1 zp4#{{`EwdOg`LDsV8^jz*iq~Vb{IQ^9mEb`cVYXm4Qvl~D|QREhE@4&I@lyIxy(X;cP@PXjhZ=ExRa1q2=z-UvF2-{$b*L-B+1vjrY<@`3 zExYNj#q9<8>wg2!!=Hd>;lG7v;J<^X;ZMR-@G3kB|2;ebe+nLl{{bF@KMjw<{|Jx3 zpMi(re}aeLHFyyIXLtbqEW8W;7q}1pSGWQH8{7l`JG>SC9J~cS4%guSfc3s*_0Pk! zm+D`DX;0O^2-DuGe+kz6nAN`w>%GkCUxCwls4Kyzv>s}=^7=KD*H_5y9ag_`qYhQ) zFLkK8zUJ;5uY`5~r4Ci;)7-rqztXSNp(=fwyOR!8>0hpgs^?Sc zQ1$$pyI;!j^n6Pls-AyychaFMe>8Vr$Nqznj?LXe@DTiBco@DG9)YicM`2AIvH3*s z)%eHZ7s3#_2nfXV*iGghq|igyJ0=lHMVcI9_n%VH(d`^?b9<~4^{cITn|;=hP?f*4dRh-v`9G^`T(XGU)zf;YdVjLI#x?V{-mk2l)p#(hmE38(c?cfn~r)IM0_%6Yp1Yuwq^gN4(2 zs9WK*9_kiY^HTD54NmK!s{GCBNr#&1r=&wo^;6QJrur%AP*whC^`t{h_0xJC>U@+l zo9j@IhQB)BXJuV~ZpnF0@0HIp@%B|QKhV0z>-%>v{W$GXEkZxj*ZndcVp0o&WH`vLEjAfPBGJ z@2@Z4qnM4K&G-A_v2wrl_f=gF)sLIMhxASTGUogHIG6X}Q-9p=GhN5f$1MFA7s~IV zzkfGzoVWN@*m%_SE0MmfE04?eugTU|!!Ip+d1vh_e!iQx9S>`t zh>E|wqx0r-+J1Af9;))&#`RDspSI}$<@!Re{k$JAKdAh2!go6?O-|6E8YeyDgRvfJ z^qlq!=BE1 zsL{V^>Uti?^-z~={G&xa^8DZM`|Q_qZuKjlSUWSW_hjWo8b|S0$lsS^Ki^Gq_~>b*Ntcvzt!Ip*W2v;y3)Cyc5ml5VA{o< z--K)I|6A}@`2WCL;NOPzoSU8Bf#>n-`dj_8@bBWEfqxI4hCcvL!M_hr!XJbu;6H%J z;Xj1O;A8M8{73Kz{KxPx{3q}b{HO3B{Ach0{O9m4_%Gl-co}Yp4}VB@{=>5Od_;Ek zqq2woQg-fRvYn5Iwe*Ynsay|LOQOK7U^@9(xbXP(uwhuluka16Y1a3{`u^dNRN}PhwAlF(q-OmY2ZKI zhu!{Ioxt03U$%Utqn7(ub)23aH*h_^zcpJ=y1$>dy8qgJ>~GD^6ZZFveX{GZCdi5V z+Ye5*zqcsU_1t4OV}~!^8=q(H_qWIFL#;!N_;0W7#MeW0&JXJSE#6xdXR)4!kKE;l zl+Vv2pPi@S%UXVwx7y7A!a+B+{AxAy@)r#U-`BkTl-3Qa(N&W6( zJyh!DZH#-jskgVK`9Rd`#d@gJ|JywG*mG~wPS{30mB#P4U4(yD&v9ELIQ4hR{z|zX zsvp7ohXeEat^dH=y90k%_75L89V+R4S6o(Y`(wORQUBO;+_^O`5$*mMC%*A9UyL#! z^&fA1%;$qse>%TQ>3id2J{Q}!Ki1!#T5a#`6Oj=vwF=+`#%G{A{h}Y|$f*Bo{Wbgl zjAb>`oyPX+}1AuX}4mzDau0oVaKHM3qDN*Q-3tpODJs zMWx5}3$j;AA7uT1@qy#m)vzbrkLTaI;*?fCZSXI7`?jO>@qD#n?C-f}b$`#_XwRdf zcZ>I+qIZJ}y&J5!ywy)|p?8A|y&GKU-C&-7eFE0Ffz?m2#uco7f(yMHTP7kW3i(7VBUuky|y zTW*U$1|cnG25{BK8=@~-YuTb-ixVEtWdDx;VbLwoi|f{dB4~Tw(XBm zIaV!)Chd2r9J<$os?U5s@!TFQ2CVF>#YMSw>H~<}RK70UlZjlf2S@MfLJAcmJ|BL4x|B7vM?Qxcw8fN$4zwsP3V5`r|+qJ2Eli%gP zvi{iv@Er}$$JURHd|iG=zsg}7AByAJxDZz5S*w3bTu-ZiE4ByQ!1iHxVF$2-*dgpNb_6?$RXy11ABQKf zlh`TjG?_zgR*^{Xh~ zHnxXU4yl}Iy^D3ZhAo8$Hhoz&qtnLpT2D$_o?lkzU$|~KcO=Ip5LQ# zId7_*_43>P7w?;Q@LD@)N8X`!`(ylH_4mTs zdtk}(m13R&amCh)W4GF6w)?96=aF1|9(s?8el+g4q929rg6z-Y9I#zLu<~U^KZ-x~ zyOobC`ceGK2o~pnl@9iOEm(2Fq8+(E#Rc^KH20^t!6^HuxWWjW;ts=bic1W^(Y?0& z8HAP27UzId++!E47s}!saEhBW;1pNsfm7UNE1cpoTi_J8slloLKs)kB^kABk#DgBM z@~ZikCn?>pSGm}{`vUQmv@h?vP)vE({NZm9-=y|k8L!fNx_3hDg>0wF-R#xh6#HjS zy+Za|o+EqRvt_^bS+cLyz=7#Pqx{Tv?uzX;KPc`e+xbjb_nYl}2CVeRb~2vWR(fSS z8Bc60J+qyRC$^Q|*-pk2+j<_^&ZlxbJ+EwMA3VtUFN25Rr@+JTrSJ%>7sb{MgD=59 z244)1!@ckX+<+(Hi{L3(&mnJ5!x!S8f%P1%{)hFPO_v3yIPn6k{E_O{I{|HR`|Q%9{4qI1O9Hf5567V1uITx@qhTW_y^(dfrsGN!Nc(P z!Xxna!K3i&;W7C8;c-}T!Mr^IH}OxxcfeC{22aC30MEcb2+zWAfal?T@Ir7tx1{Zt zHacAwkkHm8^eV^?0+V2$feQ`X~_sRAjm8~y@Jwe}RaqKjo zFvU@;<<|4P+|p%v`;p_UVOOy$I&M2Izw0`a5wE{ne(yhc%BB8%MmzSxZAw4CKEK3sYdp`kuB(f_FRt?>`abzL>ic4Q7kytmmr~z% zDA>vi+SxNHUbQq{y~o(!kQ4NM z&bQh>_Lur2k0O1a-V5S2slD8)>-|e{R{QR3JU<)v!%ku+u;bV<>?n2wJB%H|4q^we zyRd!O2DS&g6}tsn!>Zi1_z(A?@;b#YZ5)m5ss}3izOSnLuIl@|ge~=bkBJfJQ_}ZY zIhWp}G|%Hf(D%i2t?2uLP2U$bjdz*8PuyORzy3GyJp2iG7XDj!2L3yE8vZ0a1+T)B z@ZZA|@TcH$_#fag_|xzx{EzSm{26!{{wH_{UV{hWe})I(&%(Rle}Vhpe}x!nCLAUxM{Mn!XRFeOCVpJgf42ZYB7_ zC%z@h-LiiAuff&%>Rrq0*TinM^VBV@nZ7SJ+!(c-*K^+6Q2p63d%OMLTXIF*&T0qW zz7MRdkx%e|LT0T>i%A3b=%(qDdvj5 z>i*sW>$<=FfZb16m(W{`Y5#ldzdb&a?!(i=?{AO&^U$s{_}y{s&E0$A7Hob+l;;(l zCVV4)<-=yF)5QNu{L04_ohE)gSeri)`LUwYgm2*YdXFkPP5dvzulKN`)5QN0{CbZo zI!*l7;U9#DV3iZ)dZEMkuf?x&rn&nXcohGO;4%1WcpQEqJON(?Pr`%n6#N2s8va&z z27W#~3qKE@ho1{Cz*oYHO8<>I&DiheuX%Gk|8r~44Qp`+*|}BupO~|Kf$eK-e?zdB zC;n&s2Kf)Fyu0~1cLZ-gNBt6SFM5x~`WtaQo9p~uu6RTLQv5!9yT(Jan>0RZx|BG7 zMdt?>IzPD3`N0~GE#fex&JX`lU4L88r=s)2ukm1OKf{I24=!|maG~>q3!NWa==|Vg zoPQ85bbfH5^MebWA6)4C;6mpI7dk(<(D}j3oWBMaIzK(HQs)O3IzL$R39MfP7dk(< z(D}h1kMrI5wO$JQc#!&)C(-%E@2cYfD_)*<;^z?`Uvi#HO^X-v9i}ZXSp>-@g* zyXAiC@9PAepZ(r+eoEh44eak^>rJkj->>5(e_`o&-#WiYU(@-?_N)A`@x5TnFUohF zmEe=;{Ivf@ogdrR;y7J&e)4bB`NjQq(fKKVZqWJt>gPROOt%%sTiij$(J*YZA zJN^+>Usau-UtXcdOmX01{(v=Jyyce0NA3GeN*Bu0iq4PpIx2hcnCzkDu&1T-^L|b< zE~|FtI={nlfD_(xi^teFZd{M&|Ay^hrxe%Hd|`H(>P_nw{T- zX=inQ3+@Tq?ED{iEBxE=0{lDhJgn=td1~Js?RDqKkavu+G7=+pSC|76}<&V~ZRb5BY{T)_5vG3u^Ur!OgU9hd1)hK}g(u-B!&C4j@HBieJOlT_vv32R zhcAK`V2xj7yDyCG+2t3=zJqa!{Tippni`+T&S6}F_j>OWG!Av?Id|1wV87gs-^*ib zHWWIg_4BiCe#$Og$06!r`oXE3$hWDVoj-9<`+dDCfcy!=!L9Ag8^4D6DIIRxuJk-YdYEo1uCvrT>i#!d zN3yk@^tgufxI*cX#)(>&D&0(X7#H*ldv#r@Ub)>aCgK?yF4{0Z`K<0v>9x-)QGafG z%s$k*I}0h*F6z~FU3$(97NhcZoAOhUe^iWAb$5}UQ#>|}V>|%5yU4GmyOZtE|7HG8 zc89kb?;V(Zr}{(Lv;3-!U!e|6(eK@+7pj;aQ0naB_*tp5gVQ(^<>NNS9ov+j z+ZdNj{oYb%$L|@}O#R+cXNTWjZ2K$bPi%VvJc6Hb)%GyVxNCa|W?Z&C2s3Wm9)KCw zP4hptG47k@hZO5QHrPMSkDwkbb#|&3OPw8j0oP0YTk7oar}-Q6F!e>7`hHs@exKqX zrOxh(|8R$wBmM-t>Fi!|wCtZfa5_8E^RBq82SI12{Flb@d|ukX2TgZ(na=0BJFDjG zom2kx`#-hy9(Q^7cox!Td?R);P z>T`=r!pc8ZFMiGs)ZE|0@z!AFzocJp?oac(R`4tT+IShP=V7`uSoz=j4RD%Ywgl__ zY1J2DyFPrbv_UOkzVcR$MGkX;y(Vn^X%_3v**}fkDtUYA^x?0 zZc(<4b=~|8NyqW_Qq;GH_1>m*OyixcD+eO|?zP{n+WoZp2cn#Ot6!Y`wfYCce>&?u zdOmnC=BfLA*?h0KzH*+r=1HdV-tuu=ZyMLR-G0-s|L?=5c_kiy^uKt{Zn@tg9&{0A7>@s!*yNX@I9>>-q9c;Zx>{e_K zwt?-#?h5PcJ^FKwo40?ut@lWljeMNug={)c-SXE?JI>RaBXP)+%}@W8gVpsO2jf1f z^V9vh9*XrIf8wIM?Ib%#4FFOO-0VSZ@ue)p6dg+-lJc~`hIObHx%db zax~frl%vj;{BL%BXTyHC5Bugz4D4@@u|4YA_Qz7cpabyxZP<2;_eGwv?|R9in@sJF zLdRqWiT&5<4O(wkyslcGEZGHB`?)K|{=RyGdOdQ(1Mu8Z|M%S5r|qa#ZgRit)4|!x z(dzYieevMyUVkjoGrd>$SNH1WWW(;`WO|QTOXu{wEN-jwx9vyv=k@h{J(mmYxs>`> zl{=;WRpn8+-lNK?a=k~DU*&p_D%Z;O9#!6z>piL*EZ2Kf`B<*^sB*Jh?@{Gxvz_#> zDrcMRq<>ZU+iWNOtIFkOJLz9lUN_rG|EhAl+17ZWwG-q0YPOU9bpcNL*LgVUUuWT@ zf1QDo{&gBo`qwEq>0c*djh9+G4NmJlj>8&nwRRtz^sgi0Q(o_JEcQ?BoqSe&>gzq~ ze5L+X*Hf^{=}Aa=l00U%B3+?!VN(Dt*fJ9+iIOdXF=4{Bpg=Svcum=i#J( zU4WDRbrEL#y|V--{p(RU>0gh*N&mVGC;jURob<1&aMHi7!Abvm9AoAn=|To*^X-O2-RUpCBo zd(~~;8H(#G`k@!wM*DNNV&ze#gMG8LXNvDGJPdWPud80)8MkX@$tUx&bL9Jj%73lv zdgA%EzJ-4AQ|X_2qtO0x`W^W!`NpH;2s@ddudeoAsn^r}mg_xI@9npP#QxNK z#d?p_d;3#=eQUgzrCyJEuUPMqdXMpbtIy-TE5FmDa-&)3^;E8udOejpWjsRVQgi=* z;`&r>HTS1@#!-%+;vFjYn)`X~sovY4;w200pW-R=aEiCg!YLjz1E+Y+G@Rl&Q?Pm` z7Jq$fpv)<1tRyo`o4FZ0os{>pd>ue=66r2=~ED@MZ8(_$lx)_)>ToelolQtD&8@ zS7B8YHm(o%vj1_o0aM?dujgR;GSy$_r?{}*o9ukW9rHHz-T5i5OnrC0;*R!xIDW6V zW8T(#o1L$Gl;RE9`8{#|BYVSiUGLH39uZHlSKRw2ANu3!dXLYG7e7C!d~w^g1Hsie z*u@^VD!%)w^Hlx4;a40m>42*Kh?f=Lh28l3i{kf+6L$OkH-ukt!*2cy!>>4EH~$6U zS6s21|4HE=`+Kc$U)S{>FNxz$ZF*f# z4*&F~{!7C@v#I|n;h){qe_8nFH}yxnvsfRF`>MoGpBlek-1PVT;a}R+|Bc~4x~czZ z;Xk&i|LNgh-qin$@ULv@e`fesH}yw6x3jjX|MK|#@lE~D3V%)INbkng{EZX*J|FFyeS5o4+g02c?+VU41MJ_33(h-(Fy&rn7^d9ojKGw8 zol%%_uQLWy?sdjt%Dv76Ou5&YgnKyu6ubkThE+e?dWSIMg`HVg^}DTi2&?|jI}5Pd z2R052tNmc>Tf%BzX}}}!}1RGOt0E+MZc<7f#$qJJ<}V-zL)c=cY3YC8pl)nG3)hG z%F4&f!&uBIt@kK@x9?oM@3+cv%hpYOaUZSgwf}wVK}X^`T2~Is_7BO{2g6qNpdRn) zrUy;qBwzTWsvdNLubd!imR z>Rn4l-_QM@ZhOB>=ech^sIF_H9#q%8xgJ#aXZql;_>~sxRm>{gH|jxm#d9h3ps)C% z|L(!pgT5#-R5v~73+((=J!tfAZuP5rH0nVI^j_5U-r4s<$d76d+W0iQ6}tsn!>W9+ zxG2X_d1CQVSmlq6E5j{h+V+WV`s55*lFw(b`m>*9mkGgN3kQ=!LX$sbb#$& z9rs<;gL+MM(eB93_SMlRJl6SC^q>*fS2gt@uJ@>NqSS+`yvp9bH}YG4NY5?1=~i*- zm(*{Am4CDPcfrcXS^YJz@^e=IZdmy`tKSYQe`obESou7wzZO0o`6jD>54;Ay4qk=7 z7hZwC4_<~}4Os}7+_>JO&R^;Xb$#V} zkGlR+N2vQN*L&3cmpVeFPr2UXWZYk=BUJj9>pd#{OC8}1`@bx1z~;-qFNNpfm%t0~ z_3$Em9lQh&!AId2!^hxj;br(5cm;kDyb50pufZ>bkHc5NdViX`2VuQm&E5XgJU*!R zuetkMVZEQt-Oq>h{x)|%57ztL-2Gfw<#%)UmGFShzd=Ws$`!?D&#nDHv`@VK)UaRr zdQ1m{Qm5EkCqsuhb2upk4N2*+7UJHYkSPbJRaM}Tkw1A|1pmTf0`fd z>FPazG>_GP7xQ?`cAdwg?o(}_`Frel=hmJQ&#%;hs=U5=!+MV@M{j=OK0R;0c>61L zpepBX-gLdkU6G$Q*MWZV^M1T+Qyr-CXQ=~K{w>#gRQ@j4dsO}}*L&3akrg^ny+7r8 zk9xmK9jM;Fa=k~rpIJTWK=uA+^`ryU`<>O34pi@dR!=%ml@D1x=|EL}WOa?}+V>Qd zKJ}ynU4)YkbOBB}(0MrNKxg5k1D%1B4s;q$I?yS2ndd(VCmrYntnWe>apQW@fsWx% zI?z!#=|D%|qyrs<*Xuz0V*BPg(4p{G=S8fn>(9k}fjQ4THa=tB-v%Dmu{RH~JZ4n&17>fqK8mulwh$ zP<89$oIWpR(2ni>_4PW?|NR@~e(Ue6ssr`o=Il{~X&l*MX`$vhQF=KD~L{7s#(VUcTvik2-I@ zK?kb*wowPVEAm;kO$A#yuRE>xsQgmZfqK5F>Oh?zOdV+SpVj=R=s=0{@3)it`R(!t z%-a0kNY@xQvS(M!J4|sK+WSebnRf>75quNzW~BACLTH^O<%3?KPP6DAs!< zor?7ym42lTRQbhqp#C1^ZM|nn-_<0&Tm34ho1Lqa&iyKPo1GWJ0$ovUG$)6LF{ zV3q65&Nc89`(FzyA2d5JhWo-cJG%Z>e*?Y_e-C^;ycK>4yaj$KT!UW*ALslphu7d6 z;8j@ZY2RsvcjI4%UjZM3UkM+DzYSi3Z-f`&SHTPL9(W$s^EDl(`0%U4-<-cm_MUH- zo&65kLpRILeWz^amavw7@%wVU$3F4p8jsEAW`bKc4QTsrjnC$X^xRsHAJq0j2Rfzw z?;O$gV!g*vak1Xxm^kS^i+K31cyG#hc+z_+9ZJ2Y(y7#YF6nr^jN=yZaK>?qcz8d@ zUuJ*CaXTw;AO2OCaoi#v&Nyxn55JWCm5;LCC&S8TS??vV@?q9{F|2%=_4dNb$60R! zRzA;qFM{+STt z?%S>K@hjbjE!TV0@lyZE#%Us-mHNj4-Om#TW!LFKQ~%*{*52`Pt#0c*`gmWr^&WkE zx4Pb=k9W2jaT@>5q|%9eTdwyw9@ppdYkXImAE@_&dcIl?d->gMy+^Mv^7e2XKaFo! z*L(cpA6R>1_QZ5a>FxD^o%#V;?=jMa{!w~A({u3iMfzN&^r&u+bh=#IQ#$!5PNaW> z?Xy#HeL_K8Vcaprg$o@j zfA~n&p)UUHdL8O{7SB@t zje5cE{oE)mtpDTXhW-C_ystkNsps{T+66~OwZY5np7+}J#}7w6)<_n{e=_{lcFd?PbaFBs>ZBdo<1~-6c1v~s+>GVdZaUOi-+r;qm-Le!$C~%;&*nM~ z3`IVv>QEQl|04XSp+jBqIF@cd^oi+u|Jl|vNxF;FUVQ}WP?b*aQo2-hsImQC+x%&3 zhno&H;>~X*9ZZKB{?pQ-T0VF%bg2I3T6{9D?<6`@-KVl`jJq`Kcl+%BZd1JT6m+O@ zoYsL+tlIOf1GM80OtO6nJB^*e&SK}W3)n^M680$e7n#z?5?n`L-pruNfCeDbf_v3)t)>R9jceGr=mk0`^gh@sBs@v9jaf~L!m>x;-@_B zt$2UyjP)AImtKB&K0N~+s-Eius6+MZSl^#caZE2qqn$uG>TJpXh|-~c+49rn=(V@Z`53_Z$VU3qrI}z4+nza+*v<|DvyNV7KKksi{ zg9?K75~q&|14bSP~k#{3Ku$57(HHR2`+S~aG^tm3mqz4 z=uqK8hYA-uRJhQg!i!wL+5r_EYP=5>9V%StP~k#{3Ku$5xX_`(g$^~?+rd%4m~B`+ zljgCQ4mGaN$4R4px!9cc=WO-Mqe_SRjB5S!Fw~*etJinN?V9_oLyi1kI#lHw%L|re zPDO{R-@QZqUC(d+yFK>L3(P(gI@Ec~!za<9#{E@vsIdLWueYvtc(dqlQ}2~JRQ6B( zb?UwSsXtG>SM>Mw-Zx7fYNS_1hYF{7g8C5^9V-5>9haUT1wKm2r9>6)GYG+61LozM7XThFDUL*@63U$z%v#xL7TFyoi)qcG!_ z?PKtzoNpOcz~8=e4qt+Q6;?%II#jq9|8ckhQ{R<3)Oc^QQilqsxUt%kS*b(CpW@DX zFSGNNPfQ1fe<$ZtzwVTDs22C|ak>;Yn)*Ohhx+~~2uz0>`Qo-~7lW&Du#U&A(s+b! z|AaVMJN$|RcGF=-ysXfx#pR#y`=5^AD^A$$_dgYW#SOdpe=_`vBX;xu_wbJ@-*>tG z{}z758N2=dK=>7R?B@T8@K0=d{D>nK`Z@0ZD%n(j+}5)(UFPDrQ=1<5VECsu^&blV z%%=YLgkSOCZufOh_~$qMeZ)Hp-QLFQKODbb-1PVF4gb=n{+|i|(M|n78~$UP`hPC` z%bWUtKKv`2`hOw(tDE{Go?Fb5*m(cH7{5Qh>F<9j{56#$UGnAs2>+H%{qGC^)=mBY zGyFZ9`hPk6jT8Jnuj*dko^B?qHQr)6RM;wr_&xPZsYAtoPWZd%P{Z%zmh0DBzwOt`aZA&o z#(kL%HTKW<$Kh)EU1~??caxrP(Q|EGKN9K=up`{9{uc%>#0o0zfp%8+q>vcUbsPHoO7*^$#jU&U0Se1LWE-E~W zoxx6Hr?8XQ3G6s_3_FS)!48J4=up}I)p6fd9jezfRUNAHspwE6uCHpU&<{QE>yoN` zuINxBpP3Fdtm#nWxtR`Cocbm8+hFRG`gg&Nu%<(Wd*JVex5Br>%HO6#g_X}uhYBCp z`Rm^UufeZ_SK;r4SK#l1m*LmL$KdaWkHV@SOy>hP@h`%6zzc8&&%-|e&%!?l&%keh zr{R6@6ihju`qlLu{{;R!;c>VHkHK$*N8vZYBk&KwgYcW-LWdfBCOXt8uU|uXeTD4a zVf8D!=uqSQ6&)&kWBf4b11dUH{IA5X`>*Iw@$bez2@k_c---?u|I6{~`80RG4A%22 z*R#~~ZSH;vem(zkJBX_*H&abf`N2MjdMW?&h!2_&_%us<(*KJl)%^ z{nao|@%ytn)JX0~4@;VdqYhQiccTuK?VIXQ<=bPW6+0=pET}idL&(MJ*`Ko_p_oy#b4-9;X;QB7dlk9(4oQ_ z*DdR(LWhdK(4oSG4izqRsBob}g$o@jTRL~x zLrvH5E4H4_Dd_td zpBs`rI4pZ;B<$(vP@{j-)b*VCdZh1*161QSgBFJ|9co;U=l_P^XMf6H%2(FT4FAc> z3y=T!IEo!2-m9xD-qS^gs{1c>sIc_Vwk{7WJ+;l34zB1>gI$N}<&Wu5BY#zNsNpvq zYHT+hDm($d5FUrGhE-0R4i%ope+@hZUkfWAm<|>03u`)5xB*`W_rTY~Tj7_$Ti}<% zHTY#P?bgoAVcNBw8{k#0Px;GqsPJz5%kV4UWAH2Cqwu%EOYn{GBK#_N0p0`8!{qD! zS@Gdlhu?IlviE$u?Cf{Q9=cg}?mJ~Ww}eeP-ii)2j#sWnIumR2il1@ZA|B2-ZV?ZE8oyUMm+Ow| zIb_AUqsttRaoi#v-pB7(@iUHF#KRfKE#l#f;}-F7#&J8!XB8c4q<2M!3ion8<>PWZ zL;1X-LuLO$hZ@&sIxX45)PJ&Znz-&W(V_ad zRyQ50kN0)cq5Al4Rfp>1ovlVBuj^2iPKTz$R&=OwefQe^`>v+r2u}5UwH)^HyPFQx z>kHGN#&Og5c2$S^Grwc)joG0S(j}$0*8_Iy2SkS&>7wB!TNhRLnVy56FVg2KrAKvp zq|@cvp3=!jaU%U2Z0Ef`nGW^qY}X^i1#h?d$$z>Jdsc_4blk`D-edNm)}i{ND%U^V zU2`@as@{|I-l{mO>QKY~Am~taUh-|KM~d<-eV6uG{QM1B?wR`Cr4ALp=XU?S+7DT&Lyh~$N*yX(=ulzn5XJ9TU=_SJUms@NH_aE?rWecB zg~#u$GC%(k%(!xzkF>4Oq2gy;x;+mwZrz@RcXGTjxDJoPX+9A3`ZmVR+k^Pie4+uk z(4oQ?al8iH2=;Q<|GMc={SLe7P!In~**|>Xbf~2FU2!=N!g{D0_uhN^Vm!!L|I|)( z2D;NP`V}4-^?z;Nu>F6=F5Psev3>jFF7ocWt^c9)wsE}JUeTSxdR{iJ2VdYnv-)o< ztmkdxe6aF^jrYMj+5h+#{6EThhHJ3$o5hJ??_jZo|dHX1x@4a@u zq?7RWiG{%)iR+g}x+MK=MK>DT@3q@KZue!n(J%S^S9GJ{w{~beNQ+-8zSEf^&ND50 za7OmfK%XmV(Wn7jI9HT4^{7H z*7I*&aY`${BR^LC5x?#zeLP>S*#6b{)Ia|C33|794=Q>$xX`=7ipyL51Q&WYxX`=7 ziu+sr1oQms$0I*i^lq@m6|8=O3%wg$=-uE#?*3RF2y`vEZzKHvHL5ZQ1KPvRBT@9yk~_?~Jg2p?8DdBmZHwYbts-{Ds~Pp67Uz zaG`gD3%wisGweSD7kW3i(7VBf-VHAFZtw!fTY?L{8(iq!;6m>P7kW3i(7VBf-VHAF zZtx=KSN^Z)-QsD(e8n9fc4#qx+{k&4dEN$mD<)?99w-D8{G zbK^O$wSU*uv(~On?VJ3raM$v?)eg_!LjU@Qna8^udlmhJ%e7ytSHDZ`BOm{8kBzU! zb(Y`J_~zI#^;e5>&o9pYZnyt8?Em|)X+G|T?`WvoP^|0T>R0*K>Q^~z<3o{7HZFu! zdDiNmf~T=6x9mHV@H}<_yNFeJ)apM9AHyzVSFo$tHSBS$%9B?AmPn6Q|5mK(Wg9<$ z`>=YxK5pynUQ3SnyRh-R`0w-`L+{tqB#q~r=F{G88yohEeb^(!GkyHew|n|~5u;Z@6UYs-Tpm|PsDzCdob>&`aKQ5zH@5_bQ~_mkKeH4o@^cJN&8)D z2envlyn6m6^H<0HR*b9dp%466rMx)f_fh%N`&FJ_pT2D$_o?mO=E2`(H|ObMm-ChU zo}oyOys7uV%WwN%yl>ufZtc+a{0_Y@zK*GH_x7Fd*SbvG^E(XeFKzexbpQ6p_`me` z+*H{U~e~WPcXtfb9Z;l`os6 zeiVP|cPk%P)-lDej8L>AOZ{l1S4BSxr?`OLpNf7Ie~K&UeJj6rrT4I+A7%d(x6pfA zeoss9bNRh3z30vSDK0Y4@1uKe=`jnZxXKKi;x5y0ipxyFDQ+_fQ*NeqRcV8gBa#VcRg<{IP<_~{^_@-g`i+I&w@ZJfv7qXoyce7W2Q|zBT z^$OWY{!3x6@SZi{5M$fw`|7&Sn;=P$4|hDzhyfV zNAvHf`-R{3R^{isJ;n9TvHvuD5T1b#!L#st;Cc8ScmYVbe-2)Oe;!_ie*s>D6&JL5hwv}ruPGny_$7D?{6FBW@cZB%_J~swm!0*T5Ck1DF$>(zuY$u=3O~T6O`P>w& zax|Zth8d5Un}Jmh=X0~L%ISP=9**0y`&fWg&fB^vFylpYOEC5E+)-HdNIrKAR{T4k zTZR??&gWKO# z!}%QL%H@iG+x#|_E0?Pt&*vytE>}IDTrT^_|jv0m@FwU5MgnZ8fHB2+hh*!6VXOK+k7IY!_xTI%?W&*u%@g!}9A_Lmh8@*$+mWqe-GxzW7p*T3kK8T4 zx0}2rmiiNZo;SU7oxab@PfH%(&;39BE^lAzJb7m{+T9m!Q~G)P)>H1>8qc$>>*}KK zi|fogic4Q7kytmmr~z%DEPr&XYv}q-CDPGCjAXLVVz0a^T@5f_oH&1 zNxc_!y-%sVZ2G=)~VY_rpiwad-)C!i(@7@B*B{^Y9PAv+xhX zGw>VWX?Pzz1y8_}a1Kwvcf#Xv3m${t2#>;Vf=A#Vf(PL@!x|sR=SG7seBxWY*e&9L z=hpsfaCN?V*Yf%`v0JUO&SaGLH%2Yz^_=%MRDU+i-fsW*mRg$scDwEE+xKC&pEDEn zUGn!>GsRwq*k-%cZrSbsYJWe`4Qh53$MgMdI$+oRy$0^K|Jo+|dyA;s{vJp%SNv74 z$Ls&D``ZuL{eSz{BjX_oSlJ#Q$>qde164P5dv#ulKZ~ z)5L#0{zdpYcnKbYkHRm8kHOc%%kVYu3j88?6}}o?gI@?Ahp&QF4pwxU@qSixn(()> zzslLldZGBAhhOD%WxY`RSK=Sg`8Vn`W51if=FRc^&#gT-Y~E&^Z%*a*%}>nP&iLD$ z%F~;l_=ec-?Op$~ev|e)sPgXS=iCvz{T%g6y#4I;qxCo9dN$Yjy#peh z;6mpI7dk&!q3!NWa==|V9=LZ)$Ke*8O!5Ysm;&}B!=ZC-0`N4(G57vAF>leX=&JQkh ze(=X5f86-BUJCnoP+x36iOw(l)p39oFHbx1^N5cxInTk?y^VQM%6<_aU*FGLn)ZI& zKs;~P`FZ`fUJuuGy-BOEQXKwNbbiY}q-(NEx?eg!kKcR$^Oj#M#~J*+@~Weo&TssE z<$mk$>xA_t?YO4%Q~KVjYdx9HFI~s`f8ElL_= zlP%hXD=IfSv{U#Vk(Vo8v~280ug3nB^(NzZCs}V&{*CKR#{G8D`Nj5)I=^52yr)cl zQ2AwjyQ#X~r01ig7i;~v(#7X_`TgAMg`ivRZ#&~PsT}p^>FtCY&+)yj9i^~)t@V_^ z+GX~-#5j(suZqr3@!J$XNpWD)`NjRmdXsj@iq22zLc71B^CP{6WDgF@9vTUIIy%4T z=QMTQXRh-*90#br=YtlHN%_drt6_WCc&@ImU-g#Fy9qv7d6DAcc8GYdUSx5f^xQ1Y z8u`rTkLvzQogb`xX!B2DGN&MjeWoIZ|M(fNtX^(KQ&=cnzZ&QIGPKd9}c&QII#9MN`k ze)&C<+Wz)YZAb5y&rfLkfiZ1Qy1&EY!Fgv^+e`f){7lQ0mM=R>pUOIv_zV3X%y?Z# z>0ibB$M5B_ zm+NVM#`<}|H$P>UuItcH-1ias!Ks|cx2d0f>yGD|QC^TG>=D=A^@I+m)UvJxuQy*IDWvhvSF&6G@-19~3`9 z6=Z8W>2VF|afQ;uba-+7txJ_|raO$^{leZbF+SR`|Md7pkJ+=jJGC=!xLoOTkEKgB zKku_j)HXdV)_?RYSL*I=P`~q_-m4=2JX!bQ&(}jP`61=!6pwuX*ME$BmLHmy?d%Gh zF@L96@9{409hgq*o$3!|&r%>LdxbhMHZC9ezM`{(y;b4u3f13Psk6hM#-UVyXQj># zKjV_A-&^YJbe*Nn4))fqpO5mpT<;P86Yx|1Z)03F&A%vhcI?l%Z0h%x>pkLUT(`Xd zGw$1-hyCsJ>!E(zmgYx{;b&Yq^-H&@9M9V$_%Go1gYbp$0L*wc{nKpQMfe-|8^Njl zUh3?w_z!n@`_!LMH=W)4f2r)BJ@RyR$6J1Xp|g8|zeCEee!u5fR=)4`9T%cMb!60! zqS#Q+omL+`{#b0^sI!}o?WN9c7S{7Jof&*V9M5!Su%5TAZwS}%Pr}MCNta&g?8fmc zzghhVD?g_1h&1=7`Cj^7M00rvHnrD!{2U5-_8^o{o#dL14Rh0IZzRyyw@2Kw; zl=Imd?4NXYJ+R*A^c~T1zT6i4Di2J@7x}ZCZ?_1mJW1aTE!TIHF1DP{cZ~h@+)ZZ) ztNgNYOIYPv@jbi!mOD_^koQ)(xqxQ-4Nx;JZHL_h8W z7G%%gu^jm`f9HzqyH>-t4jhf+=I>q;pN7tEmU#evh2HK-=leA~U(#o!cHTW!33>f^ zi?UDQ-)Gn8cf7~`iMW6A-=X{7WB2oH`}6s^ertQoI-iICNU!$u<9JG^IF0}AJo~%M z>^b(=<0r98h=1*$TT~2(4lUX<9H*%N4(q+!sIyy)^t#uM@maf{R=?&yz11(y{#yM@ z;XieqosRcF>g;^x&HDCqKBwor_t`3^9*H`;XGMHcaoLALXXp9-tj@0d4phyaN4c(? z<^`5IJIxzxwv*0I^9q}7#l;I9bUW$nroZ6tPqUqLc2jWD*-gSc|D;21D{gQ7IQ)w1 zTm1wlo!uy$bao?f(%B8eNoO|%C!O6OtZ|7#huuy(yIuH`&aMwmI=cp(bap*((%Ef= zlg@4noOE_ISmQEQKSVjxY$u)F8mw_0t8d_>vs)IQvd(Tb_D|(_-VvX=&Q9mcigo35 zJ>|M`Dql;TovuIYPdYo@U)Db#Wp>`t{b&72XQ%YZ`jgI1=~u2Rr}WMGlg>`*pYdBtUu}OM)4<|-5C7K+}}8y zbaoT)BK}GESKul5f5Fpm(%H?x@5et2C!O6qoOE^z@R8U*eb>P2@2F4AHthZMde&{; zp+32o`o!u#uiw|#J8!0*_4?R;YB~+Ir>gCkNv}uI`}%l*AHQ`c@#Z^;D<4oi`CL>y ztpjUuoty2y@%Z|Eb^DT?w;IP;G4^(hSLGg``L6%h$HP*2Goy5Dr}uvvPVeIsycE{P z^}|-rH(R;S4fpr<)4#sq>h+zmu4h))-Qhi(BflS1zH42l{$%T0Xoo+Q_V7+iB>T&0 zC*`xsKlb?IIp1p!JDzv^tMMJ*|5S8#-mZNxbatMP(|q;Kb#|0{e)0BqyZygm|KEpA z^J4E?XQ%Sd;`mXHw)$1Rwfa@AwfbxEzM0MqyA|7mZD9MbyRZY;LF^EA7(0R;#g1Xe zu@l%y>=bqyJA<9Y&SMwC`najLdo4NQuba+JJup50)6v;^B;{0ec2D?!syaKhx2rlk zzrKe;XZJC?uA;m+;tJK*kpEZkqvGQNJPNVW=sk2jlZSGI~Zsp^$U#|RJ_S=>3%XJzj zBE8Fg|2UlD0%LIcKF=te;tC^hiaQL${`9;bKLjgISbnc3#We=-r?|&1SQV$un}$=| zqyeY6N)MdkE?eOgm)QcVV{LH+m~uU}BRA;mXipY8JC%#gLT5+&ve4P7yeoBfYTuRL zh0=SvcS7xjGuPSCE-Z9*x}R((<92P`Z>h6WdXzdlrB|u5Q+j4Qlg>`*o$X}YF6qB^ zGH#djUxm(YFw!&Id09Mf8_$Lrw`(guWIHd#ul$njRKVTl2eJPp_{ZRj;c>VZo`4(h zBzzG(1*bUeG@RnNGqB=<7AJUyFW3C z5B?;)3s#)Y=4HWukAD#U6g&j~13V0W8XkfF5gvs<1CPP~1dqdt3z}{Q{%8D?@MqyE z_+Q{@_+Q}}_}}1J_}}4q_;c_=a6Y%B?Uy$^TiATbV=(!BZW$)O&#l1Z_qkP={64n^ zKPiq^>gC9lp zi{=Jl)f4&L5X^Yf+%T+qCZ8LDRS)HJqcG!Hb7OGQ*^R@Dhs{mEUmNL?&rQN=@0-pL z_7=WBhiRDcxVafv^|0v-Va2~qX9z3)Z8}3(1%l0&g`+s=qO()}XkD-U?ptTK9LH;2 zc}%wds4U;}tLp4Lu9xPCrSFwh%dKC3e^qC9oa3xvSFtN$tNp!EYloiDzw~(h-I07T z|I(ja>Q8uobNauWsI!am(~`&cbN?^>S8reHJol}$({*js+3C7B*V*a*@(nsWrTa#m zo!--jlg`fDvsIm4v_EfEx~Klgqh}qx#VEH@yvEkCBR}f>OL5lpok<(_!#|0gz>Z_b zu%p-!>@ao+JBS^??!xwA8`vJ~R_qpR4Xbk3;y>Jn%Ig%rv~e`Hs~#wIc3)lhUDern z34hUU<>yP!dCX&-Peo@J;}@!a9>jI@7UQ{=I=hwN?CpOQHb122mfiH%;`W04^}m7V z;ZMM`@ZZ8S@ZZ7H@F(FZcom+6{~n%zKLwA&{{WA{pN2=_e}qTi&%nd*Kfy!r8axR9 zGduu)7TyK_3)~0)E8Kwp4eo*e9o`Cm4&DMEhimYEzg<%yn!9g|3s3bysk2i)ZSH<0e&yp*XQzDL+^vGLhcTo|Za0y~pKxh<13w?0g`Wq{!_S2m;49(9 zsJELNbasoe-{v~IRrxpQ?AF-+hOhVue0;(GN}b(t`8UE8sk77lXZ57B zQ~G4}q_b1{W%Z=9Q~G9w&Q9r{)ir)(IFgSC(%JRE8jm-fA)It}TVRc^na&VS zIy=3;Sv~3OQazP)cB!69I=fU)C7qqhkF1__cB!6Pud|zve7d>L?r8X{{W>2ftoG}c zoadAueO`^Xv+hmvv8?;MzMuCeZ}WcKV%+cPtf$v=nmW6lAJR41CEYKbo%f%-|9QuI z%W(#e;|2yx7MhVqVsM-GleX({=pe|FZPEPo3RL zq;KoWp8p$upZ$8yt$yVb zYo~<&WaUMQi`yaMz1m}OpY+^Hot^GGFLZXKM_c(Yty7WmaayOM)Y&PWU1#UzkFDbp zLwxu{vhyF7z2_scvmcc`^p~=8ACv8TJglW(Jl9fZr}Cv-Pp?P& z-K6$dR_N@uYWw4<7Ym);7Hz+i`m@m4)wKQX)U$=oPWi*Wg<$$S?|*=*IK?!^R9ZI1}ptbot>Ufxz655TxZtHcwJ`{?&J4kFynQd zahUPC&IHVOU1t(zysk3^U&8UG;fvuJxEG#<8}K}Q5xf9v{NnU=c6zV(K0)J9p|i7! z;PiENI!@A+rE=oFb#}}fzlQnbS7>~$b?I`;Z?M$at;KzMyS-uCZT@0#TCb;CUV1s( zO=sujdfq-3`7FifPeo_r>?UjJ+2`=u26c|_Xu_0 zmnz*(rn8H92Jt#y_rud|ANK6}c9s~P9#)B3mU>v|>>@7P8<%CP?A%au&JQX-75PWS zNM(IH<>v=pXQzCYAKDuEE$=L-d_HZR9pzK8o*m`aHfz}V{iXQ>h0bm!&X;XtT(Lb3 zGwztaN4t%2$<*&HbaoT$@2wU;{y5CIXPff7(AiPGZ)4oFJ;MHstETxEh0bmWf700v z{{QT~3wT{eb@qRp#6;x({~E=KZTTc=juMg+TH>*?%1@TakV z_Sn@FuehGtId;Cd z-rCt@KHN4AnF{&(PH>FoNX0#g6TCnv=(v1icoXLi>R!n=npEZ;k9?;*Qq1bhrSJN+P_&zsVA zk6&*_uIKs;?RSeC>M^*U9m?HuogM0d`{cEJN1n^qC%HpA&GIX^4_SI1z0MBjdpLD= zTB9x1JNP`A?N5Q7dMxVfHk*Hvx`*SO$L#Ixm4z?a`#P5O>@>eWuCt3elr!ahM4jEh zgPNdGX9rz>)Y^i$Svg_<-$*!}TA-m4* zAlY?x(`1axg!Nv7&TfM7uCp5>yUuPDeAGI-aogYRcvb};z0MBTi#j{pPt@7LzDAuL z?mz16ChhuBXNTvHIyZ_wB2=f$X`)shy0heyUq^zGi`UB9rAD5?m9c<@3b9yr>xp#`7f?#*G+bv zT@TrHcD-cR+4YfKXV*`5o!tQ0b#`E_zpXxzuq5Ss7sHJHrtRmmK9TxQ>-nYi&SP0; zw`*9(!&u)u3fHsSk-xv=tPiE1{E*shDc=Z>S!aiGoQ*NR$hjno#P22=#c}bY(b;Lc z_C)CHG#|@+am(k8b#}CS`VjKlDSu1ycNasS7kgx#9qgZvBb3`=-~77_@;wH#FR~sT zL)fo!JM5O|^SB*$%Ex!&xDM=*jFZ^&$a-`PVR!sHcjb22nR0sv<6&3I?XV~1cG!_} zdk^DbH{v>cuoJ!>pN^YqyH}FKe)V*A=usWJ&Q5!3N29ZQ(j9r7-H@eIUT3HG_ekjM zz9IJ&?8R}HN90fKS80BYIy-Eyr?VSB5d9|E{$WdxdOADx)YQ}2>2@90)+~P_barB< z4x_WfbH#oy>`3evBmc#IGwQLZvqOH3Iy>a!sIx=3<)w0s}?{U|5VFVMz# zeH-eBD3RT-&_Y(Ps>U~y;U^S72N`}s@pF*fuYq<(T+a^ekof%}l>cP6`%PdMqF)8} zBKlomN1|T__9gmlV0Ys8lO`>{B+GPmuvbaY*^OhrptBnT2c6w0IIL$k0^Y5;OVb7A zbo(IM3&*ds!~Mqf?C?BMXNTvFIyq_J<#v`5m zyR~sWyB@~7AGeo$4v+66pH1#37s&%;_ahII;TJsIdUjfm=lw#j_}jeB?yYKWWIel4 z3&o#q{;hQFt?*9;T^9y)WgZ&i>A$KBlW*bvBjneSN6EiMhW{;H`&u&mZ|T}H8UD9) z?agHP-_o@i8UD9)E&OOvXNUak^BB^#w{ia&UjKITEcx~1Ir1CG^W;0o3uO4|Wc~&D zw;5kRK3sbzxrzKnax?jN$SvgGC6~y*M{XnkKDmPozo6*+$a@&yMZSyNO}?AlL%xUH zOMVl%kNjqGKlv@>0pqCmDj`1xeHZh4(06fMBIvuA--EvE93DS`>ufmNIO^;sx!rYk z(`1gPaQ;uaf#WT;8OFQLZkFsiyE(G!?B>a^<5_Kiyo&d=NalD^jdo=N>WQpIyRyM` zcC;%SI387_UD<$oD67$~Y~XlStqtXN1M0D`zQYENht+6THn`4?b|tK5*UjVM|IWg? zg7ANf&X4i%e`jG`LHNJ3u&$suishHpXjj5|cC;%E*Rw+JA+%XM~0_vJb}l+#C( z&Q2{uUT0_R&l`~LKYlv9L9-k3oiXOaeujMvdl~jHL^<~LgJhhK+dCMxF)T4`Vc5*D ziD7{u?3Rqr@jhVZe7>RRIyg>J3`n=4>I>8}3Pt@7{WIcCYXQviBud`D= z8l9buUvS=z&+B;j*RzA2h&nsitMtx_<(F(9-dlQI6sql2NYG;(g?UR!-95 zB$@4);{PE}GXC$#6Xd@qkCXp_JVyS%!fX15sxO zJCSU;hWo>gBwMZ~!_FjIHj`n8k}X$}VW*NU&nCl;C0ni}!_FmJHj%rmJjV6xy2)2C zzK8rQaxeLr`G+U z*|m^eXV*-2om~^zb#?`^>+Fz!)1vF_kiXNS>+F#K)1vF_P(IS4>+Dc|(xU6^P`=Wl z>+Dee(xU6^P(IVJp4}wgSJ2r_kX>gtPIjH$7}<4pqh#0F4Uw1X?D}ncW1Zcw#pnBV zb4&Vl)53f5mOn&~IbRCaS&x`lV)sN`+@#(*o^gE)?Zp_lRym1m?`vk(! zE_9t8_G_%O8@J<@>+Ep8#yUG(ce&0E`E9w*j`pdc&JOt{ud~y9lh@fPyI$)==*M<@99YMHn)WT!Y z*;zj)vD+*>oI1N9DL68YYxm>%U&eEBf9=R8SxM0zuomSNfrD1_;XU-&F6p}PO7((VTY6I zZDiQtq&@L7cjnud_K9C+)C~vm&pBOwboKDs{>?=UmUy6ZrIXm`xzLAGM$}N=*Ob`bNQWJ(k)EC&S#{9v^XPSUOpnb>kIRrAS#1{O zWj)gEa5_8lXV72wxXupmX}`QAX}*T_8Fxt~s_$)^g!bK_R_r&0VKv)s>-5M@THkJy z(AMc;{KK_QkLDlq%kuiFvs2FYB0q)v^CaBgPT5~a%CdbUmLJ?7`|z!2hkTapgPj*U z1G{?6Iy>5@ptGa>3OYO5x1h75{R=uf+Q+b-9qnh(+0niRon5Duvox${*FkojT^kt= zuB=ibbKJDjLgu)t&%X#dyC%lF&aOb_xNU{?Pte)1epZ&Tf$L9M2BALe>}lUFKCKJ6`jh{_5%MwB1)vXZPv7v48gP z>Fk)Ex7zKbZ$0S&W8ELyk-l3``mSwX zeKLBfQ#T-9`-h7kI<>GJ)i`u_4?T3nvFq+8?$)YA()u-NMcND)D zK5pBi?rx0iy1P*_-mmDw$aw#v8zUosNV}cvy1PL#o?rS=WaK|tKZv}>Zdlg0BP0Kc z?vIT3A-X>@DiZnbI~nCe#sSH$yXz#Qe2MOl?DN;!$UeWVME3b_Eo7e`*G$&jsQtnw zvRX&wiSK9_=ig0|kxyitkc{^)whWjjy*V!_KRmFzh+40&@a_| zJg3{w$9}FiQ$NzYZhs2zF7|&^Ubqw>={k_A@S18{*Yv(E7JI8Q= z;UdF=-ADP}CWg%nTNsuYwlVBr*vYVqVK>7bhP@2?81^$9U^vKdh~Y595r(4-#~6+? zoUpJ(o=@MiC7S$m?#O%Wzuqp?dJz^I@7L#r>=ZLol09`@M-8V|%RlnddiFdCFG+fh zr?y#eNPZZT>uI^~*{$=_UuipJ738b@{B*sql?5~er(o9X{3SU;?2p~Eyk86R`E5w^ zZ4rLU@|_FI;-@7(Ki_ChSnE@L<$7P|n%|jvmgAnEK56Nz_CxdOCG=OWEDT%Dl6jhT zU!o5}SQ|mOcNF11l*1$IT`!iiOZwA(dO7p-@_AZnKlMI#N?4Lm`vV$gHP}nFqt;HK z9aWZOxn*g8>Xr-SAo*>RczM-@)hDxlVLI#cmSnr=FYGzwyIKhOKD^x_^@(lQ{9^kr zd7tIuSWoNolAnH5U4i$1R~Eh^Pa)~b=Uti(%371=^PScgCtmmZCQCOjR~h?f*_mhu zWM`p0lAYo0qDiFxwG#+8Lcb(>o5QC6A{~Gy+r*h>`v6b!X8Ea zE9_Kmok=T4QU40NmRo0%@veV`9gO-{*vF`U9pL`1e}z3wDz1O+W4!BMd&#bU?IFAV zwVUkv*Dmr5(!1D6#(1K%6UnZBZ6mw>wM2IPYYW-+ugzrFzc!Iw|5_j)WM<<^bazf@1iEPciDN8z3)W0@1GD>rg?tWuWS!xW8m~OR*vQQU8kci~3ijZ`8jc z{d4O~T6*TznIyaZ74J8<&Lrbq|BCz(^{>c3QUBV@{old#=p(!SwV&+z*8#HYUkAx3 z=UH`#9M+j6yZ&{A?E2SHvg=>R$gY1KC%gW2g6#TNu(sQ+exW_z#ZcCnwD+g=kJT^d zn^`p-m6(+uD;?~beEst%)WM#VzrW*d*PvVty1yR4?a z&;2T@Th;uz^<+I->UlIn3+3k+7A}&_^U?-zzxwHGuswc6)J6#~#k?!f5pCRMDq-)yA9hR=?8uT+n-$ZU>d>8p5 zayR)xau0buxtELrCF|#r(a_E+{bW=WGXH_x%Hs#gCGrsYJn}FZ?@7kN$as%gWt8lG zO?7F^5GVg^fB^({q4B? zLHl2}7x`kx)r-d7kJIygTK!g4`2A8me(2|E{Qp=y{DAf1&0ki9U$9>Mr|fw63G2mw z(&FJatQY?Yi-#YvUi`-`9)87o@gK8z_!;ZPf7IgPcdQrx5sQZ(vR=IT5vv81A5Xtc zNPkT~`BT_|*LX;}e#Xw*bm(#HU+Zz7wfN?S@t?E!mWJ`4xA;=S_%B#|Tf=zscUC(Z z#(&X{?`#GVNZq0K3$@o0Z#)e$nQJXsp77C%W=E2ZmLS|IIV%-?dqxB6$B#*qhf53OgOTZ!YAZqU1ud8}xT7JiJ@T{Qb9|@x=u!mtc!!CxM3_BRMF)T4`Vc5*DiD7{u?6dgM`5dt4;-4kY zGDJNQ^`NLneo~%0uLsqdFzP|iI9d5<^q}U~M>TaK*Il&t8ug%a#j{d|y-XjPE6HCijuABKMP@ zO&%a$NggC4or6DaOBdsZ8Gi+Ng#0Y>DEXP>G4eCW$Z;~g*tY5ZFWI91Vt+lw z^U*vH=hOXFM`b(7Kl%Ojy7l&7Xt2LFS?cYtj@o+X*Oq$S{pEmq`|GXy{`=+sa@t3s z9{57Lcj+f0tj**7o_RC3PjLGJx9>9cc41aSKFIbiBL1nV#jjq0ev7sfwMUcH&^~Rf z1AXuTO~bT(+Kx}}#JFI39mWZz-)iTNI#A@_r~^g*jyh1}|EL2+`G`7Dl%J>r9pd@J zdW+<+-Xhs`p#5amfuek;Mc0A$GTwEdJ!IE`c9Un2zLhSr>p(lnt^@5LyAHIC>^jgA z*>#{TWY>WQ2h3?Xs%mb*xXZM1jV%3Fn`ejYXFAZO{kwf-?Y~Xh^QsP1>%FCV z$$C1_7BM{9A62__$(8!A)ThGw3*$N$f?LE`w7eGo*Ij-T9jNx3wBLEvTVp?5%as~h z?XS=7KMxm@e|5jDe;oH)`doP(sGe8WTSWTafKwb!2kQ4x`Lm*y_DC1YCdv3;fc_JTK^f%kDLyae*WEff9mhhaRcv<*|?Fs=coh4bGSW?I?!pP zXYC-uy)y{+&02UYI#BE1B)FgB*MYvnPH;#$7e9=AkJs);^M6U7v)%I-@`?0UE&g!! z!u&asCR&8Fyj(2)9)E992a4y8I#8xZ(19|Yf({hv7j>XWXVrnK{gLk!TE26Am#nvl zbZu|3P}W-{v)x;LCzbuAV?*Gr^X7anqP2_(ePmte39w+1eW!@I~y^J3v|0{Wf z{BPu8^83g`e-nbL%Z) z`)RBfgATL_+izz5Ngb%nU&M8&|CIF=!LIuZ{_qaTZIa)DKb+&Z!5_|X+~5!AIBxKV za~wDL!#R!{{NWtO4gPSB;|70t8?TS|9QB^a2T|`iXwMn-p2$a0?>Wr)3wXW}^7-UZ zaw~a^Tq2K?&m&KewKPil>_<7v#tXJRJAiVQuE6+4y5$_(FWrstjC2piG13I%7wHC$ zTd-WK-L?5h7+#R|-u7sF|BBTsaK9Qa9Q1Qb=gnS!A^K_A80>`ik7S(2?l0;e)w;|5 zpV@`*EK~^D89l~R(m&GQsS@hARvE)3q5q`!q2qn!P1w(`quX_Sx4Z${wau>Mo#hf( z)+t0f?Q6DB*4eQL@fR9ve?WJYdDO--kJ`e#9iA5ZExJpqhx2w_>kC=O(ektV`=`*2 zHv4?HtWUNyT|B+D9*|2HcC^~-iM_V)6LUK)6desg#ELzCZ^jj+J?7p$9AvBcFK9QKANImaOwQu$Jcj6dhO!- z-X`HAtvgjqab7F#YyFBXrfZP(9W5V+a{DC2>-*KBDY{ULKb`r^$4jzJ%%4|w*#X(J zS+1`_{yoyXeb0BEZ#};S`&ON>>!z2=jmR&(NpqWocS%D?!&}iGOJ4v3lAeSPl(!Sp zphKly4LVfX-JnCIT@E@_+U=l29kz0i1|2Hxe$b%~GM?kEK3``Q$7Ov!Ph9Vj`@`^N zm0mK(eJed=jtf`1$s9NKe)lSlEBkz;phNB8{%b9rvPv7-?SF~v^Lbb=$MqhO?s2_G zGU^xCsiZ-N%639r?~(hn9;>juv8rVE<9?XfU-{6YMyOrUnoj$NolC}Z_xxe(A3mma zs9#)hs1EfCEn~>P`ur>8*;iWafb>`)+g`!)`X);~>nBkn`A2`UM29N*wXP0Tx1W#m`8fNj za=Y`o{VCX9zV{&R;~ud3Ar>_LD#jm+4pr98*7Bjh{QVB={U+G1?HX;bJ_dEDNT<8; z96nz`bf~udKH2cOAOl>b};N@*u}7$VGqMzhJ6hC84fTUWH`idnBfS+QHEm- z#~Dsos5(@A&ypPWtEWSS#X|qV=c61>hpHCvXmqF#WryfcEgkbZRK2f9LWlako5f!E zx@yO**O;{QRr{g&^f+{=$XAG-)T2KWa8h+KJ?#LnULpPTGlNjOR%^ksNfWy(FeSUVUWbg1N@LnQ|tDmmy-$w7xo4mwnF(4kuS&goFe zL5E5XI#lq{>ricfZx4wM)%X~6sMx=KpS@4{9v}H_-~%(pIUOqF_j7;Lzd0SMJ%3Jz zO8yh>-%S2fatry-$R+ZhliSFDLB{(_+k+03@f`oJc9DY)mHbyczK8tRud73q?V8W@{3k?*DknaS4%MD7r$Z&n4e9+9(GJh)P#N$2an^ggy}v%f zc<;}%-rMc{eU$sSZY1ly-RQuCdT+P;6Z&~R_cy@qB)i=o0lSp!c7FxzR*Kquj-(yYJ!0#wJRPOJ7>Imm0=@!Q$H*#+$#h+R-rni*|fx!}u>*d{@KxFI#+f!}zaQd{4vpuUdR>!}zaR zd|$)(uUmY7!+7)ORtFl!f5VO+Y#9Gdiyvwj|1FCjZW#Yb~O-*F*}qeOmU=gDXv%KIj(m6CDi4Hn2aUC^OgypCHg)uBG{ z2XWj|bg1?oMTctpAB7Ip_7fc{!uEp*i_;b!qC*vbS6v;d+_L(8Htjz|hsyITFq~&N zhx1nOd|L1INxvsQ@5RQEZbQ8K>Gch}-(IiN{F)^?RIPU<8FfF6zf?M-GLP1-Bl*Dk zFXyg8I_tQw{E>9!d*}C)>*!E<{D2)_XC5u$YlDdQd9-6l_c}UMdoPbF9jc_mAv#n^ z82_HJ`~826bf_p7^j~;?%>9qQL>y=5(mWqC>S%bg1^;M28BlOd!7a8S*&!v*a=I=g6bv&yz>UUmy>Y=gC9l zFOmnzUm_2XzfA5Ye}&vf{wleb{55h9`Rn9v@&dVw{0(v^`J3bp^0&xs}>@>V&D9?zfCp)!68Rl3MQhe{4QRC3Uvl7kMF9CWDUphG1G9V!{)+QIJ| z)+6=$3FG3T$HMz71|2FH3o2Ee{Nd2h8(W* zOvZGc9lFh?LtWaxd(o@3|2ApQZ#q;tbg5pmt`7AW*CTCt9qvhP=||I{N*UIE=eO>O z{cxK{DBJ7lP*0HsD0P2HmWP%;*C9GoIX-*aL8R{uxYxt#P(V@z%O`-Xb*P+@CyWd3p9i4h#K8`N#C2g_gbf`!dw)b;7 zRHoNKgnMTY?whsnm~^Pxze(gKU(mD8bGe7U{FLeZg;VRw`2 zJIQPpSKmc0aQ}ZMH$nPf) zlK-7NK>h%^pFBhEBmW1vm;6C;5BWpnZt{o8UF82Hcar~$+(G_tavOP;Tmm2X2*UA? zBHaHmgkv8^xbG7PYoA0|{gj20ey|&@Pm{MS`EeucOHPN1{jNiMI;TU$_S4vJi#k+n zzj+qtjXG3t)S-f-4%Lo}>yF|%+iFw{OCI z`gQdFb$s^_9jbB(`-#pC>9nue!kiA(SpD9*tLQk4Meku@-VRTT-L0!bmHI+-sP^1G zzMa>hUMcJMi4OIUbn*1odO$Ay@aRx;=_PtT+`pb&ej$A}f%EC6EXb*PN@ z@h{r#s6%Bu$4$N89d)RT*H)9Zn+C`nmksNK!eJucoo74@ujo+89QUpCkU1_~=_YgB z*!$g4hst=4J6Af$9GCX_Okq9L661Y7&pgsO>QKpN^LbdWuk!gqtpB49mHV@v^6~ps ztj8*BZ>%cW`PA;}FZNfW4pmdIo({F^&9Q&@@aa&Q-nZKAoPhOEwe%DU+jkEBtcL5w zAU`Cw@i=s+_P(b2^ekf6(qZ-p?G_UZXI|V_dIgf$=Cf z(q19k;j(|h?mypdnUn929Zq-JC8tt<%kyi}PTA9I`7^t#58>VY7K)D4&YRsc06qrY zXi5D}Qs3!M+ed!AO>#ZgNoe~-{XLIC-6+!gZaklli;8a4w%;e4@0aHi-ROh5#~n-u z(T!TXv_tJhivRW@jX%sfjJE%gzUQ#A(59ye>qs0<|E4uu9sQeKXZurNryh&Cx4%u* zKMKEa`8enGN8Q_(ke(MIH~)1N>7)9BIoUt&pSoS%M^5i%=yOH_+ zi-Y8#cOwVA8#(CR$U*N$4th6o(7Ta?-i?fL5viZZ7&npni5&E9_IEp;Rp*UUuIt%w-Nk#ux{KUD=-tR~ zgFQSjW1Q2wF+S+s$m6u11$+LS-i;jeZseeMBL}@3Iq2QULGMNmdN=X}uir%udN*>= zyOD$5jU4oD zL)f!&dz0NyxxJZT3&Rq_HioEQ%I&Ck%I&a6<@RpI_b}{b*vGJ+;Q+%yhC>X88ICX< zWjMxgoZ*CpI&Q1&UP%u7om+Z_{Xf5+JCnlRyw9g?_#F+|xg=-O^w*x*CCU4Ls3-RJ z&(ija_GjLd==U@}Yx~LfvMfFG-_y|hTUodl=h2R|{Pg@K38mh&`<3^M`>tp#{HQ~6 zoVSCHXI=Lj9+vVrY3Z!}D$TE#tlGur#P)jg;Me8G-?RPf&m}0QYQN==&F48!!tz@B z$8JJ-)^$vEd(e+wgzec)vN5+^+kJYTqh81K8av$9G3}QFr!w&Av>Ul~OznAd`cbkZ zfc(VIL6#dZM!w9gW6F5%cOxIiemU}Y?6)J|$9_G^L+tmXoJ7AsKhN)egFbT5kCNT* z&_n(y-fuVA{T5wh+EZ^w?smUN2jkr@(nfZ_Nr~)!l@_x5U7E@6muVuq-=;uzzYgqC z@&>$^WT=SyJ`MINx&3VLwP^n(x19st2)mZtN`DjWUGn;$M*MYX-$j2F%IWq&v=`EK zu)FCmU2glQ7hi_(=bwu3IZr|O#7hz0xWPjC9DUg^3glaZe3x}PBG@uOnp>klza~NA0y*Ei!O_d zd?30kGV+JlpXoZ}pS)hMQ_h&5|D^SJ-Y@j=G11AOSQmC&{8}|9g&n^=Xrb%B(zQ3( zi<9e^|0`X)olJl9TKcazZy{a#62`;-mahF(GX2?WuP4L*mahF3GX3Fef0+#bTe|i- zGW>7p+Fv3Uknh&QkEY*I*Bjq)2l8`PX=3~i?%z!QHF692rQ{O%W#l&UPI3nse!8GX zUV9_syBPm+ayR)E`lY7a(LGB~}Cb^&dO7Z|1enD9`j+`)lhD6 zXFjhjay#>Rt$=**-*v7vkzq%(S~HpBF|`&l>~K~qkvX1IYa_#sXSEJ8?0i=1By+r| z)c-jC?} zjE_R!hvPQRAZ$N~usCgDUf-vFJ)fuM-x15(t<7q;a9i4bUx6r|9Id$H<=}kCH!69wC2$JWQS^50Sq}9wdK>JV5?3xu5(Mav%At)!^7s~kOF&^bG zw_YgYpUZfZD@y}s=7a4X{=D(1yVSEqyYBKChvSl;5kMUQL`^nEH50I}U50W>L zhsa&zVe%E^5%ROhqvU6j$H>nhkCUHHo*-`|!_L>yY1)3*pK^=6|CNQOTPS`9gtd9Z zpP6wx$0KSB-2NKd?(K2uH(rGnzXsq-5MZ`B=Z_=)x)A^Bu&W{{) ze&nF@BL|%y`5>PY?8-2b~{zme((kG2S2ie8r&i!~2OkKQiVMNWX|2bbjQZ^CK_Q`Pufv z==>}`KMpasq+d6!T(fLn(0MgBFACja)A=p!=WY89?Z-{p^QzA8JUMi!9- zext9$J!y~oM_F%D`%l{cy#IIO{7mhamh`^mb^Ri_`n%+8_7(c;O#O`W;#4XXz_CKZNbDA2RM^Ecpfbt~zIY7@Z&XU#|1x_60jn z<9;;8n{qlod)_)aKii(Jl0=bToHzUT<_DGaChdAl+f8|$pXQ?zsq?dbG^($h&JXP} ze^2W7(3Y9#{BXb0JkJ4urQ{fN-1SGkpWAPd;E9^8TA?@yCeH&+fU+rJjK}?pPL2Ft#*dQ!l{`ZJH}Wv~ zedHnX`^kgkep5t{@yq}!@kMS2<`4vAYxs8nXpIe8L@fR|Fki4EeMCN#1b(jo;kyS^? z=X3v2aw~a^Tq2K?)mlrrtWJhdU%Ur!Rr0kbbKdx7&L_VN<8$Tp7$;j< z_)R;Z`1kBNwcTElEzyrYZ`!QcAeCGan|1R~^Z{xnF1{q?Q z!tCqwWPLNA_d9h5<3}0Zh|v8Lo(?-!BR&0lCZe0N`;2kIRrA zp**ffx{2=4&Qni!XZ{TO)t1greq48l_qIzaQOQz;Z4y4xy1OUJeZ=)2pI=ZG-JRvv zkbhuC^13^VKLNTs%deulL+Ib#JV{ea+LylGtjFVYk1YKjvj(0yu>@QsQJ&n-zskZy->Fi$k`>}ua*wfj~nuE!7c9JB= zuCv2DkEuRQCFw88-`eRXNhj}K+ZoJQ^13TN!FYR>h zUnFB5OZ;9x=D9?j-30gd`C8*-Q8MzgjPsF^-{bm{C=W93$9R;NxV|JD z!Et>_l()FPB+6sC*vI2hUgP?bJ|C`!@hIx!BBj*eTKZkzv2$`jfD0aeYcD5O)0z?hiW{*SEB2xxX%p&$mZP(jGaS&TdRj zrT&o{-YR~HJ(C;tOxa!22=6{q1;}u@_O_-JDl&~)Y)kXSn5~EYE5=u+n)kE zrT##<{m0b$a_{|h^-sbt`$*{QG`~Ntvy1D>y+z(f)Y+k59d&kSZzL7h*`a@)RNxo) z`4dUSb#~}KB^B4%9kl$KR9t6=_DJIIzX-oUQgNN#1owwuKj_dauCp6syzA^n$*!{- zA-m3QnCv>cAu`4#f(|{bD>uM+*V*-xU1!%vcAZ@>*>!e3WY^hslU--mMaH;H(4ki_ zZWDCq6^!cy-Fd}zb}cymsC9O2w!ho)%-0JzYMmXfmxguaN_M`q-F0@&#!+Y2!T9~w zzs`L9fp(6+`T7Ix2N;j^N!wj#hxAL^U1x{%P1{{(hxAX|U1x{)leW9gZh+T!o!uar z<9xpUK)dVgh8gcVyAiVM>_*A1vl}D3&TgFiw|t%nvg_<7$s9+lPLo|{caZElyBV_U z>}JXT!1K?MU1v8>cAeb<*>!ect-q~4k+3B7$}WakwaND1em?6HssGfUv$Wp1h2tjL z50*nkry-7a`Q_U&Lt2kg?|Yv#uSycXY`wL6;ZI&^En|tl7vmd^_FsN}9G~AlE!WNa zapr{8f1_2owwu2Hid=p3DAd_~A%B05n9i=*@EO!%l`>47(ZjFzjX6$FQH_0K-9s zLkx!*jxZc$IL2_C;RM4;hSLlWGMr&J%W#h2Ji`SGb=*|jy^|Xt_l*dJT9_?3YevLXiY_F%Ydvb34JKNu6$7hcs zo!vn(2#s}ic&@0kLq3b&pF#eM>og)?Mx7nJLK=EvqQd*{rX8uuc)(| zAiG~+oa}ysF|zv=M#=iN)Q>PicE7|h+5HwnWcOj5^i9Ah4I{Ua=y3YNyGmLkg-7MMt zymREUdA@mak-R{5Kk_0O`R8ytJFUmHJvAofU)xh(mvyn+U$o=mkIPoo+09xg^9jt~ zmacuL`JtqqCjS!|{7p z+P@=rGXDRN;eSil!jBepcF50JrJMV|i~IMG|C!uNemA*~{4eBw@_WbwWccYs=SF@n z^ixf z`MlOe=6Fi2n+!Xe)q2PrkE!*NU1!%v=6Fu6pUm-|+5nm3LA60L$BSx1WYiN`ZJ5mQ zrrHRZ<59IyGU_4Gxsg#%iO!A8@vhng8TFjZS0!`2Ea)52U(0F-84v$=)H`xKF6bTM z|IUKm5&rKi=pDr%$S(_eN9}DXFY^3m4(jOakUz@TV!tEn>{=ew^OiSaoYChK$@l7P zdtPU!em$Qjme<+2-Rf1lh1-()y%Xox`y)R->*y_-ojkHmZN|!%jQcU1W{7g{>mRt^RL1id zKgtmH#=p<$-{o{a=!sv4uVD8Pb#^~l&z;xVsYTE0?39m2XJ_LVsD4hM&JK1W>g+fV z;m%gGli5DJxAeO6!IcGjuW9iD@;v!T(s@+|p6GV*m=yok(tigww*!;=;-W<2tH zT5Kmz@O(c*9w$GUjB=0`FCn8mq{W{lqg@xrO{Ja)EpWdCck! z|IWbi=YA>^V z5_NXSM^R^oe3oq4YBwInv$nj5jC>k(cF4zZJw)X5sI%*`d>VCjC?|0}M3kebv+L#l z&*Sy_$iG1DCqI`wK)#kdNPZ4^h}=ycCSOAyAzw`%C2uB=k*^|;lb=nVAYVzIByS>5 zle@?V$ybnP$j>6rl3iyvM}7w5=gCheFOaSKChcU{`QzC>5U{9|< z^EH-lyge@c7TBA;uy>7hc4(&_zs?TN7j<@c{

iJETt<*3(1!rC~iiq;FbuogLCY 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 QN-_@5S&pK6mRkxxXRhDA|d> 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%0AifUtiLcv3##f;SzKRK7g@Ugl!PmBN@$;*T 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%0DRO3mr>z{L%4NSq})y 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 literal 0 HcmV?d00001 diff --git a/compression/cutils/anchor/tests/fixtures/spl_noop.so b/compression/cutils/anchor/tests/fixtures/spl_noop.so new file mode 100644 index 0000000000000000000000000000000000000000..e250fa09254f69ad2e39a74a000e01ca5e3825b4 GIT binary patch literal 41056 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 literal 0 HcmV?d00001 From 9f9f4708bf1a4be2418782781e5e89f90d5ee4f0 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 20:59:38 +0000 Subject: [PATCH 031/138] Add LiteSVM integration test for cutils program Exercises the cutils program end to end under LiteSVM: - Builds a real Token-Metadata sized-collection NFT (mint + metadata + master edition) so Bubblegum MintToCollectionV1's collection check passes. - Creates a ConcurrentMerkleTree<3,8> via account-compression alloc + Bubblegum create_tree_config. - Calls the cutils `mint` instruction to mint one cNFT into the tree/collection. - Recomputes data_hash/creator_hash exactly as Bubblegum stores the leaf (collection verified=true after MintToCollectionV1), builds the empty-node proof for leaf 0, reads the live root, and calls the cutils `verify` instruction, asserting success and that a tampered data_hash fails. Adds the mpl_token_metadata mainnet fixture (required by MintToCollectionV1) and two clippy allows in the program source (diverging_sub_expression false positive from Anchor's #[program] macro, and vec_init_then_push on the intentional MintToCollectionV1 account-meta builder). https://claude.ai/code/session_013dpnF6uSGWXjkJJZseqzcP --- .../programs/cutils/src/bubblegum_types.rs | 12 +- .../programs/cutils/src/instructions/mint.rs | 17 +- .../cutils/anchor/programs/cutils/src/lib.rs | 19 +- .../programs/cutils/tests/test_cutils.rs | 739 ++++++++++++++++++ .../cutils/anchor/tests/fixtures/README.md | 8 +- .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes 6 files changed, 773 insertions(+), 22 deletions(-) create mode 100644 compression/cutils/anchor/programs/cutils/tests/test_cutils.rs create mode 100644 compression/cutils/anchor/tests/fixtures/mpl_token_metadata.so diff --git a/compression/cutils/anchor/programs/cutils/src/bubblegum_types.rs b/compression/cutils/anchor/programs/cutils/src/bubblegum_types.rs index b51e444b..3f91dcef 100644 --- a/compression/cutils/anchor/programs/cutils/src/bubblegum_types.rs +++ b/compression/cutils/anchor/programs/cutils/src/bubblegum_types.rs @@ -105,9 +105,13 @@ pub fn leaf_schema_v1_hash( pub fn get_asset_id(tree: &Pubkey, nonce: u64) -> Pubkey { // mpl-bubblegum program ID let bubblegum_id = Pubkey::new_from_array([ - 0x98, 0x8b, 0x80, 0xeb, 0x79, 0x35, 0x28, 0x69, 0xb2, 0x24, 0x74, 0x5f, 0x59, 0xdd, - 0xbf, 0x8a, 0x26, 0x58, 0xca, 0x13, 0xdc, 0x68, 0x81, 0x21, 0x26, 0x35, 0x1c, 0xae, - 0x07, 0xc1, 0xa5, 0xa5, + 0x98, 0x8b, 0x80, 0xeb, 0x79, 0x35, 0x28, 0x69, 0xb2, 0x24, 0x74, 0x5f, 0x59, 0xdd, 0xbf, + 0x8a, 0x26, 0x58, 0xca, 0x13, 0xdc, 0x68, 0x81, 0x21, 0x26, 0x35, 0x1c, 0xae, 0x07, 0xc1, + 0xa5, 0xa5, ]); - Pubkey::find_program_address(&[b"asset", tree.as_ref(), &nonce.to_le_bytes()], &bubblegum_id).0 + Pubkey::find_program_address( + &[b"asset", tree.as_ref(), &nonce.to_le_bytes()], + &bubblegum_id, + ) + .0 } diff --git a/compression/cutils/anchor/programs/cutils/src/instructions/mint.rs b/compression/cutils/anchor/programs/cutils/src/instructions/mint.rs index 6bbe34bb..338539bc 100644 --- a/compression/cutils/anchor/programs/cutils/src/instructions/mint.rs +++ b/compression/cutils/anchor/programs/cutils/src/instructions/mint.rs @@ -1,6 +1,6 @@ use crate::bubblegum_types::{ - Collection, Creator, MetadataArgs, MintToCollectionV1InstructionArgs, - TokenProgramVersion, TokenStandard, MINT_TO_COLLECTION_V1_DISCRIMINATOR, + Collection, Creator, MetadataArgs, MintToCollectionV1InstructionArgs, TokenProgramVersion, + TokenStandard, MINT_TO_COLLECTION_V1_DISCRIMINATOR, }; use crate::*; use anchor_lang::solana_program::{ @@ -75,10 +75,10 @@ impl Mint<'_> { Ok(()) } - pub fn actuate<'info>( - context: Context<'info, Mint<'info>>, - params: MintParams, - ) -> Result<()> { + // `with_capacity` + push is intentional here: it documents the exact 16-account + // MintToCollectionV1 layout in CPI order, so allow clippy's vec_init_then_push. + #[allow(clippy::vec_init_then_push)] + pub fn actuate<'info>(context: Context<'info, Mint<'info>>, params: MintParams) -> Result<()> { // Build MintToCollectionV1 instruction data let args = MintToCollectionV1InstructionArgs { metadata: MetadataArgs { @@ -188,7 +188,10 @@ impl Mint<'_> { context.accounts.payer.to_account_info(), context.accounts.tree_delegate.to_account_info(), context.accounts.collection_authority.to_account_info(), - context.accounts.collection_authority_record_pda.to_account_info(), + context + .accounts + .collection_authority_record_pda + .to_account_info(), context.accounts.collection_mint.to_account_info(), context.accounts.collection_metadata.to_account_info(), context.accounts.edition_account.to_account_info(), diff --git a/compression/cutils/anchor/programs/cutils/src/lib.rs b/compression/cutils/anchor/programs/cutils/src/lib.rs index cd4f3f16..e39a7602 100644 --- a/compression/cutils/anchor/programs/cutils/src/lib.rs +++ b/compression/cutils/anchor/programs/cutils/src/lib.rs @@ -1,3 +1,7 @@ +// False positive emitted by Anchor's `#[program]` macro expansion; accepted in +// this repo (the sibling cnft-burn example does the same). +#![allow(clippy::diverging_sub_expression)] + pub mod instructions; pub use instructions::*; @@ -10,16 +14,14 @@ use anchor_lang::prelude::*; /// SPL Account Compression program ID (cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK) const SPL_ACCOUNT_COMPRESSION_ID: Pubkey = Pubkey::new_from_array([ - 0x09, 0x2a, 0x13, 0xee, 0x95, 0xc4, 0x1c, 0xba, 0x08, 0xa6, 0x7f, 0x5a, 0xc6, 0x7e, 0x8d, - 0xf7, 0xe1, 0xda, 0x11, 0x62, 0x5e, 0x1d, 0x64, 0x13, 0x7f, 0x8f, 0x4f, 0x23, 0x83, 0x03, - 0x7f, 0x14, + 0x09, 0x2a, 0x13, 0xee, 0x95, 0xc4, 0x1c, 0xba, 0x08, 0xa6, 0x7f, 0x5a, 0xc6, 0x7e, 0x8d, 0xf7, + 0xe1, 0xda, 0x11, 0x62, 0x5e, 0x1d, 0x64, 0x13, 0x7f, 0x8f, 0x4f, 0x23, 0x83, 0x03, 0x7f, 0x14, ]); /// mpl-bubblegum program ID (BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY) const MPL_BUBBLEGUM_ID: Pubkey = Pubkey::new_from_array([ - 0x98, 0x8b, 0x80, 0xeb, 0x79, 0x35, 0x28, 0x69, 0xb2, 0x24, 0x74, 0x5f, 0x59, 0xdd, 0xbf, - 0x8a, 0x26, 0x58, 0xca, 0x13, 0xdc, 0x68, 0x81, 0x21, 0x26, 0x35, 0x1c, 0xae, 0x07, 0xc1, - 0xa5, 0xa5, + 0x98, 0x8b, 0x80, 0xeb, 0x79, 0x35, 0x28, 0x69, 0xb2, 0x24, 0x74, 0x5f, 0x59, 0xdd, 0xbf, 0x8a, + 0x26, 0x58, 0xca, 0x13, 0xdc, 0x68, 0x81, 0x21, 0x26, 0x35, 0x1c, 0xae, 0x07, 0xc1, 0xa5, 0xa5, ]); #[derive(Clone)] @@ -38,10 +40,7 @@ pub mod cutils { use super::*; #[access_control(context.accounts.validate(&context, ¶ms))] - pub fn mint<'info>( - context: Context<'info, Mint<'info>>, - params: MintParams, - ) -> Result<()> { + pub fn mint<'info>(context: Context<'info, Mint<'info>>, params: MintParams) -> Result<()> { Mint::actuate(context, params) } diff --git a/compression/cutils/anchor/programs/cutils/tests/test_cutils.rs b/compression/cutils/anchor/programs/cutils/tests/test_cutils.rs new file mode 100644 index 00000000..400c7b6e --- /dev/null +++ b/compression/cutils/anchor/programs/cutils/tests/test_cutils.rs @@ -0,0 +1,739 @@ +//! LiteSVM integration test for the `cutils` Anchor program. +//! +//! The cutils program exposes two instructions: +//! * `mint` โ€” CPIs Bubblegum `MintToCollectionV1` to mint a cNFT into a +//! (Token-Metadata) verified collection and a Bubblegum tree. +//! * `verify` โ€” recomputes the V1 leaf hash and CPIs SPL account-compression +//! `verify_leaf` to prove the leaf is present in the tree. +//! +//! Full flow exercised here: +//! 1. Load the cutils program plus the four mainnet fixtures +//! (mpl-bubblegum, spl-account-compression, spl-noop, mpl-token-metadata). +//! SPL Token + the Associated Token program are provided by LiteSVM. +//! 2. Build a real Token-Metadata *sized collection* NFT (mint + metadata + +//! master edition) so Bubblegum's `MintToCollectionV1` collection check +//! passes. `payer` is the collection update authority. +//! 3. Allocate + initialize a Bubblegum Merkle tree (max_depth=3, +//! max_buffer_size=8, canopy=0) via `create_tree_config` (same mechanics +//! as the sibling cnft-burn reference test). +//! 4. Call cutils `mint` to mint one cNFT into that tree/collection. +//! 5. Recompute `data_hash` / `creator_hash` exactly as Bubblegum stores +//! them for the minted leaf (note: after MintToCollectionV1 the collection +//! is stored *verified*, so the data_hash reflects `verified = true`). +//! 6. Build the Merkle proof for leaf 0 (all empty-node siblings), read the +//! live root from the on-chain tree account, and call cutils `verify`, +//! asserting success. A second `verify` with a tampered data_hash must +//! fail. + +use { + borsh::BorshSerialize, + litesvm::LiteSVM, + solana_instruction::{account_meta::AccountMeta, Instruction}, + solana_keccak_hasher::hashv, + solana_keypair::Keypair, + solana_message::Message, + solana_pubkey::{pubkey, Pubkey}, + solana_signer::Signer, + solana_transaction::Transaction, +}; + +// ---- Program IDs ---------------------------------------------------------- + +const CUTILS_ID: Pubkey = pubkey!("BuFyrgRYzg2nPhqYrxZ7d9uYUs4VXtxH71U8EcoAfTQZ"); +const BUBBLEGUM_ID: Pubkey = pubkey!("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY"); +const COMPRESSION_ID: Pubkey = pubkey!("cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK"); +const NOOP_ID: Pubkey = pubkey!("noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV"); +const TOKEN_METADATA_ID: Pubkey = pubkey!("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); +const TOKEN_ID: Pubkey = pubkey!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); +const SYSTEM_ID: Pubkey = pubkey!("11111111111111111111111111111111"); + +// ---- Instruction discriminators ------------------------------------------- + +const CREATE_TREE_CONFIG_DISC: [u8; 8] = [165, 83, 136, 142, 89, 202, 47, 220]; + +// ---- Tree parameters ------------------------------------------------------ + +const MAX_DEPTH: u32 = 3; +const MAX_BUFFER_SIZE: u32 = 8; + +// ---- MetadataArgs (mirrors mpl_bubblegum::types::MetadataArgs borsh layout) ---- +// +// These mirror the values the cutils `mint` instruction hardcodes (see +// programs/cutils/src/instructions/mint.rs): name "BURGER", symbol "BURG", +// the test-supplied uri, a single creator equal to the collection authority, +// seller_fee 0, primary_sale_happened false, is_mutable false, edition_nonce +// Some(0), token_standard NonFungible, token_program_version Original, and a +// Collection pointing at the collection mint. + +#[derive(BorshSerialize, Clone)] +struct Creator { + address: [u8; 32], + verified: bool, + share: u8, +} + +#[derive(BorshSerialize, Clone)] +struct Collection { + verified: bool, + key: [u8; 32], +} + +#[derive(BorshSerialize, Clone)] +enum TokenProgramVersion { + #[allow(dead_code)] + Original, + #[allow(dead_code)] + Token2022, +} + +#[derive(BorshSerialize, Clone)] +struct MetadataArgs { + name: String, + symbol: String, + uri: String, + seller_fee_basis_points: u16, + primary_sale_happened: bool, + is_mutable: bool, + edition_nonce: Option, + token_standard: Option, // TokenStandard, variant index (NonFungible = 0) + collection: Option, + uses: Option, // None โ€” Uses, kept absent + token_program_version: TokenProgramVersion, + creators: Vec, +} + +// ---- Hashing, exactly as the Bubblegum program does ------------------------ + +fn hash_metadata(metadata: &MetadataArgs) -> [u8; 32] { + let serialized = borsh::to_vec(metadata).unwrap(); + let inner = hashv(&[serialized.as_slice()]).to_bytes(); + hashv(&[&inner, &metadata.seller_fee_basis_points.to_le_bytes()]).to_bytes() +} + +fn hash_creators(creators: &[Creator]) -> [u8; 32] { + let creator_data: Vec> = creators + .iter() + .map(|c| [c.address.as_ref(), &[c.verified as u8], &[c.share]].concat()) + .collect(); + hashv( + creator_data + .iter() + .map(|c| c.as_slice()) + .collect::>() + .as_slice(), + ) + .to_bytes() +} + +// ---- SPL account-compression empty-node helper ----------------------------- + +fn empty_node(level: u32) -> [u8; 32] { + if level == 0 { + return [0u8; 32]; + } + let lower = empty_node(level - 1); + hashv(&[&lower, &lower]).to_bytes() +} + +// ---- ConcurrentMerkleTree<3,8> account layout ------------------------------ +// +// account_data = header (56) || zero-copy ConcurrentMerkleTree (1248) || canopy(0) +// Current root = change_logs[active_index].root. See cnft-burn reference test +// for the full layout derivation. + +const HEADER_SIZE: usize = 56; +const CMT_SIZE: usize = { + let changelog = 32 + 3 * 32 + 4 + 4; // 136 + let path = 3 * 32 + 32 + 4 + 4; // 136 + 8 + 8 + 8 + changelog * 8 + path +}; +const TREE_ACCOUNT_SIZE: usize = HEADER_SIZE + CMT_SIZE; + +fn read_current_root(data: &[u8]) -> [u8; 32] { + let tree = &data[HEADER_SIZE..]; + let active_index = u64::from_le_bytes(tree[8..16].try_into().unwrap()) as usize; + let changelog_stride = 136; + let root_off = 24 + active_index * changelog_stride; + let mut root = [0u8; 32]; + root.copy_from_slice(&tree[root_off..root_off + 32]); + root +} + +// ---- Anchor discriminators ------------------------------------------------- + +fn anchor_disc(name: &str) -> [u8; 8] { + let digest = sha256(format!("global:{name}").as_bytes()); + let mut out = [0u8; 8]; + out.copy_from_slice(&digest[..8]); + out +} + +// Minimal SHA-256 (FIPS 180-4) โ€” used only to derive Anchor discriminators, +// avoiding a crypto crate that conflicts with the program's solana version. +fn sha256(input: &[u8]) -> [u8; 32] { + const K: [u32; 64] = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, + 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, + 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, + 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, + 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, + 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, + 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, + 0xc67178f2, + ]; + let mut h: [u32; 8] = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, + 0x5be0cd19, + ]; + let mut msg = input.to_vec(); + let bitlen = (input.len() as u64) * 8; + msg.push(0x80); + while msg.len() % 64 != 56 { + msg.push(0); + } + msg.extend_from_slice(&bitlen.to_be_bytes()); + + for chunk in msg.chunks(64) { + let mut w = [0u32; 64]; + for (i, wi) in w.iter_mut().enumerate().take(16) { + *wi = u32::from_be_bytes([ + chunk[i * 4], + chunk[i * 4 + 1], + chunk[i * 4 + 2], + chunk[i * 4 + 3], + ]); + } + for i in 16..64 { + let s0 = w[i - 15].rotate_right(7) ^ w[i - 15].rotate_right(18) ^ (w[i - 15] >> 3); + let s1 = w[i - 2].rotate_right(17) ^ w[i - 2].rotate_right(19) ^ (w[i - 2] >> 10); + w[i] = w[i - 16] + .wrapping_add(s0) + .wrapping_add(w[i - 7]) + .wrapping_add(s1); + } + let mut v = h; + for i in 0..64 { + let s1 = v[4].rotate_right(6) ^ v[4].rotate_right(11) ^ v[4].rotate_right(25); + let ch = (v[4] & v[5]) ^ ((!v[4]) & v[6]); + let t1 = v[7] + .wrapping_add(s1) + .wrapping_add(ch) + .wrapping_add(K[i]) + .wrapping_add(w[i]); + let s0 = v[0].rotate_right(2) ^ v[0].rotate_right(13) ^ v[0].rotate_right(22); + let maj = (v[0] & v[1]) ^ (v[0] & v[2]) ^ (v[1] & v[2]); + let t2 = s0.wrapping_add(maj); + v[7] = v[6]; + v[6] = v[5]; + v[5] = v[4]; + v[4] = v[3].wrapping_add(t1); + v[3] = v[2]; + v[2] = v[1]; + v[1] = v[0]; + v[0] = t1.wrapping_add(t2); + } + for i in 0..8 { + h[i] = h[i].wrapping_add(v[i]); + } + } + let mut out = [0u8; 32]; + for (i, word) in h.iter().enumerate() { + out[i * 4..i * 4 + 4].copy_from_slice(&word.to_be_bytes()); + } + out +} + +// ---- keccak256 leaf hash (mirrors leaf_schema_v1_hash in bubblegum_types.rs) ---- + +fn leaf_schema_v1_hash( + id: &Pubkey, + owner: &Pubkey, + delegate: &Pubkey, + nonce: u64, + data_hash: &[u8; 32], + creator_hash: &[u8; 32], +) -> [u8; 32] { + hashv(&[ + &[1u8], // Version::V1 = 1 + id.as_ref(), + owner.as_ref(), + delegate.as_ref(), + &nonce.to_le_bytes(), + data_hash, + creator_hash, + ]) + .to_bytes() +} + +fn get_asset_id(tree: &Pubkey, nonce: u64) -> Pubkey { + Pubkey::find_program_address( + &[b"asset", tree.as_ref(), &nonce.to_le_bytes()], + &BUBBLEGUM_ID, + ) + .0 +} + +// ---- Helpers --------------------------------------------------------------- + +fn send( + svm: &mut LiteSVM, + ixs: Vec, + payer: &Keypair, + signers: &[&Keypair], +) -> Result<(), Box> { + let msg = Message::new(&ixs, Some(&payer.pubkey())); + let blockhash = svm.latest_blockhash(); + let mut tx = Transaction::new_unsigned(msg); + tx.sign(signers, blockhash); + svm.send_transaction(tx).map(|_| ()).map_err(Box::new) +} + +fn metadata_pda(mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[b"metadata", TOKEN_METADATA_ID.as_ref(), mint.as_ref()], + &TOKEN_METADATA_ID, + ) + .0 +} + +fn master_edition_pda(mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[ + b"metadata", + TOKEN_METADATA_ID.as_ref(), + mint.as_ref(), + b"edition", + ], + &TOKEN_METADATA_ID, + ) + .0 +} + +/// Create a Token-Metadata *sized collection* NFT whose update authority is +/// `authority`. Returns (collection_mint, collection_metadata, master_edition). +fn create_collection_nft( + svm: &mut LiteSVM, + payer: &Keypair, + authority: &Keypair, +) -> (Keypair, Pubkey, Pubkey) { + let mint = Keypair::new(); + let metadata = metadata_pda(&mint.pubkey()); + let master_edition = master_edition_pda(&mint.pubkey()); + + // 1. Create + initialize the SPL mint (mint authority = authority). + let mint_rent = svm.minimum_balance_for_rent_exemption(82); + let create_mint = Instruction { + program_id: SYSTEM_ID, + accounts: vec![ + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(mint.pubkey(), true), + ], + data: { + let mut d = 0u32.to_le_bytes().to_vec(); + d.extend_from_slice(&mint_rent.to_le_bytes()); + d.extend_from_slice(&82u64.to_le_bytes()); + d.extend_from_slice(TOKEN_ID.as_ref()); + d + }, + }; + // InitializeMint2 (tag 20): decimals=0, mint_authority=authority, freeze=None. + let init_mint = Instruction { + program_id: TOKEN_ID, + accounts: vec![AccountMeta::new(mint.pubkey(), false)], + data: { + let mut d = vec![20u8, 0u8]; + d.extend_from_slice(authority.pubkey().as_ref()); + d.push(1); // freeze authority present (required for NFTs) + d.extend_from_slice(authority.pubkey().as_ref()); + d + }, + }; + + // 2. Create + initialize a token account, then mint 1 to it. + let token_account = Keypair::new(); + let acct_rent = svm.minimum_balance_for_rent_exemption(165); + let create_token_acct = Instruction { + program_id: SYSTEM_ID, + accounts: vec![ + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(token_account.pubkey(), true), + ], + data: { + let mut d = 0u32.to_le_bytes().to_vec(); + d.extend_from_slice(&acct_rent.to_le_bytes()); + d.extend_from_slice(&165u64.to_le_bytes()); + d.extend_from_slice(TOKEN_ID.as_ref()); + d + }, + }; + // InitializeAccount3 (tag 18): owner = authority. + let init_token_acct = Instruction { + program_id: TOKEN_ID, + accounts: vec![ + AccountMeta::new(token_account.pubkey(), false), + AccountMeta::new_readonly(mint.pubkey(), false), + ], + data: { + let mut d = vec![18u8]; + d.extend_from_slice(authority.pubkey().as_ref()); + d + }, + }; + // MintTo (tag 7): amount = 1. + let mint_to = Instruction { + program_id: TOKEN_ID, + accounts: vec![ + AccountMeta::new(mint.pubkey(), false), + AccountMeta::new(token_account.pubkey(), false), + AccountMeta::new_readonly(authority.pubkey(), true), + ], + data: { + let mut d = vec![7u8]; + d.extend_from_slice(&1u64.to_le_bytes()); + d + }, + }; + + send( + svm, + vec![ + create_mint, + init_mint, + create_token_acct, + init_token_acct, + mint_to, + ], + payer, + &[payer, &mint, &token_account, authority], + ) + .expect("collection mint setup should succeed"); + + // 3. CreateMetadataAccountV3 (disc 33) with collection_details = V1{size:0} + // (this makes it a *sized* collection that Bubblegum accepts). + let create_metadata = Instruction { + program_id: TOKEN_METADATA_ID, + accounts: vec![ + AccountMeta::new(metadata, false), + AccountMeta::new_readonly(mint.pubkey(), false), + AccountMeta::new_readonly(authority.pubkey(), true), // mint_authority + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new_readonly(authority.pubkey(), true), // update_authority + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = vec![33u8]; + // DataV2 + "Collection".serialize(&mut d).unwrap(); // name + "COLL".serialize(&mut d).unwrap(); // symbol + "https://example.com/collection.json" + .serialize(&mut d) + .unwrap(); // uri + d.extend_from_slice(&0u16.to_le_bytes()); // seller_fee_basis_points + d.push(0); // creators: Option> = None + d.push(0); // collection: Option = None + d.push(0); // uses: Option = None + d.push(1); // is_mutable = true + // collection_details: Option = Some(V1 { size: 0 }) + d.push(1); + d.push(0); // CollectionDetails::V1 variant + d.extend_from_slice(&0u64.to_le_bytes()); // size + d + }, + }; + + // 4. CreateMasterEditionV3 (disc 17) with max_supply = Some(0). + let create_master_edition = Instruction { + program_id: TOKEN_METADATA_ID, + accounts: vec![ + AccountMeta::new(master_edition, false), + AccountMeta::new(mint.pubkey(), false), + AccountMeta::new_readonly(authority.pubkey(), true), // update_authority + AccountMeta::new_readonly(authority.pubkey(), true), // mint_authority + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new(metadata, false), + AccountMeta::new_readonly(TOKEN_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = vec![17u8]; + d.push(1); // max_supply: Option = Some + d.extend_from_slice(&0u64.to_le_bytes()); + d + }, + }; + + send( + svm, + vec![create_metadata, create_master_edition], + payer, + &[payer, authority], + ) + .expect("collection metadata + master edition should succeed"); + + (mint, metadata, master_edition) +} + +#[test] +fn test_cutils_mint_and_verify() { + let mut svm = LiteSVM::new(); + + // Load the cutils program and the mainnet fixtures. + svm.add_program( + CUTILS_ID, + include_bytes!("../../../target/deploy/cutils.so"), + ) + .unwrap(); + svm.add_program( + BUBBLEGUM_ID, + include_bytes!("../../../tests/fixtures/mpl_bubblegum.so"), + ) + .unwrap(); + svm.add_program( + COMPRESSION_ID, + include_bytes!("../../../tests/fixtures/spl_account_compression.so"), + ) + .unwrap(); + svm.add_program( + NOOP_ID, + include_bytes!("../../../tests/fixtures/spl_noop.so"), + ) + .unwrap(); + svm.add_program( + TOKEN_METADATA_ID, + include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"), + ) + .unwrap(); + + // Fund payer (also the collection authority / tree delegate / leaf owner). + let payer = Keypair::new(); + let leaf_owner = Keypair::new(); + svm.airdrop(&payer.pubkey(), 1_000 * 1_000_000_000).unwrap(); + svm.airdrop(&leaf_owner.pubkey(), 10 * 1_000_000_000) + .unwrap(); + + // Build the verified collection NFT (payer is the collection authority). + let (collection_mint, collection_metadata, collection_master_edition) = + create_collection_nft(&mut svm, &payer, &payer); + + // Create the Merkle tree account (owned by the compression program). + let merkle_tree = Keypair::new(); + let rent = svm.minimum_balance_for_rent_exemption(TREE_ACCOUNT_SIZE); + let create_acc = Instruction { + program_id: SYSTEM_ID, + accounts: vec![ + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(merkle_tree.pubkey(), true), + ], + data: { + let mut d = 0u32.to_le_bytes().to_vec(); + d.extend_from_slice(&rent.to_le_bytes()); + d.extend_from_slice(&(TREE_ACCOUNT_SIZE as u64).to_le_bytes()); + d.extend_from_slice(COMPRESSION_ID.as_ref()); + d + }, + }; + + let (tree_config, _) = + Pubkey::find_program_address(&[merkle_tree.pubkey().as_ref()], &BUBBLEGUM_ID); + + // create_tree_config(max_depth, max_buffer_size, public=None) + let create_tree_ix = Instruction { + program_id: BUBBLEGUM_ID, + accounts: vec![ + AccountMeta::new(tree_config, false), + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new_readonly(payer.pubkey(), true), // tree_creator + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = CREATE_TREE_CONFIG_DISC.to_vec(); + d.extend_from_slice(&MAX_DEPTH.to_le_bytes()); + d.extend_from_slice(&MAX_BUFFER_SIZE.to_le_bytes()); + d.push(0); // Option::None + d + }, + }; + + send( + &mut svm, + vec![create_acc, create_tree_ix], + &payer, + &[&payer, &merkle_tree], + ) + .expect("create_tree_config should succeed"); + + // ---- Call cutils `mint` ------------------------------------------------- + // + // Account order mirrors the Mint<'info> struct in mint.rs: + // payer, tree_authority, leaf_owner, leaf_delegate, merkle_tree, + // tree_delegate, collection_authority, collection_authority_record_pda, + // collection_mint, collection_metadata, edition_account, bubblegum_signer, + // log_wrapper, compression_program, token_metadata_program, + // bubblegum_program, system_program. + // + // When there is no collection-authority-record PDA, that account must be + // the Bubblegum program id. bubblegum_signer is the `collection_cpi` PDA. + let (bubblegum_signer, _) = Pubkey::find_program_address(&[b"collection_cpi"], &BUBBLEGUM_ID); + + let uri = "https://example.com/burger.json".to_string(); + let mint_ix = Instruction { + program_id: CUTILS_ID, + accounts: vec![ + AccountMeta::new_readonly(payer.pubkey(), true), // payer (signer) + AccountMeta::new(tree_config, false), + AccountMeta::new_readonly(leaf_owner.pubkey(), false), + AccountMeta::new_readonly(leaf_owner.pubkey(), false), // leaf_delegate + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new_readonly(payer.pubkey(), true), // tree_delegate (signer) + AccountMeta::new_readonly(payer.pubkey(), true), // collection_authority (signer) + AccountMeta::new_readonly(BUBBLEGUM_ID, false), // collection_authority_record_pda + AccountMeta::new_readonly(collection_mint.pubkey(), false), + AccountMeta::new(collection_metadata, false), + AccountMeta::new(collection_master_edition, false), // edition_account (mut: set_and_verify writes details) + AccountMeta::new_readonly(bubblegum_signer, false), + AccountMeta::new_readonly(NOOP_ID, false), // log_wrapper + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(TOKEN_METADATA_ID, false), + AccountMeta::new_readonly(BUBBLEGUM_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = anchor_disc("mint").to_vec(); + // MintParams { uri: String } + uri.serialize(&mut d).unwrap(); + d + }, + }; + + send(&mut svm, vec![mint_ix], &payer, &[&payer]).expect("cutils mint should succeed"); + + // ---- Recompute the stored leaf's data_hash / creator_hash --------------- + // + // Mirror exactly what cutils mint hardcodes; after MintToCollectionV1 the + // collection is stored *verified = true*. + let creator = Creator { + address: payer.pubkey().to_bytes(), + verified: false, + share: 100, + }; + let metadata = MetadataArgs { + name: "BURGER".to_string(), + symbol: "BURG".to_string(), + uri, + seller_fee_basis_points: 0, + primary_sale_happened: false, + is_mutable: false, + edition_nonce: Some(0), + token_standard: Some(0), // TokenStandard::NonFungible + collection: Some(Collection { + verified: true, // verified by MintToCollectionV1 + key: collection_mint.pubkey().to_bytes(), + }), + uses: None, + token_program_version: TokenProgramVersion::Original, + creators: vec![creator.clone()], + }; + + let data_hash = hash_metadata(&metadata); + let creator_hash = hash_creators(&metadata.creators); + + // Proof for leaf index 0 in an otherwise-empty tree: empty-node siblings. + let proof = [empty_node(0), empty_node(1), empty_node(2)]; + + // Read the live root from the on-chain tree account. + let tree_data = svm.get_account(&merkle_tree.pubkey()).unwrap().data; + let root = read_current_root(&tree_data); + + // Sanity: the leaf we computed must equal what the program will recompute, + // and the proof must rebuild the on-chain root. + let asset_id = get_asset_id(&merkle_tree.pubkey(), 0); + let leaf = leaf_schema_v1_hash( + &asset_id, + &leaf_owner.pubkey(), + &leaf_owner.pubkey(), + 0, + &data_hash, + &creator_hash, + ); + let mut node = leaf; + let mut idx = 0u32; + for sibling in proof.iter() { + node = if idx & 1 == 0 { + hashv(&[&node, sibling]).to_bytes() + } else { + hashv(&[sibling, &node]).to_bytes() + }; + idx >>= 1; + } + assert_eq!( + node, root, + "locally recomputed root must match the on-chain tree root" + ); + + // ---- Call cutils `verify` ---------------------------------------------- + // + // Accounts per Verify<'info>: leaf_owner (signer), leaf_delegate, + // merkle_tree, compression_program, then proof nodes as remaining accounts. + let build_verify = |dh: [u8; 32]| -> Instruction { + let mut accounts = vec![ + AccountMeta::new_readonly(leaf_owner.pubkey(), true), + AccountMeta::new_readonly(leaf_owner.pubkey(), false), // leaf_delegate + AccountMeta::new_readonly(merkle_tree.pubkey(), false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + ]; + for sibling in proof.iter() { + accounts.push(AccountMeta::new_readonly( + Pubkey::new_from_array(*sibling), + false, + )); + } + Instruction { + program_id: CUTILS_ID, + accounts, + data: { + let mut d = anchor_disc("verify").to_vec(); + // VerifyParams { root, data_hash, creator_hash, nonce, index } + d.extend_from_slice(&root); + d.extend_from_slice(&dh); + d.extend_from_slice(&creator_hash); + d.extend_from_slice(&0u64.to_le_bytes()); // nonce + d.extend_from_slice(&0u32.to_le_bytes()); // index + d + }, + } + }; + + send( + &mut svm, + vec![build_verify(data_hash)], + &leaf_owner, + &[&leaf_owner], + ) + .expect("cutils verify should succeed for the minted leaf"); + + // A tampered data_hash must fail verification. + let mut bad = data_hash; + bad[0] ^= 0xff; + let bad_result = send( + &mut svm, + vec![build_verify(bad)], + &leaf_owner, + &[&leaf_owner], + ); + assert!( + bad_result.is_err(), + "verify must fail for an incorrect data_hash" + ); +} + +#[test] +fn test_empty_node_matches_manual() { + let e1 = empty_node(1); + let manual = hashv(&[&[0u8; 32], &[0u8; 32]]).to_bytes(); + assert_eq!(e1, manual); +} diff --git a/compression/cutils/anchor/tests/fixtures/README.md b/compression/cutils/anchor/tests/fixtures/README.md index 6e1ab7d3..e516b6a9 100644 --- a/compression/cutils/anchor/tests/fixtures/README.md +++ b/compression/cutils/anchor/tests/fixtures/README.md @@ -1,16 +1,21 @@ # Test fixtures โ€” mainnet program binaries -These `.so` files are the compiled on-chain programs the cNFT-burn test CPIs +These `.so` files are the compiled on-chain programs the cutils test CPIs into, dumped from Solana **mainnet-beta** so [LiteSVM](https://github.com/LiteSVM/litesvm) can load them locally (LiteSVM only bundles System/Token/Token-2022/ATA). They are the real programs โ€” not modified โ€” so accounts they create/verify behave exactly as on mainnet. +`mpl_token_metadata.so` is required because the cutils `mint` instruction CPIs +Bubblegum `MintToCollectionV1`, which in turn validates a real Token-Metadata +collection NFT (mint + metadata + master edition) that the test builds. + | File | Program | Program ID | Source | Dumped (UTC) | Slot | |------|---------|------------|--------|--------------|------| | `mpl_bubblegum.so` | Metaplex Bubblegum (cNFTs) | `BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY` | mainnet-beta | 2026-06-05 | 424532091 | | `spl_account_compression.so` | SPL Account Compression | `cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK` | mainnet-beta | 2026-06-05 | 424532091 | | `spl_noop.so` | SPL Noop (log wrapper) | `noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV` | mainnet-beta | 2026-06-05 | 424532091 | +| `mpl_token_metadata.so` | Metaplex Token Metadata | `metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s` | mainnet-beta | 2026-06-05 | 424532091 | ## Refreshing @@ -21,4 +26,5 @@ upgrade), update the date/slot above and run: solana program dump BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY mpl_bubblegum.so -u https://api.mainnet-beta.solana.com solana program dump cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK spl_account_compression.so -u https://api.mainnet-beta.solana.com solana program dump noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV spl_noop.so -u https://api.mainnet-beta.solana.com +solana program dump metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s mpl_token_metadata.so -u https://api.mainnet-beta.solana.com ``` diff --git a/compression/cutils/anchor/tests/fixtures/mpl_token_metadata.so b/compression/cutils/anchor/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 Date: Fri, 5 Jun 2026 20:55:37 +0000 Subject: [PATCH 032/138] Add LiteSVM integration test for cnft-vault withdraw_cnft Adds programs/cnft-vault/tests/test_vault.rs, a LiteSVM test that: - loads the built cnft-vault program plus the three mainnet fixtures (mpl-bubblegum, spl-account-compression, spl-noop) - creates a Bubblegum ConcurrentMerkleTree<3,8> and mints a cNFT whose leaf_owner is the vault PDA (seeds [b"cNFT-vault"]) - recomputes data_hash/creator_hash, builds the index-0 empty-node proof, reads the live root - calls withdraw_cnft (CPIs Bubblegum Transfer, vault PDA signs via invoke_signed) to move the cNFT to a recipient, asserting success and that a replay with the now-stale root fails Also: add #![allow(clippy::diverging_sub_expression)] (accepted Anchor #[program] false positive) and #[allow(clippy::too_many_arguments)] on build_transfer_instruction, plus rustfmt cleanup, so fmt/clippy are clean. withdraw_two_cnfts is left untested (would need two trees/leaves/proofs). https://claude.ai/code/session_013dpnF6uSGWXjkJJZseqzcP --- .../src/instructions/withdraw_cnft.rs | 7 +- .../src/instructions/withdraw_two_cnfts.rs | 7 +- .../anchor/programs/cnft-vault/src/lib.rs | 13 +- .../programs/cnft-vault/tests/test_vault.rs | 452 ++++++++++++++++++ 4 files changed, 463 insertions(+), 16 deletions(-) create mode 100644 compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_cnft.rs b/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_cnft.rs index b9d66f68..d85dbe1e 100644 --- a/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_cnft.rs +++ b/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_cnft.rs @@ -1,10 +1,7 @@ use anchor_lang::prelude::*; -use anchor_lang::solana_program::{ - instruction::AccountMeta, - program::invoke_signed, -}; +use anchor_lang::solana_program::{instruction::AccountMeta, program::invoke_signed}; -use crate::{build_transfer_instruction, TransferArgs, SPLCompression, MPL_BUBBLEGUM_ID}; +use crate::{build_transfer_instruction, SPLCompression, TransferArgs, MPL_BUBBLEGUM_ID}; #[derive(Accounts)] pub struct Withdraw<'info> { diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_two_cnfts.rs b/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_two_cnfts.rs index 84c1d795..0ad80351 100644 --- a/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_two_cnfts.rs +++ b/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_two_cnfts.rs @@ -1,10 +1,7 @@ use anchor_lang::prelude::*; -use anchor_lang::solana_program::{ - instruction::AccountMeta, - program::invoke_signed, -}; +use anchor_lang::solana_program::{instruction::AccountMeta, program::invoke_signed}; -use crate::{build_transfer_instruction, TransferArgs, SPLCompression, MPL_BUBBLEGUM_ID}; +use crate::{build_transfer_instruction, SPLCompression, TransferArgs, MPL_BUBBLEGUM_ID}; #[derive(Accounts)] pub struct WithdrawTwo<'info> { diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/src/lib.rs b/compression/cnft-vault/anchor/programs/cnft-vault/src/lib.rs index c2ade6ad..5d6a3dbe 100644 --- a/compression/cnft-vault/anchor/programs/cnft-vault/src/lib.rs +++ b/compression/cnft-vault/anchor/programs/cnft-vault/src/lib.rs @@ -1,3 +1,5 @@ +#![allow(clippy::diverging_sub_expression)] + use anchor_lang::prelude::*; use anchor_lang::solana_program::instruction::{AccountMeta, Instruction}; use borsh::BorshSerialize; @@ -9,16 +11,14 @@ declare_id!("Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D"); /// mpl-bubblegum program ID (BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY) const MPL_BUBBLEGUM_ID: Pubkey = Pubkey::new_from_array([ - 0x98, 0x8b, 0x80, 0xeb, 0x79, 0x35, 0x28, 0x69, 0xb2, 0x24, 0x74, 0x5f, 0x59, 0xdd, 0xbf, - 0x8a, 0x26, 0x58, 0xca, 0x13, 0xdc, 0x68, 0x81, 0x21, 0x26, 0x35, 0x1c, 0xae, 0x07, 0xc1, - 0xa5, 0xa5, + 0x98, 0x8b, 0x80, 0xeb, 0x79, 0x35, 0x28, 0x69, 0xb2, 0x24, 0x74, 0x5f, 0x59, 0xdd, 0xbf, 0x8a, + 0x26, 0x58, 0xca, 0x13, 0xdc, 0x68, 0x81, 0x21, 0x26, 0x35, 0x1c, 0xae, 0x07, 0xc1, 0xa5, 0xa5, ]); /// SPL Account Compression program ID (cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK) const SPL_ACCOUNT_COMPRESSION_ID: Pubkey = Pubkey::new_from_array([ - 0x09, 0x2a, 0x13, 0xee, 0x95, 0xc4, 0x1c, 0xba, 0x08, 0xa6, 0x7f, 0x5a, 0xc6, 0x7e, 0x8d, - 0xf7, 0xe1, 0xda, 0x11, 0x62, 0x5e, 0x1d, 0x64, 0x13, 0x7f, 0x8f, 0x4f, 0x23, 0x83, 0x03, - 0x7f, 0x14, + 0x09, 0x2a, 0x13, 0xee, 0x95, 0xc4, 0x1c, 0xba, 0x08, 0xa6, 0x7f, 0x5a, 0xc6, 0x7e, 0x8d, 0xf7, + 0xe1, 0xda, 0x11, 0x62, 0x5e, 0x1d, 0x64, 0x13, 0x7f, 0x8f, 0x4f, 0x23, 0x83, 0x03, 0x7f, 0x14, ]); /// Transfer instruction discriminator from mpl-bubblegum @@ -45,6 +45,7 @@ impl anchor_lang::Id for SPLCompression { /// Build a mpl-bubblegum Transfer instruction from pubkeys and args. /// This avoids using mpl-bubblegum's CPI wrapper which requires solana-program 2.x AccountInfo. +#[allow(clippy::too_many_arguments)] pub fn build_transfer_instruction( tree_config: Pubkey, leaf_owner: Pubkey, diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs b/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs new file mode 100644 index 00000000..7fb18e83 --- /dev/null +++ b/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs @@ -0,0 +1,452 @@ +//! LiteSVM integration test for the cnft-vault Anchor program. +//! +//! Full flow exercised: +//! 1. Load the cnft-vault program plus the three mainnet fixtures +//! (mpl-bubblegum, spl-account-compression, spl-noop) into LiteSVM. +//! 2. Allocate + initialize a Bubblegum Merkle tree (max_depth=3, +//! max_buffer_size=8, canopy=0) via `create_tree_config`. +//! 3. Mint a single cNFT whose leaf_owner is the vault PDA (so the vault +//! holds it) via `mint_v1`. +//! 4. Recompute `data_hash` / `creator_hash` exactly as Bubblegum does. +//! 5. Build the Merkle proof for leaf 0 (all empty-node siblings) and read +//! the current root from the on-chain tree account. +//! 6. Call our program's `withdraw_cnft`, which CPIs Bubblegum `Transfer` +//! signed by the vault PDA (`invoke_signed`), to move the cNFT to a +//! recipient. Assert the transaction succeeds and that a second withdraw +//! with the now-stale root fails (the leaf moved, so the root changed). + +use { + borsh::BorshSerialize, + litesvm::LiteSVM, + solana_instruction::{account_meta::AccountMeta, Instruction}, + solana_keccak_hasher::hashv, + solana_keypair::Keypair, + solana_message::Message, + solana_pubkey::{pubkey, Pubkey}, + solana_signer::Signer, + solana_transaction::Transaction, +}; + +// ---- Program IDs ---------------------------------------------------------- + +const CNFT_VAULT_ID: Pubkey = pubkey!("Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D"); +const BUBBLEGUM_ID: Pubkey = pubkey!("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY"); +const COMPRESSION_ID: Pubkey = pubkey!("cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK"); +const NOOP_ID: Pubkey = pubkey!("noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV"); +const SYSTEM_ID: Pubkey = pubkey!("11111111111111111111111111111111"); + +// ---- Bubblegum instruction discriminators --------------------------------- + +const CREATE_TREE_CONFIG_DISC: [u8; 8] = [165, 83, 136, 142, 89, 202, 47, 220]; +const MINT_V1_DISC: [u8; 8] = [145, 98, 192, 118, 184, 147, 118, 104]; + +// ---- Tree parameters ------------------------------------------------------ + +const MAX_DEPTH: u32 = 3; +const MAX_BUFFER_SIZE: u32 = 8; + +// ---- MetadataArgs (mirrors mpl_bubblegum::types::MetadataArgs borsh layout) ---- + +#[derive(BorshSerialize, Clone)] +struct Creator { + address: [u8; 32], + verified: bool, + share: u8, +} + +#[derive(BorshSerialize, Clone)] +enum TokenProgramVersion { + #[allow(dead_code)] + Original, + #[allow(dead_code)] + Token2022, +} + +#[derive(BorshSerialize, Clone)] +struct MetadataArgs { + name: String, + symbol: String, + uri: String, + seller_fee_basis_points: u16, + primary_sale_happened: bool, + is_mutable: bool, + edition_nonce: Option, + token_standard: Option, // TokenStandard enum, encoded by variant index + collection: Option, // None โ€” Collection, kept absent + uses: Option, // None โ€” Uses, kept absent + token_program_version: TokenProgramVersion, + creators: Vec, +} + +// ---- Hashing, exactly as the Bubblegum program does ------------------------ + +fn hash_metadata(metadata: &MetadataArgs) -> [u8; 32] { + let serialized = borsh::to_vec(metadata).unwrap(); + let inner = hashv(&[serialized.as_slice()]).to_bytes(); + hashv(&[&inner, &metadata.seller_fee_basis_points.to_le_bytes()]).to_bytes() +} + +fn hash_creators(creators: &[Creator]) -> [u8; 32] { + let creator_data: Vec> = creators + .iter() + .map(|c| [c.address.as_ref(), &[c.verified as u8], &[c.share]].concat()) + .collect(); + hashv( + creator_data + .iter() + .map(|c| c.as_slice()) + .collect::>() + .as_slice(), + ) + .to_bytes() +} + +// ---- SPL account-compression empty-node helper ----------------------------- + +fn empty_node(level: u32) -> [u8; 32] { + if level == 0 { + return [0u8; 32]; + } + let lower = empty_node(level - 1); + hashv(&[&lower, &lower]).to_bytes() +} + +// ---- Anchor discriminator for withdraw_cnft -------------------------------- + +fn withdraw_cnft_disc() -> [u8; 8] { + // sha256("global:withdraw_cnft")[..8]. Implemented inline to avoid pulling + // a crypto crate that conflicts with the program's solana version. + let digest = sha256(b"global:withdraw_cnft"); + let mut out = [0u8; 8]; + out.copy_from_slice(&digest[..8]); + out +} + +// Minimal SHA-256 (FIPS 180-4) โ€” only used to derive the Anchor discriminator. +fn sha256(input: &[u8]) -> [u8; 32] { + const K: [u32; 64] = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, + 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, + 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, + 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, + 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, + 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, + 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, + 0xc67178f2, + ]; + let mut h: [u32; 8] = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, + 0x5be0cd19, + ]; + let mut msg = input.to_vec(); + let bitlen = (input.len() as u64) * 8; + msg.push(0x80); + while msg.len() % 64 != 56 { + msg.push(0); + } + msg.extend_from_slice(&bitlen.to_be_bytes()); + + for chunk in msg.chunks(64) { + let mut w = [0u32; 64]; + for (i, wi) in w.iter_mut().enumerate().take(16) { + *wi = u32::from_be_bytes([ + chunk[i * 4], + chunk[i * 4 + 1], + chunk[i * 4 + 2], + chunk[i * 4 + 3], + ]); + } + for i in 16..64 { + let s0 = w[i - 15].rotate_right(7) ^ w[i - 15].rotate_right(18) ^ (w[i - 15] >> 3); + let s1 = w[i - 2].rotate_right(17) ^ w[i - 2].rotate_right(19) ^ (w[i - 2] >> 10); + w[i] = w[i - 16] + .wrapping_add(s0) + .wrapping_add(w[i - 7]) + .wrapping_add(s1); + } + let mut v = h; + for i in 0..64 { + let s1 = v[4].rotate_right(6) ^ v[4].rotate_right(11) ^ v[4].rotate_right(25); + let ch = (v[4] & v[5]) ^ ((!v[4]) & v[6]); + let t1 = v[7] + .wrapping_add(s1) + .wrapping_add(ch) + .wrapping_add(K[i]) + .wrapping_add(w[i]); + let s0 = v[0].rotate_right(2) ^ v[0].rotate_right(13) ^ v[0].rotate_right(22); + let maj = (v[0] & v[1]) ^ (v[0] & v[2]) ^ (v[1] & v[2]); + let t2 = s0.wrapping_add(maj); + v[7] = v[6]; + v[6] = v[5]; + v[5] = v[4]; + v[4] = v[3].wrapping_add(t1); + v[3] = v[2]; + v[2] = v[1]; + v[1] = v[0]; + v[0] = t1.wrapping_add(t2); + } + for i in 0..8 { + h[i] = h[i].wrapping_add(v[i]); + } + } + let mut out = [0u8; 32]; + for (i, word) in h.iter().enumerate() { + out[i * 4..i * 4 + 4].copy_from_slice(&word.to_be_bytes()); + } + out +} + +// ---- ConcurrentMerkleTree<3,8> account layout ------------------------------ +// +// account_data = header (56 bytes) || zero-copy ConcurrentMerkleTree (1248) || canopy (0) +// +// Header (ConcurrentMerkleTreeHeader): account_type(1) + header-enum-discriminant(1) +// + V1{ max_buffer_size(4), max_depth(4), authority(32), creation_slot(8), +// is_batch_initialized(1), _padding[5] } = 56 bytes total. +// +// ConcurrentMerkleTree<3,8> (#[repr(C)]): +// sequence_number u64 (off 0) +// active_index u64 (off 8) +// buffer_size u64 (off 16) +// change_logs [ChangeLog<3>; 8] (off 24), stride = 136 +// ChangeLog<3> = root[32] + path[3*32] + index u32 + _padding u32 = 136 +// rightmost_proof Path<3> +// +// Current root = change_logs[active_index].root. + +const HEADER_SIZE: usize = 56; +const CMT_SIZE: usize = { + let changelog = 32 + 3 * 32 + 4 + 4; // 136 + let path = 3 * 32 + 32 + 4 + 4; // 136 + 8 + 8 + 8 + changelog * 8 + path +}; +const TREE_ACCOUNT_SIZE: usize = HEADER_SIZE + CMT_SIZE; + +fn read_current_root(data: &[u8]) -> [u8; 32] { + let tree = &data[HEADER_SIZE..]; + let active_index = u64::from_le_bytes(tree[8..16].try_into().unwrap()) as usize; + let changelog_stride = 136; + let root_off = 24 + active_index * changelog_stride; + let mut root = [0u8; 32]; + root.copy_from_slice(&tree[root_off..root_off + 32]); + root +} + +// ---- Helpers --------------------------------------------------------------- + +fn send( + svm: &mut LiteSVM, + ixs: Vec, + payer: &Keypair, + signers: &[&Keypair], +) -> Result<(), Box> { + let msg = Message::new(&ixs, Some(&payer.pubkey())); + let blockhash = svm.latest_blockhash(); + let mut tx = Transaction::new_unsigned(msg); + tx.sign(signers, blockhash); + svm.send_transaction(tx).map(|_| ()).map_err(Box::new) +} + +#[test] +fn test_withdraw_cnft() { + let mut svm = LiteSVM::new(); + + // Load the cnft-vault program and the three mainnet fixtures. + svm.add_program( + CNFT_VAULT_ID, + include_bytes!("../../../target/deploy/cnft_vault.so"), + ) + .unwrap(); + svm.add_program( + BUBBLEGUM_ID, + include_bytes!("../../../tests/fixtures/mpl_bubblegum.so"), + ) + .unwrap(); + svm.add_program( + COMPRESSION_ID, + include_bytes!("../../../tests/fixtures/spl_account_compression.so"), + ) + .unwrap(); + svm.add_program( + NOOP_ID, + include_bytes!("../../../tests/fixtures/spl_noop.so"), + ) + .unwrap(); + + // Fund payer. + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), 100 * solana_native_token::LAMPORTS_PER_SOL) + .unwrap(); + + // The vault PDA that owns the cNFT and signs the transfer CPI. + // seeds = [b"cNFT-vault"] under the cnft-vault program. + let (vault_pda, _vault_bump) = Pubkey::find_program_address(&[b"cNFT-vault"], &CNFT_VAULT_ID); + + // The recipient of the withdraw. + let recipient = Keypair::new(); + + // Create the Merkle tree account, owned by the compression program. + let merkle_tree = Keypair::new(); + let rent = svm.minimum_balance_for_rent_exemption(TREE_ACCOUNT_SIZE); + let create_acc = Instruction { + program_id: SYSTEM_ID, + accounts: vec![ + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(merkle_tree.pubkey(), true), + ], + // System CreateAccount: u32 instruction index (0) + lamports u64 + space u64 + owner [32] + data: { + let mut d = Vec::new(); + d.extend_from_slice(&0u32.to_le_bytes()); + d.extend_from_slice(&rent.to_le_bytes()); + d.extend_from_slice(&(TREE_ACCOUNT_SIZE as u64).to_le_bytes()); + d.extend_from_slice(COMPRESSION_ID.as_ref()); + d + }, + }; + + // tree_authority (a.k.a tree_config) PDA = [merkle_tree] under bubblegum. + let (tree_config, _) = + Pubkey::find_program_address(&[merkle_tree.pubkey().as_ref()], &BUBBLEGUM_ID); + + // create_tree_config(max_depth, max_buffer_size, public=None) + let create_tree_ix = Instruction { + program_id: BUBBLEGUM_ID, + accounts: vec![ + AccountMeta::new(tree_config, false), + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new_readonly(payer.pubkey(), true), // tree_creator + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = CREATE_TREE_CONFIG_DISC.to_vec(); + d.extend_from_slice(&MAX_DEPTH.to_le_bytes()); + d.extend_from_slice(&MAX_BUFFER_SIZE.to_le_bytes()); + d.push(0); // Option::None + d + }, + }; + + send( + &mut svm, + vec![create_acc, create_tree_ix], + &payer, + &[&payer, &merkle_tree], + ) + .expect("create_tree_config should succeed"); + + // Build the MetadataArgs for the single cNFT we mint. The leaf owner / + // delegate are the vault PDA, so the vault holds the cNFT. + let creator = Creator { + address: payer.pubkey().to_bytes(), + verified: false, + share: 100, + }; + let metadata = MetadataArgs { + name: "Vault cNFT".to_string(), + symbol: "VCNFT".to_string(), + uri: "https://example.com/nft.json".to_string(), + seller_fee_basis_points: 500, + primary_sale_happened: false, + is_mutable: true, + edition_nonce: None, + token_standard: Some(0), // TokenStandard::NonFungible + collection: None, + uses: None, + token_program_version: TokenProgramVersion::Original, + creators: vec![creator.clone()], + }; + + // mint_v1 โ€” leaf_owner and leaf_delegate are the vault PDA. + let mint_ix = Instruction { + program_id: BUBBLEGUM_ID, + accounts: vec![ + AccountMeta::new(tree_config, false), + AccountMeta::new_readonly(vault_pda, false), + AccountMeta::new_readonly(vault_pda, false), // leaf_delegate + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new_readonly(payer.pubkey(), true), + AccountMeta::new_readonly(payer.pubkey(), true), // tree_creator_or_delegate + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = MINT_V1_DISC.to_vec(); + d.extend_from_slice(&borsh::to_vec(&metadata).unwrap()); + d + }, + }; + send(&mut svm, vec![mint_ix], &payer, &[&payer]).expect("mint_v1 should succeed"); + + // Recompute data_hash and creator_hash exactly as Bubblegum does. + let data_hash = hash_metadata(&metadata); + let creator_hash = hash_creators(&metadata.creators); + + // Proof for leaf index 0 in an otherwise-empty tree: empty-node siblings. + let proof = [empty_node(0), empty_node(1), empty_node(2)]; + + // Read the current root from the on-chain tree account. + let tree_data = svm.get_account(&merkle_tree.pubkey()).unwrap().data; + let root = read_current_root(&tree_data); + + // Build withdraw_cnft via our program. Accounts per Withdraw struct: + // tree_authority (mut), leaf_owner (vault PDA), new_leaf_owner (recipient), + // merkle_tree (mut), log_wrapper, compression_program, bubblegum_program, + // system_program, then proof nodes as remaining accounts. + let mut withdraw_accounts = vec![ + AccountMeta::new(tree_config, false), + AccountMeta::new_readonly(vault_pda, false), + AccountMeta::new_readonly(recipient.pubkey(), false), + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(BUBBLEGUM_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ]; + for node in proof.iter() { + withdraw_accounts.push(AccountMeta::new_readonly( + Pubkey::new_from_array(*node), + false, + )); + } + + let withdraw_data = { + let mut d = withdraw_cnft_disc().to_vec(); + d.extend_from_slice(&root); + d.extend_from_slice(&data_hash); + d.extend_from_slice(&creator_hash); + d.extend_from_slice(&0u64.to_le_bytes()); // nonce + d.extend_from_slice(&0u32.to_le_bytes()); // index + d + }; + + let withdraw_ix = Instruction { + program_id: CNFT_VAULT_ID, + accounts: withdraw_accounts.clone(), + data: withdraw_data.clone(), + }; + + // Withdraw is signed by the payer (the vault PDA signs via invoke_signed + // inside the program, not as a transaction signer). + send(&mut svm, vec![withdraw_ix], &payer, &[&payer]).expect("withdraw_cnft should succeed"); + + // After transfer, leaf 0's owner changed (vault -> recipient), so the root + // moved. A second withdraw replaying the same (root, hashes) must fail: the + // cached root is stale and the leaf no longer hashes to it for the vault. + let withdraw_ix2 = Instruction { + program_id: CNFT_VAULT_ID, + accounts: withdraw_accounts, + data: withdraw_data, + }; + let second = send(&mut svm, vec![withdraw_ix2], &payer, &[&payer]); + assert!( + second.is_err(), + "second withdraw must fail: leaf already transferred out of the vault" + ); +} From f3e9f8e3ae9f63c09bff5b8ca41f4d1441b970ab Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 21:04:32 +0000 Subject: [PATCH 033/138] ci(compression): re-enable cutils + cnft-vault (build fix + LiteSVM tests) --- .github/.ghaignore | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/.ghaignore b/.github/.ghaignore index 10e15815..c26a85c3 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -1,14 +1,8 @@ # uses generated client from shank, can't rewrite to solana-bankrun tools/shank-and-solita/native -# not building -compression/cutils/anchor -compression/cnft-vault/anchor - - - # build failed - program outdated tokens/token-extensions/metadata/anchor # dependency issues -tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor \ No newline at end of file +tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor From a8a0107378a359c34f9892df6c4e8df57ff841f6 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 21:11:06 +0000 Subject: [PATCH 034/138] fix(compression): use localnet provider so anchor test deploys to a local validator (not unfunded devnet) --- compression/cnft-vault/anchor/Anchor.toml | 4 ++-- compression/cutils/anchor/Anchor.toml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/compression/cnft-vault/anchor/Anchor.toml b/compression/cnft-vault/anchor/Anchor.toml index cf08cac8..bfb853e3 100644 --- a/compression/cnft-vault/anchor/Anchor.toml +++ b/compression/cnft-vault/anchor/Anchor.toml @@ -5,13 +5,13 @@ solana_version = "3.1.8" resolution = true skip-lint = false -[programs.devnet] +[programs.localnet] cnft_vault = "Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D" # [registry] section removed โ€” no longer used in Anchor 1.0 [provider] -cluster = "devnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] diff --git a/compression/cutils/anchor/Anchor.toml b/compression/cutils/anchor/Anchor.toml index 8876afb4..0d2e1b66 100644 --- a/compression/cutils/anchor/Anchor.toml +++ b/compression/cutils/anchor/Anchor.toml @@ -5,14 +5,14 @@ solana_version = "3.1.8" resolution = true skip-lint = false -[programs.devnet] +[programs.localnet] cutils = "BuFyrgRYzg2nPhqYrxZ7d9uYUs4VXtxH71U8EcoAfTQZ" # [registry] section removed โ€” no longer used in Anchor 1.0 [provider] -cluster = "devnet" -wallet = "~/.config/solana/test.json" +cluster = "localnet" +wallet = "~/.config/solana/id.json" [scripts] test = "cargo test" From 9f9b5e7ba7280d0a17b17ef7c14d956ca6405daf Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 21:19:44 +0000 Subject: [PATCH 035/138] test(compression): use crate ID (not hardcoded) so tests survive anchor keys sync in CI --- .../cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs | 3 ++- compression/cutils/anchor/programs/cutils/tests/test_cutils.rs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs b/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs index 7fb18e83..a089e891 100644 --- a/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs +++ b/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs @@ -29,7 +29,8 @@ use { // ---- Program IDs ---------------------------------------------------------- -const CNFT_VAULT_ID: Pubkey = pubkey!("Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D"); +// Track the crate's declared id (CI runs `anchor keys sync` before building). +const CNFT_VAULT_ID: Pubkey = cnft_vault::ID; const BUBBLEGUM_ID: Pubkey = pubkey!("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY"); const COMPRESSION_ID: Pubkey = pubkey!("cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK"); const NOOP_ID: Pubkey = pubkey!("noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV"); diff --git a/compression/cutils/anchor/programs/cutils/tests/test_cutils.rs b/compression/cutils/anchor/programs/cutils/tests/test_cutils.rs index 400c7b6e..e7a23055 100644 --- a/compression/cutils/anchor/programs/cutils/tests/test_cutils.rs +++ b/compression/cutils/anchor/programs/cutils/tests/test_cutils.rs @@ -39,7 +39,8 @@ use { // ---- Program IDs ---------------------------------------------------------- -const CUTILS_ID: Pubkey = pubkey!("BuFyrgRYzg2nPhqYrxZ7d9uYUs4VXtxH71U8EcoAfTQZ"); +// Track the crate's declared id (CI runs `anchor keys sync` before building). +const CUTILS_ID: Pubkey = cutils::ID; const BUBBLEGUM_ID: Pubkey = pubkey!("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY"); const COMPRESSION_ID: Pubkey = pubkey!("cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK"); const NOOP_ID: Pubkey = pubkey!("noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV"); From b1fe2a84cdfd24a4eb7d5733a95d1f67466b7095 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 21:39:39 +0000 Subject: [PATCH 036/138] Migrate shank-and-solita native example from Solita to Codama Solita is unmaintained and does not work on the current toolchain, so this example is reworked around Codama and modernised end to end. - Rename tools/shank-and-solita -> tools/shank-and-codama (Solita is gone). - Program: bump to borsh 1.x, shank 0.4.8, solana-program 4.0. Replace the removed solana_program::system_instruction with solana-system-interface and borsh try_to_vec with borsh::to_vec. Shank 0.4's #[seeds(...)] PDA codegen is broken (emits unparsable tokens) and is not emitted to the IDL, so seeds are dropped and PDAs derived explicitly via Car::find_pda / RentalOrder::find_pda. Make the crate standalone (empty [workspace]) so it pins its own deps/lock. - Regenerate the Shank IDL (origin "shank", u8 discriminants) and generate a @solana/kit TypeScript client with Codama via codama.ts. Remove .solitarc.js, .crates/, and the old Solita output. - Replace the devnet test with an in-process LiteSVM (npm) test that loads the built .so and exercises add_car/book_rental/pick_up_car through the generated client, asserting account state. Runs in CI with no network. - package.json scripts (build, generate-client, build-and-test) wired for native.yml; commit a fresh frozen pnpm-lock.yaml. Drop the stale .ghaignore entry; track the standalone program Cargo.lock via .gitignore exception. https://claude.ai/code/session_013dpnF6uSGWXjkJJZseqzcP --- .github/.ghaignore | 3 - .gitignore | 2 + tools/shank-and-codama/native/README.md | 128 ++ tools/shank-and-codama/native/codama.ts | 44 + tools/shank-and-codama/native/package.json | 24 + tools/shank-and-codama/native/pnpm-lock.yaml | 1807 +++++++++++++++++ .../native/program/Cargo.lock | 1584 +++++++++++++++ .../native/program/Cargo.toml | 25 + .../program/idl/car_rental_service.json | 58 +- .../program/src/instructions/add_car.rs | 44 +- .../program/src/instructions/book_rental.rs | 42 +- .../native/program/src/instructions/mod.rs | 70 + .../program/src/instructions/pick_up_car.rs | 32 +- .../program/src/instructions/return_car.rs | 32 +- .../native/program/src/lib.rs | 14 +- .../native/program/src/state/mod.rs | 68 + .../generated/src/generated/accounts/car.ts | 116 ++ .../generated/src/generated/accounts/index.ts | 10 + .../src/generated/accounts/rentalOrder.ts | 144 ++ .../tests/generated/src/generated/index.ts | 12 + .../src/generated/instructions/addCar.ts | 239 +++ .../src/generated/instructions/bookRental.ts | 264 +++ .../src/generated/instructions/index.ts | 12 + .../src/generated/instructions/pickUpCar.ts | 201 ++ .../src/generated/instructions/returnCar.ts | 201 ++ .../generated/programs/carRentalService.ts | 242 +++ .../generated/src/generated/programs/index.ts | 9 + .../generated/src/generated/types/index.ts | 9 + .../src/generated/types/rentalOrderStatus.ts | 42 + tools/shank-and-codama/native/tests/test.ts | 149 ++ .../native/tests/tsconfig.test.json | 14 + .../native/.crates/.crates.toml | 2 - .../native/.crates/.crates2.json | 14 - .../shank-and-solita/native/.crates/bin/shank | Bin 5946147 -> 0 bytes tools/shank-and-solita/native/.solitarc.js | 14 - tools/shank-and-solita/native/README.md | 82 - tools/shank-and-solita/native/package.json | 14 - .../native/program/Cargo.toml | 13 - .../native/program/src/instructions/mod.rs | 55 - .../native/program/src/state/mod.rs | 48 - .../native/tests/generated/accounts/Car.ts | 148 -- .../tests/generated/accounts/RentalOrder.ts | 171 -- .../native/tests/generated/accounts/index.ts | 7 - .../native/tests/generated/index.ts | 21 - .../tests/generated/instructions/AddCar.ts | 96 - .../generated/instructions/BookRental.ts | 103 - .../tests/generated/instructions/PickUpCar.ts | 76 - .../tests/generated/instructions/ReturnCar.ts | 76 - .../tests/generated/instructions/index.ts | 4 - .../tests/generated/types/AddCarArgs.ts | 26 - .../tests/generated/types/BookRentalArgs.ts | 28 - .../generated/types/RentalOrderStatus.ts | 26 - .../native/tests/generated/types/index.ts | 3 - tools/shank-and-solita/native/tests/test.ts | 146 -- .../native/tests/tsconfig.test.json | 10 - 55 files changed, 5518 insertions(+), 1306 deletions(-) create mode 100644 tools/shank-and-codama/native/README.md create mode 100644 tools/shank-and-codama/native/codama.ts create mode 100644 tools/shank-and-codama/native/package.json create mode 100644 tools/shank-and-codama/native/pnpm-lock.yaml create mode 100644 tools/shank-and-codama/native/program/Cargo.lock create mode 100644 tools/shank-and-codama/native/program/Cargo.toml rename tools/{shank-and-solita => shank-and-codama}/native/program/idl/car_rental_service.json (80%) rename tools/{shank-and-solita => shank-and-codama}/native/program/src/instructions/add_car.rs (57%) rename tools/{shank-and-solita => shank-and-codama}/native/program/src/instructions/book_rental.rs (63%) create mode 100644 tools/shank-and-codama/native/program/src/instructions/mod.rs rename tools/{shank-and-solita => shank-and-codama}/native/program/src/instructions/pick_up_car.rs (52%) rename tools/{shank-and-solita => shank-and-codama}/native/program/src/instructions/return_car.rs (51%) rename tools/{shank-and-solita => shank-and-codama}/native/program/src/lib.rs (68%) create mode 100644 tools/shank-and-codama/native/program/src/state/mod.rs create mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts create mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/accounts/index.ts create mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts create mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/index.ts create mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts create mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts create mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/instructions/index.ts create mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts create mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts create mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts create mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/programs/index.ts create mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/types/index.ts create mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts create mode 100644 tools/shank-and-codama/native/tests/test.ts create mode 100644 tools/shank-and-codama/native/tests/tsconfig.test.json delete mode 100644 tools/shank-and-solita/native/.crates/.crates.toml delete mode 100644 tools/shank-and-solita/native/.crates/.crates2.json delete mode 100755 tools/shank-and-solita/native/.crates/bin/shank delete mode 100644 tools/shank-and-solita/native/.solitarc.js delete mode 100644 tools/shank-and-solita/native/README.md delete mode 100644 tools/shank-and-solita/native/package.json delete mode 100644 tools/shank-and-solita/native/program/Cargo.toml delete mode 100644 tools/shank-and-solita/native/program/src/instructions/mod.rs delete mode 100644 tools/shank-and-solita/native/program/src/state/mod.rs delete mode 100644 tools/shank-and-solita/native/tests/generated/accounts/Car.ts delete mode 100644 tools/shank-and-solita/native/tests/generated/accounts/RentalOrder.ts delete mode 100644 tools/shank-and-solita/native/tests/generated/accounts/index.ts delete mode 100644 tools/shank-and-solita/native/tests/generated/index.ts delete mode 100644 tools/shank-and-solita/native/tests/generated/instructions/AddCar.ts delete mode 100644 tools/shank-and-solita/native/tests/generated/instructions/BookRental.ts delete mode 100644 tools/shank-and-solita/native/tests/generated/instructions/PickUpCar.ts delete mode 100644 tools/shank-and-solita/native/tests/generated/instructions/ReturnCar.ts delete mode 100644 tools/shank-and-solita/native/tests/generated/instructions/index.ts delete mode 100644 tools/shank-and-solita/native/tests/generated/types/AddCarArgs.ts delete mode 100644 tools/shank-and-solita/native/tests/generated/types/BookRentalArgs.ts delete mode 100644 tools/shank-and-solita/native/tests/generated/types/RentalOrderStatus.ts delete mode 100644 tools/shank-and-solita/native/tests/generated/types/index.ts delete mode 100644 tools/shank-and-solita/native/tests/test.ts delete mode 100644 tools/shank-and-solita/native/tests/tsconfig.test.json diff --git a/.github/.ghaignore b/.github/.ghaignore index c26a85c3..0ee23466 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -1,6 +1,3 @@ -# uses generated client from shank, can't rewrite to solana-bankrun -tools/shank-and-solita/native - # build failed - program outdated tokens/token-extensions/metadata/anchor diff --git a/.gitignore b/.gitignore index e3147d99..0103d507 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,8 @@ node_modules/ # Exception: escrow native is a standalone (non-workspace) crate, so it keeps # its Cargo.lock tracked for reproducible builds. !finance/escrow/native/Cargo.lock +# Exception: shank-and-codama native is also a standalone (non-workspace) crate. +!tools/shank-and-codama/native/program/Cargo.lock **/*/.anchor **/*/.DS_Store diff --git a/tools/shank-and-codama/native/README.md b/tools/shank-and-codama/native/README.md new file mode 100644 index 00000000..9071c123 --- /dev/null +++ b/tools/shank-and-codama/native/README.md @@ -0,0 +1,128 @@ +# Shank and Codama + +[Shank](https://github.com/metaplex-foundation/shank) lets a **native** Solana +[program](https://solana.com/docs/terminology#program) export an IDL the same +way [Anchor](https://solana.com/docs/terminology#anchor) does. Once you have an +IDL, [Codama](https://github.com/codama-idl/codama) turns it into a typed client +in the language of your choice. + +This example is a small "car rental service" program. It is annotated with Shank +macros, Shank extracts the IDL, and Codama renders a TypeScript client +(`@solana/kit`-based) from that IDL. An in-process [LiteSVM](https://github.com/litesvm/litesvm) +test then drives the program through the generated client โ€” no validator or +devnet required, so it runs in CI. + +> This example used to use [Solita](https://github.com/metaplex-foundation/solita) +> to generate the client. Solita is unmaintained and does not work on the current +> toolchain, so it has been replaced with Codama. The Shank half of the lesson is +> unchanged. + +## Shank + +[Shank](https://github.com/metaplex-foundation/shank) is a set of Rust derive +macros plus a CLI that generates an IDL for your program. + +Mark a struct as an [account](https://solana.com/docs/terminology#account): + +```rust +#[derive(BorshDeserialize, BorshSerialize, Clone, Debug, ShankAccount)] +pub struct Car { + pub year: u16, + pub make: String, + pub model: String, +} +``` + +Mark an enum as your [instruction](https://solana.com/docs/terminology#instruction) set, +using `#[account(...)]` attributes to describe each instruction's accounts: + +```rust +#[derive(BorshDeserialize, BorshSerialize, Clone, Debug, ShankInstruction)] +pub enum CarRentalServiceInstruction { + #[account(0, writable, name = "car_account", desc = "The account that will represent the Car being created")] + #[account(1, writable, name = "payer", desc = "Fee payer")] + #[account(2, name = "system_program", desc = "The System Program")] + AddCar(AddCarArgs), + // ... +} +``` + +> Shank needs `declare_id!` in your program for the IDL generation to work: +> +> ```rust +> declare_id!("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"); +> ``` + +Install the CLI and generate the IDL: + +```bash +cargo install shank-cli +pnpm generate-idl # runs: shank idl --crate-root ./program --out-dir ./program/idl +``` + +The IDL lands in `program/idl/car_rental_service.json` (committed to the repo so +the client can be regenerated without the Rust CLI). Its `metadata.origin` is +`"shank"`, and each instruction carries an explicit single-byte (`u8`) +`discriminant` โ€” this is what distinguishes a Shank IDL from an Anchor IDL. + +### A note on PDAs and `#[seeds(...)]` + +Shank 0.0.x used a `#[seeds(...)]` attribute on a `ShankAccount` to *generate* +`shank_pda` / `shank_seeds_with_bump` helper methods. As of Shank 0.4.x that PDA +code-generation produces unparsable tokens and fails to compile, and the seeds +are not emitted into the IDL either. So this example keeps PDA derivation +explicit in `program/src/state/mod.rs` (`Car::find_pda`, `RentalOrder::find_pda`) +and no longer uses the `#[seeds(...)]` attribute. `ShankAccount` is still used โ€” +it is what tells Shank to include the account layout in the IDL. + +## Codama + +[Codama](https://github.com/codama-idl/codama) reads an IDL and renders a client. +It understands Shank IDLs out of the box. + +Install the pieces used here: + +```bash +pnpm add codama @codama/nodes-from-anchor @codama/renderers-js @solana/kit +``` + +The generator script ([`codama.ts`](./codama.ts)) reads the Shank IDL, sets its +`origin` to `"shank"` so the `u8` discriminants are honoured, builds a Codama +root node, and renders a TypeScript client: + +```ts +import { rootNodeFromAnchor } from "@codama/nodes-from-anchor"; +import { renderVisitor } from "@codama/renderers-js"; +import { createFromRoot } from "codama"; + +const idl = JSON.parse(readFileSync(idlPath, "utf-8")); +const codama = createFromRoot( + rootNodeFromAnchor({ ...idl, metadata: { ...idl.metadata, origin: "shank" } }), +); +await codama.accept(renderVisitor(outDir, { deleteFolderBeforeRendering: true })); +``` + +> Codama also ships `@codama/renderers-rust` if you want a Rust client instead of +> a TypeScript one โ€” swap `renderVisitor` from `@codama/renderers-js` for the Rust +> renderer. + +Generate the client: + +```bash +pnpm generate-client +``` + +The generated TypeScript client lands in `tests/generated/`. + +## Build and test + +```bash +pnpm install +pnpm build # cargo build-sbf -> program/target/so/car_rental_service.so +pnpm build-and-test # build, regenerate the client, then run the LiteSVM test +``` + +The test ([`tests/test.ts`](./tests/test.ts)) loads the compiled `.so` into a +[LiteSVM](https://github.com/litesvm/litesvm) instance and exercises `add_car`, +`book_rental`, and `pick_up_car` through the generated client, asserting on the +resulting on-chain account state. diff --git a/tools/shank-and-codama/native/codama.ts b/tools/shank-and-codama/native/codama.ts new file mode 100644 index 00000000..eebe79cc --- /dev/null +++ b/tools/shank-and-codama/native/codama.ts @@ -0,0 +1,44 @@ +// Codama client generator. +// +// Reads the Shank-generated IDL (program/idl/car_rental_service.json) and emits +// a TypeScript client built on @solana/kit into tests/generated/. +// +// Flow: read IDL -> rootNodeFromAnchor (origin = "shank" so the u8 instruction +// discriminants are interpreted correctly) -> createFromRoot -> render JS. +// +// Run with: pnpm generate-client + +import { readFileSync, rmSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +import { rootNodeFromAnchor, type AnchorIdl } from "@codama/nodes-from-anchor"; +import { renderVisitor } from "@codama/renderers-js"; +import { createFromRoot } from "codama"; + +const here = dirname(fileURLToPath(import.meta.url)); +const idlPath = join(here, "program", "idl", "car_rental_service.json"); +const outDir = join(here, "tests", "generated"); + +const idl = JSON.parse(readFileSync(idlPath, "utf-8")) as AnchorIdl; + +// Make sure Codama treats this as a Shank IDL. Shank uses single-byte (u8) +// instruction discriminants rather than Anchor's 8-byte hashes, and the +// "origin" field is what tells nodes-from-anchor to honour the explicit +// `discriminant` values in the IDL. +const idlWithOrigin = { + ...idl, + metadata: { ...idl.metadata, origin: "shank" }, +} as AnchorIdl; + +const codama = createFromRoot(rootNodeFromAnchor(idlWithOrigin)); + +await codama.accept(renderVisitor(outDir, { deleteFolderBeforeRendering: true })); + +// The renderer drops a standalone `package.json` (declaring an implicit CommonJS +// package) at the output root. That would shadow this example's +// `"type": "module"` setting and break ESM resolution of the generated `.ts` +// files when the test imports them via tsx, so remove it. +rmSync(join(outDir, "package.json"), { force: true }); + +console.log(`Codama: generated TypeScript client in ${outDir}`); diff --git a/tools/shank-and-codama/native/package.json b/tools/shank-and-codama/native/package.json new file mode 100644 index 00000000..fa3ee05d --- /dev/null +++ b/tools/shank-and-codama/native/package.json @@ -0,0 +1,24 @@ +{ + "type": "module", + "scripts": { + "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", + "generate-idl": "shank idl --crate-root ./program --out-dir ./program/idl", + "generate-client": "tsx ./codama.ts", + "test": "node --import tsx --test ./tests/test.ts", + "build-and-test": "pnpm build && pnpm generate-client && pnpm test" + }, + "dependencies": { + "@codama/nodes-from-anchor": "^1.5.0", + "@codama/renderers-js": "^2.2.0", + "@solana-program/system": "^0.12.2", + "@solana/program-client-core": "^6.9.0", + "@solana/kit": "^6.9.0", + "codama": "^1.7.0", + "litesvm": "^1.1.0" + }, + "devDependencies": { + "@types/node": "^25.9.1", + "tsx": "^4.22.4", + "typescript": "^5.9.0" + } +} diff --git a/tools/shank-and-codama/native/pnpm-lock.yaml b/tools/shank-and-codama/native/pnpm-lock.yaml new file mode 100644 index 00000000..69219aeb --- /dev/null +++ b/tools/shank-and-codama/native/pnpm-lock.yaml @@ -0,0 +1,1807 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@codama/nodes-from-anchor': + specifier: ^1.5.0 + version: 1.5.0(typescript@5.9.3) + '@codama/renderers-js': + specifier: ^2.2.0 + version: 2.2.0(typescript@5.9.3) + '@solana-program/system': + specifier: ^0.12.2 + version: 0.12.2(@solana/kit@6.9.0(typescript@5.9.3)) + '@solana/kit': + specifier: ^6.9.0 + version: 6.9.0(typescript@5.9.3) + '@solana/program-client-core': + specifier: ^6.9.0 + version: 6.9.0(typescript@5.9.3) + codama: + specifier: ^1.7.0 + version: 1.7.0 + litesvm: + specifier: ^1.1.0 + version: 1.1.0(typescript@5.9.3) + devDependencies: + '@types/node': + specifier: ^25.9.1 + version: 25.9.1 + tsx: + specifier: ^4.22.4 + version: 4.22.4 + typescript: + specifier: ^5.9.0 + version: 5.9.3 + +packages: + + '@codama/cli@1.5.2': + resolution: {integrity: sha512-d5b6+m0TFYsIii4ALPIWrC6vGNbTLCXOaBqZO5WdI522w4jlk2MQozuSDVhAMBWQjxt9QD/WOJer8PHYwa1rYA==} + hasBin: true + + '@codama/errors@1.7.0': + resolution: {integrity: sha512-N1E4LT3XRYqHHJAnL+eVQ5V3Pc0uSPjsn4Xt6QEO6Fz1p0slF6hbD+/axkFUc7+lNCAfgnkKzhk+6SpFLU/WrQ==} + hasBin: true + + '@codama/fragments@0.1.0': + resolution: {integrity: sha512-rWnSKw4UA9LS7mMQyzKnR1woibVEYrYgp66+i+JB+O1lnvU/i/KCH4TmoV+S6Y3ADL2WyznrwfDA3rBET6U5Cg==} + + '@codama/node-types@1.7.0': + resolution: {integrity: sha512-VDytcSgN6jOGEh4aJ1LgSnqCe1drSEUSdAeKOV92aU0MOYiDi2s2B18+Gx7dx40mex2GfVc3zamu7KGzTlxegA==} + + '@codama/nodes-from-anchor@1.5.0': + resolution: {integrity: sha512-zbDkjNgMk0EGxHIOOlIq/G2KfXQ7rQrfwogw56MR7nQs6UFGKXnNLJUXiq1m8s3CzfoucvTo49z4mNKTEcGDhQ==} + + '@codama/nodes@1.7.0': + resolution: {integrity: sha512-PZ1zI+SbE1PEaGEka0KjdFrAJ7e9O0kPG4CCGYhjsqUo76OBbINRjNVx7pkP4r8Ksa2r/BLbVIfZV1M/n5J5Kg==} + + '@codama/renderers-core@1.3.8': + resolution: {integrity: sha512-xy9Qb5BLYTi1OyvlRhRD7n0HUevOQ3QcHSPq9N3kqoUOgL2ziXPXvoejzzLC0OkvA16M7WvK3ihNx/nf4UEClQ==} + + '@codama/renderers-js@2.2.0': + resolution: {integrity: sha512-/GWVnB329kMkeqlOqX+NWQAmd1k6yybVOp7C5X+LEvrZ2A5w1saQwWFbBMCq/EQPqnFU+CRFoG/+7KubAEa73Q==} + engines: {node: '>=20.18.0'} + + '@codama/validators@1.7.0': + resolution: {integrity: sha512-PBWN4zLikf6sssZD6sDVN7ASbh++fzvZ5pluHu6VlSQDk7lFL3Gsh7P1Q5JgIuXkM2gFntzCrTJSStToDCAW3g==} + + '@codama/visitors-core@1.7.0': + resolution: {integrity: sha512-ii1Z39ORzssMQdpxqpjaHCLbFwO4KZbI1SrsJ1e0r+0g03gxuYEA1H6RoxcrIOuUeOnqNtLb96cErrzHdrx23Q==} + + '@codama/visitors@1.7.0': + resolution: {integrity: sha512-wk8ufgX3AfKOnaok5H4y1UteLyY/WkDIhhKRE7y5MJqOn5JnxLgL9R4MU2+5TmZUF04sdwyUn6fPho0IqTq+BQ==} + + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@noble/hashes@2.2.0': + resolution: {integrity: sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==} + engines: {node: '>= 20.19.0'} + + '@solana-program/system@0.12.2': + resolution: {integrity: sha512-MaBeOxlvTruQhA7UYkOb3hVTEHPPagOtd+PvTm6a8rGgvEAP0kD4BbC37NceOaR4ABNqdaCmD5OMVRKgrE6KAg==} + peerDependencies: + '@solana/kit': ^6.4.0 + + '@solana-program/token@0.13.0': + resolution: {integrity: sha512-/Apjrd5lwOJGrPB0J5Rv7EBeclvyEBQPAGA85Scm7wBH+GpkbdLDM9uK3TNg8jjFKyWQYai/JtPHbrx7VgFLSg==} + peerDependencies: + '@solana/kit': ^6.5.0 + + '@solana/accounts@6.9.0': + resolution: {integrity: sha512-g36AJreJrgf9AAjOfbdFHEFUTymBgzbWHoEDElZ+fDKvqBINDiUVKzDApwc7C7kGPMFqQBaoEHnQRxf2IqfKZQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/addresses@6.9.0': + resolution: {integrity: sha512-tWnG2L6lo/ZhcMT019F3myDsH87MM8EZbTO0cgwgvVPlEdIGblROFF3tGVrb7FVCOlbPI0ONCFyPbnrmR58LsA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/assertions@6.9.0': + resolution: {integrity: sha512-FjWWD6e0in+HFsHMvU2zKCbyPfKtDW6iGXZZ9+Qg1QUYpO1AEObsya3F7hb9RkZKUueK4WwWAQnIuvEUp3A1uA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-core@5.5.1': + resolution: {integrity: sha512-TgBt//bbKBct0t6/MpA8ElaOA3sa8eYVvR7LGslCZ84WiAwwjCY0lW/lOYsFHJQzwREMdUyuEyy5YWBKtdh8Rw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-core@6.9.0': + resolution: {integrity: sha512-F2BmLecG/1nTtnjyD509NsEc254pxJKa2bpvotymv1lL1WfEn3zchcZ9SMIiLyL4G6J8b9F3OKIq2YSZho2AOQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-data-structures@5.5.1': + resolution: {integrity: sha512-97bJWGyUY9WvBz3mX1UV3YPWGDTez6btCfD0ip3UVEXJbItVuUiOkzcO5iFDUtQT5riKT6xC+Mzl+0nO76gd0w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-data-structures@6.9.0': + resolution: {integrity: sha512-f7GYtiHafvJDhqiwzUUSr/6AYSK4DCw6quPmA80NZGtkNiFa+g6LoJy2wbC0wp2dxvCwNpxf6x3ILCYRutAvvg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-numbers@5.5.1': + resolution: {integrity: sha512-rllMIZAHqmtvC0HO/dc/21wDuWaD0B8Ryv8o+YtsICQBuiL/0U4AGwH7Pi5GNFySYk0/crSuwfIqQFtmxNSPFw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-numbers@6.9.0': + resolution: {integrity: sha512-XMI0FOHV2h7yPAllxWCX8z+J1msidNjXzN1mRjH5KR6C+vfzyKa2xWHve0bNSV/bjVAhqqhc7dQCpBKuF4+ScQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-strings@5.5.1': + resolution: {integrity: sha512-7klX4AhfHYA+uKKC/nxRGP2MntbYQCR3N6+v7bk1W/rSxYuhNmt+FN8aoThSZtWIKwN6BEyR1167ka8Co1+E7A==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: ^5.0.0 + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true + + '@solana/codecs-strings@6.9.0': + resolution: {integrity: sha512-PTqYQxMsmdfEEq29bV1AnALD4FjFEsSxOj1fYNqooOSTEQEpUoYEQtsd55/kBsnIKltXbvYwXYXBusm19n1sQA==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.4.0' + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true + + '@solana/codecs@5.5.1': + resolution: {integrity: sha512-Vea29nJub/bXjfzEV7ZZQ/PWr1pYLZo3z0qW0LQL37uKKVzVFRQlwetd7INk3YtTD3xm9WUYr7bCvYUk3uKy2g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs@6.9.0': + resolution: {integrity: sha512-oWOybKa1PTGI1D/FyrvGKralADM1jmVZC2AtgEo+4JTKG0+i1p9ZbwNY2UcJqdYsDMDaGHAx0LMAid9LDCxXTQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/errors@5.5.1': + resolution: {integrity: sha512-vFO3p+S7HoyyrcAectnXbdsMfwUzY2zYFUc2DEe5BwpiE9J1IAxPBGjOWO6hL1bbYdBrlmjNx8DXCslqS+Kcmg==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/errors@6.9.0': + resolution: {integrity: sha512-7i+b07KMnkbHvFlz7uWade3jvyc22UmVm8o9taxPK8YV3JNM/NkS8oQFvMac2MIaLPAlEs7I8MHyVLUal1yY4g==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fast-stable-stringify@6.9.0': + resolution: {integrity: sha512-l14zGVsURbT5Aox/kLFQywqV4VaE9/j3h2EvCu9oULVPMwzQB6yezJb1/KyiDwhm/RscooPd0gFQFIKEGQbayw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fixed-points@6.9.0': + resolution: {integrity: sha512-0K7mbYC4jdAZFlXqXjpNanmEyZxk7K9NtXDLc1zuhGuxwH8J9guvohwdw2V7TQ9bfjCYsprY3Tp2kUVQpECGmA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/functional@6.9.0': + resolution: {integrity: sha512-sgNHOaIjETZZuziZdlwPsU5EjBVj5M0dUbwrSQTTNZe0SxX3pQ1QFVcs5KyvdS7AQcpBVdLjx4CfQjdKXk52GA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instruction-plans@6.9.0': + resolution: {integrity: sha512-SxTSOetEKD+WPzvDuYRsP1+KkwUp8KqL1n7oFx9ThxjyfEY0ly0i9KdbvX5yYVDOA2TSwrltgdu14y/Pf6y3Cg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instructions@6.9.0': + resolution: {integrity: sha512-LZfJx3bGdUSbGaswoOEPHygticqkCg3TusRczPJXyCmKhoQzPCcGQQ99qMzP7Wg8pEV5tWA5t7tycf8E237ydg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/keys@6.9.0': + resolution: {integrity: sha512-1g2QARiqSjNqT0EIqLDLQ5vRm7hCsbqgFwFAp5GsMV/8BTYT8s1Ct2wLHDZiJ4eAX6beTHVf8LbOBfVejtn3oQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/kit@6.9.0': + resolution: {integrity: sha512-k7BRz7Akfv8wiRtlCR/xUyDLfuMfYMelMR1+AC5KgwaRRJReDF0BucMLNN1In7WoI+KuWwr1OKv4na/oKpyeAQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/nominal-types@6.9.0': + resolution: {integrity: sha512-ouhrnY7a6nsLXRGcariwcmHDdXroCNqOuzwtdjKt2c8e8Drwao9yxPH2VoViNgpq8IGNJeQMEI1TVnoJZRn0gw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/offchain-messages@6.9.0': + resolution: {integrity: sha512-qK3tqRPb+E0kmTz5qFXZbEdF4pyzfOWRZjyVESHVGemDDeGzZ1SV3zAxcA6HBCnv4wCBnlyaDPw8t+5sryNMAw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/options@5.5.1': + resolution: {integrity: sha512-eo971c9iLNLmk+yOFyo7yKIJzJ/zou6uKpy6mBuyb/thKtS/haiKIc3VLhyTXty3OH2PW8yOlORJnv4DexJB8A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/options@6.9.0': + resolution: {integrity: sha512-H5ZRWNzzLMwHU/fRU9aVx+3TaMN4gDNCUYxsZxq0h7mqiwxFy6mpy95xPsfdldthCHDYtYnUTxe2sBatGbNHig==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-core@6.9.0': + resolution: {integrity: sha512-KslLSnzY8zbGZibEBVMVUm2ZS8T2xf+cut7F65VjWPoWNAxU+p7933wsMz/az6CF7b65RI7iU3HhCr5/5QF50w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-interfaces@6.9.0': + resolution: {integrity: sha512-Qj4sk9thkM1UgnFXvWIoezd/CbqpX/2jigLBDsMB5Ed/gmFlkBSTL127LFDSY3OtzBpXl4hROs+Zqv+5xqtguA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/program-client-core@6.9.0': + resolution: {integrity: sha512-+iUnsddhs72QoBJoUO+/yHUXoBvYWa1sGCBRJk35zeg8j7ZXEwRkk6eX0VOrUPxhEpQbYJsIOCrIYApNIt8RFw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/programs@6.9.0': + resolution: {integrity: sha512-L9LAnQtfFFcCDLcbbnxhUtgAmu/kS4aRmrVncdnX5CFyQshlpo0/Qhrq3UA7vnhute4gjYV4pFT+64onH5qGEQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/promises@6.9.0': + resolution: {integrity: sha512-227PlXRi6KZX4ODYTkJitr9InSa79NTquI72slay4gzxO9VmMepgvYdMAX6kawdN5pt+VzaklKhNhWXk50Pi9g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-api@6.9.0': + resolution: {integrity: sha512-3KhXS6A1ie6GqTywW/KEMSXJ1VJEU66fxjhuiiqPILuJstP7kex3ycr3H6DirKydUsy6gaKaPN43rE+LfyS7OA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-parsed-types@6.9.0': + resolution: {integrity: sha512-6ThH8izY+DWDyrVOOlS40vTcFjwjCinjfqnId7zhRk8OxhkfHQ/iEj+OnGwD4Yhe8pGdVa7GNVYlrQgQgzQ3eQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec-types@6.9.0': + resolution: {integrity: sha512-A4fY1JRrcKqX3EfttO4Q8L97nGPqdjfekAV0eDyxN5nu9ngf5p7GKenkl7AYDoHLNr6ZX/C96cRADxXjsRJ0iA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec@6.9.0': + resolution: {integrity: sha512-3yHRoChc0IpsJbUq0/94l+ar3t9U3Ax58W0HON7eyYe7zFP10UAxpkHn7DPch9DeALyuGph8kVnvl+kXRgJlGg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-api@6.9.0': + resolution: {integrity: sha512-UA/rPQeNx6zQMUFcS8PPPuB4vzUOtSzIY/igMH0DRoP020NyES2GguIb7Zo7sqDNi4n0gkQRhoW4dPVotcNKdA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-channel-websocket@6.9.0': + resolution: {integrity: sha512-kT8Yne9HjJD2gooaOFNSyKrvaIfOy2GR0Ymv8OfecBCwFStdz+SPo5eYXq8ZWoZbr5E/MMpHgqsHBanqa2Ffyg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-spec@6.9.0': + resolution: {integrity: sha512-DbaG67s99vRZQxFMK80UQ7DEKkRJK6JEZeYg/U5UttD6n7ax/vct7qopxGnrt4RCkaaac2fU8Sr+fcnvWQweUg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions@6.9.0': + resolution: {integrity: sha512-IMctZQaMxzvRACQ6ooW98lP+7tVoUJnRgOZtkAdzgBizldQAYPIKd3MulP0jbQPCMfdPsa2Hs0NBcUwfgonq3w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transformers@6.9.0': + resolution: {integrity: sha512-dg4LK2wEBpaY+KRk/SJIkYvrvjdsc1AwD4bkmGY4Fp7EwVlvwBQShAQn78Qi4IP0WQ/0n9ncFyUxgcB1Y01ZuQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transport-http@6.9.0': + resolution: {integrity: sha512-4gy30fWJcS6jrcXCoP/optFpGJ/gD9xdkE8wDbe1Ys/Y+e4XjyBt45xtTnbdmMdukvdRX+oXS3zgUIYoagpNzQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-types@6.9.0': + resolution: {integrity: sha512-iFhPzZK3qiQ1lhfNTNBTI7BIs5PfWZSgRLD3enKm8ZAQggzvUklfO3KPh47jVsc/Jsr1UGPH8M3o3m17qjO1Cg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc@6.9.0': + resolution: {integrity: sha512-ny1Kt20+oq3xZErNA56+Magmb2JKYfQgHwZTsBmHKVl/9mBpv1y1+ygV+KNiiX/wWXWstLbdIo1jgPwZPbU2Vg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/signers@6.9.0': + resolution: {integrity: sha512-x7WyoRm9IORMqeSqNivZgyY+RERPkmqWxpINPD13kUH+oaZzonORIgxk2Lz+u5iPRXiJPkdRPrQ4FoFWv8i6kQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/subscribable@6.9.0': + resolution: {integrity: sha512-YV0/BrJNfepf10CTfLwD7kRY1kkELDHd+BbHJZhBeiuiXTY3xQTvvx1RFs3NtfFCcTHG25Uh8NpRacQJnxSSIQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/sysvars@6.9.0': + resolution: {integrity: sha512-e0e+QKr/th9t/O2N1oUoJmcodLghzAtWKUlGb1zyYub0/WJrPImnKqJqp/gDP4tK98mJxopPMcprCeHk4B+TQg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-confirmation@6.9.0': + resolution: {integrity: sha512-fzYCOih7hhtBzzNSkAnxMjeFeQ8U7e27k9i0RsgQc3/e3OCynF5HoIVNhhqZbwfIBKiaD4ginJR6slRnfqO32Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-messages@6.9.0': + resolution: {integrity: sha512-OWpryt0w6SHlwHx12Vd1wvx2QwSGBXAIUEHTCtkctcM3AaZRy5cIl7CAq9iD5PgahUsaOyRLBV0zlCJcC2JrJA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transactions@6.9.0': + resolution: {integrity: sha512-uKPzLwHbjwChfVl82he17ntkh02PfgnMMhN7uOAC+VbkIt1O+EEw8sX87gi6kdG/EV+QBDQXm9PLAo5W0tYylw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@types/node@25.9.1': + resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + codama@1.7.0: + resolution: {integrity: sha512-kPB7IPAJkPAllxHiPtNDv6+qhTvfRpetYJgxp1iVa4L+BxztmSXTKMZ3Bsjve4ArENvxuUY4GIAchOYqb3G6nw==} + hasBin: true + + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + json-stable-stringify@1.3.0: + resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} + engines: {node: '>= 0.4'} + + jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + litesvm-darwin-arm64@1.1.0: + resolution: {integrity: sha512-SjcivEOOjBk65U6TgIeMJ7CCnHNKQXHx0qf6K6GIFZC1aHTg7ePrEi+WhAQD6VUBMdDHIMCVKC/uXnXPi6EKIw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + litesvm-darwin-x64@1.1.0: + resolution: {integrity: sha512-hTs+eZ9sHVZXhjggpnn/8A/E+Nt/E6Gf8E2ejdWWL9bBQKmq1Y0VcrDpORbIvqqRpTLHXqbxCuH1wQB2C8frJg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + litesvm-linux-arm64-gnu@1.1.0: + resolution: {integrity: sha512-6EjJ6+E+1SUXdJmCyeyhvlKhNncccqQNH241+P8d4E72rE3zuFxeCtLHhusCQk2p/Xau3dBI0qTLogZ1F1IGSA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + litesvm-linux-arm64-musl@1.1.0: + resolution: {integrity: sha512-mNuBOfX6GnDFT2i/kYPWud7eZGe57dDP0u4lwiSTQPRE0BxQbGZT2aEwX8LTwbonhbc6HSt50LamaZZzK4h4ig==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + litesvm-linux-x64-gnu@1.1.0: + resolution: {integrity: sha512-Ot8RgUVlMKzKJi2nVDxaHVo0hjB5vtYTomYNIf26mIA32DOy0+dQfwOqUhynhvvSMxN3VFec3r/OtCnk6lRBrw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + litesvm-linux-x64-musl@1.1.0: + resolution: {integrity: sha512-6kmneOIsTBSActELRTwxIYVJOVaLm3P6uwlmkqc9BUtDAQ7bRdRmwREWSbM8XxKBGw2LjiUfgRJ5WJGYo8fUFg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + litesvm@1.1.0: + resolution: {integrity: sha512-UOlMIEst50gSUyPnC2pGjGLygH8iC/GOqnNXQIHc8iGwD76m44ReeA/0h0vu/AIieZ2zG5/ERLxFV0kdNxkNsA==} + engines: {node: '>= 20'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + engines: {node: '>=14'} + hasBin: true + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + semver@7.8.2: + resolution: {integrity: sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + tsx@4.22.4: + resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} + engines: {node: '>=18.0.0'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + +snapshots: + + '@codama/cli@1.5.2': + dependencies: + '@codama/nodes': 1.7.0 + '@codama/visitors': 1.7.0 + '@codama/visitors-core': 1.7.0 + commander: 14.0.3 + picocolors: 1.1.1 + prompts: 2.4.2 + + '@codama/errors@1.7.0': + dependencies: + '@codama/node-types': 1.7.0 + commander: 14.0.3 + picocolors: 1.1.1 + + '@codama/fragments@0.1.0': + dependencies: + '@codama/errors': 1.7.0 + + '@codama/node-types@1.7.0': {} + + '@codama/nodes-from-anchor@1.5.0(typescript@5.9.3)': + dependencies: + '@codama/errors': 1.7.0 + '@codama/nodes': 1.7.0 + '@codama/visitors': 1.7.0 + '@noble/hashes': 2.2.0 + '@solana/codecs': 5.5.1(typescript@5.9.3) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@codama/nodes@1.7.0': + dependencies: + '@codama/errors': 1.7.0 + '@codama/node-types': 1.7.0 + + '@codama/renderers-core@1.3.8': + dependencies: + '@codama/errors': 1.7.0 + '@codama/fragments': 0.1.0 + '@codama/nodes': 1.7.0 + '@codama/visitors-core': 1.7.0 + + '@codama/renderers-js@2.2.0(typescript@5.9.3)': + dependencies: + '@codama/errors': 1.7.0 + '@codama/nodes': 1.7.0 + '@codama/renderers-core': 1.3.8 + '@codama/visitors-core': 1.7.0 + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + prettier: 3.8.3 + semver: 7.8.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@codama/validators@1.7.0': + dependencies: + '@codama/errors': 1.7.0 + '@codama/nodes': 1.7.0 + '@codama/visitors-core': 1.7.0 + + '@codama/visitors-core@1.7.0': + dependencies: + '@codama/errors': 1.7.0 + '@codama/nodes': 1.7.0 + json-stable-stringify: 1.3.0 + + '@codama/visitors@1.7.0': + dependencies: + '@codama/errors': 1.7.0 + '@codama/nodes': 1.7.0 + '@codama/visitors-core': 1.7.0 + + '@esbuild/aix-ppc64@0.28.0': + optional: true + + '@esbuild/android-arm64@0.28.0': + optional: true + + '@esbuild/android-arm@0.28.0': + optional: true + + '@esbuild/android-x64@0.28.0': + optional: true + + '@esbuild/darwin-arm64@0.28.0': + optional: true + + '@esbuild/darwin-x64@0.28.0': + optional: true + + '@esbuild/freebsd-arm64@0.28.0': + optional: true + + '@esbuild/freebsd-x64@0.28.0': + optional: true + + '@esbuild/linux-arm64@0.28.0': + optional: true + + '@esbuild/linux-arm@0.28.0': + optional: true + + '@esbuild/linux-ia32@0.28.0': + optional: true + + '@esbuild/linux-loong64@0.28.0': + optional: true + + '@esbuild/linux-mips64el@0.28.0': + optional: true + + '@esbuild/linux-ppc64@0.28.0': + optional: true + + '@esbuild/linux-riscv64@0.28.0': + optional: true + + '@esbuild/linux-s390x@0.28.0': + optional: true + + '@esbuild/linux-x64@0.28.0': + optional: true + + '@esbuild/netbsd-arm64@0.28.0': + optional: true + + '@esbuild/netbsd-x64@0.28.0': + optional: true + + '@esbuild/openbsd-arm64@0.28.0': + optional: true + + '@esbuild/openbsd-x64@0.28.0': + optional: true + + '@esbuild/openharmony-arm64@0.28.0': + optional: true + + '@esbuild/sunos-x64@0.28.0': + optional: true + + '@esbuild/win32-arm64@0.28.0': + optional: true + + '@esbuild/win32-ia32@0.28.0': + optional: true + + '@esbuild/win32-x64@0.28.0': + optional: true + + '@noble/hashes@2.2.0': {} + + '@solana-program/system@0.12.2(@solana/kit@6.9.0(typescript@5.9.3))': + dependencies: + '@solana/kit': 6.9.0(typescript@5.9.3) + + '@solana-program/token@0.13.0(@solana/kit@6.9.0(typescript@5.9.3))': + dependencies: + '@solana-program/system': 0.12.2(@solana/kit@6.9.0(typescript@5.9.3)) + '@solana/kit': 6.9.0(typescript@5.9.3) + + '@solana/accounts@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/addresses@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/assertions': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/assertions@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-core@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-core@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-data-structures@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-data-structures@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-numbers@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-numbers@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-strings@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-strings@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + '@solana/options': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/codecs@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/fixed-points': 6.9.0(typescript@5.9.3) + '@solana/options': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/errors@5.5.1(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.2 + optionalDependencies: + typescript: 5.9.3 + + '@solana/errors@6.9.0(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.3 + optionalDependencies: + typescript: 5.9.3 + + '@solana/fast-stable-stringify@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/fixed-points@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/functional@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/instruction-plans@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/instructions': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/promises': 6.9.0(typescript@5.9.3) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + '@solana/transactions': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/instructions@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/keys@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/assertions': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + '@solana/promises': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/kit@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 6.9.0(typescript@5.9.3) + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/instruction-plans': 6.9.0(typescript@5.9.3) + '@solana/instructions': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/offchain-messages': 6.9.0(typescript@5.9.3) + '@solana/plugin-core': 6.9.0(typescript@5.9.3) + '@solana/plugin-interfaces': 6.9.0(typescript@5.9.3) + '@solana/program-client-core': 6.9.0(typescript@5.9.3) + '@solana/programs': 6.9.0(typescript@5.9.3) + '@solana/rpc': 6.9.0(typescript@5.9.3) + '@solana/rpc-api': 6.9.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/signers': 6.9.0(typescript@5.9.3) + '@solana/subscribable': 6.9.0(typescript@5.9.3) + '@solana/sysvars': 6.9.0(typescript@5.9.3) + '@solana/transaction-confirmation': 6.9.0(typescript@5.9.3) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + '@solana/transactions': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/nominal-types@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/offchain-messages@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/plugin-core@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/plugin-interfaces@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/instruction-plans': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/signers': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/program-client-core@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 6.9.0(typescript@5.9.3) + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/instruction-plans': 6.9.0(typescript@5.9.3) + '@solana/instructions': 6.9.0(typescript@5.9.3) + '@solana/plugin-interfaces': 6.9.0(typescript@5.9.3) + '@solana/rpc-api': 6.9.0(typescript@5.9.3) + '@solana/signers': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/programs@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/promises@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-api@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + '@solana/transactions': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-parsed-types@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-spec-types@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-spec@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-subscriptions-api@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + '@solana/transactions': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-subscriptions-channel-websocket@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) + '@solana/subscribable': 6.9.0(typescript@5.9.3) + ws: 8.21.0 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@solana/rpc-subscriptions-spec@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/promises': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + '@solana/subscribable': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-subscriptions@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/promises': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/subscribable': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/rpc-transformers@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transport-http@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + undici-types: 8.3.0 + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-types@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/fixed-points': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/rpc-api': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) + '@solana/rpc-transport-http': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/instructions': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + '@solana/offchain-messages': 6.9.0(typescript@5.9.3) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + '@solana/transactions': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/subscribable@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/sysvars@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-confirmation@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/promises': 6.9.0(typescript@5.9.3) + '@solana/rpc': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + '@solana/transactions': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/transaction-messages@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/instructions': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/instructions': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@types/node@25.9.1': + dependencies: + undici-types: 7.24.6 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + chalk@5.6.2: {} + + codama@1.7.0: + dependencies: + '@codama/cli': 1.5.2 + '@codama/errors': 1.7.0 + '@codama/nodes': 1.7.0 + '@codama/validators': 1.7.0 + '@codama/visitors': 1.7.0 + + commander@14.0.2: {} + + commander@14.0.3: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + gopd@1.2.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + isarray@2.0.5: {} + + json-stable-stringify@1.3.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + + jsonify@0.0.1: {} + + kleur@3.0.3: {} + + litesvm-darwin-arm64@1.1.0: + optional: true + + litesvm-darwin-x64@1.1.0: + optional: true + + litesvm-linux-arm64-gnu@1.1.0: + optional: true + + litesvm-linux-arm64-musl@1.1.0: + optional: true + + litesvm-linux-x64-gnu@1.1.0: + optional: true + + litesvm-linux-x64-musl@1.1.0: + optional: true + + litesvm@1.1.0(typescript@5.9.3): + dependencies: + '@solana-program/system': 0.12.2(@solana/kit@6.9.0(typescript@5.9.3)) + '@solana-program/token': 0.13.0(@solana/kit@6.9.0(typescript@5.9.3)) + '@solana/kit': 6.9.0(typescript@5.9.3) + optionalDependencies: + litesvm-darwin-arm64: 1.1.0 + litesvm-darwin-x64: 1.1.0 + litesvm-linux-arm64-gnu: 1.1.0 + litesvm-linux-arm64-musl: 1.1.0 + litesvm-linux-x64-gnu: 1.1.0 + litesvm-linux-x64-musl: 1.1.0 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + math-intrinsics@1.1.0: {} + + object-keys@1.1.1: {} + + picocolors@1.1.1: {} + + prettier@3.8.3: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + semver@7.8.2: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + sisteransi@1.0.5: {} + + tsx@4.22.4: + dependencies: + esbuild: 0.28.0 + optionalDependencies: + fsevents: 2.3.3 + + typescript@5.9.3: {} + + undici-types@7.24.6: {} + + undici-types@8.3.0: {} + + ws@8.21.0: {} diff --git a/tools/shank-and-codama/native/program/Cargo.lock b/tools/shank-and-codama/native/program/Cargo.lock new file mode 100644 index 00000000..a30bf730 --- /dev/null +++ b/tools/shank-and-codama/native/program/Cargo.lock @@ -0,0 +1,1584 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[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.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[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.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7ced0ae9557296835c32bf1b1e02b44c746701f898460fb000d7eaa84f00a" + +[[package]] +name = "blake3" +version = "1.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.3.0", +] + +[[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 = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" +dependencies = [ + "borsh-derive", + "bytes", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfcfdc083699101d5a7965e49925975f2f55060f94f9a05e7187be95d530ca59" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[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 = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[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 = "car-rental-service" +version = "0.1.0" +dependencies = [ + "borsh", + "borsh-derive", + "shank", + "solana-program", + "solana-system-interface", +] + +[[package]] +name = "cc" +version = "1.2.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[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.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[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", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +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 0.2.17", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rand_core", + "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.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +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.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "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", + "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", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[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", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[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 = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a0f1728185f277989ca573a402716ae0beaaea3f76a8ff87ef9dd8fb19436c5" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8_core" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059c31d7d36c43fe39d89e55711858b4da8be7eb6dabac23c7289b1a19489406" + +[[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.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[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.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[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", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures 0.2.17", +] + +[[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.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" + +[[package]] +name = "memchr" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" + +[[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-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 = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "pastey" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +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 = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[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.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[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_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 = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "shank" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a1dc1d3af4ba5f02190110598b2abac0d13ce9dc58408aba4549e1c0f91a24c" +dependencies = [ + "shank_macro", +] + +[[package]] +name = "shank_macro" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63dbf105335507ad339dccacf3b1ea20e4c0b70d992b4de7cc11d5c0b91b0747" +dependencies = [ + "proc-macro2", + "quote", + "shank_macro_impl", + "shank_render", + "syn 1.0.109", +] + +[[package]] +name = "shank_macro_impl" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346563412da6d1a53bc53c81f9d8b102f177952b95fd8de00e5d2203a4685635" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", +] + +[[package]] +name = "shank_render" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8358067ec1787814d2577e76d9ddcc980559ad821e6bd04584f4847f4d1d955c" +dependencies = [ + "proc-macro2", + "quote", + "shank_macro_impl", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[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", + "solana-program-error", + "solana-program-memory", +] + +[[package]] +name = "solana-address" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39c93e262f671bf402e1040e4a7e40b05d81da5956c7681948c975a0997517bb" +dependencies = [ + "borsh", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "five8", + "five8_const", + "serde", + "serde_derive", + "sha2-const-stable", + "solana-atomic-u64", + "solana-define-syscall 5.1.0", + "solana-program-error", + "solana-sanitize", + "solana-sha256-hasher", + "wincode", +] + +[[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 = "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-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", +] + +[[package]] +name = "solana-borsh" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c04abbae16f57178a163125805637b8a076175bb5c0002fb04f4792bea901cf7" +dependencies = [ + "borsh", +] + +[[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", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-cpi" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dea26709d867aada85d0d3617db0944215c8bb28d3745b912de7db13a23280c" +dependencies = [ + "solana-account-info", + "solana-define-syscall 4.0.1", + "solana-instruction", + "solana-program-error", + "solana-pubkey", + "solana-stable-layout", +] + +[[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 = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cddf2388b28291210d9aa60690740733cab527531f06ed153c4d388951e407c" +dependencies = [ + "serde", + "serde_derive", + "solana-hash", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[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", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[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", +] + +[[package]] +name = "solana-example-mocks" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eb265ff95e28eceda117e2e3d2d2a611ecbbfe911dfeeeecd1521814540ffab" +dependencies = [ + "serde", + "serde_derive", + "solana-hash", + "solana-instruction", + "solana-nonce", + "solana-pubkey", + "solana-sdk-ids", + "solana-system-interface", + "thiserror", +] + +[[package]] +name = "solana-fee-calculator" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ee18959f176ba6229105c6c2a2ddaaa04bd53615af9277d834b113571bd205" +dependencies = [ + "log", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-hash" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe51db00ac3aa9f950d1e6201a126acfa26e6d81bc4a183ba64ec02effcad883" +dependencies = [ + "borsh", + "bytemuck", + "bytemuck_derive", + "five8", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-instruction" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ebb0ffd19263051bc3f683fcc086134b8ff23af894dcb63f7563c7137b42f1" +dependencies = [ + "bincode", + "borsh", + "serde", + "serde_derive", + "solana-define-syscall 5.1.0", + "solana-instruction-error", + "solana-pubkey", +] + +[[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", +] + +[[package]] +name = "solana-instructions-sysvar" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e0732294560e88ecdb2bbc656e67383e9f88c78ec09469cef172f0d28cd1bcd" +dependencies = [ + "bitflags", + "solana-account-info", + "solana-instruction", + "solana-instruction-error", + "solana-program-error", + "solana-sanitize", + "solana-sdk-ids", + "solana-serialize-utils", + "solana-sysvar-id", +] + +[[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", +] + +[[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", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[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 = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8dd4c280dca9d046139eb5b7a5ac9ad10403fbd64964c7d7571214950d758f" + +[[package]] +name = "solana-nonce" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95dbc9f2e33b6c10e231df15cb2a3bff9ea7eab6347f9e316fe75c97fd67bbb" +dependencies = [ + "solana-fee-calculator", + "solana-hash", + "solana-pubkey", + "solana-sha256-hasher", +] + +[[package]] +name = "solana-program" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778f08fb0eaf52c9a3bef2978247f7fab0ccfddc44cfddb936d5ad9f98ede886" +dependencies = [ + "memoffset", + "solana-account-info", + "solana-big-mod-exp", + "solana-blake3-hasher", + "solana-borsh", + "solana-clock", + "solana-cpi", + "solana-define-syscall 5.1.0", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-epoch-stake", + "solana-example-mocks", + "solana-fee-calculator", + "solana-hash", + "solana-instruction", + "solana-instruction-error", + "solana-instructions-sysvar", + "solana-keccak-hasher", + "solana-last-restart-slot", + "solana-msg", + "solana-native-token", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-secp256k1-recover", + "solana-serde-varint", + "solana-serialize-utils", + "solana-sha256-hasher", + "solana-short-vec", + "solana-slot-hashes", + "solana-slot-history", + "solana-stable-layout", + "solana-sysvar", + "solana-sysvar-id", +] + +[[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", + "solana-define-syscall 4.0.1", + "solana-program-error", + "solana-pubkey", +] + +[[package]] +name = "solana-program-error" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f04fa578707b3612b095f0c8e19b66a1233f7c42ca8082fcb3b745afcc0add6" +dependencies = [ + "borsh", + "serde", + "serde_derive", +] + +[[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 = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a88006a9b8594088cec9027ab77caaaa258a2aaa2083d3f086c44b42e50aeab" + +[[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", +] + +[[package]] +name = "solana-pubkey" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7db719574990de7e8b0f55a8593ac92a5ccb42c8ce67b3e4bf05b139d5d9ee71" +dependencies = [ + "solana-address", +] + +[[package]] +name = "solana-rent" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9809b081e99bc142ce803bcd7ee18306759ce3b30a96a9da3f6f41c45e50ef0" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[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 = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" +dependencies = [ + "solana-address", +] + +[[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 = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c5f18893d62e6c73117dcba48f8f5e3266d90e5ec3d0a0a90f9785adac36c1" +dependencies = [ + "k256", + "solana-define-syscall 5.1.0", + "thiserror", +] + +[[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 = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761357b0853c9623bf12c1d2314b3d6160a85b087b84c45224fb85766d22616b" +dependencies = [ + "solana-instruction-error", + "solana-pubkey", + "solana-sanitize", +] + +[[package]] +name = "solana-sha256-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7dc3011ea4c0334aaaa7e7128cb390ecf546b28d412e9bf2064680f57f588f" +dependencies = [ + "sha2", + "solana-define-syscall 4.0.1", + "solana-hash", +] + +[[package]] +name = "solana-short-vec" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb8cc883fc7b8ce4a7814cb1441b48c06437049ec11847005cf63bcfa85c546" + +[[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", + "solana-sdk-ids", + "solana-sysvar-id", +] + +[[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", + "solana-sysvar-id", +] + +[[package]] +name = "solana-stable-layout" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9f6a291ba063a37780af29e7db14bdd3dc447584d8ba5b3fc4b88e2bbc982fa" +dependencies = [ + "solana-instruction", + "solana-pubkey", +] + +[[package]] +name = "solana-system-interface" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55b54965bf0b76fa8e2b35376583efddd4d916618cfe595bf48c7d7b55a9e628" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-address", + "solana-instruction", + "solana-msg", + "solana-program-error", +] + +[[package]] +name = "solana-sysvar" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1632b69b4f72489db5949a10e8308c229dfa003f99ecaa7477b376807c7b81f4" +dependencies = [ + "base64", + "bincode", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-define-syscall 5.1.0", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash", + "solana-instruction", + "solana-last-restart-slot", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-slot-hashes", + "solana-slot-history", + "solana-sysvar-id", +] + +[[package]] +name = "solana-sysvar-id" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" +dependencies = [ + "solana-address", + "solana-sdk-ids", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[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 = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl", +] + +[[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.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +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_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[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.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wincode" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d967db7705dc29120bb6e8ce5b5a2e27734ed5976d1c904e95bd238d1c3c5a" +dependencies = [ + "pastey", + "proc-macro2", + "quote", + "thiserror", + "wincode-derive", +] + +[[package]] +name = "wincode-derive" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15ab90b719560d0fda79c74550ad1c948d17b118765942838055ebaf34d67071" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" diff --git a/tools/shank-and-codama/native/program/Cargo.toml b/tools/shank-and-codama/native/program/Cargo.toml new file mode 100644 index 00000000..1e7dd9d9 --- /dev/null +++ b/tools/shank-and-codama/native/program/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "car-rental-service" +version = "0.1.0" +edition = "2021" + +[dependencies] +borsh = "1.5.7" +borsh-derive = "1.5.7" +shank = "0.4.8" +solana-program = "4.0" +solana-system-interface = { version = "3", features = ["bincode"] } + +# This example is intentionally standalone (not part of the root workspace), +# so it pins its own dependency versions and has its own Cargo.lock. +[workspace] + +[lib] +crate-type = ["cdylib", "lib"] + +[features] +custom-heap = [] +custom-panic = [] + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tools/shank-and-solita/native/program/idl/car_rental_service.json b/tools/shank-and-codama/native/program/idl/car_rental_service.json similarity index 80% rename from tools/shank-and-solita/native/program/idl/car_rental_service.json rename to tools/shank-and-codama/native/program/idl/car_rental_service.json index 54af8ec2..3292978d 100644 --- a/tools/shank-and-solita/native/program/idl/car_rental_service.json +++ b/tools/shank-and-codama/native/program/idl/car_rental_service.json @@ -9,19 +9,25 @@ "name": "carAccount", "isMut": true, "isSigner": false, - "desc": "The account that will represent the Car being created" + "docs": [ + "The account that will represent the Car being created" + ] }, { "name": "payer", "isMut": true, "isSigner": false, - "desc": "Fee payer" + "docs": [ + "Fee payer" + ] }, { "name": "systemProgram", "isMut": false, "isSigner": false, - "desc": "The System Program" + "docs": [ + "The System Program" + ] } ], "args": [ @@ -44,25 +50,33 @@ "name": "rentalAccount", "isMut": true, "isSigner": false, - "desc": "The account that will represent the actual order for the rental" + "docs": [ + "The account that will represent the actual order for the rental" + ] }, { "name": "carAccount", "isMut": false, "isSigner": false, - "desc": "The account representing the Car being rented in this order" + "docs": [ + "The account representing the Car being rented in this order" + ] }, { "name": "payer", "isMut": true, "isSigner": false, - "desc": "Fee payer" + "docs": [ + "Fee payer" + ] }, { "name": "systemProgram", "isMut": false, "isSigner": false, - "desc": "The System Program" + "docs": [ + "The System Program" + ] } ], "args": [ @@ -85,19 +99,25 @@ "name": "rentalAccount", "isMut": true, "isSigner": false, - "desc": "The account representing the active rental" + "docs": [ + "The account representing the active rental" + ] }, { "name": "carAccount", "isMut": false, "isSigner": false, - "desc": "The account representing the Car being rented in this order" + "docs": [ + "The account representing the Car being rented in this order" + ] }, { "name": "payer", "isMut": true, "isSigner": false, - "desc": "Fee payer" + "docs": [ + "Fee payer" + ] } ], "args": [], @@ -113,19 +133,25 @@ "name": "rentalAccount", "isMut": true, "isSigner": false, - "desc": "The account representing the active rental" + "docs": [ + "The account representing the active rental" + ] }, { "name": "carAccount", "isMut": false, "isSigner": false, - "desc": "The account representing the Car being rented in this order" + "docs": [ + "The account representing the Car being rented in this order" + ] }, { "name": "payer", "isMut": true, "isSigner": false, - "desc": "Fee payer" + "docs": [ + "Fee payer" + ] } ], "args": [], @@ -256,8 +282,6 @@ ], "metadata": { "origin": "shank", - "address": "8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ", - "binaryVersion": "0.0.12", - "libVersion": "0.0.12" + "address": "8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ" } -} +} \ No newline at end of file diff --git a/tools/shank-and-solita/native/program/src/instructions/add_car.rs b/tools/shank-and-codama/native/program/src/instructions/add_car.rs similarity index 57% rename from tools/shank-and-solita/native/program/src/instructions/add_car.rs rename to tools/shank-and-codama/native/program/src/instructions/add_car.rs index 6bc26978..7b195825 100644 --- a/tools/shank-and-solita/native/program/src/instructions/add_car.rs +++ b/tools/shank-and-codama/native/program/src/instructions/add_car.rs @@ -1,20 +1,16 @@ +use crate::state::Car; use { - borsh::{ - BorshDeserialize, - BorshSerialize - }, - shank::ShankAccount, + borsh::{BorshDeserialize, BorshSerialize}, solana_program::{ - account_info::{AccountInfo, next_account_info}, - entrypoint::ProgramResult, + account_info::{next_account_info, AccountInfo}, + entrypoint::ProgramResult, program::invoke_signed, pubkey::Pubkey, rent::Rent, - system_instruction, sysvar::Sysvar, }, + solana_system_interface::instruction as system_instruction, }; -use crate::state::Car; #[derive(BorshDeserialize, BorshSerialize, Clone, Debug)] pub struct AddCarArgs { @@ -23,18 +19,13 @@ pub struct AddCarArgs { pub model: String, } -pub fn add_car( - program_id: &Pubkey, - accounts: &[AccountInfo], - args: AddCarArgs, -) -> ProgramResult { - +pub fn add_car(program_id: &Pubkey, accounts: &[AccountInfo], args: AddCarArgs) -> ProgramResult { let accounts_iter = &mut accounts.iter(); let car_account = next_account_info(accounts_iter)?; let payer = next_account_info(accounts_iter)?; let system_program = next_account_info(accounts_iter)?; - let (car_account_pda, car_account_bump) = Car::shank_pda(program_id, args.make, args.model); + let (car_account_pda, car_account_bump) = Car::find_pda(program_id, &args.make, &args.model); assert!(&car_account_pda == car_account.key); let car_data = Car { @@ -43,24 +34,27 @@ pub fn add_car( model: args.model, }; - let account_span = (car_data.try_to_vec()?).len(); + let account_span = borsh::to_vec(&car_data)?.len(); let lamports_required = (Rent::get()?).minimum_balance(account_span); invoke_signed( &system_instruction::create_account( - &payer.key, - &car_account.key, + payer.key, + car_account.key, lamports_required, account_span as u64, program_id, ), - &[ - payer.clone(), car_account.clone(), system_program.clone() - ], - Car::shank_seeds_with_bump(args.make, args.model, &[car_account_bump]), + &[payer.clone(), car_account.clone(), system_program.clone()], + &[&[ + Car::SEED_PREFIX.as_bytes(), + car_data.make.as_bytes(), + car_data.model.as_bytes(), + &[car_account_bump], + ]], )?; - + car_data.serialize(&mut &mut car_account.data.borrow_mut()[..])?; Ok(()) -} \ No newline at end of file +} diff --git a/tools/shank-and-solita/native/program/src/instructions/book_rental.rs b/tools/shank-and-codama/native/program/src/instructions/book_rental.rs similarity index 63% rename from tools/shank-and-solita/native/program/src/instructions/book_rental.rs rename to tools/shank-and-codama/native/program/src/instructions/book_rental.rs index 9bc7a884..a523ae3d 100644 --- a/tools/shank-and-solita/native/program/src/instructions/book_rental.rs +++ b/tools/shank-and-codama/native/program/src/instructions/book_rental.rs @@ -1,22 +1,15 @@ +use crate::state::{RentalOrder, RentalOrderStatus}; use { - borsh::{ - BorshDeserialize, - BorshSerialize - }, - shank::ShankAccount, + borsh::{BorshDeserialize, BorshSerialize}, solana_program::{ - account_info::{AccountInfo, next_account_info}, - entrypoint::ProgramResult, + account_info::{next_account_info, AccountInfo}, + entrypoint::ProgramResult, program::invoke_signed, pubkey::Pubkey, rent::Rent, - system_instruction, sysvar::Sysvar, }, -}; -use crate::state::{ - RentalOrder, - RentalOrderStatus, + solana_system_interface::instruction as system_instruction, }; #[derive(BorshDeserialize, BorshSerialize, Clone, Debug)] @@ -32,14 +25,14 @@ pub fn book_rental( accounts: &[AccountInfo], args: BookRentalArgs, ) -> ProgramResult { - let accounts_iter = &mut accounts.iter(); let rental_order_account = next_account_info(accounts_iter)?; let car_account = next_account_info(accounts_iter)?; let payer = next_account_info(accounts_iter)?; let system_program = next_account_info(accounts_iter)?; - let (rental_order_account_pda, rental_order_account_bump) = RentalOrder::shank_pda(program_id, car_account.key, payer.key); + let (rental_order_account_pda, rental_order_account_bump) = + RentalOrder::find_pda(program_id, car_account.key, payer.key); assert!(&rental_order_account_pda == rental_order_account.key); let rental_order_data = RentalOrder { @@ -51,24 +44,31 @@ pub fn book_rental( status: RentalOrderStatus::Created, }; - let account_span = (rental_order_data.try_to_vec()?).len(); + let account_span = borsh::to_vec(&rental_order_data)?.len(); let lamports_required = (Rent::get()?).minimum_balance(account_span); invoke_signed( &system_instruction::create_account( - &payer.key, - &rental_order_account.key, + payer.key, + rental_order_account.key, lamports_required, account_span as u64, program_id, ), &[ - payer.clone(), rental_order_account.clone(), system_program.clone() + payer.clone(), + rental_order_account.clone(), + system_program.clone(), ], - RentalOrder::shank_seeds_with_bump(car_account.key, payer.key, &[rental_order_account_bump]), + &[&[ + RentalOrder::SEED_PREFIX.as_bytes(), + car_account.key.as_ref(), + payer.key.as_ref(), + &[rental_order_account_bump], + ]], )?; - + rental_order_data.serialize(&mut &mut rental_order_account.data.borrow_mut()[..])?; Ok(()) -} \ No newline at end of file +} diff --git a/tools/shank-and-codama/native/program/src/instructions/mod.rs b/tools/shank-and-codama/native/program/src/instructions/mod.rs new file mode 100644 index 00000000..3572eae5 --- /dev/null +++ b/tools/shank-and-codama/native/program/src/instructions/mod.rs @@ -0,0 +1,70 @@ +pub mod add_car; +pub mod book_rental; +pub mod pick_up_car; +pub mod return_car; + +pub use add_car::*; +pub use book_rental::*; +pub use pick_up_car::*; +pub use return_car::*; + +use { + borsh::{BorshDeserialize, BorshSerialize}, + shank::ShankInstruction, +}; + +#[derive(BorshDeserialize, BorshSerialize, Clone, Debug, ShankInstruction)] +pub enum CarRentalServiceInstruction { + #[account( + 0, + writable, + name = "car_account", + desc = "The account that will represent the Car being created" + )] + #[account(1, writable, name = "payer", desc = "Fee payer")] + #[account(2, name = "system_program", desc = "The System Program")] + AddCar(AddCarArgs), + + #[account( + 0, + writable, + name = "rental_account", + desc = "The account that will represent the actual order for the rental" + )] + #[account( + 1, + name = "car_account", + desc = "The account representing the Car being rented in this order" + )] + #[account(2, writable, name = "payer", desc = "Fee payer")] + #[account(3, name = "system_program", desc = "The System Program")] + BookRental(BookRentalArgs), + + #[account( + 0, + writable, + name = "rental_account", + desc = "The account representing the active rental" + )] + #[account( + 1, + name = "car_account", + desc = "The account representing the Car being rented in this order" + )] + #[account(2, writable, name = "payer", desc = "Fee payer")] + PickUpCar, + + #[account( + 0, + writable, + name = "rental_account", + desc = "The account representing the active rental" + )] + #[account( + 1, + name = "car_account", + desc = "The account representing the Car being rented in this order" + )] + #[account(2, writable, name = "payer", desc = "Fee payer")] + ReturnCar, +} diff --git a/tools/shank-and-solita/native/program/src/instructions/pick_up_car.rs b/tools/shank-and-codama/native/program/src/instructions/pick_up_car.rs similarity index 52% rename from tools/shank-and-solita/native/program/src/instructions/pick_up_car.rs rename to tools/shank-and-codama/native/program/src/instructions/pick_up_car.rs index eb9894fc..8637edb1 100644 --- a/tools/shank-and-solita/native/program/src/instructions/pick_up_car.rs +++ b/tools/shank-and-codama/native/program/src/instructions/pick_up_car.rs @@ -1,37 +1,21 @@ +use crate::state::{RentalOrder, RentalOrderStatus}; use { - borsh::{ - BorshDeserialize, - BorshSerialize, - }, + borsh::{BorshDeserialize, BorshSerialize}, solana_program::{ - account_info::{AccountInfo, next_account_info}, - entrypoint::ProgramResult, + account_info::{next_account_info, AccountInfo}, + entrypoint::ProgramResult, pubkey::Pubkey, }, }; -use crate::state::{ - RentalOrder, - RentalOrderStatus, -}; - -pub fn pick_up_car( - program_id: &Pubkey, - accounts: &[AccountInfo], -) -> ProgramResult { +pub fn pick_up_car(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult { let accounts_iter = &mut accounts.iter(); let rental_order_account = next_account_info(accounts_iter)?; let car_account = next_account_info(accounts_iter)?; let payer = next_account_info(accounts_iter)?; - let (rental_order_account_pda, _) = Pubkey::find_program_address( - &[ - RentalOrder::SEED_PREFIX.as_bytes().as_ref(), - car_account.key.as_ref(), - payer.key.as_ref(), - ], - program_id, - ); + let (rental_order_account_pda, _) = + RentalOrder::find_pda(program_id, car_account.key, payer.key); assert!(&rental_order_account_pda == rental_order_account.key); let rental_order = &mut RentalOrder::try_from_slice(&rental_order_account.data.borrow())?; @@ -39,4 +23,4 @@ pub fn pick_up_car( rental_order.serialize(&mut &mut rental_order_account.data.borrow_mut()[..])?; Ok(()) -} \ No newline at end of file +} diff --git a/tools/shank-and-solita/native/program/src/instructions/return_car.rs b/tools/shank-and-codama/native/program/src/instructions/return_car.rs similarity index 51% rename from tools/shank-and-solita/native/program/src/instructions/return_car.rs rename to tools/shank-and-codama/native/program/src/instructions/return_car.rs index 328802c8..1962bd3a 100644 --- a/tools/shank-and-solita/native/program/src/instructions/return_car.rs +++ b/tools/shank-and-codama/native/program/src/instructions/return_car.rs @@ -1,37 +1,21 @@ +use crate::state::{RentalOrder, RentalOrderStatus}; use { - borsh::{ - BorshDeserialize, - BorshSerialize, - }, + borsh::{BorshDeserialize, BorshSerialize}, solana_program::{ - account_info::{AccountInfo, next_account_info}, - entrypoint::ProgramResult, + account_info::{next_account_info, AccountInfo}, + entrypoint::ProgramResult, pubkey::Pubkey, }, }; -use crate::state::{ - RentalOrder, - RentalOrderStatus, -}; - -pub fn return_car( - program_id: &Pubkey, - accounts: &[AccountInfo], -) -> ProgramResult { +pub fn return_car(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult { let accounts_iter = &mut accounts.iter(); let rental_order_account = next_account_info(accounts_iter)?; let car_account = next_account_info(accounts_iter)?; let payer = next_account_info(accounts_iter)?; - let (rental_order_account_pda, _) = Pubkey::find_program_address( - &[ - RentalOrder::SEED_PREFIX.as_bytes().as_ref(), - car_account.key.as_ref(), - payer.key.as_ref(), - ], - program_id, - ); + let (rental_order_account_pda, _) = + RentalOrder::find_pda(program_id, car_account.key, payer.key); assert!(&rental_order_account_pda == rental_order_account.key); let rental_order = &mut RentalOrder::try_from_slice(&rental_order_account.data.borrow())?; @@ -39,4 +23,4 @@ pub fn return_car( rental_order.serialize(&mut &mut rental_order_account.data.borrow_mut()[..])?; Ok(()) -} \ No newline at end of file +} diff --git a/tools/shank-and-solita/native/program/src/lib.rs b/tools/shank-and-codama/native/program/src/lib.rs similarity index 68% rename from tools/shank-and-solita/native/program/src/lib.rs rename to tools/shank-and-codama/native/program/src/lib.rs index 9f8e43c6..376b66be 100644 --- a/tools/shank-and-solita/native/program/src/lib.rs +++ b/tools/shank-and-codama/native/program/src/lib.rs @@ -1,17 +1,14 @@ mod instructions; mod state; +use crate::instructions::*; use { borsh::BorshDeserialize, solana_program::{ - account_info::AccountInfo, - declare_id, - entrypoint, - entrypoint::ProgramResult, + account_info::AccountInfo, declare_id, entrypoint, entrypoint::ProgramResult, pubkey::Pubkey, }, }; -use crate::instructions::*; declare_id!("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"); entrypoint!(process_instruction); @@ -21,12 +18,11 @@ pub fn process_instruction( accounts: &[AccountInfo], instruction_data: &[u8], ) -> ProgramResult { - let instruction = CarRentalServiceInstruction::try_from_slice(instruction_data)?; match instruction { - CarRentalServiceInstruction::AddCar(car) => add_car(program_id, accounts, car), - CarRentalServiceInstruction::BookRental(order) => book_rental(program_id, accounts, order), + CarRentalServiceInstruction::AddCar(args) => add_car(program_id, accounts, args), + CarRentalServiceInstruction::BookRental(args) => book_rental(program_id, accounts, args), CarRentalServiceInstruction::PickUpCar => pick_up_car(program_id, accounts), CarRentalServiceInstruction::ReturnCar => return_car(program_id, accounts), } -} \ No newline at end of file +} diff --git a/tools/shank-and-codama/native/program/src/state/mod.rs b/tools/shank-and-codama/native/program/src/state/mod.rs new file mode 100644 index 00000000..cb5fd132 --- /dev/null +++ b/tools/shank-and-codama/native/program/src/state/mod.rs @@ -0,0 +1,68 @@ +use { + borsh::{BorshDeserialize, BorshSerialize}, + shank::ShankAccount, + solana_program::pubkey::Pubkey, +}; + +// NOTE on PDAs and Shank's `#[seeds(...)]` attribute: +// +// Older versions of Shank (0.0.x) used `#[seeds(...)]` on a `ShankAccount` to +// generate `shank_pda` / `shank_seeds_with_bump` helper methods. As of Shank +// 0.4.x that PDA code-generation produces unparsable tokens and breaks +// compilation, and the seeds are *not* emitted into the IDL anyway. Shank 0.4 +// therefore only uses `ShankAccount` to extract the account's layout for the +// IDL. We keep the PDA derivation explicit here (the seed bytes are identical +// to what the old generated helpers produced). + +#[derive(BorshDeserialize, BorshSerialize, Clone, Debug, ShankAccount)] +pub struct Car { + pub year: u16, + pub make: String, + pub model: String, +} + +impl Car { + pub const SEED_PREFIX: &'static str = "car"; + + /// Derive the PDA for a `Car` account: `["car", make, model]`. + pub fn find_pda(program_id: &Pubkey, make: &str, model: &str) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + Self::SEED_PREFIX.as_bytes(), + make.as_bytes(), + model.as_bytes(), + ], + program_id, + ) + } +} + +#[derive(BorshDeserialize, BorshSerialize, Clone, Debug)] +pub enum RentalOrderStatus { + Created, + PickedUp, + Returned, +} + +#[derive(BorshDeserialize, BorshSerialize, Clone, Debug, ShankAccount)] +pub struct RentalOrder { + pub car: Pubkey, + pub name: String, + pub pick_up_date: String, + pub return_date: String, + pub price: u64, + pub status: RentalOrderStatus, +} + +impl RentalOrder { + pub const SEED_PREFIX: &'static str = "rental_order"; + + /// Derive the PDA for a `RentalOrder` account: + /// `["rental_order", car, payer]`. + pub fn find_pda(program_id: &Pubkey, car: &Pubkey, payer: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[Self::SEED_PREFIX.as_bytes(), car.as_ref(), payer.as_ref()], + program_id, + ) + } +} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts new file mode 100644 index 00000000..871f35d6 --- /dev/null +++ b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts @@ -0,0 +1,116 @@ +/** + * This code was AUTOGENERATED using the Codama library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun Codama to update it. + * + * @see https://github.com/codama-idl/codama + */ + +import { + addDecoderSizePrefix, + addEncoderSizePrefix, + assertAccountExists, + assertAccountsExist, + combineCodec, + decodeAccount, + fetchEncodedAccount, + fetchEncodedAccounts, + getStructDecoder, + getStructEncoder, + getU16Decoder, + getU16Encoder, + getU32Decoder, + getU32Encoder, + getUtf8Decoder, + getUtf8Encoder, + type Account, + type Address, + type Codec, + type Decoder, + type EncodedAccount, + type Encoder, + type FetchAccountConfig, + type FetchAccountsConfig, + type MaybeAccount, + type MaybeEncodedAccount, +} from "@solana/kit"; + +export type Car = { year: number; make: string; model: string }; + +export type CarArgs = Car; + +/** Gets the encoder for {@link CarArgs} account data. */ +export function getCarEncoder(): Encoder { + return getStructEncoder([ + ["year", getU16Encoder()], + ["make", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + ["model", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + ]); +} + +/** Gets the decoder for {@link Car} account data. */ +export function getCarDecoder(): Decoder { + return getStructDecoder([ + ["year", getU16Decoder()], + ["make", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], + ["model", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], + ]); +} + +/** Gets the codec for {@link Car} account data. */ +export function getCarCodec(): Codec { + return combineCodec(getCarEncoder(), getCarDecoder()); +} + +export function decodeCar( + encodedAccount: EncodedAccount, +): Account; +export function decodeCar( + encodedAccount: MaybeEncodedAccount, +): MaybeAccount; +export function decodeCar( + encodedAccount: EncodedAccount | MaybeEncodedAccount, +): Account | MaybeAccount { + return decodeAccount( + encodedAccount as MaybeEncodedAccount, + getCarDecoder(), + ); +} + +export async function fetchCar( + rpc: Parameters[0], + address: Address, + config?: FetchAccountConfig, +): Promise> { + const maybeAccount = await fetchMaybeCar(rpc, address, config); + assertAccountExists(maybeAccount); + return maybeAccount; +} + +export async function fetchMaybeCar( + rpc: Parameters[0], + address: Address, + config?: FetchAccountConfig, +): Promise> { + const maybeAccount = await fetchEncodedAccount(rpc, address, config); + return decodeCar(maybeAccount); +} + +export async function fetchAllCar( + rpc: Parameters[0], + addresses: Array

, + config?: FetchAccountsConfig, +): Promise[]> { + const maybeAccounts = await fetchAllMaybeCar(rpc, addresses, config); + assertAccountsExist(maybeAccounts); + return maybeAccounts; +} + +export async function fetchAllMaybeCar( + rpc: Parameters[0], + addresses: Array
, + config?: FetchAccountsConfig, +): Promise[]> { + const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config); + return maybeAccounts.map((maybeAccount) => decodeCar(maybeAccount)); +} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/index.ts b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/index.ts new file mode 100644 index 00000000..7b2f3b87 --- /dev/null +++ b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/index.ts @@ -0,0 +1,10 @@ +/** + * This code was AUTOGENERATED using the Codama library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun Codama to update it. + * + * @see https://github.com/codama-idl/codama + */ + +export * from "./car"; +export * from "./rentalOrder"; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts new file mode 100644 index 00000000..539854a1 --- /dev/null +++ b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts @@ -0,0 +1,144 @@ +/** + * This code was AUTOGENERATED using the Codama library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun Codama to update it. + * + * @see https://github.com/codama-idl/codama + */ + +import { + addDecoderSizePrefix, + addEncoderSizePrefix, + assertAccountExists, + assertAccountsExist, + combineCodec, + decodeAccount, + fetchEncodedAccount, + fetchEncodedAccounts, + getAddressDecoder, + getAddressEncoder, + getStructDecoder, + getStructEncoder, + getU32Decoder, + getU32Encoder, + getU64Decoder, + getU64Encoder, + getUtf8Decoder, + getUtf8Encoder, + type Account, + type Address, + type Codec, + type Decoder, + type EncodedAccount, + type Encoder, + type FetchAccountConfig, + type FetchAccountsConfig, + type MaybeAccount, + type MaybeEncodedAccount, +} from "@solana/kit"; +import { + getRentalOrderStatusDecoder, + getRentalOrderStatusEncoder, + type RentalOrderStatus, + type RentalOrderStatusArgs, +} from "../types"; + +export type RentalOrder = { + car: Address; + name: string; + pickUpDate: string; + returnDate: string; + price: bigint; + status: RentalOrderStatus; +}; + +export type RentalOrderArgs = { + car: Address; + name: string; + pickUpDate: string; + returnDate: string; + price: number | bigint; + status: RentalOrderStatusArgs; +}; + +/** Gets the encoder for {@link RentalOrderArgs} account data. */ +export function getRentalOrderEncoder(): Encoder { + return getStructEncoder([ + ["car", getAddressEncoder()], + ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + ["pickUpDate", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + ["returnDate", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + ["price", getU64Encoder()], + ["status", getRentalOrderStatusEncoder()], + ]); +} + +/** Gets the decoder for {@link RentalOrder} account data. */ +export function getRentalOrderDecoder(): Decoder { + return getStructDecoder([ + ["car", getAddressDecoder()], + ["name", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], + ["pickUpDate", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], + ["returnDate", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], + ["price", getU64Decoder()], + ["status", getRentalOrderStatusDecoder()], + ]); +} + +/** Gets the codec for {@link RentalOrder} account data. */ +export function getRentalOrderCodec(): Codec { + return combineCodec(getRentalOrderEncoder(), getRentalOrderDecoder()); +} + +export function decodeRentalOrder( + encodedAccount: EncodedAccount, +): Account; +export function decodeRentalOrder( + encodedAccount: MaybeEncodedAccount, +): MaybeAccount; +export function decodeRentalOrder( + encodedAccount: EncodedAccount | MaybeEncodedAccount, +): Account | MaybeAccount { + return decodeAccount( + encodedAccount as MaybeEncodedAccount, + getRentalOrderDecoder(), + ); +} + +export async function fetchRentalOrder( + rpc: Parameters[0], + address: Address, + config?: FetchAccountConfig, +): Promise> { + const maybeAccount = await fetchMaybeRentalOrder(rpc, address, config); + assertAccountExists(maybeAccount); + return maybeAccount; +} + +export async function fetchMaybeRentalOrder( + rpc: Parameters[0], + address: Address, + config?: FetchAccountConfig, +): Promise> { + const maybeAccount = await fetchEncodedAccount(rpc, address, config); + return decodeRentalOrder(maybeAccount); +} + +export async function fetchAllRentalOrder( + rpc: Parameters[0], + addresses: Array
, + config?: FetchAccountsConfig, +): Promise[]> { + const maybeAccounts = await fetchAllMaybeRentalOrder(rpc, addresses, config); + assertAccountsExist(maybeAccounts); + return maybeAccounts; +} + +export async function fetchAllMaybeRentalOrder( + rpc: Parameters[0], + addresses: Array
, + config?: FetchAccountsConfig, +): Promise[]> { + const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config); + return maybeAccounts.map((maybeAccount) => decodeRentalOrder(maybeAccount)); +} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/index.ts b/tools/shank-and-codama/native/tests/generated/src/generated/index.ts new file mode 100644 index 00000000..f4b543bb --- /dev/null +++ b/tools/shank-and-codama/native/tests/generated/src/generated/index.ts @@ -0,0 +1,12 @@ +/** + * This code was AUTOGENERATED using the Codama library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun Codama to update it. + * + * @see https://github.com/codama-idl/codama + */ + +export * from "./accounts"; +export * from "./instructions"; +export * from "./programs"; +export * from "./types"; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts new file mode 100644 index 00000000..3ef59108 --- /dev/null +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts @@ -0,0 +1,239 @@ +/** + * This code was AUTOGENERATED using the Codama library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun Codama to update it. + * + * @see https://github.com/codama-idl/codama + */ + +import { + addDecoderSizePrefix, + addEncoderSizePrefix, + combineCodec, + getStructDecoder, + getStructEncoder, + getU16Decoder, + getU16Encoder, + getU32Decoder, + getU32Encoder, + getU8Decoder, + getU8Encoder, + getUtf8Decoder, + getUtf8Encoder, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, + transformEncoder, + type AccountMeta, + type Address, + type Codec, + type Decoder, + type Encoder, + type Instruction, + type InstructionWithAccounts, + type InstructionWithData, + type ReadonlyAccount, + type ReadonlyUint8Array, + type WritableAccount, +} from "@solana/kit"; +import { + getAccountMetaFactory, + type ResolvedInstructionAccount, +} from "@solana/program-client-core"; +import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; + +export const ADD_CAR_DISCRIMINATOR = 0; + +export function getAddCarDiscriminatorBytes(): ReadonlyUint8Array { + return getU8Encoder().encode(ADD_CAR_DISCRIMINATOR); +} + +export type AddCarInstruction< + TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, + TAccountCarAccount extends string | AccountMeta = string, + TAccountPayer extends string | AccountMeta = string, + TAccountSystemProgram extends string | AccountMeta = + "11111111111111111111111111111111", + TRemainingAccounts extends readonly AccountMeta[] = [], +> = Instruction & + InstructionWithData & + InstructionWithAccounts< + [ + TAccountCarAccount extends string + ? WritableAccount + : TAccountCarAccount, + TAccountPayer extends string + ? WritableAccount + : TAccountPayer, + TAccountSystemProgram extends string + ? ReadonlyAccount + : TAccountSystemProgram, + ...TRemainingAccounts, + ] + >; + +export type AddCarInstructionData = { + discriminator: number; + year: number; + make: string; + model: string; +}; + +export type AddCarInstructionDataArgs = { + year: number; + make: string; + model: string; +}; + +export function getAddCarInstructionDataEncoder(): Encoder { + return transformEncoder( + getStructEncoder([ + ["discriminator", getU8Encoder()], + ["year", getU16Encoder()], + ["make", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + ["model", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + ]), + (value) => ({ ...value, discriminator: ADD_CAR_DISCRIMINATOR }), + ); +} + +export function getAddCarInstructionDataDecoder(): Decoder { + return getStructDecoder([ + ["discriminator", getU8Decoder()], + ["year", getU16Decoder()], + ["make", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], + ["model", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], + ]); +} + +export function getAddCarInstructionDataCodec(): Codec< + AddCarInstructionDataArgs, + AddCarInstructionData +> { + return combineCodec( + getAddCarInstructionDataEncoder(), + getAddCarInstructionDataDecoder(), + ); +} + +export type AddCarInput< + TAccountCarAccount extends string = string, + TAccountPayer extends string = string, + TAccountSystemProgram extends string = string, +> = { + /** The account that will represent the Car being created */ + carAccount: Address; + /** Fee payer */ + payer: Address; + /** The System Program */ + systemProgram?: Address; + year: AddCarInstructionDataArgs["year"]; + make: AddCarInstructionDataArgs["make"]; + model: AddCarInstructionDataArgs["model"]; +}; + +export function getAddCarInstruction< + TAccountCarAccount extends string, + TAccountPayer extends string, + TAccountSystemProgram extends string, + TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, +>( + input: AddCarInput, + config?: { programAddress?: TProgramAddress }, +): AddCarInstruction< + TProgramAddress, + TAccountCarAccount, + TAccountPayer, + TAccountSystemProgram +> { + // Program address. + const programAddress = + config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + + // Original accounts. + const originalAccounts = { + carAccount: { value: input.carAccount ?? null, isWritable: true }, + payer: { value: input.payer ?? null, isWritable: true }, + systemProgram: { value: input.systemProgram ?? null, isWritable: false }, + }; + const accounts = originalAccounts as Record< + keyof typeof originalAccounts, + ResolvedInstructionAccount + >; + + // Original args. + const args = { ...input }; + + // Resolve default values. + if (!accounts.systemProgram.value) { + accounts.systemProgram.value = + "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; + } + + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); + return Object.freeze({ + accounts: [ + getAccountMeta("carAccount", accounts.carAccount), + getAccountMeta("payer", accounts.payer), + getAccountMeta("systemProgram", accounts.systemProgram), + ], + data: getAddCarInstructionDataEncoder().encode( + args as AddCarInstructionDataArgs, + ), + programAddress, + } as AddCarInstruction< + TProgramAddress, + TAccountCarAccount, + TAccountPayer, + TAccountSystemProgram + >); +} + +export type ParsedAddCarInstruction< + TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, + TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], +> = { + programAddress: Address; + accounts: { + /** The account that will represent the Car being created */ + carAccount: TAccountMetas[0]; + /** Fee payer */ + payer: TAccountMetas[1]; + /** The System Program */ + systemProgram: TAccountMetas[2]; + }; + data: AddCarInstructionData; +}; + +export function parseAddCarInstruction< + TProgram extends string, + TAccountMetas extends readonly AccountMeta[], +>( + instruction: Instruction & + InstructionWithAccounts & + InstructionWithData, +): ParsedAddCarInstruction { + if (instruction.accounts.length < 3) { + throw new SolanaError( + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 3, + }, + ); + } + let accountIndex = 0; + const getNextAccount = () => { + const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; + accountIndex += 1; + return accountMeta; + }; + return { + programAddress: instruction.programAddress, + accounts: { + carAccount: getNextAccount(), + payer: getNextAccount(), + systemProgram: getNextAccount(), + }, + data: getAddCarInstructionDataDecoder().decode(instruction.data), + }; +} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts new file mode 100644 index 00000000..64465322 --- /dev/null +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts @@ -0,0 +1,264 @@ +/** + * This code was AUTOGENERATED using the Codama library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun Codama to update it. + * + * @see https://github.com/codama-idl/codama + */ + +import { + addDecoderSizePrefix, + addEncoderSizePrefix, + combineCodec, + getStructDecoder, + getStructEncoder, + getU32Decoder, + getU32Encoder, + getU64Decoder, + getU64Encoder, + getU8Decoder, + getU8Encoder, + getUtf8Decoder, + getUtf8Encoder, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, + transformEncoder, + type AccountMeta, + type Address, + type Codec, + type Decoder, + type Encoder, + type Instruction, + type InstructionWithAccounts, + type InstructionWithData, + type ReadonlyAccount, + type ReadonlyUint8Array, + type WritableAccount, +} from "@solana/kit"; +import { + getAccountMetaFactory, + type ResolvedInstructionAccount, +} from "@solana/program-client-core"; +import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; + +export const BOOK_RENTAL_DISCRIMINATOR = 1; + +export function getBookRentalDiscriminatorBytes(): ReadonlyUint8Array { + return getU8Encoder().encode(BOOK_RENTAL_DISCRIMINATOR); +} + +export type BookRentalInstruction< + TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, + TAccountRentalAccount extends string | AccountMeta = string, + TAccountCarAccount extends string | AccountMeta = string, + TAccountPayer extends string | AccountMeta = string, + TAccountSystemProgram extends string | AccountMeta = + "11111111111111111111111111111111", + TRemainingAccounts extends readonly AccountMeta[] = [], +> = Instruction & + InstructionWithData & + InstructionWithAccounts< + [ + TAccountRentalAccount extends string + ? WritableAccount + : TAccountRentalAccount, + TAccountCarAccount extends string + ? ReadonlyAccount + : TAccountCarAccount, + TAccountPayer extends string + ? WritableAccount + : TAccountPayer, + TAccountSystemProgram extends string + ? ReadonlyAccount + : TAccountSystemProgram, + ...TRemainingAccounts, + ] + >; + +export type BookRentalInstructionData = { + discriminator: number; + name: string; + pickUpDate: string; + returnDate: string; + price: bigint; +}; + +export type BookRentalInstructionDataArgs = { + name: string; + pickUpDate: string; + returnDate: string; + price: number | bigint; +}; + +export function getBookRentalInstructionDataEncoder(): Encoder { + return transformEncoder( + getStructEncoder([ + ["discriminator", getU8Encoder()], + ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + ["pickUpDate", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + ["returnDate", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], + ["price", getU64Encoder()], + ]), + (value) => ({ ...value, discriminator: BOOK_RENTAL_DISCRIMINATOR }), + ); +} + +export function getBookRentalInstructionDataDecoder(): Decoder { + return getStructDecoder([ + ["discriminator", getU8Decoder()], + ["name", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], + ["pickUpDate", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], + ["returnDate", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], + ["price", getU64Decoder()], + ]); +} + +export function getBookRentalInstructionDataCodec(): Codec< + BookRentalInstructionDataArgs, + BookRentalInstructionData +> { + return combineCodec( + getBookRentalInstructionDataEncoder(), + getBookRentalInstructionDataDecoder(), + ); +} + +export type BookRentalInput< + TAccountRentalAccount extends string = string, + TAccountCarAccount extends string = string, + TAccountPayer extends string = string, + TAccountSystemProgram extends string = string, +> = { + /** The account that will represent the actual order for the rental */ + rentalAccount: Address; + /** The account representing the Car being rented in this order */ + carAccount: Address; + /** Fee payer */ + payer: Address; + /** The System Program */ + systemProgram?: Address; + name: BookRentalInstructionDataArgs["name"]; + pickUpDate: BookRentalInstructionDataArgs["pickUpDate"]; + returnDate: BookRentalInstructionDataArgs["returnDate"]; + price: BookRentalInstructionDataArgs["price"]; +}; + +export function getBookRentalInstruction< + TAccountRentalAccount extends string, + TAccountCarAccount extends string, + TAccountPayer extends string, + TAccountSystemProgram extends string, + TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, +>( + input: BookRentalInput< + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer, + TAccountSystemProgram + >, + config?: { programAddress?: TProgramAddress }, +): BookRentalInstruction< + TProgramAddress, + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer, + TAccountSystemProgram +> { + // Program address. + const programAddress = + config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + + // Original accounts. + const originalAccounts = { + rentalAccount: { value: input.rentalAccount ?? null, isWritable: true }, + carAccount: { value: input.carAccount ?? null, isWritable: false }, + payer: { value: input.payer ?? null, isWritable: true }, + systemProgram: { value: input.systemProgram ?? null, isWritable: false }, + }; + const accounts = originalAccounts as Record< + keyof typeof originalAccounts, + ResolvedInstructionAccount + >; + + // Original args. + const args = { ...input }; + + // Resolve default values. + if (!accounts.systemProgram.value) { + accounts.systemProgram.value = + "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; + } + + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); + return Object.freeze({ + accounts: [ + getAccountMeta("rentalAccount", accounts.rentalAccount), + getAccountMeta("carAccount", accounts.carAccount), + getAccountMeta("payer", accounts.payer), + getAccountMeta("systemProgram", accounts.systemProgram), + ], + data: getBookRentalInstructionDataEncoder().encode( + args as BookRentalInstructionDataArgs, + ), + programAddress, + } as BookRentalInstruction< + TProgramAddress, + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer, + TAccountSystemProgram + >); +} + +export type ParsedBookRentalInstruction< + TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, + TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], +> = { + programAddress: Address; + accounts: { + /** The account that will represent the actual order for the rental */ + rentalAccount: TAccountMetas[0]; + /** The account representing the Car being rented in this order */ + carAccount: TAccountMetas[1]; + /** Fee payer */ + payer: TAccountMetas[2]; + /** The System Program */ + systemProgram: TAccountMetas[3]; + }; + data: BookRentalInstructionData; +}; + +export function parseBookRentalInstruction< + TProgram extends string, + TAccountMetas extends readonly AccountMeta[], +>( + instruction: Instruction & + InstructionWithAccounts & + InstructionWithData, +): ParsedBookRentalInstruction { + if (instruction.accounts.length < 4) { + throw new SolanaError( + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 4, + }, + ); + } + let accountIndex = 0; + const getNextAccount = () => { + const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; + accountIndex += 1; + return accountMeta; + }; + return { + programAddress: instruction.programAddress, + accounts: { + rentalAccount: getNextAccount(), + carAccount: getNextAccount(), + payer: getNextAccount(), + systemProgram: getNextAccount(), + }, + data: getBookRentalInstructionDataDecoder().decode(instruction.data), + }; +} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/index.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/index.ts new file mode 100644 index 00000000..818ee3c2 --- /dev/null +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/index.ts @@ -0,0 +1,12 @@ +/** + * This code was AUTOGENERATED using the Codama library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun Codama to update it. + * + * @see https://github.com/codama-idl/codama + */ + +export * from "./addCar"; +export * from "./bookRental"; +export * from "./pickUpCar"; +export * from "./returnCar"; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts new file mode 100644 index 00000000..c3ca7b13 --- /dev/null +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts @@ -0,0 +1,201 @@ +/** + * This code was AUTOGENERATED using the Codama library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun Codama to update it. + * + * @see https://github.com/codama-idl/codama + */ + +import { + combineCodec, + getStructDecoder, + getStructEncoder, + getU8Decoder, + getU8Encoder, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, + transformEncoder, + type AccountMeta, + type Address, + type FixedSizeCodec, + type FixedSizeDecoder, + type FixedSizeEncoder, + type Instruction, + type InstructionWithAccounts, + type InstructionWithData, + type ReadonlyAccount, + type ReadonlyUint8Array, + type WritableAccount, +} from "@solana/kit"; +import { + getAccountMetaFactory, + type ResolvedInstructionAccount, +} from "@solana/program-client-core"; +import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; + +export const PICK_UP_CAR_DISCRIMINATOR = 2; + +export function getPickUpCarDiscriminatorBytes(): ReadonlyUint8Array { + return getU8Encoder().encode(PICK_UP_CAR_DISCRIMINATOR); +} + +export type PickUpCarInstruction< + TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, + TAccountRentalAccount extends string | AccountMeta = string, + TAccountCarAccount extends string | AccountMeta = string, + TAccountPayer extends string | AccountMeta = string, + TRemainingAccounts extends readonly AccountMeta[] = [], +> = Instruction & + InstructionWithData & + InstructionWithAccounts< + [ + TAccountRentalAccount extends string + ? WritableAccount + : TAccountRentalAccount, + TAccountCarAccount extends string + ? ReadonlyAccount + : TAccountCarAccount, + TAccountPayer extends string + ? WritableAccount + : TAccountPayer, + ...TRemainingAccounts, + ] + >; + +export type PickUpCarInstructionData = { discriminator: number }; + +export type PickUpCarInstructionDataArgs = {}; + +export function getPickUpCarInstructionDataEncoder(): FixedSizeEncoder { + return transformEncoder( + getStructEncoder([["discriminator", getU8Encoder()]]), + (value) => ({ ...value, discriminator: PICK_UP_CAR_DISCRIMINATOR }), + ); +} + +export function getPickUpCarInstructionDataDecoder(): FixedSizeDecoder { + return getStructDecoder([["discriminator", getU8Decoder()]]); +} + +export function getPickUpCarInstructionDataCodec(): FixedSizeCodec< + PickUpCarInstructionDataArgs, + PickUpCarInstructionData +> { + return combineCodec( + getPickUpCarInstructionDataEncoder(), + getPickUpCarInstructionDataDecoder(), + ); +} + +export type PickUpCarInput< + TAccountRentalAccount extends string = string, + TAccountCarAccount extends string = string, + TAccountPayer extends string = string, +> = { + /** The account representing the active rental */ + rentalAccount: Address; + /** The account representing the Car being rented in this order */ + carAccount: Address; + /** Fee payer */ + payer: Address; +}; + +export function getPickUpCarInstruction< + TAccountRentalAccount extends string, + TAccountCarAccount extends string, + TAccountPayer extends string, + TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, +>( + input: PickUpCarInput< + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer + >, + config?: { programAddress?: TProgramAddress }, +): PickUpCarInstruction< + TProgramAddress, + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer +> { + // Program address. + const programAddress = + config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + + // Original accounts. + const originalAccounts = { + rentalAccount: { value: input.rentalAccount ?? null, isWritable: true }, + carAccount: { value: input.carAccount ?? null, isWritable: false }, + payer: { value: input.payer ?? null, isWritable: true }, + }; + const accounts = originalAccounts as Record< + keyof typeof originalAccounts, + ResolvedInstructionAccount + >; + + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); + return Object.freeze({ + accounts: [ + getAccountMeta("rentalAccount", accounts.rentalAccount), + getAccountMeta("carAccount", accounts.carAccount), + getAccountMeta("payer", accounts.payer), + ], + data: getPickUpCarInstructionDataEncoder().encode({}), + programAddress, + } as PickUpCarInstruction< + TProgramAddress, + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer + >); +} + +export type ParsedPickUpCarInstruction< + TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, + TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], +> = { + programAddress: Address; + accounts: { + /** The account representing the active rental */ + rentalAccount: TAccountMetas[0]; + /** The account representing the Car being rented in this order */ + carAccount: TAccountMetas[1]; + /** Fee payer */ + payer: TAccountMetas[2]; + }; + data: PickUpCarInstructionData; +}; + +export function parsePickUpCarInstruction< + TProgram extends string, + TAccountMetas extends readonly AccountMeta[], +>( + instruction: Instruction & + InstructionWithAccounts & + InstructionWithData, +): ParsedPickUpCarInstruction { + if (instruction.accounts.length < 3) { + throw new SolanaError( + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 3, + }, + ); + } + let accountIndex = 0; + const getNextAccount = () => { + const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; + accountIndex += 1; + return accountMeta; + }; + return { + programAddress: instruction.programAddress, + accounts: { + rentalAccount: getNextAccount(), + carAccount: getNextAccount(), + payer: getNextAccount(), + }, + data: getPickUpCarInstructionDataDecoder().decode(instruction.data), + }; +} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts new file mode 100644 index 00000000..2d444a3a --- /dev/null +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts @@ -0,0 +1,201 @@ +/** + * This code was AUTOGENERATED using the Codama library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun Codama to update it. + * + * @see https://github.com/codama-idl/codama + */ + +import { + combineCodec, + getStructDecoder, + getStructEncoder, + getU8Decoder, + getU8Encoder, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, + transformEncoder, + type AccountMeta, + type Address, + type FixedSizeCodec, + type FixedSizeDecoder, + type FixedSizeEncoder, + type Instruction, + type InstructionWithAccounts, + type InstructionWithData, + type ReadonlyAccount, + type ReadonlyUint8Array, + type WritableAccount, +} from "@solana/kit"; +import { + getAccountMetaFactory, + type ResolvedInstructionAccount, +} from "@solana/program-client-core"; +import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; + +export const RETURN_CAR_DISCRIMINATOR = 3; + +export function getReturnCarDiscriminatorBytes(): ReadonlyUint8Array { + return getU8Encoder().encode(RETURN_CAR_DISCRIMINATOR); +} + +export type ReturnCarInstruction< + TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, + TAccountRentalAccount extends string | AccountMeta = string, + TAccountCarAccount extends string | AccountMeta = string, + TAccountPayer extends string | AccountMeta = string, + TRemainingAccounts extends readonly AccountMeta[] = [], +> = Instruction & + InstructionWithData & + InstructionWithAccounts< + [ + TAccountRentalAccount extends string + ? WritableAccount + : TAccountRentalAccount, + TAccountCarAccount extends string + ? ReadonlyAccount + : TAccountCarAccount, + TAccountPayer extends string + ? WritableAccount + : TAccountPayer, + ...TRemainingAccounts, + ] + >; + +export type ReturnCarInstructionData = { discriminator: number }; + +export type ReturnCarInstructionDataArgs = {}; + +export function getReturnCarInstructionDataEncoder(): FixedSizeEncoder { + return transformEncoder( + getStructEncoder([["discriminator", getU8Encoder()]]), + (value) => ({ ...value, discriminator: RETURN_CAR_DISCRIMINATOR }), + ); +} + +export function getReturnCarInstructionDataDecoder(): FixedSizeDecoder { + return getStructDecoder([["discriminator", getU8Decoder()]]); +} + +export function getReturnCarInstructionDataCodec(): FixedSizeCodec< + ReturnCarInstructionDataArgs, + ReturnCarInstructionData +> { + return combineCodec( + getReturnCarInstructionDataEncoder(), + getReturnCarInstructionDataDecoder(), + ); +} + +export type ReturnCarInput< + TAccountRentalAccount extends string = string, + TAccountCarAccount extends string = string, + TAccountPayer extends string = string, +> = { + /** The account representing the active rental */ + rentalAccount: Address; + /** The account representing the Car being rented in this order */ + carAccount: Address; + /** Fee payer */ + payer: Address; +}; + +export function getReturnCarInstruction< + TAccountRentalAccount extends string, + TAccountCarAccount extends string, + TAccountPayer extends string, + TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, +>( + input: ReturnCarInput< + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer + >, + config?: { programAddress?: TProgramAddress }, +): ReturnCarInstruction< + TProgramAddress, + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer +> { + // Program address. + const programAddress = + config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + + // Original accounts. + const originalAccounts = { + rentalAccount: { value: input.rentalAccount ?? null, isWritable: true }, + carAccount: { value: input.carAccount ?? null, isWritable: false }, + payer: { value: input.payer ?? null, isWritable: true }, + }; + const accounts = originalAccounts as Record< + keyof typeof originalAccounts, + ResolvedInstructionAccount + >; + + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); + return Object.freeze({ + accounts: [ + getAccountMeta("rentalAccount", accounts.rentalAccount), + getAccountMeta("carAccount", accounts.carAccount), + getAccountMeta("payer", accounts.payer), + ], + data: getReturnCarInstructionDataEncoder().encode({}), + programAddress, + } as ReturnCarInstruction< + TProgramAddress, + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer + >); +} + +export type ParsedReturnCarInstruction< + TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, + TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], +> = { + programAddress: Address; + accounts: { + /** The account representing the active rental */ + rentalAccount: TAccountMetas[0]; + /** The account representing the Car being rented in this order */ + carAccount: TAccountMetas[1]; + /** Fee payer */ + payer: TAccountMetas[2]; + }; + data: ReturnCarInstructionData; +}; + +export function parseReturnCarInstruction< + TProgram extends string, + TAccountMetas extends readonly AccountMeta[], +>( + instruction: Instruction & + InstructionWithAccounts & + InstructionWithData, +): ParsedReturnCarInstruction { + if (instruction.accounts.length < 3) { + throw new SolanaError( + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 3, + }, + ); + } + let accountIndex = 0; + const getNextAccount = () => { + const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; + accountIndex += 1; + return accountMeta; + }; + return { + programAddress: instruction.programAddress, + accounts: { + rentalAccount: getNextAccount(), + carAccount: getNextAccount(), + payer: getNextAccount(), + }, + data: getReturnCarInstructionDataDecoder().decode(instruction.data), + }; +} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts b/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts new file mode 100644 index 00000000..d0ed2a1a --- /dev/null +++ b/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts @@ -0,0 +1,242 @@ +/** + * This code was AUTOGENERATED using the Codama library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun Codama to update it. + * + * @see https://github.com/codama-idl/codama + */ + +import { + assertIsInstructionWithAccounts, + containsBytes, + extendClient, + getU8Encoder, + SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, + SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, + SolanaError, + type Address, + type ClientWithPayer, + type ClientWithRpc, + type ClientWithTransactionPlanning, + type ClientWithTransactionSending, + type GetAccountInfoApi, + type GetMultipleAccountsApi, + type Instruction, + type InstructionWithData, + type ReadonlyUint8Array, +} from "@solana/kit"; +import { + addSelfFetchFunctions, + addSelfPlanAndSendFunctions, + type SelfFetchFunctions, + type SelfPlanAndSendFunctions, +} from "@solana/program-client-core"; +import { + getCarCodec, + getRentalOrderCodec, + type Car, + type CarArgs, + type RentalOrder, + type RentalOrderArgs, +} from "../accounts"; +import { + getAddCarInstruction, + getBookRentalInstruction, + getPickUpCarInstruction, + getReturnCarInstruction, + parseAddCarInstruction, + parseBookRentalInstruction, + parsePickUpCarInstruction, + parseReturnCarInstruction, + type AddCarInput, + type BookRentalInput, + type ParsedAddCarInstruction, + type ParsedBookRentalInstruction, + type ParsedPickUpCarInstruction, + type ParsedReturnCarInstruction, + type PickUpCarInput, + type ReturnCarInput, +} from "../instructions"; + +export const CAR_RENTAL_SERVICE_PROGRAM_ADDRESS = + "8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ" as Address<"8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ">; + +export enum CarRentalServiceAccount { + Car, + RentalOrder, +} + +export enum CarRentalServiceInstruction { + AddCar, + BookRental, + PickUpCar, + ReturnCar, +} + +export function identifyCarRentalServiceInstruction( + instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array, +): CarRentalServiceInstruction { + const data = "data" in instruction ? instruction.data : instruction; + if (containsBytes(data, getU8Encoder().encode(0), 0)) { + return CarRentalServiceInstruction.AddCar; + } + if (containsBytes(data, getU8Encoder().encode(1), 0)) { + return CarRentalServiceInstruction.BookRental; + } + if (containsBytes(data, getU8Encoder().encode(2), 0)) { + return CarRentalServiceInstruction.PickUpCar; + } + if (containsBytes(data, getU8Encoder().encode(3), 0)) { + return CarRentalServiceInstruction.ReturnCar; + } + throw new SolanaError( + SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, + { instructionData: data, programName: "carRentalService" }, + ); +} + +export type ParsedCarRentalServiceInstruction< + TProgram extends string = "8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ", +> = + | ({ + instructionType: CarRentalServiceInstruction.AddCar; + } & ParsedAddCarInstruction) + | ({ + instructionType: CarRentalServiceInstruction.BookRental; + } & ParsedBookRentalInstruction) + | ({ + instructionType: CarRentalServiceInstruction.PickUpCar; + } & ParsedPickUpCarInstruction) + | ({ + instructionType: CarRentalServiceInstruction.ReturnCar; + } & ParsedReturnCarInstruction); + +export function parseCarRentalServiceInstruction( + instruction: Instruction & InstructionWithData, +): ParsedCarRentalServiceInstruction { + const instructionType = identifyCarRentalServiceInstruction(instruction); + switch (instructionType) { + case CarRentalServiceInstruction.AddCar: { + assertIsInstructionWithAccounts(instruction); + return { + instructionType: CarRentalServiceInstruction.AddCar, + ...parseAddCarInstruction(instruction), + }; + } + case CarRentalServiceInstruction.BookRental: { + assertIsInstructionWithAccounts(instruction); + return { + instructionType: CarRentalServiceInstruction.BookRental, + ...parseBookRentalInstruction(instruction), + }; + } + case CarRentalServiceInstruction.PickUpCar: { + assertIsInstructionWithAccounts(instruction); + return { + instructionType: CarRentalServiceInstruction.PickUpCar, + ...parsePickUpCarInstruction(instruction), + }; + } + case CarRentalServiceInstruction.ReturnCar: { + assertIsInstructionWithAccounts(instruction); + return { + instructionType: CarRentalServiceInstruction.ReturnCar, + ...parseReturnCarInstruction(instruction), + }; + } + default: + throw new SolanaError( + SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, + { + instructionType: instructionType as string, + programName: "carRentalService", + }, + ); + } +} + +export type CarRentalServicePlugin = { + accounts: CarRentalServicePluginAccounts; + instructions: CarRentalServicePluginInstructions; +}; + +export type CarRentalServicePluginAccounts = { + car: ReturnType & SelfFetchFunctions; + rentalOrder: ReturnType & + SelfFetchFunctions; +}; + +export type CarRentalServicePluginInstructions = { + addCar: ( + input: MakeOptional, + ) => ReturnType & SelfPlanAndSendFunctions; + bookRental: ( + input: MakeOptional, + ) => ReturnType & SelfPlanAndSendFunctions; + pickUpCar: ( + input: MakeOptional, + ) => ReturnType & SelfPlanAndSendFunctions; + returnCar: ( + input: MakeOptional, + ) => ReturnType & SelfPlanAndSendFunctions; +}; + +export type CarRentalServicePluginRequirements = ClientWithRpc< + GetAccountInfoApi & GetMultipleAccountsApi +> & + ClientWithPayer & + ClientWithTransactionPlanning & + ClientWithTransactionSending; + +export function carRentalServiceProgram() { + return ( + client: T, + ): Omit & { + carRentalService: CarRentalServicePlugin; + } => { + return extendClient(client, { + carRentalService: { + accounts: { + car: addSelfFetchFunctions(client, getCarCodec()), + rentalOrder: addSelfFetchFunctions(client, getRentalOrderCodec()), + }, + instructions: { + addCar: (input) => + addSelfPlanAndSendFunctions( + client, + getAddCarInstruction({ + ...input, + payer: input.payer ?? client.payer.address, + }), + ), + bookRental: (input) => + addSelfPlanAndSendFunctions( + client, + getBookRentalInstruction({ + ...input, + payer: input.payer ?? client.payer.address, + }), + ), + pickUpCar: (input) => + addSelfPlanAndSendFunctions( + client, + getPickUpCarInstruction({ + ...input, + payer: input.payer ?? client.payer.address, + }), + ), + returnCar: (input) => + addSelfPlanAndSendFunctions( + client, + getReturnCarInstruction({ + ...input, + payer: input.payer ?? client.payer.address, + }), + ), + }, + }, + }); + }; +} + +type MakeOptional = Omit & Partial>; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/programs/index.ts b/tools/shank-and-codama/native/tests/generated/src/generated/programs/index.ts new file mode 100644 index 00000000..06d01a8d --- /dev/null +++ b/tools/shank-and-codama/native/tests/generated/src/generated/programs/index.ts @@ -0,0 +1,9 @@ +/** + * This code was AUTOGENERATED using the Codama library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun Codama to update it. + * + * @see https://github.com/codama-idl/codama + */ + +export * from "./carRentalService"; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/types/index.ts b/tools/shank-and-codama/native/tests/generated/src/generated/types/index.ts new file mode 100644 index 00000000..df062dd9 --- /dev/null +++ b/tools/shank-and-codama/native/tests/generated/src/generated/types/index.ts @@ -0,0 +1,9 @@ +/** + * This code was AUTOGENERATED using the Codama library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun Codama to update it. + * + * @see https://github.com/codama-idl/codama + */ + +export * from "./rentalOrderStatus"; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts b/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts new file mode 100644 index 00000000..f4d5054d --- /dev/null +++ b/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts @@ -0,0 +1,42 @@ +/** + * This code was AUTOGENERATED using the Codama library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun Codama to update it. + * + * @see https://github.com/codama-idl/codama + */ + +import { + combineCodec, + getEnumDecoder, + getEnumEncoder, + type FixedSizeCodec, + type FixedSizeDecoder, + type FixedSizeEncoder, +} from "@solana/kit"; + +export enum RentalOrderStatus { + Created, + PickedUp, + Returned, +} + +export type RentalOrderStatusArgs = RentalOrderStatus; + +export function getRentalOrderStatusEncoder(): FixedSizeEncoder { + return getEnumEncoder(RentalOrderStatus); +} + +export function getRentalOrderStatusDecoder(): FixedSizeDecoder { + return getEnumDecoder(RentalOrderStatus); +} + +export function getRentalOrderStatusCodec(): FixedSizeCodec< + RentalOrderStatusArgs, + RentalOrderStatus +> { + return combineCodec( + getRentalOrderStatusEncoder(), + getRentalOrderStatusDecoder(), + ); +} diff --git a/tools/shank-and-codama/native/tests/test.ts b/tools/shank-and-codama/native/tests/test.ts new file mode 100644 index 00000000..f940acbb --- /dev/null +++ b/tools/shank-and-codama/native/tests/test.ts @@ -0,0 +1,149 @@ +// In-process integration test for the car rental service program. +// +// Runs entirely in CI with no network: the program `.so` is loaded into a +// LiteSVM instance and exercised through the Codama-generated client +// (tests/generated). It creates a car (add_car), books a rental +// (book_rental) and picks it up (pick_up_car), asserting on-chain account +// state after each step. + +import assert from "node:assert/strict"; +import { readFileSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { test } from "node:test"; +import { fileURLToPath } from "node:url"; + +import { + address, + getAddressEncoder, + getProgramDerivedAddress, + generateKeyPairSigner, + getUtf8Encoder, + lamports, + pipe, + appendTransactionMessageInstruction, + createTransactionMessage, + setTransactionMessageFeePayerSigner, + signTransactionMessageWithSigners, + type Address, +} from "@solana/kit"; +import { FailedTransactionMetadata, LiteSVM } from "litesvm"; + +import { + CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, + decodeCar, + decodeRentalOrder, + getAddCarInstruction, + getBookRentalInstruction, + getPickUpCarInstruction, + RentalOrderStatus, +} from "./generated/src/generated/index.ts"; + +const here = dirname(fileURLToPath(import.meta.url)); +const programSoPath = join(here, "..", "program", "target", "so", "car_rental_service.so"); + +const utf8 = getUtf8Encoder(); +const addressEncoder = getAddressEncoder(); + +function loadSvm(): { svm: LiteSVM; programId: Address } { + const svm = new LiteSVM(); + const programId = CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + svm.addProgram(programId, readFileSync(programSoPath)); + return { svm, programId }; +} + +async function carPda(programId: Address, make: string, model: string): Promise
{ + const [pda] = await getProgramDerivedAddress({ + programAddress: programId, + seeds: [utf8.encode("car"), utf8.encode(make), utf8.encode(model)], + }); + return pda; +} + +async function rentalPda(programId: Address, car: Address, payer: Address): Promise
{ + const [pda] = await getProgramDerivedAddress({ + programAddress: programId, + seeds: [utf8.encode("rental_order"), addressEncoder.encode(car), addressEncoder.encode(payer)], + }); + return pda; +} + +async function sendIx( + svm: LiteSVM, + payer: Awaited>, + // deno-lint-ignore no-explicit-any + ix: any, +) { + const tx = await pipe( + createTransactionMessage({ version: 0 }), + (m) => setTransactionMessageFeePayerSigner(payer, m), + (m) => svm.setTransactionMessageLifetimeUsingLatestBlockhash(m), + (m) => appendTransactionMessageInstruction(ix, m), + (m) => signTransactionMessageWithSigners(m), + ); + const result = svm.sendTransaction(tx); + if (result instanceof FailedTransactionMetadata) { + throw new Error(`Transaction failed: ${result.err()}\n${result.meta().logs().join("\n")}`); + } + return result; +} + +test("car rental service: add_car, book_rental, pick_up_car", async () => { + const { svm, programId } = loadSvm(); + + const payer = await generateKeyPairSigner(); + svm.airdrop(payer.address, lamports(10_000_000_000n)); + + // 1. add_car + const make = "BMW"; + const model = "iX1"; + const carAccount = await carPda(programId, make, model); + + await sendIx( + svm, + payer, + getAddCarInstruction({ carAccount, payer, year: 2020, make, model }), + ); + + const carRaw = svm.getAccount(carAccount); + assert.ok(carRaw?.exists, "car account should exist"); + const car = decodeCar(carRaw); + assert.equal(car.data.year, 2020); + assert.equal(car.data.make, make); + assert.equal(car.data.model, model); + + // 2. book_rental + const rentalAccount = await rentalPda(programId, carAccount, payer.address); + await sendIx( + svm, + payer, + getBookRentalInstruction({ + rentalAccount, + carAccount, + payer, + name: "Fred Flintstone", + pickUpDate: "01/28/2023 8:00 AM", + returnDate: "01/28/2023 10:00 PM", + price: 300, + }), + ); + + let rentalRaw = svm.getAccount(rentalAccount); + assert.ok(rentalRaw?.exists, "rental account should exist"); + let rental = decodeRentalOrder(rentalRaw); + assert.equal(rental.data.name, "Fred Flintstone"); + assert.equal(rental.data.car, carAccount); + assert.equal(rental.data.price, 300n); + assert.equal(rental.data.status, RentalOrderStatus.Created); + + // 3. pick_up_car + await sendIx( + svm, + payer, + getPickUpCarInstruction({ rentalAccount, carAccount, payer: payer.address }), + ); + + rentalRaw = svm.getAccount(rentalAccount); + assert.ok(rentalRaw?.exists, "rental account should still exist"); + rental = decodeRentalOrder(rentalRaw); + assert.equal(rental.data.status, RentalOrderStatus.PickedUp); +}); diff --git a/tools/shank-and-codama/native/tests/tsconfig.test.json b/tools/shank-and-codama/native/tests/tsconfig.test.json new file mode 100644 index 00000000..22bb5919 --- /dev/null +++ b/tools/shank-and-codama/native/tests/tsconfig.test.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "module": "esnext", + "moduleResolution": "bundler", + "target": "es2022", + "lib": ["es2022"], + "types": ["node"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "noEmit": true + }, + "include": ["./**/*.ts", "../codama.ts"] +} diff --git a/tools/shank-and-solita/native/.crates/.crates.toml b/tools/shank-and-solita/native/.crates/.crates.toml deleted file mode 100644 index 13c0b457..00000000 --- a/tools/shank-and-solita/native/.crates/.crates.toml +++ /dev/null @@ -1,2 +0,0 @@ -[v1] -"shank-cli 0.0.12 (registry+https://github.com/rust-lang/crates.io-index)" = ["shank"] diff --git a/tools/shank-and-solita/native/.crates/.crates2.json b/tools/shank-and-solita/native/.crates/.crates2.json deleted file mode 100644 index f638b54c..00000000 --- a/tools/shank-and-solita/native/.crates/.crates2.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "installs": { - "shank-cli 0.0.12 (registry+https://github.com/rust-lang/crates.io-index)": { - "version_req": "0.0.12", - "bins": ["shank"], - "features": [], - "all_features": false, - "no_default_features": false, - "profile": "release", - "target": "aarch64-apple-darwin", - "rustc": "rustc 1.66.1 (90743e729 2023-01-10)\nbinary: rustc\ncommit-hash: 90743e7298aca107ddaa0c202a4d3604e29bfeb6\ncommit-date: 2023-01-10\nhost: aarch64-apple-darwin\nrelease: 1.66.1\nLLVM version: 15.0.2\n" - } - } -} diff --git a/tools/shank-and-solita/native/.crates/bin/shank b/tools/shank-and-solita/native/.crates/bin/shank deleted file mode 100755 index 89c990f9c2ef0fb943606b47160a8b398d82c0d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5946147 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

EFmWmb+CA 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

CeE~94087IqV=0|5Wn@CGm&Sl-<*%E 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�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%0D$XJbRg}o7)Ciy#KWK8@DrvB3Y5LX%K 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%0A&e=_TRk`xl2x9&m??t32UD3ogP>A^Z!xOrPpU z3L8^_QN6m*RsA6Ufm8hu{~s903QTAUHLWN|_WlV~{c_9-fp*;qHyp$6Zo$0H&k3#f;H4c4XGk3*$ z(g&8oBg?&zGHig9K5&0pf<7>qlBM*42C>0yeP9`W%L25&W&d<_zruiqc06k%DV}xn z%c2YH9}=5_$QpV+Q$?&9RW1+j z0p1PXi+Fd1CGIQdG46U?AUeZW?Ykb&-fP|UcsA9(>!H7Eec`Y8E_|PfoVSLOYS#)p#zllz(Xtud@1yG&Q5P1gE#fe zuavw(gGTNwIQyz)TXEe&`sy%!wGup}pH@2ii92Oeg@&B7h3|3U(^J|!*x6=uCdqBy z_)ub-jZf2N#*^LVyOY}d;p5gE5qYiIOPkl*Z6>d3GrkWJ+C1)}p4&XZ8k=Q$Y?kS< zS+2)snI4a1&W)c-qy8n4RlhPl_V0qbQ{>jHm9od0V=k^U z!BOUk?7=pkvR=p@ZR06pQ1);eR});-{tljM&ApH~v3gG!&zLpjo=DDVp(@hEu9ZD; zjq&_BN>(Q_NcCQNu9B6>nMl2V{akgIRQ=y|j*`RuyW0HJw=8+wcW8T0FxzRjvwyw= z{yp_k{FO9)SL6ae=i*n38}aYTxM*e{eD<5zkJE?m(Y_PV+c_pGf&0&ni=OIyLf09k z&Ys%Y(>S~X+??aEr}~!b`X1?}zPo_wq-)#$*#!x7b&UI->bptTcLnt=0j86t?eBf1 zz)918M}3#-`b1Xu|DwKgbbT`KMgP)MAO5>&I>b?@!2EeH_5QoY&ap+-{E)WFm|N3J zz5mX+`L?5Ond5RV^Z(TxZE(~r>%ir`v|IY5u$Mf&^~uCu%6COukyBStx9k)4UiQz< zv6GyqWG$4~p1sjI8JDB%Jqc??(mrX!UW&}*dXa&1=6vIx__}Fn#;q0V{fy9SypQU5 zA07Gw@9(DS@0>ATS`Kh0B&*&j0Gd;KOrx-e0(2*#m{;=pus4FXKJP|0?n=E3A0Qtz;GlkXN{nnKY*t zhs#GlQrO(TB<(nA(E~Hv7d~yoJjhc-mQgl(bz%AF2Ma}> zQ8xM^{y$v!o!8x!74<2h=>B3Q8#Z@eR9W#?cV%$->~Pug0pZ|sWCqKFQ-jOD%zM9Z z)v`;&<;(h$K8yDZ-Y?<3Z}_g_K9v=#i1m@J;Y_)(vf@(Gp74f(%V!`z=@SlKX~|iF z%ct}1rfg~0#knK6{30c1sake1@2+s=(Gx&euhh>EYuesWSCvk=i&N0o^7Q7|MRz!Y9ehc2bA|<<8c08UH%|h>*av}1( z^l<)V@K3u_ct?hp>J8_*N|59E@V^q^J(c$&-qXU-Y^?`=rq2u;oRth7exYTh_fe;=v8_Y0e2beZ?8v^~(PPNNbYku1r+y}}*CQ_zlg=NSJ zbJB`=cO!Ey375mC=O7y?gHO*zHc}3s9!0jIV7F@6EyFAAvw8c{27t$tiK!s^H6Syn$T8y1dYi=^P6(C|+TuWU@68J6`XxO@nGUdq_aq|awC zRtNKbG4BI;pU(TB@E+!Z$g*6s1Y+5rvb`YS5Uaic18%d3Ec4s*$@24tBH z=7}pS8JCrf%depR0pZ49HZmWBQyZ7h;k_St%mttR;YQYrAaimL>q!-3!JKkQgPBeF zC0AFPQ~FevLI2=#pOTdZuS6aQ{e#QXpf$3oW%z}G{=wxbyd#@hmKru&DL>EEV76RC z{ch@?7Y?TO37h*a=1gM58kb*#FUvIQyOz1;rG9+xU;mJ5)zC}`z7fZa)R99GdKG{ExFTS`=_JA2D7!7jQN&RQ+dF=lpU$M_GoU#6u^NW4fQfCfyy9Y*aS5oVC z=W=Ec{jKO`&!g_xEdvXVE;y~A4SXeS0%`5<@xFgRfxOEeE6#oQMh$p1NfyZKRH?YH+ z9Izh&cDx(d@%{LDYTyM~MLz@9!D7q5JA3T)jLReQ(ukkz zwfwsubo-;^6&thWdc*SXPFiRD+OnxVROL@ zRd)oP`&8r|mJe0yTfsnV(#DBD_u^CICok}+a;`ItxiNUM=4YV?{-Uo(PL9n?EV3D& z=fj70_;WA)X_7y8Xd?dHedVs&*ss`=;mPtPezHm*UjLI__;W{AKM8;C$LZS>*~$Lg z`_x@S{N&Qj&~dyG8*B_+C3iN5i7$6}2x1hU5<7W__T@g0*vVVnjqi8|HojA%VkZw( zv6BlNv6Hu^8m|p;4N<<_y=lXgFZXh>`9$94MWkA#=h;#UDn#q>c`!MeFHj&&@7kHQbT*iKfBnUi0za3XR!Nwe~PhF&azTx zcRt*&zn^i{&saScI<|n9(}(+h`uPi#w|%%bQb$YPRdt7+>^^3)U-@qzuKl+UZ>hV} zn0r=&|MuY>{@eEx9~tBZdj&uGt2J%Ih-~hC&c$DQMOyY}ijlnPp!VC!`qhN3W`r^C z^w++O@B7ZjH}@9$h50thHQe&o&b(9p+LsVVR{XW|j57b6{@N!b`D?FnyKBoX#$Wqh z#iSN_^#@PqcecOxr5M7>eweW{-JPJivuqRtq}w=YkMk<9v8 zWumua?XzPf2j0d`WDfp&-@-rTRrr18Y5M?~1}(%N)PXAW1u01}lJ|DTNFL7m<;VZi zpR2`RyXE6yJY~gaOAvqUBiI`vD=uRl92{1Doae!pBWqV{BXN^eYz+LCDxb%|jm;^F z#jw3RKCdWtZC_#}S9Qin9f}5#8(OD+gOxzQ>R}; z`V^5BsQ7>qBYAjzbS-{mD5HFMvqu_L4-}eeUF;jWl)gKH4j?iLf9-k2_?It^jhc!d zbMZ+{j6`ezKQj9BJRM)M#GddPfrhc@eP<3CEOC+>i2Xa$_ocwDndoM9oaC`vKW9wr z$oH-8^D)M6tpV2={3f`tNd|ZBtf)F8Syr8!vJHu;d`g`KNp&{maj)6V=cqF|Uviz; zcPe`|ANBqyfp+5SenkD_nszD{a}w?1#GJ9|7KLsRXf_SnsaVX=tr5SP)1cd)^iN4Q z-)E;=K6INVV_~oO)wkj{AHSQizjv0uDb1MpJBizD1Y!mBS;6Uu)iH>pLuJboqq0!`7He>F=;C)vzGsN>aw42DKGtKr(y3f_ifVHM=y8M`5(vXvCD?ofG(ncjVuw^KUKG`IqYa z9+&0YxddOO@UVL>fR?(B(a1^7>aSS5==r2mPxAokT5(!f&iiHydlhjR?EEWq9W{Pk z$DO*4R`_krr%V6ae0uYb<8$SVCv>st5Iq*3`;h4UX)kAn9UpKOiBvTfia#ZZJ5nHP zY87#c9|=zVJ8SMC+Bs9DJzpp>lUiuUQrb~YKehl@&Z`>C@jbzJK_)#Qiupnm&>Jn7OO=W5*nx$JmPG1!9wK zkFQJT3^5p-kaAHSz>=!UNoKZ<(}vDHN}w;i8X?XBXwdboM@V)^eJOreDes+w(EWw`q91n9qTikJ=HaVOu!kDb6?o7Cq5oA_Pb!mhAk@vRF zYea1ly~@B>+3k0;PFzM=89QHqX7(N(q>RWT)uJ`H^UG8&~iFmD>}g)^W_;a zH#!rk-|my~x=*AHkt4_wpsm;uuf8q5ZnMl~+En8~k7 zfBq8V$y@)zBfi?VNjJn+^{`*vaeI&Uiw;Jm<)5!?a}JQ!pR|o)zY|FhWkPcozrTRyC>KEn!I8ooev*v`%J2WUvt_>bM8y@nFQU-u#t|yZz>zYPbYz7` z$D6Jx97@|_&_mIUc+=8W^`CgtB3ri7&kZesUJp9+>bTPCJ8`82-`mJjO&(dpZC)n; zpV`8hZq`8Llq*U)?5-oNO$k1ja<9Y(HT`<~GVxVEm_D+6FwI-ztKBNLRM=ccsy*Sw z*j>w>G8DV(eCT`?Ke?lQO6=$<$T>^koAft)U?;|o=DUg=z4>AlJGu;hC$7sJ+nnlG za|t}e7WjN{XgfIAU%|bjCVT)@aPO!|d@~L zJ!NI?Nu5HE`yKSSg8%39?P<#XLYH^auF{crCjZBicMJJ`s`Co%_Q5L^kiJQ$$$laI zr)UAL6_iVs!>9B8QSz%hT6SK>v5R(#?(ty_OL#Lm>y#*bs(d>7;HPGI+}i#qK;x+s_TrF!HZi+Z_BSvraM zn(P@9SR)6g7!!|HBbVW4>z`7g_mP7G{7pCX2`$ujDP>JF;~s2aFI9b8RSXZa`4WEt z>rQktacE6 z`Y6(6U&`YQvY^;Mk}+lP@iuPnG7h@aU&*;${Nskd9A7s{^g7ZmWErxb$sO`Tvy50y zh;!`Pm4!K>-|<|<9`j#?5$;==3(zSsW~;Er{_|*8sO=!WhTkiSJ?kFak_*4qJc7HO zWr`o_xZC-&>sgPOpC`bx`IzKI7sTBPvlTvcg;AF|e8}puRK|6GWG*Sf7x>njp0v^Q%3&>7U|7`&weN>_Vb!_W<7uXpN((3f&xu zor%&9fo}j^PlWv>?#^uKF3zviF_=1Pi1XW_8*=+vHlY_8>I%f3Krhtf&pDxbE-B)j#l9aes+{T|d*6)iMJ<;!x_$)ftsHwZ~l4 zXt3yXW6;u%J-1ddf38AjG?sD|qzk`w44$K6P#{KJ$5;irqFtm({mJ#l8H*9>dgAk< zE6P&3qWP}=s(xEH6oKD2)9AZq>iF>9eKY%Iy{z{1vg}YZ`;@HdGm#N*Wc*J?NAxUs ztc=I!PBXGv3h4KizumnrW8tFnT0V(Sl>OrvZJbZ++j3+!$2|Qy@H83Y3+s#PGKf_> zGdE*>%l@L+VdmE&+9rOA-#@`z7?W0Kj_cI<3O{3(^zpYW9b9*K{*byzT1NQ&z3^;# zseV&rR?PJ|O~NBw?62?|6WciF%AS&s%p%I%n1H@g&hCR9=S%wbBlzvPa;^+=?w50B z5l{Q<|F^$rxy5_dnK=R+`}{BGz`yc+NSd4@;I%x4|A<~U2OQuG#9G*)$Dxi0=M^P4 z!dFF=$bNLJx<3Fzc%!YifV*Bx%gDcP88(l<(q(ohmT6RFGV9khyAPL+{6CkJojv5 zd?)ydMX#mKJ)v1Os~u+3 zI%iU-oPAQk;w&om! z&Ts)s@wVW!6r6ITPQFQ+lXtEMj>JThbH@_?3lIJ_`QGXx?*>QSZ}VT)=Rc6|_xxn- zbi$56!^y(W0{e)Z7vO6zVNC5IZzI1Rd0Wrm4&NdFv9s#g&dSUBAMv;?UY2{dbD(iE z??UgZo?`v<4DNCL{H*uQC2q4?Q%>kL@q-33kTffvA98{?I-?fOthZAp?r|v})c3GY#4}y7j3PUJpWBMxmubZ2vFDAT zu4}VBp&`umozI;Snnc=4elz*a;#bPg9G_kw&uCtndLGL2Dj(A7+ZbN~cM3k*!?{rK z6qYQNF5u8QDB|v0vQ>#!s@qPu z{hHhZpY0#@MeZvQiw>Hon1A(mJN!now@Y0c??qphS4zA?L-~zvyg}Y))Wta~OcP(I zydR~`69-fM@5(*!RqXB5E4m4h{p@D$9^IVj_j&>i`5vReJ0Y+ue*&@}Xe;^r$BBi! z`BMMUnb`PAInt$ESeJt@RprE2jViZS{Lc&sox9Rid!^iM%_L6z9TKy<6UPYmznwUi z@$STN;{%B}ezzAKPt!PFd43{}_xFP1xS*@{HO^V)bnf4Bm$e!HzX^D9XFCB;-ko@s z1rzbC=mpQe#VlHWZ*n4@*Y<*E4zVD23!YQJ6JI0Ew=gEyN2JeXJeDax(VcxB!B4ak zPea{#?(FjmdcpHI;MvjFtU>3HU*d{O+VDB#w?4D z^jZcYX|>3k1)rEIc<|mx$*^RpR(ldv5C!Webw1b}C z?*-4H8qY~dc&_RN&p|b=+ET%Dnx-c{fSq_orX=E7#=8^Gobp6^-rNhGhuif$7eCex zdY1Kq=b6xRg5WvF!n0_0BA#W~SUAUL#Gi;~WL_ek7xseZb2gsXbvf~z)C-;`A8^%X z3!Wa!-?o7t^@R0E`G@WtpAq~+JLwr@oT&QrJQ~ppp5M3e6#vi;diL!F&+YfQYCVEy ziKgd8iS&$&O{8ZT?@m0+@T20y^TU-r&-a@(osz z>pAGaSWjcJkE?wiS&9?4AamY{+l#&6HXYnLaAHmWE&1hrl^eSWWKZUJkue!N-iKZt z`Pk>TlP?Z`&>ik)RKv3%4!d~D!qv32F zpy6C)!TDwqK3DYuXNJIm-WC0f9YGKNo0Se$`)|%0Stm5VDhXzBFEA%+m`&*#CU*Tf zE*s|O6wKlzm|yG#<}%&he6McrG^@Q|N`jN!3!HCjIA)55GslASxgW|}o#y-9FeYkD64r8a)zhg$fd5(~ehC*g-az+Oq_^}Eam=Gai?mdL%^ z1{gb(&9dkWKG6P+k$FkHG4lhLlFxBA@GDtnz~Z}v@6Nl9ISZUVvZkGqPyA9?{P}R5 z?|7H+@Byv!4bb^M>@r^`ycC`9Z(ZeU#5c8ucVeD}-(R}Q7wCldkEqW}>aj9_=pG98HQ&(}Oyz70|aMm%A_ei?eWehTTxA|GgbBp9* zjZ%5wb5$PR?K6(#xk2)RU%+~4L;+vUIB zW6LRfDP=`|Bx#1=2tV_d+nX-=M|!;J6>`4jEF*ps#Rs?W5%lqnSQ_($d8ufz*7B1* z9NmDNA?3UB!M24Mi`>tStP4&R+~VW04H}0pFp;;*J|uhDd&F0hyWDfIIoZ-U^Z+`M7^KmeWTcLe3+&D;f%1qzkN{tyTe^cREiXq_E_a2L z{n#et&oc5uAQo`uhj|9 z)5jY)jt*jOGrD)i!4KPn`LlAm0$^bTvPbsh$08; z#8-pxI~CY0iO&Y}1pDdVh#xx&9}4()xcy9QPqO(xG&uFHWiJ1Bmb?6SuX6d9JnZt{ z`CXU)p6_A5$yly<+~vRHM=pOhzN6`vr^I(OYxWxZesST~EL(%FzMacAk?V?#^;x&^ zQ5$neY%pq(!%FPY@A8!Xmw6<6h>M@(mG(^JCv&0#nnbF-p<9(M#^S}xp;sg=5WD)D zoYVEWOvn3V-Wij`enaHKHvLTM-AXJ_zD<_uJR zREw@X(hW{-h11~r|E>_3yoFDYc9_&LxC)srG91+w_&x2@Aphqlc_q&#N1ogGFK}Mr z`yX{4p}`5pkJLQ}S~Zc5jPr&=*oTVR$8u)K5kAHfoSN(7PH6^r z96bSS|1#_M?>1_i8H;;ZlkB-`wWoyk6xRVW)bPg1EZ_g(?)}4~s;-6qGczHXBw&OP zf?y>fS`uhQ1%>FOOcIm;3QD4=u_ZCKqS$g`w?pu2=iL{qY=oD@N zF=|U7s3^6FsMOM4&LmpTB(y3?AOm>k{jBpN8A1r*mVTe_^Zqft6H<<6;9|Z`(S>j*b01WvDxRCp2r+ zebfd0t7Gh)tW#%QhR;9I?N7Yc?a#6$zB$J>^vzA!>z%ZJF@6S|y=lm_IUDMSDBC>v zKh&|#DxjNIAD&`Ug719sByJ!-@U9>c8E7r!95g zI9p14Gxn}3>QZc})pBoE3%0uj^wY_j57|?yS5xQWSS6c!v#s$tzA%@#?R)BFjGSql zm7q;G=yu^78tk91I4Jf%fz`MCy^MV(aF3$9Gkg+L_4>xZ@72)O|0X@+7;>O{(WQ*> zaK?B9^PkN8$M~%KMC&-OR`p@^J6iRxk7(|G!p8CTv|Izki z6Tjs4&tY7b*y7*((x>k3zb$$4oncr1>eyRvy>%?`)X`&4*@iI(iTD=`ZJ3y(Y+pZA z`Rrk3{m*uBCT=cg1y|gud{!#YHqL-v@Af|htN^f<;3xFVub+D7?@NAt?3t^7e{9|} ze?PXwcFCK-Yp4d^zM;zYxx@JWHohOq_ss7Z-~X4p`wv$?_0BWD{?)O+Z~FbQKRkW( z%%`88jG+62bdATB z!5mGL`A61Ea46Gsc+h!p;vG55IwKx^0qqN+JE$OjP%SYzs_?O>$H$`HYdautUBIpN z7IzE1sdL=d9Zhfk`0nW%fi;^t68H)HCVU_Su803fWQaeqBF?`va-(inP*Yj&^dabd z%@y>nc10E{;X22kTtWPyB4w-z_RmuGQQ2qJ%9-r99%3V{bb+&ajQW(f@dcv)*RwXe z3Y~r#hpr8Zzn;3GT_X43qlEo|v8ki|AKe|lPR0Pd_H*V0S~4{XuSYi2)Beww7lNM) zz|%We3%5gC3_9640Nnjia6i>?9lKH@cbiB%uo>yR7JK^csF)$MSR2;9ZPDL|TSwUx#A?jt>f-_?nHTXtkcyuUu*eqbc`ulk!E2d0xZhH|6$*SvOLGS3>{ zs=(jzpt4RoG~bW?Zu|E}Fpq1La0&W|3ibglKQ~+8i9cE`_pjAEQm3a$%o>RmLpdC)jIx&dFPx4ep?ke^^SYGwdG2<*6~O1GFFc(rGbwv)9}%E3<+#^4DYs6 zuEgGyQ|nmkS`3Y=cZ}?oKC6sT9rZm=yAHNUeG9wmyCc|QM>V{rDeHENeSQK!L-+oeHjruU(yYVRumEf772v=x+DH z(>3*9H0cEAfq%f7PKH)QA_;!QA@|R7&Wti?BSi)xMhdcuGi!)X+Mp;r1u6*Cyg$CjL>{1mbv4it$G#v6jHW z9=ME$v_s&2y3knDPKV-`F&g?O+d4O}I^c;k_y_5miXXV-ef&ooc2VwA2A?|NQAb`GFHx|qx$)qSlLGt~1{klG=$Fj1%&U#L7|+~QP_N4R`91Ynu%sTLY4v}N@yow+ zAvW&jxB+eZ&KP&L_PUZC0l$Rj&EwAHuD6=4Zx7`&g@%0-{JELEXH&Q^CW)X z<0xaZ>W8i^Ctu_yy*WNT;pW#h=;dH@P7_W;cZ4m)80~( z_CBq6C=6^=1BN(HD4jV5%}wHXR}79cG9mZbFJqhn`F>NeO~cJ z%jVglF(J;Q${MJ3{M@85U+CV>zTLIKX3&^?i^hoF3L3LPIWU&_6#Af=K7PQ;uJhj4 zE&OZrI{5QDr)#V>Sa?|Vrx^ctV-4Rx_StOlX*zpd+gR6je}uCc#=5@Tpcm-&Y8|!% z(uR|FanDH<9BEt12R8legcj${?&V$QFy^z_ukj0L=8g&BT?L=vdu0C=Uws{)lMH;8 zy>>C<+Kboc9)}NTL*H?*aJ;TNQuG=)E_fkr{tS6hVCr~6TW1QMfTJnk#*^T91X|U- zD3Nv!rM<(zkxRf4hmIrL@@)r3N8^cSuy_&!o(wVY#EUM$A#$_LmxBFI@FWC|$X%Qs z_5vSmll@(2gv@7%xqZ|e8yP1_W4=F+SHAHd|6-KQmi2Fz&0a#9$ZDDFTijW*%}HLG z(AH(ETv_a0p=Cq5;a{@VWYUu1*E;a^iQ_CaZMctb1qUMR<=TW8ztzrf;*SvB&RlrU z2hFn4`#=|c(!b*_cik79@sfW2AHJ`56i=5v<|32T!in!vrJd{gWAGiUPPH@u8XD&O;6CNi5Jp1Es^==b4A;6bPA zd-T}uZQjefUtkT@(vE)tZk2shdoA)-sKfS~hwl8zG3O88c&>I-LG^aW*lza0XY(r3 ze07v%^zpXyb7v!FZI(XN!+bN%0ikKGpAy+ioYR9)VZ^IfS8Hr5&ZeM5zvGw|#O zk~YtSj-0zqn6p6i7>X~mtUE24`_V?=e-np(DOPEGh;dQl&_%Joi7rummV_q>BGa`1 zbD!WS^LHG)sJMiEpSfdC7!jh3jBn}Zk)q724Ek=Z^~_+5U*KB(`F#02aQilJ{8o79 zxvWQrz8+i0m}iyfZzBEeStrcP;}00?WG?kL(We3Z|C&>Des)Kh<3L9SeqOz6=IyMy z3*&3Q>48^(4m=*s*G@C}+6|ZZ?t@2dqmH6$CYEO<9d^Wq+`JUHIDEa2LAd`gCP`*A?)#AKSte!rR&n-d4{2hfMyqV!H6Rqo%vz zZ%dd{H~ei0ceB*f*IMdq<&GFtWU{!M0&0TL^M7;Id+&t5y{ucKEmFpP59^7$OviDz zg#y2rYP`XQemJKU-{rB+88&Kv;~2WlI|caKG2e! z!29i#na_J%pe2>quiWFL;=8CO(cd-00&3E{z(-4)a{kKiBY6JSk!#O;&pT$c85Dp*urAJs2AGq)op|5 znTf{++#q;-`JD#e8RQ&6`mpHzeq@9CcCUO*sRty*6$+xMxG2`=d)u75Z$*K_v@&@!S@# z6m@mT8R1?&`30$;b@=c{y?k;y@qKQjy=UyNbNgEAWqZ?VHcBG+Cf21r@^SpdRn}eKv>dRAA()MWC zBAY(Qc)S<|&yp?f0oFirz*E%Yhkkq+y3{6PXVQb&(5-pUEA9;S&Ea3@gUI?9lSX{W z=5DNI-~2MMri4c9=6tizh~312784TdPdUjzBl$Jh0AZvvvxgCGouLeD(>OE;q_KC|zzOKQsWn;Z&9` z=URMqFcc}0vk|J;D-GH4?L1RM=}mh7m)XTAar6j|}tr0aY*>o$>o3m-nE z!s0=ad|$mkQgb=weqoj4+W_Cn8SnLG+6bNnhQ+JYvW~h%mS+qVz86_>9c6oD#f&81 zr{qV=ipNVS&z!tuwqXQqsN|bSzQ_Xc@JR{qONqz=L;asS3|Sy0nx_d4Rt~Tu2RIBl zz+uV(Ud4C+zd(Zu-JBU?p3#A5+}D1Vy!O7KH(0zt@e6(Ae%^Pk=N}$j*HJwLPpSx? zFK6pzA3?4XJ*CK>S(H1Ao=&hM+d<1SEZJ_X$ac@>)h3{`LAGmE4tNWD^{~PNuZOlt zy#G-}x&EJs-C5^>uQz#Mu{oqRxc3u#gf`U@chRszq&7VLukq`|hH3D`hK=Jg#<iC?h==d!2DsrR9 z2v&cj?b4t5^hes3DSIkS*4b7>yo+U zneyAdM;+hAo;6Uz$zAYncqZE~u>s2-R2dU+Vz<(Y!41BZv2WpgnVa^DZAPuM z2ee}HZ^BjtOf}!;dmjItTJPPat>~UJY(=***V2aV=!(VGl!nYxacq|>4Vg#dTha6V zr}z$4=IJ_p@u?7cE$J2gU~&%Ti5gI`ycD= z62{x&m1+|eLuZPv>R#qqzA1_NrUE^LtWg`^$U4z+3ca<>i7uG`5IXnqx_s_z7)w72 zqzw9v`i-WZ9C*^cCDML)KLs6J5S!aB#@N!I4dXjm55%Nn} z;A(qnbsJ-F7kpbM`kl@Rv3`lUB6^e2%oX=hVOF89xt&66p<-uoAg=yt7 ze0M91?_~`orx{<`HRWBK9^(X>7jD7^B74KT*g!hj8@iw`^6f;*RM}J7OVP^+&I-+r z_CM%ev;bVc!+&}yHa622AzFV@g8qd4H@sVHW)*4TBjWop>rUod;wB2cl{wnUo-4iy z|Mf#tS4Y}Qq>0||S5_KrE-8uB2v4%nN(0`zx{hvS!2Cq`<_^GMuPQ{*f z*BSOS9iN&E9Zit2ExE(MsXFgn-MjkO)2;-*MKf~Ip)Lo1QvQs*8yVJPPa8uSb{XBC zhOGN`f3hxqls)#eCS=|1M{dBLHp;N4F;=C_fn`rSB=)q!*ZJ!i+Z`KjFzsohrt9s- zhgar9+I^kb?nnEvryc+O>6)8q>)CsDUwfJfm+`RRUJhL0W6&Y$_O$8H#TmfrgzlnC zJj0%r{7$cotJ7K5{NGk;*0~g)p0cxTY5Qnv7xYYIWWgUNx(&ha(+AFm z{qIq*t$FFSrJZ}MKEBsw5o_%7MY?}G*uLksSOCfoyU zxEq?a5S}s4vNilewzR(Z_=?$9i-)vqX~;uwoAS^WOCFl^gEQr!H+hI4;5R8hgP+(+PCl5xc=vBFiIS1FWO>f! zgU&^Nh1NQShZj491APZ|-|`rE2CuuA*e^e%%@$7_e~Cp)erD1V^#1IP(YASG?uO}b zf@O;DHs((F!aDE0eQaeT8-{~#Qcu-TXei?->+2zS)^AW}-*wteyP|F1y6+8Xdy(g) z4co9yyl~`kf9GMF|Ag2p@Egp8ABfLTeBF}_{wNKZt=9W9S2i+RqjzlgOAhQDUfY40 ztl3P*nD$!i1kwAgl3GyxB7BwJrwZ&9lzoBzjAri^p4K^xSTg_Wd@f=it;g%Hu#c`D zy}{=D3I7`v+q#n?vwQJLg5S_M_o2Z@N`LWv*gk0n7TWPF#anQzRM zwa%=y?|j$d;m@>XoP2Ojk3B-GDokbr*;Qq;653zi=obLv-i8$g8h@JU_*Y2}q z1muG)S#^WsODrFsqs2DA$OYopBfdUu8R!P#JKEq!+E~-FcDhX)i1_?y%?^VvX*T(i zj2Is=i+(ePZ#2qF|C_!B->~pD|K4PH6nKZO4JRMNZQ( z^j*g)TqWZ3Go>P@tJ3oGNtv!rGVC!bWhy9BPo1J`4+8UfU{-#>{@}esw=uejK~PKn zz0j@Kqxg>5sTQsHiAgI)K`ZX;hgO(=Jiy2U|Ad#V!-lhKSg%|l_#X@ITYFM2_l}6| zRoAnx7~aEooPHBOo>2qy9kt%!y*hULYS;F|*TZ+D7<>nP%V%7L@93KB4nM}-1wX;A zn}QpU=D5CLbdSF$v5~1uVhz6&~xvxfa{-(1Uo?^w>JjDyNS9pr!@Dy!x@o9ti zbc)8(mV_o=jc$Y0E@A9n0yPPgJ;$b46 z>V9cI<6U@zyOVo)7@6x?@C>p?WP@)you%(THFYPyGt*>_wEGO5?qn;CZ>RIE=yWHV zX_ih`*6bn_QFMQL#Q+@=$h{J*ZPdsCd z@6U2{y3L0FPZY26Y*uivyh)OpTl0Pz$=J;*aoiUztB-H{I56Gm&#r(ez_rVHL@bXe*^E+OYsBtAg2d~2W2jS zCH^yS-6#5nJN%1BE8Fix&hA>zUXJdkLVOv#x!Jle18`+Ouf599Ih3GtNJF<&f-i&U z^(j+R@!;z|CES|e4zyM$1RkJW1=t_lakfByBK|R_h+{WV2?xFNxT_MoqxZJJ?v+Yl z4{h%%M%Oi2+VE3iUkdM>+O3FR4RDR^AOZ;R1SbkTO98I~XG zA83;bUe%!^vi499x@Me^`{5@Nu_q1nN0u1&B~^X4P0NGW#D?L z$H4XbJxbsKc#KXH*VTor*)saQl{F%F1OmGtop<2o+Q4-Ox_lkiV~Eo<#MeUKv_s~) zgO_@ArQ-W;i|h|64Z{W3kzJDX|B(&D__xOW8pd7dN5>kIN0D(i$3n#x7s1au;z$?- zk7CDH+1~4`jIL8?a*wa_B1N~+^~!zcUQZ8zE3%%fJ#$w_q-Z^Bv_Br@;A3a%SH8`= zWpD1G{q+3@_X_PF+3-03BC}rdeIu5izE^+)qu?Q~A>B#3*i4N*B-ZzU=s&=tr%2b+ znClmSaTR4gr!MRJSiVmqt=mi!TdCw(Z4h109RiE7&f|O0&-~5$9(q(nS`V)SUAmoj z8M_ZD)5Ghu#`xU8=qU$YPo|vUbpm^xwDW%2d5CW=KtJ#mO` z^gN|@L$@A%kH|OauiWp_pU%cPfX-$c?Xz??dt*mc+tB3;?u*XmZeU(yoy{5Z_dRp| zthH;=(F@VpOb3^vbv9n)C~F-Fp1gmLf$JN=^UHNyx8ti32TyvoZ@-f>RpNtJ%NUQl zj5|B=!&fTMHQ=i@5_?`JcDeP$RZAxZPY({6v41u0gVpf!*Y%O`uwpaQSYtQg+x9hZ zPKSdo%?TV`mzFOvy%pa9Q|DfgpiI@zp2O#7LJQ&Zvu~I0V#HQ!4~)c*L~M0SiCv0a zVvBQFjPDI%5NI3OBP(s3J>=P;G>UD#1-NPaOFY!|-8P*!$EKbw-#0NHVyCnLZ!zEd z`EI>k`7D#T)4HDN|HSy(fIo-$iL-61f2Kcw6yuvj*|yF2({j$hs!M#1t-79|92~R2 z;pK(rkywSo^GrkkLq7!P^s{K-oUT_h%ZJ1kLwTp*9Ay_XXOBpE!8LdX9oH!PF7Xqi zaZT*uwUyKL`G>E5QE=_~eER_l*J7e^jqk5wY{WN~z6B3|#5p&cvR&4G zJ9yq-nNrG>fcvt>EE>`GeCz3@^Lx&?I)Nqk2kQ6@O_+6e6uvV*zvW%<{r&Hq8{a?2 zU$qC{f$<~0ku_HcuJ7eL*3|!}^z=r2;s>IqnrUYoEIl1-;P|tHrKfYjJsE$Co<72O z3_wo@#PNaX>9u`vd=T`so^ynQrKhE@4opw)A^$?@>E?w|_?6H4H}UH$1K`)!qw$Mx z{tgVmub27e8Xdnx4|nz%D_e!g@Jc{Yki}$Q9nHQvmUHv)!|<2cZ^+r`(zAJ0_DG-8 z_QT(VSliKOqeGlU3T4C^`**Y06WOb1&r{#BtqXbGn4l=6jUnZ@`DS#>Jt<<360H^e-*XEXI)*dM94Zi8~* z%d<@%7<9<8-tl)UmvejgzW3~lBD4K{&*_?}Qr||mzYY1f_q^>8coM_csDM4P-eKwP zhV|&~Mp|`H=e7H6>%_LF>m(-|GMJn#qOaN7EY5*r-;p>)i-C2iq)#^FHnG1xFMd5G zSv_r^V#3X$-F};Lz3A<<33BfA-2MHmptrwOePnCv9HPME+;@5O*(B>+lF+$YhwXqJ z-CYk4NWbnhaq5fU({tZFk1j8N=z-%7dxOLZ5xMdtdcD?Ur+-lidopufmHE^=Rm6p; zy85kS^?{?uRukhQM2w3NF)mgU<063=7ZZtbF_9P-4aB&pzRvBJ_!dubf6deIHvwWq zEFqr75@J!bb8q$f80E7i#I*3h2Rt&w9bR8*@SRI+MobEcC!ybc6VG0R9xpl$3Hp)k z^>%nx;$?~7ME!q?&zk9rg6t^%0KaR+*7lqkPiFm@@nlNCn^5@xC4#qJcB>Z5he% zn!phrcdV_k1y}~3F{+`h%f@|O74Jw}wS?5_p1T&|EstDd*Sb#@y;{ko-yRhy6U}Jauf~cqat$+1@s}z`tUc^4T2Q`k#r+VZ}VzMa<6&jd?N& zT(e@H?1J~a(3mHaz%?u8$u7qCLSvpd?l8qbrI z@Kk(ig&!P)>>>UNCG;hPOp=B^PH0mIxY#$s>yR1lEwg>5j8}>}Sr5=pK^EiEAWM{lwIeqbKt|*%-VBY-k=t8MwWEVG2M)dayh>DqZ{sTHuiR- z+~|h)DMuWQ=~WpLZwuQv^u#$rDcT2ZSh6eAx0?7O52NqNichFcBff~Xk9KlLw2bx3 zoN-JO-M{IJSSv9+Xq(WU2HIB}M+^__0=15JkwrM;h#g%&%V6p101$@wzX z%XmD9E|VB=+Ce3}S@w*Zj5DfDdQ9Vi>w9Jp^^K;!6V$gO2R@p)lRKUi=1$*VZ&JcP zmO7D%B-V|}8P4G69n)BCNIEZ@x zV%Dp*MYcD}eoY*}z1N<9-dux#{hA4TF}{-eysa_kEyE^v52c=O+%g8JL-67n=Bbl*8)y6578*RyT!}G4%+?SwTeU>)en^4_ zu%6z8#>+jKvxnqQZzElNt8MIIb?_|dYL-vuUAPNYVNdzyEQ1GG#CZgL&NAp9xZ1WC znN#AcLW35kv8GI#Wbkx-{8KYV7(88BjKR~TaqkTKR~_r(#aoC?M!&>AwRBuGA2+h$ z2fH~JPM;*UrNmXr=h^D}3F2Ay?Z2!;C%mBgpzxJHc8Ptap7k&D+_fa%-;qi_emZhr zrfv_*;OsK?uqS{kylNX`<7fTqe&xxPF5Ry@xymJe<%SKeR~Y(h?D02YIJ0WiCZ~C-o373=!?p^W;c4w zh3GI<;vTuZKXR2aW->qBhivQQPIL{rr0+>9Sj()ny|Q<(w;4F@bIG_>k#-86&7hmc z{uK|LQM5_EsrsMDb`($VNZGwSOW9Q38_T}q-v%F82ahK)l(cHvv4Za_;{tV#1Kd?8 z&#?jN?`N;|_IDR?Im9=sb8>EYEdTZ3j^K2y;}AIZluKiO{}J_Tv+}aF2if~sbE31B zb*im32X)gbs#GI;gkn&+zb+{VwgY z@O&EMCEv>#9%9gh&!Qphb3#Y;??1fS=YfBEAnJReQ`0_055pcQJftm6dWb?=l9`{^+%xOgRnSEgzh= zXwOKK_SCcP(2;&t%6b+Wqx-o{6R{S`+jGnyk|n)=zX^ki6h02CY)t8Ba6r*kMUOf^Wj!UfsL!qVJJ@6L&33 z+e^lnW{fpNb_5Beo#o5*%T3%&`B6Fk=WcJ{;w{L-&($kY8;#INNjJ}tGJ zH!F#?1#Vk53<&!@_0hp!HK_T=rhb)r8JJ%13Hx+mYf6Y3cGGUsw;Pnj5%Z{7#h zMm~G#^!h7>U%yM|*E27d__4-)P!pF#@#^e5^;av~56@7hNqrUblp=wvKByECw_= z=(ZdAK-#JEOyFN=k`m^=&|ZE$O({BjtvSAKb9}j*XRza2a)E9B_*0|J@u}x%^VmLZ zX1@rr@82hFHsz@_+I-V>Mw``XMw{K-zcSc1Pr1N0zht)gA@=UGa6-m8qfeV<&qBXA zS=xLU`t${5`^y7NARKv{1|L|<1Vnh&(L1MVQjT$w^wj@sfoj_oUa8phR{w~ zGlJ*EYTUHwKFYci+^;wi(c7(XN6TQ_{lR|^ZtcmsYo*Q6^-7)6wx+|8ZC%Lfku}gM z=x#^GE&k($H~Y2Xc)#F-$V{CgGs(URUF$&B*Z}$OqE)=yr#o5yGQ}GJ4xB{Hfg0VYOZOQVp0Yd)q_6Z~{Y%YR`qh z5IM>@&5)ne$KZ*PpR^7otmC7kFE!;Zcz)T((ZP%qe(Q|>pJS{oKF%5goxd{qCC5ze zRbx!J3qtol*F>je(Z>n+1yavo>afN{##o1M@?7kJ>n1V31GQCepRB=ta6^Y>@|%AI z)){T(8>_9N`^x*@w$}EK-e+J4 zpPt5knryaR){Wru1>sIIIN=@DEifex7=ED7=1D9C)~V|Hj1{pT6+#0{*{6!56xCLGzn*=KS`B{}tfR z{wKo!BJi)h=^}}|x7N4^d&i^r-31G=-SBV8 zC*qs>o8O+U`O-yiTQBbIr)}aF^pEa8(S5V{t{zrW|I7cpR75P`rfLb~t@ip3+}E557*{H{ z^Vh$Fua-U5(pT0YGupgWE|Dqqb6noh=#LJ#WL#|?uPcbY%a(%gI{HtW=SQx(>g563 zYJ39V*F(_y_{&(+@CWf%@egjrU#oSKMjDv55ILZl-S~yw{m0Tb03I!FFC{CLe5dOCMW9t7Ihcd-(nK6uPlFy zT~YoPr92PD-y)Nk0`;c9#V*EL{4GL-F=1_f4Ei7by(92{8Sg9QJ|J~bo^3Kq^ zIbMPqP`!$3yF={uir(XJ*+L{*NpE) zG5>LHpEEa+GlnC4!3^8Fj%BmMh2q1G|3&AL+4wY8EGWhQLZhv+?|e8BT0UW}U!AZ! zN6rhi70wK|EdoxNJsf(_Zunqqh-qvAUK(we82_vPW?LsZf0esC7MuN9oRD0dY{r6l zA76|W#8EbUF-D!!7h~tkhA)P;bhdt%o8@0&`JnG0U)I}?S$8iD0awj(s`Mku7b8Hq zZu&jCY{);+A7k$SGyWL$JMo8Lyq2vb20nNYZXW78-W>1ignsCL8r+jni(W>~*Xw>7 z%kk4#=0;bLFMb+ZvO@j%X>i6<_tSW=kDo?HOt@`A40~`)xP3Cuj&vh#Qoa&SguiI_ zrW22x{|)2I+mo*>Z}(nR-tL&d|A=z#xhEEq&3_kq+BWd-KJ>JALZ9ZmVfVG6b8VyT za-K?m-^}?)`ZNdJ?@c34lb&YifQ@o?Bdv6Z?(?CiB?C*!asSpr3m$T}i;d2#|T-NaWmrS2g zz1(FD|8pC3rTNip?(yLc)JJtcHT*opuVl-TtgN&BO4f59Gv_Z#S8%>U_)gk?$~z*v zuZ~(D@AXQf=5^^b?o!&_w{Pk}`srAeqiv#(iB5w?>EA%3>FX}^@#&Am`&yXK4cLIn z+}HRXpw3Tkz?Xi*oN|q_;!m$svZupWbP)yba2ow(e=78CAfj=R~1gb&u1#D|ZwFX{T`#Q1Q>p~9>#_A24e zwaw0O2YZ*UdoFZ_I8ay0*YRHLSC+!T*pBc7&OJEtktimUKtMPQr5~*k7t^M+&zvWJg zbMd2#__mNbi}~HhZw^1X7uAX1Yv+br{as6uo4LQqzaaj(&b90THF4q2=iN_{ zd(3;t{~_9tiEmYibn#KCd&U9O%gd7e+a|3YSdTa*PWyfC!=^q6&k*Fr)^z6 z?U#0ZpP#k2Y7 z%=3f%*O2}k&+|zyv=EceIf6ayjSx+gZF&i*YduG_qn{!Vt=GwXRebtj&ons z+J`o3YrbBt9loqw123d*(L<|;_~tO*tl^urz&OHl4gar`zK`b>qJhF1dvME}*}cm%j>MbE>Q;t2=6K$QWp>jV|mPvNmKsw5auQ zDtc|Ougm)2PQUPqOO$V0^GW=JBAN45z!zIY2z){&$*vgDR5@M){Z$ycAH~%YLA;vVc8CtQ?89vE)gc+Be*ay+& z6;-X|Ts~{43i(ggQEuVc>qz9Una~0`n}EK>r&JKX6xm2yJ1gA9x{|dMLbfdUD6;)q zvW71bO$#5nrH8JqyhSOx7TBurLk{pY4!na$(2`@rDtxZmu`(xkf**W>8sY!c${ZDb zS8e6_V@W4Q!6*E;ugqzKHxeF6Tb`)%N7|`TYPlS zQ^46Q@M0SOL#T5cX&K&}bQ^U};(3CkQ)d#-$&yZ;V|h+B@p}^MdE5i6snO*YE!p*# zNKpafrwMOiu5nw?Op`s9HspR7DH8e^65i9%Oy8SxRPF@{axaM5v73JHCME*!+y$aW zct6EEcZUS!4v|*gKjyu19R26HooDV6335+}Itf@4nsX}3DqZU2=A4!(@?7OwS+?4x zPLt;+UFulUQ{~y~QpYvtv}VZjDwntH374nrN8EV?jATix;N8QwD_v?aX$zZk+So(f zrNCYUjI!n&cWIR?uN2r1$}_O%l0HkGfjuACh4Q@0m0$XVE4LKbGk}vXX%)PC_!ijJ zq*XTOqzT+Le7{znt6bv+ZjC$xcRA^g$un?Q0M{$et6UktO&7RJfw4@|xO+SK7WQ3x zSX(}~QA6LLow}=Bn;T!QO}e#FYfWm@itjGh_Khpo+Ii35{qQ~HUs0Y;d&biqZPRUy z8uzkj#l_64qg>qy>}KYN`(m_e`&MOLf1lb^TMIK@F#$_Wij5N-zZ^+$HCe7djjhC zYFBXlQ^38K=cjpo#&t?`YYjtyyD*?2!>F$lD?6(q=ZzM=y#)UN?l4i1Wz@>M_!l^Z z{44wy@ox*9&WkD6o`nCZyn}bXuQ9$~E#E&Z-_IvqzQ3J+`TjQk<@e!^{j$qx;{a}K-7;5px=eBXT}bOC%ZHj`(SJ=gi_gtkthUF>_^-0Lkm zc?)icaS287+@d=VnLM}Ha6<6hUC1QDbL)O2@Z1`Erw+T|dfm@dY(61iOZ?24zz#+6 zE62<3%(@U>UWfbQb-vQ5Hh0qItE1XH7&#%-4W5FS2ytfgPp zJP&5fzQ^}s)9FMDCMGMvcB!>FvrBgxiEShOE$Y-r)T4RZ_FjePn`1YDtR|~ z!#$)OiH%Nk`gW2ApVnKhWQgx2(pHexm56+2eGfmjjdY=*GhXhcp%(pA3nDd{6Ab&9 zq-Dw&;tL**l8GX;1G~t8e&H92&wa;0`n=k_^Kv$A=;gheP2L;6R(NlGy!!IqQ@Q(N z5WM#m(aCH;{u6ynf4q0fbrQE?L3tOvx2~V@8@#vTHF$3Y+pqB63U`S=1n(W6k@%v{ zKaYb3m^`?``3B*^6|cdAD_(;KS2*7wJh*~ALwIn7a}mOWD_(eT2ed@!hpbIx36Vj6 zz8gCUZQ<a@N`O6)(Nf;Ki$jAD#tIHy566 z<0|CQRmhz@Z{~j*={NCQL;7>P=kq>;_YJ(S=N-FCa1!s8yjSx+h4;z4ujPHssvMC! zbeRcRG&3FfL*%kGSCw}NEil{v2<`8r{Z(fB)m)`$J?*c{Gur<(+9$R_@tHoc(dOTD zU7lZj_(fh2A84^%rJ`FGz4Ybizn$pU<^FYnpTN8D1(MdbAT8YC1nTt3R9l_aStzv*VTWk;r@= z_R=oXH(UCx(__;&`;G#`H=FgL`)2p#o4(nz$#(*CJ$@8v_oHvKzBhfdbIAv%vpI8d zy;iwE*Ll}}nR57MZ<6zrxu)Km`z3nLQ?joK&ZR%36utMjGEM4kdWQKEAJ={8{Y@RX z=$6G#Tjh+U^h5fMFMXq&2TJB=>4+h=%@BjNAeVo2_P2IS@ zennQ!y4KWHoVF2oPBP~NeB#MuKL2lfw# z1D|v3ANZYn9JzsZ^yCjA1Gcfx_noU!hb{0E^sSm{8wh?Kd@eV}Nc6e-JnT8o7=aUg z$H;LZV|2#%1CNn-(37$dduJY$5++jop!!pCROcyz}11CJ5G z^9&mc-w53&&Z~Z=?JPVRYmCuR{3$BTFCX+yH}lKOj6A;frq%@F+o@TTXg%x z3DN0IU4c?`=X`T5Ej7o)f1WYHR@8S)uDOsgIph0*$7Gl_CZ>H#dGs7(GR_ziw@Ghi zoAkzQ(wkh9-njeH8{~z)^d=X2Q_dJ!xcJ^5;-*>s6&feBS?HYd2jWaZpDSw5Jzmy# zmQCWX#Cq$I-_K!_5V~xAC-#ZIe;BE;-Yps{Wt2A~+fHJGI2k45oUmk^RAekM@st^=7lfj*mN9L!ePedu71X*g0WGj8Dk@I zRfQ!7pkw|Gy#9(a(wx2kX}X+&{LsMjnv>Yt;El52e=>#7vUtd`jLA52Y%`+9Hj(tC zsIg7uJvnM@t^M8_+c@&Ega3{3Ye27WLqA#pf33vNd@~g+_O-NeotXvuSK6%hdxh<%jX$CO!R>Y`+F@q zy*hMr5`VcC{ahV7z;@d4NEm(3#yz^tre*V<9FORHu*_&Sy^UK&M);e`R32oBwaxHFlxV|)zd#h%LtL{<4D?N_D zFM?~(2~iI=p4wowt1gI+2pd5VJ5O!!Y2Kf4E&c!bb7ju$JFQP zaM0xi(dqpZeVC0sJt#Pj|Hkg(iUkYHVA4z~J(ejahi9EFHGsgy^qrqE9z<*G*yvKp)yP5m^y^=w5VWqPG{FXp`6j(1$j~0s~!Wlh^^c ztGr2%^*ttVD*4uO;i2RGLwve!A6=-f*GCuHwkSU=Hh?$LVd^@5bfIZO1kNb_1x_;m zv;+O;Y42_2@vEICjNt|hbf9f7=j*nFCwpKdnJ_LjVGJ{2ToP#Om{%VEP@*pj9!tO9 zJ2J04gdRE6oF5LsuQ}@yjj=+X97>%T4jojCaYC0YVA1*979Dr8FW|qK zZPBY4$P~G=6~m?h&;C_pzz}@2$WWHPP5c-{whB?7=-YG~-Z|>hkW)nGX4NPA2KuHg zmcD5bw6`yOu@MfoFXw>&wxv6q)ero>?H9ijU0$RQqB9gf8(oHEyh5hVuuuEnR!se& z+-ugi{pW)pJs0O}Ke|5Af&C-%d`{S=j?$X*@7@rFtXe&(aUHCfP4xq-&3 zudF3wKH~ym$QX&OX)*s7bKkId1WVpiMPCPgrr8WX{>)NaxwUu5`K7-2+INmlu-^_$ zv#{Ak@eG5he-VB-mVKu5=CkcH_mLKfw#B%ezJ;WnVY5NLT0q(vHXCd+w~?lyH`Ze* zP36o|GJHV?ar5WGd(Yp44qoi~{KLnpH<30&(y-^x;yIt6SM2%xPnLA-`O|owBI#oS zVy6@zZq1u$$R&xX`1u&R7Gkd$e3-8P5PPkm57&9`c679#;J+>YEFI#<4bOa-v?E?* z1o+*Ld2W?-c;0E9iMi_**%AK*x5#>x#Q`_+V$geEAQ%0l_$auM6NBD+dA9`$g2=z7 zzeWqb7_InZ*pXMoZ^PyR4t^Lx{4v~~XI$dD(Sq-W+q1@Hf7-75Y_y=)cYCT`ns;tv zf!Ko*7nT=%(^j76dCHaRdD>NgEEQTd&+rjwzpuRDFZOavCUrl74@kzI9QPBnGm-I2 zl4txsQh83^lauSg|HG6?-A~{bW6Gqto}qyPTMf8N?k+F5EvCGn4tdw~iP7a< zd}4HY*Yt(ag80Me@~-I%qszPa!36P#5m~nYxhvFR!fwB(yx_M(fQ^rY>Aw-G z&JE9gwbySW=)DUWOUBml+X#A#cn8jG{3EvBX11}oyx`0DOdz)uK-Xj~797AY1e#Tl z8>8cA!G9S(83o_QCj(q5NRKP8?T)1CbQhUvs6~TWKjKHBr?ZB|uB1PM(+=wy+!7f7 zOnR-`_c?!x4U&7Mru#}c+mQ*+Z=FAtn1TA)Mr3NClR@539!f?QNXa@*yCqNJmCJiq z@yINBx6V`EL3$T`mNeP(tbEzKjvpDBW#wHj@03xYVd6{q(^M?iboQ1a(&bF*zwz&-&&t=#v#c^swRgZYv1xz8LYIS1PT zE=k%$@@(dpNIrOIz29Y)7r(5}Zb6^Jd#eds`s-%?OQXtYl=&*}f3nJ8_kPB0+|lr! znI^tLJ#)p}em+Bd8B!Wn=SFJgk+;t*r|Tj5(_63)^yd$(%daBSL8C?gtk1jf1?b>K z2Q6oEM$%r1%_sF=Z1~nZGKM-XgcytdaG_Pw`@x03NP6En2Nw=Wy1B=kvd(O7L zL(HX7*my)|stNyXPs%>m+17gdxzDyb1LoP*9W(o!ZB5bdtWn69^Bad*V_Tf?gl0Ka z`Vw`v_4u#2+llxjFL8!^u(8G)qGFBzYEZGp3;&-v+o}z-Z95Ik{kd21{S6v-)H~hR z<(=v~1@3qx203>>R>;}bLVR~62Kmd(^H%=X^6$7g+b`!^AIduG?oQ1y#1~H-a%f3- z;xFC)MB;!?l9`}u|4QS0>k{*PYx9-ak+reJBIe9YAwSO1L=N&x zcJj_|YfLyRS=km@afv^&B8lIn{D%AQenR3Grud5R%i&C{?_1c1j?%BEuoXSc^WScA z`2WUxz@zwn&HLZ64gcNy72kfIKS@@?pV0SDdHys>34iLn(Knp+^;x14{*3WR<5`Wv zzQMTI)3{F!IO!Fa_|oM$(doC*w;O(Fd+uJom;1pV=C_((h`Spb_wZ?X#7<@mBxce>*FZmO++lSm^CV?jM`j0EGoF(IxA#2MMAnP8lUPr!McFH^ z;JnO9rAY3%(KZ&HL7!CUgwUuf;v+QzH~O2BZqC?{KXpiwFFl=j3Jz?{8H&&T7-vTA zi(j|ak(6B(m*iWGem~x(G-@+$ZmfFU(fGSKqaJ*u^?Nw(68t!b9{Lcv^~2a`O`Z|C;r*Dr47M{i8}@Dk(jw#9V5EebA~<$ZI)PW-RvWs;L#D% zN@A3vFm{B@xcup1zSqx-aMm(K$}yLty+eIn;M)wxsPM$P)9J<WRrx?X9ctwAX& zqTb9QdD$9xAoqT~f4}XsrebWhtd*@26CWG8oA-KR;@4R*@!MA+>w+JjtTN6rGhQ96 zA(j5hS>_tXUu{QT`2;(j#KmvL_D5WNaEAC-jsx9q+SY|P18N4Q-jrw(c?g9P>2u9P?$IV@_@O*{0Jq!Uy%1O>J0A*(%4a*;QXvuCI!_ zRo5Tj<5h%D*On#zetf!?89ts(e>Bfe(td0|*$Q^i3jDYf?$E8kkE^$i6yJZ-ZWZ}g zmw6e3ApI8^SnZH=%$#Xzk2mhsV156p2@xT%%fL7!<^~+1m##gd~XyM_ci`%cc(yujUzkWCPe#Ks-etr6p zvA!}VT-<(1OhfH4qhD_P^_*hQ9R%HY`;Ci3H(s*(^~HN+XvsTpIvyr z-j1S&ocT29;VQFV1>-Mnzr?O6vGyg_RobS(_v?X+)USDFzZPF{ar^aG+4~N=8=YUk z#|jxO{XYlpn|{|5d+*isOZFBOU2brphnU~*a{kbhBX_=NFT>lhZ#g~O-z)r_oXx#^ znD2gYoV{yHS<_VCmF!)$S19WYe<=J%YI%aLt~@F{Z7lkQtYJ4A++SSP8}7Y~0V_oZva#H&NETgzUmTt-ZD z`YL+NI>+O>?lDuot5ghoIQ+f%L5B{-g?H<5anFXWM8hr|1nlJ|>_T8q0rtYU@TPOX z4&_I+d*L8puP|Y+1-AI!bIyO=IbgpN4g0}Cz+Pj*M$QSri-dN>gnxJr*e^%J#^3q8 z9d`gtVpdjIC)I&yRU?M3!!YHi%rU?^VPE>`GlfM!Q1U9$AZCPxvU( zj+3@GjkJTL2@gWr3DWAvla`DuBzz=k-K14rNm`-!9vNw2(iVSF;E^Wum2xLZE65ah z@nKz7ll`CcQ>153RJQL#X6bMwG!&RLt7(!_v`FZ44SX~5;z;D2iS)Y-Spxr{Y`ODB zVhqTgH*(HN?z~aU%oqb6WMky*lia&v*+@iI4K7-lBWH2-a+34Zyl2$>! z$E8l;eVV+lTye^pM)(%m_&%lOUU`6lwG zAWKYJmGcY6<3udye;5PwX#K}o=rab57ikPOm}4Nk`#(Aco&UfX{A-^vP?AkNNH*~x z@oYT!K4Z`g-d_w{D7D7n%m4T|bo~S4a2Mkcy_O@;(a6Er@Ko?MdR;FLMz&RW_P9Kr zSJ}(KqeZK7Dm<^b)G}n!`S_XcbA~HCP2_VfX)gKmC4V>X%`UZ&_l1;;q6t+;1m5q- ze~Z`vKQooqrT~jGveGogzOXL+rlKF4led_bqQsbQf3)&9uwbkPfkk>b*!b1HT;&7zk+-( zFcN2nTQ-unf%NsXlR6XXup?AcW({T5@_o&ooV;N+-IlLDM>_ry;if>L&6xlfRYkcJMny-3NicANc$Dy-Ys73oXsmUCnp<9O0H$@{f>r*pm}q z8t=1oK`jU6`#m}1sXGmRvu)q(uzHy9kMMo#o}6^*Pm}uN*gx7y|Ah1ozB$1!d1X#Z z5_?x7dsiI4Q{+d;cf3lU=Y&J~G2xbRz)pR_-}=!Z3I8iP zBpY=p)D>DmU8erj{{4ytn-_A2IQm!>-M8&mwsrXIkJJ_x$X@G9Lw}kjbOpXI1P_>( zYuw*z`Odi6*JMvTVPisy+*A$xGG#HBFnswFnX^Tej8BQ}Ml=d3G=6umY;J;SI+ zbgx!DaxU4bN1;!4vrkG?pA`CJr%yKe6RkTHooy3qDTIzvkE>vk?1u z$lS-%%snj4+{4oP*~4Cc_2Td{{}nWNnN0N8|L8t`{2$oA;zdS1$DB8~P5a$6aDB=i z=<#%)BJ{wVcLn-jhfc`6E8=5g&btC_u|s2Q(3<1OSh}sz)V2QWZ?Gj|qp0UB1!opN zt79%s(0**bBgLLGoPRloUaHf1cx8OIBo>s4-Cxa2%~sZQs4 z$CoR*zWdKnUy0OruupyFnIFAA2m6K8N6gEf`b___p8D`H3!XT$zFW>wpIhoncAnY4 zv8(j6NqT)5W_@#`>PsX)X;p9kl6g<19JD|+$8+L2>KiBZA-9|{o;UIR41vdZ=9~3Z zN7Xlp{K--EP2qjonf2MWF@N5#XJ-ykrpmnO{5W%Iw8!o%%m%NM;n9226yH2aJ2;Ej zp_Id}Hb>rxvt_)ye7ErasGfJDFQ4b{>Ce-BZl1rZKTq}L@Vty?u}j>@a}9PRv0YU; zlCrgfv%>}G+N?1-u*tUWYWT9w%CBdy$8II-y`C5nBiT>g;7Km{l?Q$Wmq62(uFT10 zJo3P)d~m7-`J@&3BoCZYA0!_>UXSTC--zY(;X?jbkiHyRzl^-c_!T#^hvHvW*32Gy zOSokXdDSa(KJ=1Ti7do?CDb|C11Y!0i0{-|)2#1-EzbdOeRIx-8=7b% zmwML_XWqv$a|gi z=9M`KrP%)Vk-wjO{NY*;8FjnaliK&eM;s>a2zjl|J$rEIxgp{9L)6<&-Y4XB@ZAZ1 zr>IwAk`bFsVvkuqZY>Vk``M?GW5X@PF$+4pITEwXnU3#S;vU^Ut|gg$G<8powI7D& z7KAN-x|R&iaanufeBz%$OGJKaf$p?Ie_E$`c?Rxe;7;NP4HBQy7HE$y^Ho!CzBi`} zexnwfY;cB@p*&+Rw#E}n)tC;w%FQXN>Ky;bro`-t8yvl z-0+L%8@Z2&v`>}2lYJfscN>~;GO1fbe{`jlKm8hCdQ8QFm&g~tGX0zB*ZR_dvz@fd zthCdVBW(+5BdxTbPxh6Pwu!VPD=qC>{Z7mOBu(yW(BY}q=<$T=NRxi+X|EXYeomV7 zPx{qSIMaXp(9Ql6licC%jkoy2GZ;TLCxn(fBy?b$JA4ykE_}SCaj(rbb*wvl zgQOuVNZR)$E!7>qR??71B<(RtOLm99Bx%SzlBUy}BzJg%q#;*Hnof5T-Qn?)hW$X& zbovwL4u3(?(ECW5&>?k}J3N{+;nQmT(8T5kbXz9-N|Cz69iBdo@;iHN=fSv0QT$ch z&xMYgy{<@fD515)_x@#!Uu@#iU!i4s%$nvA1IDcB;TOv*7G!|e(etRviB^(cj6J=kIquUCy;kP*)iPzw?nbvqvSp1Q4GHd^l^WK-s?UU z=vhx3rreQOd@EdrZv{Fv@#XjgpNcKeb@A!Al(qXQI>Jx!rx1QX-czVY_Ue(j=ADuc z%6HE2Y~C01(>5mhWv^S!bG`na;1^$zy*z)qA>JR6b(Bsybf%{zA3i3YchS#|Yg!dzZHyY za6YtWt~aNGvzgu}^8zhp-kg;qn%GyMVa4PXLYEeLbHrc3+BIE0_44qdO@m#zsN92c) zR|$*%^l>Y8i_lDoEoR1USuxe7-`hh>CL?x>m2bvwd5nCWZ*)9n;JioTvY0T;_$}X} zjOMsAyP$&jEpd11<(&AYN&J>-iQn>BKXJ>KqKgz85HTA>hjM(Ra)ZViX^{C4T>yDa z)FpYN5{*3Z{j_X->PjQ;(V<43_;FhH=n7(?%XjY&GxEMIdC(CZCh<=s?}j8J?+22{ zT9-Vx_1*vF?)~GVF0TFm_hy0o5sbYml}^v6r^= zs>tn!gjfmUuPv!*i!DKH%?2ZS2}){Pf@v>Q>s3qDTHCsj_PR+>M1Exf-S6`??|Fw! z$S=L#J|5ru$3EWso|*TVGiPSboO9;PnL%#ekCX=wQC`I6U1ITkOnLAe<$3izJjDHO zlk#>Q-wW~)JHy~J)XlFWUwx{yYxXBkGXI$`>I03F$`83a1bU~!cboi^3_T<4Cqef> zR&ub$!4Dw|UkGPEz7WhEtxt-@biz2&7-IZHH(r6iRuX$NLqd=LF4w+ z^+UUclivZ(y%x@$=)fny8PPSI3p>EM)55v0GdNjY!x`BD&etuR%Ff`N-8G#49pDsL zIGa0z!#%ZK(fQ~(?dd$t!r9Roobg@5Y3cyy0t@G@&frY!8qOOX;GALM?ClIr05}>W zj8~1hw(*nIFZ5f%v19AkTN$(PVD1@@r2$Xl@^!^p=`i-Qi0jnp*k}Fm_D27*9at^M ziP&*uZ;N2dk^fD!MSf00S~X9kPq6p!RKk8Yahk0E&tF-?*RT$}%zZr-%$I~Qz8gQL zROZWro!}N+)iZ8edXL*f9&QVXm*(NN-r`m^!KwXctW{;`Qyu%jf#3Gj2h0A4?Y!Bx zGv&g6PCLKTNjvMgTcW3S=KT-bd7jsw_%8i3`m?Z;b{6a2gU;5IggKS`KWyjzzqoTM ziZ9bYqn*absRQo_-qv$FU#jml@91=X*4cIzjrr%ab5bY$=@8?sr~X{?KWyi6uRpQB z{4@G9yOVa-f4S#&UiUw2=X9?>&-&-Ib3iBUEWW0Tc3OEaOKr6JNt@o#LEiIxdRX%w z^8AL(x?=r?zCXk%pXm<<(3d8@^^9GMN24cS<|{u*ICWSDN0F{|@PDk!pzFz3rcIZb z*GpXn-;$Szzta(~qnCb0c%gU7_oxjoe1LkTW8q`;cqe$h_F3WecxJc_r<;3;6aFkK zI>G6w&kCmuXoYW&hgTtS)y`_uX*4#|2SU7 z7O&z2yox*G#Xf!scundAudjY)c%i@JQ{>UB`Nm%M<8mi9uoJxg<+H*|{$=bjw&As~ zmw2t@EClz$&P;}XAj5k)<$seF!7pBCRio1J@i#hvzfsD`+<7xz=f|hjcs>zX@|#+C z_Y~t(g-?X>pPF;G@rN+}Q}g&g|L!ToHIO~=70=FDc2;V64!S~=F+R%6v$ji}l{aOr zJyQ3}nRjc)w06x`9Bcm^=;lA=*;RFR*_5|7&J^$6+A?)M*W_E9>es-f3A?6ZK}5kR z$HyK8wuUN)wW9&wF`kh*oa32*EQGzlq_dY|(({S8sdQ`%CY`-GlRhIDJ9ZK2r8Yg& zrcVmS4k;ZQrYZl1-B+0qjD4VV?3gCK!lqB<+@8|0Z@BPn`enh`-<3}PnDk7WPXGK( z>DJccuumKr7mS_#A-esVl$f!T(4X>Mh!rRaP!yf&B$9NJv z`T14(=nuw|;2B>O=9YX>1k3oM;G1atQ0NEwpd>Ml<^SjT$;cy|!MEit^4}(ZH+AEy(y4Dt3uX3FWeZeLQUCo*i5E^0s|Ed|PxbaDN474Y?0m{w;^U!1-;?0skj=rW>9~ z42GK$?f~C$c51oqs_rbWo;<~8*v~$gY><=KW0C#lVxHdK??r9@PYR81`=1s%x9xvQ zXiVGxexY;P{`U!G^M5vV3%=k!_%FV4-5VbHd}_JYE~T580zBp4$DWi)yO{raS6nca zxrF~-T7gZ|UQ1&7%r4T~?A+YhtauTE7vS5;{5rzWUSD_lo-I1UxyLM9R&=|LcBSxM zO}n%&Cm6EHJ#Zm$1Ca6cei`*$%CD=s-*TLZp8Z^NTI<=aOIRnwf3Sa-kaibkbk^V{ z(%)2h@jCKMdHCE8m1jNk%CmPjF#^@E&(AKEfq(H**W-{-5{_7-v{9Q1Mf*0jqB zEuvlG$)>IB%iYZT+1|S;b8_ep*jyFAB-^9OBKA!w_Yi4k*fh z_?_w_&CVOfRDqlCnD0L%-y2WLV?0szUrb($^6VT`UWLiaHFETNM>)caUJf(4T zJ$^|gxyGLyeXsG3`YDb1#Z%(wH_OjKXV#sG_*X`fXVmCk#0B_RE+@`L9^H4zRM|o4V`%zg}|v38kkMB{|_} zT4tyB+;ufYXFR)6nK29BbVyusRpL>@*>u%b5H`Yh` z+39PW#`O<3jXycu%=oyb#0j0ozV@*Oe;~dQ-;U>;*f!!2lwHJ~^=~=ETJVR5V`DUN zJm|Bl@lk0m?H9TR{!{Juzbe0!=7zqZ*?NxWPWpWNe}EI4MEs0YVsH%R-g&JT_291< z%~?L;YZJ$Zc@mSHbC{S4+!4R8kbTp`%!3#)6{co8--?_Me zHNe+KUg+%erE^Bq3C8ZlM`HFztd&0IoiFu;)RbV|?9^c07+>0K-m9hK9rdrfetVj; z0|Tn?<9W+ z`B}lG=KC6xzceMa{`!>f4xBfJ=NO)XgDn}Hi?8}QcnJ5d>MMairgT$Z336&mFY3!9 zu9E6g{K1s7f??xNa$a)i*7Jhl6kpm4V|?i^cr+5P8PT`w`VwL+NuJO>$fNk5E}DTm za0aDZTy{P5{1#;gQFeGDe{TBmv5KN(=iBw*jvV=|LiH1Ot(4$@cO!RL1TS$4G;U+W zOLOqUkYA8uQdAO?qKZBj|G$)emu{uIpLFI`cRMMb1Uwht=zeC6NckP>=q~!FC0=_b zGPwG!;}{szVGIEe;YnL{&I2DG0mqGxoZ6PpMR&gq8s zWvq+3Gefd>ggMm{jrP^`OrvcUx0xd>ZW*26Ho}SZ2e-t&-T7gBVo&wI+D-lH!@s>~ z?>GNjy!IFHrbF5J;Y08#?zoK|+!YL8&)La&+8=?>%^c7AZuy?0_&j&OD^lT;`<>W< z7VhNT&_7%yI_CQW=)T-fp60H(jF%N>*!#)%24m~BcbE{5=L*JR&S;mWqsBM|vsK^Y z)A1#3FK?`&EnUeQ7X!nUH~40Ge^=hP40(e!T<1aJ%izD*aT_PqPkHCT88z=b*q1m@ zeQN%}d^xybdRXyE)40cc($#5e4`vS!AG~oySn-01Nml(k-*na@ z9v>1O>CbEl4oHl*$O zVm(lQO=PT8`3qX3nNDqOX+dik{I!N?ud11R>CWoMCi=0-_9J7q_P{1=6*tglH**e% za);8n+lH|mj}H(3nWt!%!?$DTzb1=srM+jn(%!SJd)yN7y|fqjrdWK7`nvcorw*_F z`0`W3smJ1sDL>~gUf?_ycf;*qJiX<_eta}u8`N1d|HJT`t6Qu5nXQqPpQ|D6KrHN^ z-x@v2x#eUZacf@Z+}8^3@!*b-(z*Qla<{HO6#XeOTtmL`Co6`hDaPKabK@1VZFC&x zu{Veh$5=ly$k`%2RdlWNzm^;1{*wdD1L?r(W8c0wF_ki_nTFx1yd(D}oWXJXd;#*c z+SLUA3v$k`xq+BXH!|jKuE+Pj6qwwPjQrcYVL7EgSA2PckAoe3Jn*gUg~vAGTZrLK6rH#YCzVaKN5 z?du4#OJCKA+~Vgc9$R#k6OKTepVGFgz=8AL+?l~ya{A9PcXiNzD|KH;Kj!Fke#te3 z_c%2-;fK1MZ>Q^H z`(eN}W#R4Of0_qc51KX-*Gu0#c44RlS?(;pk-Vj{8W)CFvQ~*-7Ro=pctFSp?BNNp z@6x^qvf1-BPPy^VhQDv)zt*@S<*^n$$GiIK(u8qa$oMkx|HgHGC#a$4*O4Rh)4KJm z7VnO-A2}0zwdaGa=%dJD$N25bUKX8^7l_V4Mul(p)%)lx;Jsb*@&Tv2yc`+DwLuZ% z>#xwd?3`)gVsn2>a*cegBQu!K)Z4^fw&wWY@8P4&I30qVtGOv(anZSj`)8XSXHpvf zr?Rf5!pj&|J>tKG$W-E~s!y^>G4~!yHgWa5(rC;x5{`C7E=A<^%KS5x(idEZJ+Hy8 zB|FWNz|ZE_t(~S}{0VlN-5IAD8_jlX*Po@0W=`MZHkwA{aL+~~eWEuunwi9BEwk}e z8_^vUU$to$adcizip5{#=^p_99~zqeEOTLRo@=MspV!V#^DdDMvxdO8KFBn8La#V2 zwY)IN9EhW!8G{m-T__~b67T*ZxG8z z@>nA7pT-We0eToa%!s^B?J#S}7f-&OvGo^X0!3}Ph}w~0hY3;cf6oT;gO&Nv%)E#)KU&^MiXEYjq43^A4MPL*wf%#{PS)qNv-N(AMH;>q^Yk20L9XbX3Q0{k6S=&Tj6K9K>$ZKL9o2BPMCw42( zRr)_JJt1amS~wk<%*1S+%QyL1?s+NfPvca!VWj&$02xW|n^M9}`6EN)MsbE;@A>-X z47UvTIJ@7R9vTY{&Eu29rpzRj85$aa4QmoIK@oE}I@eb>i>Fx+H~Z?$^I2b=WR~c7 zU)?;O*YPuDN1r~X1iln~{LA6y!)_eaImA(|8a*LgHGX1v8$R$aAXhbGW1rPGe{wbJ z$y8*9Joxtl?w}e~IZk`C59y9>2cB`~2shsP{g^2nC}2`SetEN zNcB``v6jgcgXeC}m^XRZLSN{Sg~W)x#VI%nz3=jWdGd|f#E9kn0Pzrt7W!UYu+4c@ z_K8aWnq0++)!B%YQ)IIo(t3pXu9)MB6Wf1AYI)_#rN*YI7<9&_Ngv6kxfr^%vS!9u zFB=c%#kS&evi0Um!t2pPqYdZMm&2-ep6e^Wj`XNMVB^CMBR=e@)q}uUa*kW>)aqYT zF4}NgAf*V}?6@s3^2^xd7O=+ayx5P%hF0N_b!*~%-)r+(!<{YSO-C3%5i8?Htc+{= z4m_{-`Y!nl*Zy|Y+TV^c_UIFhx4-|VbTY>ASDjkXu+qOPH$sdNV?)^Bk3Avz7M)x6 ztm5A}1wGX{r5APXuyyV%bn9%|D0>$6Y2l~h1(CrSedQ*Ho0xDf2QZQztxL6zh>KBR?wmCQxn?GdKZ0}--EX8o1EBa z;WFoP>9jqL!Ma}H@lD(InO7#XeY9=+ygspX)%UF1c855bJ@xw|y{PjX+xDu@b!hwC zgtm{M&qwlGXWRZPdaBMnZOo5VJ=JsD@9G5}eZ28EGokJHLz(%v*&qA8>U+^`d!!d_ z|8g(teD}BRSlfAdhqm9C&~{{(D1J=QwYKdqIA={d&O@PJzy3Mp=uSdf-Eo zyTQp@pFDna>GSc5uz%jy^mtb4=1?yTa!yZDc^qCh1w-#OKY^^Gt*V?=W zA6pc zPtSAiC%u4Q@OwM{&rO(fd+nUt?T_tMtjjmtaijB=J<+bX7j=GZxUXF6Y|a>Gi~1=? zvLAW@cg4gci!?2E$B*Ph?ai8ebb{Xtmt7W@2Ybfl%e}zm-QU>ubEZeQw5`AM6UOij z;C3UwQj5zj=D%>kUTyZaI0N1jT`uhfF2Aw36lHb5B|iZdbgk%Keyc4m4NmMH;W8dx z#P}X{N6)xq_5znR^>%!pmN34@`|1{{uFY<{>%Y@;UB`$`)YE$JSG#Xs65ctC{X%${ z#z1tQp2bs4-;e7Pi;d^Uo|Jjt%zit4HB-1e=i*Y?i*~=+3tSf3KA1VULm$jZ=!0~| z!T^5bEk4gVv9pCsi+eww@AjVQ@=Pyqsdwk*a+Mb!}$Hb#0Md*Mtu?gs2}GWK*Bme{v3{r}=k%H~2~RznOlIVKc5|e^2;4t+O@g z7Bkt4i@dy@m>aqa9==OFpv1MSbwkkDM~>|!b`5h7UAy39V!^cOaFUPUEs-~XK`g20 zW?<|BhLs&gor7&2{#WH6I@yfvd|%xK?CHkVO^?Zsu#RVC4lzkX|_5E|O1zY}}$3DTqb?B|^Nkt#OJQhV?tHr*N z(l=#w=DzRllAcz66ESaZa`rjYTattyTbvl0D{jP(!M!u)r{Cv(CCR88>^)6<>*HJb ziX|ZL4;I6r0{51-qYq4ihrm^($*!qOB z5z>oQ-s(d>${tj?B^}Cv!|f`!%Z00Q2UKoh$8v+KZ=>7+2hFoFlOkz&eA)(1ARz8OXV%^6&;U>ju{=w`A@4Ju5woHR5^TJYa9I?%Z;cWsB(5a zZR?l)`R)6edD)M02atbc3o>-u&3s~<8Yz4>V76?WNS%&Q1<-;C`|?Z0`AZwg8sY^wO8!(&XDb?wXio-(o}`6^@& zxyJ0x7i!KzgGbNmWRG)qpYYNIdtAI>e7F0Y?7zO^lwA^PgfCn<)Y{m#x&0F1E;w%< zR)Yt71?_mpw7^2GHs z<+E-15w^U_Fn>(>bpB`B@)frH1Y3TbEw3`0ZFxWcN7(Y~Z25d!{xVx$W#AQ}llmhv z^7$!|$Dxz>#=O3J$CS<~?=(r<%tA=}W)p}rR&5t6-w6K>W zABm=$gXTWus?tGQbC7+MUi5VG*61Ryj!9ObtVh@fc_S15eU6~urm>!F) zBtMh4MVaw}KY%@r zKB34azD0&_UP#%6>?th<-m{cjLb=OIri^W*%r;x5lrqaGvyw79D6@t#GfJk6A#QZ@ z2L8YN{1n*~qH8F#E-5D4tg#Diq&%^&xo>3aEl~Tcg=Yb(Q{C@pUSm z5@A2J5uB1H6km019=^Ho)kkvT6MLKp6vJM!Kvl)agC0~-h-Lx-p2GFcU11FmplWV}&ygxSCtW6Jk?^%OFKGuQN-uuMK#>Z%-_x{z%p*-?S zd5@wW8W{IYHt{HvhNPA!%E!6V)v#NeGPg}KaAM$-SZ0FCVB<7pPMZ{359|**lo_is z=-;NyUoHu)r(N%MC}Zvl!RBSkd~k`0nfbR4WrhLAeBtzflI(%~wy~pH7T$tlM`UWpD<>fOO z#r|o^{P283^Xd*T{_erB@`YlHYR|%a^N8EVpLF=<4Zd-P;5!ycGi_1KV$P1Z-(2b9 z`cQ{&Uf>&aowo5Vxx&=(nA;b3cPRgB%6Fzu)hDDIU3Igs?lICjj@v@|cQPW$B*V&fzC_$zX2(c!##G5aUTZS2`q^>brfFJM1a^WjOpYxDg|9_jji`8n^b`6<5* z_>}AWHPrR}DxDk99+37aTey>D4}M;${7+*qb~*b{g{*IyclG#EQum2IUh*Y@-~ISW z@OivX$l>nZ=(~MFKAsV~j~N}^*Q7_-%fyZp(_W^&c@#a}t4nlo@cU99SBNH2c!_B7Rm!gOIp2ZFv{Es4csW!~KJWD_jy`p3@1;2r#QH%riWghb_$g$6@}e z3z%u0z{ECo)ekJpBoAiX!u0oPYkyT2FyHT_A6Z|oDz-5Hn|#xc$+jOej>GJWKdKqq zw(XK2$OX7V)jV`88$R_vr(fN^ZNA8 z4lp)$fFVDqC^p+R7z_E9_qc4hjBD+|-_!+NIP-YIn5cv&|P`Da9cInctq#)CP-!d!D4W_A}a zr*#6;!9VxtAa`zG>cO0AVQx4M^RM#7MGna6>-sdvHYM5ltjAp0T)bK5Yof{AZ-p%G z^~1~dyCQ%4?}qZ7WOT{X`tGp4vwiox{br~2pYZBR^maCm zFl7`&U-k$2do+%US2R92J+{5&<2HMp?)O_qx$6$Yqw#6+`s6WuS0q<@eG*IPlauTk ziGF5yXb``2!#C#J@wK@RpTZxoQ~ne5gNMwz43xqJY7iSTxKdb@d1 z&lsM~82+w-<<9>bR5viBgQfI$W!DI2AB>K6Ha;>R#S5Cy!L-J^YjVF(aZ)j{NmzG? zzpS$ejp!-f8Y*3^p7Xa&=q=lIFADlfJ$Ir=cWL52o#w-=sn|%G8uHP((4pQXRx`Gw zCO>!F4DiS5S8xx{Veg0nblq&L)2X`BRmT z4wgy&1oF9er^Q}=cg2+H?=IJ>>PirWxhWanMAoIl-pD?WsY>PskTfhWfoFq zF=b{@W({SYE15DI9js*o|K~n$^tq;Glvzoc`IOnrH*5T{q4=~#cHkF9y*fW4UFxGL zspSXd+loFFEggcN6Hot8qbEg^hXxL(4-K>q7#fIW3=JI392$^+kw;H+&n0w|9P*7H z`pScfD}-*6<#YXQbNVLZn=~MFJ7aM=v86ipd4xWH=@gf5$x z4c~0{en#lE#CPWXbHEpG7XCU*>9*tC(2EJ>%$%p3=HgFt(Vs<&{BuJ`v*Q(4+Hd0Y zb38$Q6RpO;Q~n)Vh3q$8ybRfbyx0iZm&oDAS%W(B#4cu@8TL8CKC|s}f_+|QpZWI5 z-sH9<=Ue;XFY9<}y;$ex9(bP1d5Z7c$Wv>=+vFeO8TGTz#oBU2|I^+7NA*9${eMvZ zN4WnF=zq5R->hMCS;HnIywBtPvV?c=<4m-HZ_0ybq~Yw)lh90dPRRr=t;dDJq|Iu3 zKR0w6v=@DE)l+sL^FA*0b@M(p^ac7Nl0P=|IXxT3gbGdmn9x^Deop91<~=8Ly?GxU zy4Jjp4h2p5b3z5Yt50t;aLx&>5>C+XDa{Z1R`fAAgXaYLMlnp(XI?xK^_lF1>O-$j zO`ky%^Mn@W*-0Pe*>)z@Vaif}qelbg{8zy#!hFAvu_Jqk@RHoN<&1d6ySyK}%#K6s z;eBbxJER@9Y2J9&T+gDsZ01jlH1TH!zi-Q^{d1_po2#F7J58IQpJ($kwtM)+0C4s8 z+aw=xCw0hycm5W>;_Zt?6?4m%kyhp>E<8L$`R{_Ow;$%_XQt)&ok`xFmz#E){U+Od z^Jjfy_qyEtQ{8Xa*J9l7Qy-`JQ}oTG)1lu9@IOkvBnr<`{W}B;Td({byt;NCOP+KB zeDe)9tUPSv$LkuNwzH3DG0MPw zOmOX9m5a-Ww4y%H!tO`8X+!KcS>~GxeX}hQ=3w`mhT~~XtWTU7x8IF4-)U}Wf5OAF zX5|KJK$7y6qN(ZK!gw9r!WwNB3fzUJ&Y=Gb6K3h?;C2Tu93oOhmt&FSGm#KgkKD#gZY zsRBps!C%rJxp#CPXTIOyp3r-8tNquuHg8A{H_dR|vqB4i}#2Y6XLbzW$}FYS3D zaAsd5@M+Ep{SX@HtdRT^cQUTL^FN+nz(eGVPcJ$hnF5)?D_5yDB%BqxhjRaWXNB_q z@0=CNvGH0;eeSuSbbBsn9I*DYG7F=p$ zsf>lU8JTfCWxc)cmQ}|p<|jE9pAF7F<~{K^+P)_aN4xLQVJ{v*x$TT?@B6p-Uh>7W zNzO#k=ox?JWaOQl)%F8&P@ET|Nf5iUQHJq~;-m3hm z&&4ZbcMcwk*GlG|Iuc!%7%x4+J*^wK(S{_$yWVNgnlmjhbANo|p&Plk3i#2-r-hqG z_Wr!kcK8%J*h8ZV%|1`td7;}*PA#7=c#Ng!DbS|W9b4|cX@%W49oAY)oPq-z`nfSN zN__!$uZXxPjJ5U9=vVz+U2c8p{8pcQa@x+l46ZJL&O6U>*S>oCNqUUv)5w4L?n55m z9SSa@pu{ z@0a#-0?Xl(vX!@;FQQEj_oPQM?lJeIM>1Br_oQcY4u$>|yr-))Zix|->}L$TnHy1_ z|N7SG90$KM-GlB6-C_GGD&G+ZFzzw^V#7GD!) zJr33TZ+uA+C5DgapeNhmA*in_KfuU zb&{)-4;NiBgC9jEIc6VosPY*{9oNd+XlGYz<;nDAV!dJdUHjwF(fORS?|OV(Y{!SU zcUjC`Ng?n(zSq*n-D?@gel7SmO@*ekS$i#_zd2{mc+g(Ux%`^_Csnub8-r}Dc}+}> z$;BPc&wFz>-}GD8bN9+$xcew4+4J+x!T1&rKIfUtnSJfE{EjpGdaB%w$k~yP-MyVr z+~*dBf3!^C+#|d)kvb!=xO#)C?BVMobu}1E0ED7uRb~1o^AIBW6z>< zNbV2YH1U~!S?>Ar!4{Ur)U_kx6`E7)627hC+mlKAu}zcCrMgwVVYsVv&1Ei#--o>K zz~k4z*ZK0Hfz4M_!ub%8MCRUW9+NP6%QT&2#0&A9W%x`fYqae7f4niyMjW zw~6?EjFIb+7fpP>-NX%PfG@GPub5HCN|OUo?sYn{&oaERdV%W`sXH52$4d0ILdjYgjUBzi`-Nnd_!bLIrkZEJ4?h6gf7_#vTW4;+| zo&Bv~D|MR~dPNz|meIhV{u9ckb|@=|8|)e2=iq0IH}U9!+uZX& zRTnt5=KL>lwv3+BD~an#ZHmbds1?M~>oF&+ACXCG%`Te*aO>sW4P3j3eC z8NX9|ZpY|ewBv8TcH2=j*0y7bZAT07VZq(_&R*JcT_^RTt_E9I%4l2HLR;61PV5|) zPCfQN<8DqBdQwk)82wq-eW?CB_$+7dkwcuucG(U*ZL2)G>@PQPLdWa*gN;4~%k_PO)^QLrc$z%(JooHWK@91F`?I zPj>a3g?{Nd-1&@;4m?uv4ocJ5GXwv|$BBVHu)Ur$P z8RfL4D>>s5V8oZ7MBKmh@KNv{LfZ!OQ+$v3^0e@av_~+T$Gf`UHD0WU8{AkCv-=Yt z4_n=;e)*GYZLEm;lia(EO&kU0pY)upHLjkMwZ`f>nro6h=%YKjp>-5KuQKN|rVj28 z#(pr=sg2-Il;yua_aJM=OmJS8G_<8L)hU=q`_(twmR}fFI}YrEw&?F!{+H07*W?~z zJ{>aeFPqqS8Vk}1)o#i3M_GH0rE{msVQeA|!PpS!E%_?T|03l>xknZT!&(;w_d6fO zw`^NJAuL)6?(OFNlCbC|xP|N&M+XHthdXF%^xeF==zsXPMwYvMzaBqS!%J57h3^pC z868Cas+=dLT>jSR=G3i{v83;59Q0X@Zo1oz$LH#m!>fNbEMB2{7M$x8cw@lRPpjVP z6P6#VCvz>L57kGaiDDLtZaJ22_2{(C$WDo|KC};^cE#hTg-?YpvZXZ9kBUoHGH81) z_ZH`#Nq>%_FCz*4*tZw`_{(3#D-O_)1!-PCKA3xebzd^3bcOFdOk0@~MdU&Re_%pG@icY!ddBPR}OY!MEl-4t;uJ^))#am!pNXAXw2^+T?@jw#xsUXXjx=)5 zSWTgw_}#XR2c5Ouc^bSKdaq_|?FP;$?hzdo85cT}r+kMB86Q4)kL)Ab8*6ySDVJPb zwm)90^Iz^6u1s@o>1^OX3_Y^e{3rLQ+8C3YomkeIyBX)NGgnvPcRjl%tMq&Pe<}B! zC5-L#w3?=EPHZ>v9kYq;I0`@FGl>N!z2e|vVj7k9u{Mb`*Cqix@qvGR$X8xG$f=e8 zpEtfWM;4-6K219ezg^<;1rx7tH1>xjj!fU0AMn@AXb#&MKH#^nk zzn&c-_>XvjVmzo{gNj+WClG3+@1zg6rR7{2k}jnCbi4RA1#S6r9BNI3SfFJ62PUb(c6AQTq{&sZs$T+2!<}Q;Cyf#=@^!+}-nYFd( z3r^j?k0n1_`QOWpmv$eI(z9P>C1b~jA7`PLDMo+OGRN2zjIS{B#MrM`GsZBUI=Oy;3{8o61=BHqK zPx-aINBX6tzinY@UaO4Os(fI2wlBTEOIgKi{RdC++f_s374n&X#eOTEb{@DZ_M;19 zc=cq)V_rTPvKN*E{pt zyo1}X_0Al0^ZSKuc9h(nihcG}veOmLzu&YOp#BZ*PvM?VF}^FET@?&?;>gnWiQ-dgs1Q?$o> z6?bxgzwBaLjoofuIPx5_jsKq9=4E-qOvrIbb??YO2K=?h8ztV0XS+8>1VV>T8%o)(gwcQnTu-&=mYKM|9+u}aPbUm@!6oYst z%A*zn4THTR4^>DBd$1zC!HLw9tbcUBE&jm5rka5GP2 z%UQYyqNy_*USBsBBy#51pSgE*j6?T}G7g(H4jF?jjG^JIrAM+;14kPA2ae>Q%LUJY zUt^=c&#Slbe~;gZea^GQ?*C}$ zZ{AxnoS5osNp@nh_3Z#BR$YqELxt+Rs$Q0w?W>dQU!<}Fe0AoD&!c(b>u8=CzPcswj3|APatrbvYet(b;W=wdfOj2Ok{3H* z`=(0pHl)a&z_~v5O`-pKc*f#>spu5g6YhYQEfXv^PJ{TwgcZjs-q8Ixj~8^x3spEQv%H7kbK;A#=ZY^zxEJLJ>Du={%+d7mM;W+9ugx zCh*0tB8;thWxjHp%?E1_P53EKePZYey+wQB2hvB! zmgk{A5qoiEUhJ3X1;1Q8k=TnvC__wRVlZ4i*jIi7=~4e>HumCa#9kaxy}883UNq%K zRL`MYl=Egqld(mvoEsQ9#`)IHaZbS;Y`2TXoO@#IMa8>O|J(q5!1+LFy1D-(3;zb) zf08Bt2CZA*dZbb^=3VS|+kDo*?DZSF%S5-U{JH-<2UBDjR zl7ao0m@u=D#cv@dOjG8xm}0ZKaiWM9HNfo)&L!4qzO9%1D1TngU2mV?Gj6+jf!kb* z+s=H^=1Sx)U)@U8Q|kI1I9K;vPhBtS`8~3BG=o^5d*Zczjkf`AJA7C641awu;Gb^W zQ8vZ4gE?`v+A-So3*0`t=XzH5qMp?WeVKJ>LSJTg(wFerw!XyYMDvPxigm~|DW z5iSiH852E?v%+5B_LmxWoE2ScX#n3PXl$mr`;PHED!=D?uINQQvlD3GT$DhA5uMP0 zwWW;)nU)5uJBs=Fo^;l1Xuz4OyeU27HnJDEefK$NkUw+j%=4hZjG0TtBcpS8E_3Q$ zRekJF%l|fbSR=u5 zdM8J*VN{iJ7uo1p;VRwnJP+Gl_61?$?r~P(ltA7kNkC zlb>C58*;}DbHfMW7tu3Z+vmayor3$cZ}1t{W8$eXAEg6mE%ss8)!MCd>}JfcRlWZjkMnWC(v)SQ;-Y&4nBt*ne56Jk-b*V+f5vI^y(wy=7#sM)=0*eOj7(@ydW#%#azYn zh_n!cWZ&Jnvm|@i^&*G8-xz%~m9h)43rH4|{j>6v9oT5gb0Z^=C-&W++rm1zoON=H zZ}spNc+7Hm%mM%E;rBYy$%vnExY)gyow+#&7|rnF8!3OQ@803>GZ)_G|03T5!_P&& zs4M}Wqs3F6z&5_;DDoilw~@Lf1Ey1VTxr}%pmd#E|2_L9dq(uBdm{hZtxr7d-)el` zI13-yOaF21YR~Sx*q#jTAVL1oT}qYvev|9$UjhDq%#9G|zH;A7ymSBM%CFSyIZD}5 z$|7Gp@pS&y_m(7up5QFko)MSV?ODs&8$U1>0uwnYWmM|eJ-fMo#6Q0#B`M_bbj4^Svcr! z(zu^!Xz`R=u>nN5|IgT9uoW!8PEfewp4>aI3q--o#1VPesf(`7t1B9mx>fTMyI?G` z5IAFtr+i1c_cCmTU-vD&9s9u{=>nhiIE2r29EaKX1^k%0en-DFfmfJ*3Fi;o8fGr2 zZ?q>CE**$Z>cGj{`f*<&eOtBy{RcT+K1q@Veb{40b&%C%V`%oLmdnq-5l2a+8`a(pW9k;k#`kMJ4$zH86Nzk>WG z*+?kUnGSS5b&D51!uP7Lsf}+mSibQamv0Ph&o@5Lnc=S16_0Ox@rmPnqlCK>YoXN+ zWC`{PUU7C#FmXe2sMoyzazbbU^`GUvmy^$XmiKF%u) zH;ET8w^V;6eC*{xtjWB4GV}uWyQdvT)hhd33wFBZWjt5%L}w6; zR8PN?{f@ccw1)W)FaPNpr~GZkr;oG1hv8%E{aKV^)%^E}@n^u7O!bDxP79B~o+KN}aM^*dfBU$r&e)yUTiD1rtVCWg zwkLdoPou0;x+?cnY(>&bPvSj=|9iL}`8{l5P4Jo`pfrT^7*@>7A^gzorVO?y@jU67 z@|7#ne{{72r2_+3Gq<;_I5(uT7sie;&f1*Nm&`k|yv}TzZ~WHwanx~bAp4!VICDem zvgl*@z%YDII4?bCps#!o^D4@nLmId3%G~A;EuhRa%7_np<2`Fu0-UWboB(AsR*>h> zmFE~cLeala&Yv+SG4+z6!BB)Z_D2m|%DK3$X&a;^7(-;un!><~O!c$$pjKxyp}T zfN%XQ^nz6rf?H?F=D<3Xhl}&KAh#xAxQxKXq-QntiGvS+UwzLPi-x0ixZDPMm*F0=F9mhxnJUikZ z?0|dmUESk8uNSz#9CpV@mGouNm3bum&J$h7xnp=#!HM_AMIW4JiSj^UfT7{lm!8pGo6;`34XhuU&P`mNvUw;HdcdE-QLPk48vwbP+3S&O@G zOY7R6=i_%Qt!JKTX$=n(et!^t=ro%5c~_i>Um?Cx9r3Hjewj$?tXsRs@0DKQ_eYDL z_(j&~mevcqp!Ix@)&rsSKy+`nE$h@4*(hbx!M^O#S@W?z`^0u+k(Stw`mc81j-U3T z9mk$wOqWhunvy9#J#DGhn&@htOWd)2yKr3X@{BC(FdfH3;n^qRS$|f0JS)G_J)Ym` z1)d)xV~cO>r)F+{FtoS?%(RS>QYpotM*AC*WI*zjMd&5kcok zq-)l7-Qzp67x;dT@zJXF1Rv2LytRz=qzT(e4(mx7>q(C6Om;nSZGOd5T3Oe%7jlKx zR;$D3VKeMV^Q=zVAb;+}HaPRTZ$oA;+OVd|<####>>Nb)&>Y++n+Q*>(UK8@?4?Uy z(E6-*oxe-OrSc2i<8t7~UGoF2%|7fh%3S_@obeWLX4pG=mj0&6ay#E!r6w6uo9V6`zt>OUbA?-97n}&M5_snUZ;!sUGLBF2g)~-?8NR80MyD}j7aNxG!>b=+ zCR)J-7+GTh4{}ZK0z&*sCM&TASQ1^i8`Cl}L_OpTgIrcQ>&P7#N%VE)3|Gb7B9j z(HRy-f-ksi5m77K$X?fs9C0ISn_xDR*UY*sm@Ta1x5`$%+h2DpdtfctLT`nKG|$o6 zB7LbmcXnzpCjaYZWKh}X#$caoW_`Jl^`+T=@9-A*IC1i7H)5aI1OF^md$6f}o_hAM z=C9+MCw%t}e;?i>n_dkzz4wt9>8INFk0J z&bJp{_dfW(zspzmKKSm1j_-r-`{t5)%_rlL_U3`vHw|8SOw)hO}W%x`N5_44Zo)^V5<6ibF}RG)4*S~&%kpC66VpoHt<3#kS6UY_`g+Ilpf zvMC4O|G=~7e1SCiD+BK#$J&5qktV-llV2~MGraFmNb<#`L>yI*8X!TY4T|^ zY1U?SF=?`|nKWxRx`4FA{q_{=`)uqa@WvZXX3elVhHN>_Zv|tstu05fyIS4|8egkV zV#^u#Aim&?U9By$=g2OP-4UD4b*;>kHk*!f7k=UNQ=*NglJ(#c;Y2^SOGh`qKdF#XrD~Vson2qA2 zu@f2~=k3e73wVl+N{sC&d-jU4?Un!0J+96?lXKk%Si8itN9jDh>+@jF)7LY1_WU zZyCP1hh-!1Y(emkIJO|I&1%1FmL2OxXSwQH+b-D;r`_+A?*tFoT3TpFA?Hq-;U&S) z1Gx_I`NXee;}4cRh&|~_{L6x|%Jii*g(W4qHxVGp&E0nmnJsCbIInns?r)pOTl_ujX=J z-0tYttH8%X{vwfEyT9O`Uy(2vkTb3R;vOGQD`EzKmLjD}GU22`( zd^i3!jOoO2Ci~)k#^gcnSul1k>_}Pg&y?xJ17MG23~g%4@WqZ`6VX1Avt|eUu9&-^ zcbdJD*oIjFXU*@-eu=|fq}nfWlCP*~o{<-8x`7}2Ad%$$HK|%x*qgY8J(Cozf$W(? z7cxfK3w26~6}+%`%AvQX)%^m=51#Opb6P+7;yg61esX95{)c}?*3n%Jo#pK!FU!gL zqw#m8J=m9B z-qq%jUNm1gBVQwQxCM4I~XYdmiUhnI4!Pcr4xNmKiF+O)YA$1mC^_Eysd@G#Ho z?eh!vDO>Yz!Hv2GKWkxVEDatQueiZ0LpyJ#P4jtw(v}g83~iv<8)@?U9a6pUq+wv2A}D^vHItIxSvW3Bgzc?ezQ_OqxF!3qhyE zKGYiUbA7vvZ;{2^K0GttP%#brI)xtE|to)?WEc$FuvfKbIM9+^rY^8P%iT`M4sV{%p&g)b7wlg2+4VmGn-yc$JcysO#m?QQ$<%f?3V~SxV|7M*XOY!`hsY8B?EpI9= z!RNw}8TI%#ugq;;6U6R*D)%MWxCG05b?*Qxi*-=G%}<9r_%^TTIxazXzRmC6Veh*? zY|ouoe`VpM^D}RguX*$f#@VU5@7|V+s0|6e&971JaB0f_qF?jp{?GU|?_7(lC!c12 zvg^}4$@(;xGG>^gQT9%v`T6o|erU{_=bjkLD&OzMvO@1@ADbYP*aXAE&5RS{r=0D? z(&@vNh5Z6?*3&rqIK=6Uako({2fI^zd1^R5&+}zY4qd~(PBVQthxNE6oqZ(MgGKs} zZ*og%YG_d&|1f2r&y^Ls ztG^!Q95Q3_K=v^A9P;kIvOnNg%f0K+qmgzkIEuc%+U`L$^bIsJmK*OqE^lkhXETnq zPBt}64@^bREWDSycvSb}pKs$65$3FT#p#V7w=3(cBF-1~ndrNYxqCo*Tr*{ZB@O6o zrMbb9-x%FZu@j2Ur`*k6Is7pm_x_jU-ojj-dCC=Aiw5=Eip>X~38(H-&J`To@cHne zJ6vDm-(8csc1!j};Vs;Gzl}4?uOnkMF;C@V9QJ3lil;YXr!(?qrSUN~^0veN@-Lyo zA=WCLrxcBgsILmY@tnJzTFC&DzUwPL!`wNa8ZJ{G*uI+2|7-bm)khbwhgs?WLvCb) z?C|r5@r2xn&u}?D!@-N$w}vMk#b-h{nI+~ai$;2b#E-u9`Fn6_=CYzWPeK>D>kbBpUynAD~F*z^xXJqzY*t^=R8gxE; zc=ZobeC2N%-O9VGeYm-+{qft6aYy2iYROe@*;A|UrL5A3BQ<&FrOw4w8COppc^-GR zyMDtDEjsnQ6a9wgxa+d>Wny12=c3@QvrJBMu%@244e}kX_u@8ycMIoY-M9?{+_(*; zq8V~|IzAutfzC(%+vD=XxT=+XuiB>3vJW5k3znU@i5Q2`WXH9)&2eHslm3#Ajc|dp zr8hXd&eRVoVr}q zHNmZG`{#RCS79&e`irfLcolA46P!BEFmac;t!rxU>YCn*y0+W8s4S|BX6&L(50Hfi1on zX3PYCk6mayvJ~`nR4#*kKDfj1A;xFu+@<6WqeCt=ydUPCMfIQZeng(`Z&4pAFQB^?E$=Wf`YnG}jQ(|$DM63Dk8g^! zzO(*KW&KOxp2a43z$)UtMAm71g>svKG0UHt*39>}`qR={XwM?@_kd?{$$x_94{{Z! zs+jsZgY`RNy~LT{oxy1_abPYEOLuqzIj)8?O?!~9-%Iv!N8#(adl+lQC5$nAsf)2S zDz>X)s5F+&MW;zcoHyL{G*?`WliCDMD+=qAc4Ya=4HxPTdZ=h*c-$3&l zeFKrV`UawJ^F*e;YpJjN8^{@l&?m0dIGK?jh`!r55J#TZUVwA}-A`8leGa%XKE8R! zW&EO6SH?d;U91b$tIlBlXrAFmaVqd4i}AH>aE!05>_yShUm$iyJDs5&JWlYo(-{QQ z(+!HpI0b!xsXec7+gxl&n2W#3J!0l1w2~ig!hBq`rt9^{Gyq$mjXWVWATG_-DYl<5R#e z^!Sr|*I+p?zW!-pe947T3XH2iEsSAq-+mhymw#Fqf4nd>3ctw(z?ksqV7%gF4Ky@m z2cukZB0lLjHU08IrhzdP7~*xG6o%=S-&|z;)z1e;qHQ2?onQ^Fjn2t4v10~jyYXp; zB-|apdAEJDkiOJM|1zT~pnOWCVJiGs$@S%lQ7@5G>ma~JgC;MVsUVYq-l6ObEAoc8^>+gyzp%~KgO-TD$pRjBu zo*g3Y@87NexYmVcc&=hXn)_}nFZ{Or)!~I@#R6A)4F5O(*IN5nseLZ9&o!>SY#TD$cId2j z$c7?c=z>1h7kY==w~aPGs6BV<3q6N2#uwW5XGFfqz%XU3FZ49Za7TBbY#Owlad|+t zkrd8UdcM%JmnHZ@-{96&i4SGdhWX+6Hph&C$mjHaZ8(liXezo*A@3SP2e6w+wk%$5 z>J1cPKZ#&JDa3vf!G2fp0B#J*zkT=pwdY9ghqt#k2TPG{aAYnb(uGG}8~;69^R z)fA_;p4bsh$Rb(z*wtY-%MtxKqkC{0cS=Zi&CZMEeBIfSh-22Y_BdANwa2kgKDhaP zy2SC@y})sdd|bh?3>!~mE$vuCJD9)tuf{61esg9@>w3ve?dew!E{XIDcEHW}-*$uB zoL=CzW;Uc4vvYvs4P zr`g%Pz^g(u1Fz`$7BA+J@X7}-$bsub6BK8(h2= zaK=B8R+ZQ|6YtY;i{H|DqW0M$2jN?&#(0Y&&HqF@jukkuhgYqsqk9s;^mVsc>-R}8SU{Z#>YDmFQ=e; zyr%X7ujedYIfE=-tWl!Zmxb4jb{)_B9lcKN1zxYn@0Wfp zBF?K>2e1RV>%b*$zp~#ZJSPZG*_`3G>xpraNWaQc+vAzVdm^3=8hiULBGg1 zvT3DAet(dCF=W99_#Z*eTW#T(`&BKR)?&Brnd}uDMdw`(zt??;o=*IMmw$mj2uQ0#!BVNR{$ahkoxwRW%ZGM{_LGv|2> zUx4ozzo8($&d^VLjaM8nz>j9zxsk9BFTcq6 zekW$^nec^czvt>;O0SUp)5=8R8DAvth~*hdAC4`&P39$k7Wv{2;wef$Rrz-9)%SVi zdpt+!!<28=Ky%lrm2-@)XnFerzMH^z1}16f?yij#nYPW|O8;D zo4Blg%6shhSMGa|y>j_&bGPzpp2S&b^v|kUu)?V^x&ZdmLhfh2h1jdNo#VvrU~J!Y zk1w$FUSHtO2Yi8BzwZkyde|2z{IM@k^iyBpLVUEbX}scC`%H{}yOe%2Y1Zy@fV7Lf zG;90VOWFlqnzb=ClQxdDi2Ne0o#h{-DfYdAXYFbc(zMS=+EboQ=PlAs^S-sVv)4(> z^uD#WuvbYNoSP`^BU906ziWXz}}Edj|Mo@1Q?E zTCzI#odH+YJbHhhn#%9_YnpfC7lYhzXkl{T@Xg7A)HdjxOWL zxQ;GoF9{zD)nV?30Iv3hp2sF10l!2ZE4$CL{&+<>_f$85OIFG6az~ZCkb5TaQW{sM z)kODVr+?0gjbbn2%#t0XrPPcn*_qo|np%@+7b;vFFPH%TF=Gn_86lZ3AP&vwNyf zpu2mAEPbf_-^x~L?VVnqmFbRIXs-NUk*~h_jh^_2p2nC8(f+vK_v)efKJKMU;{I1Z z_rE$JLwCOuYNVX*1&jKFffVjhj3)E+bH5$w@f`M9p?Ceq@mj5k2ax9CmH!@bGEonrcYaP>#a@@eBV?%vDezCEA0Z?7wy=9zB?SD(+f z9qTON&NrPMRNKYl^ekNAgwiQn_>M31*Z9X~d|wJ}1N=Ic^VxE{D5tr40cFP9a%%gR zn0wk|t|e^@zqsE||D=L@8vT<_|0K~rDb*=w<%PMMrv;u?pgL0Jo0#InhO7?;wh_lk zV`nG!Qgo3(4)r*?vy(Ussi$Di&TwK*==oerf&)`pT=#9(62N-Yof^I2CS1RzgJ{$ET38uGn30C0RrR-L742glGv+wTf0_Y?&kq!6WkL);{MXlgR|IeSQAl`+weNo_WqW`@Yv+d#$zCUVClNT)8u>g|Xa2+KYj~A)a^4 zwW+&Bxi1v_yc}4}0wyzoD>#~O!1dZq&YDx zsz1Rv2|NW~HP6;;n+F-3xoY<`XKPwh&K`%&>vYoZQS^JGO=s_4FQ?z@7UQpZUO{~e zbUz8Z{6q5`^(~~C!r6jcXk(q65qJZejTr6~+krla@wtTl${x{t&Jc(#3bM){^V}2I zUrB1nCw$HU!|r7m@9!~x1&($F$0T5s*f0P%`q+DtarB9OPKqbzN$%28?UL}0RoN{a z+($#4c54N9S-*+A^j3D^P*1kpQC&2&T-~oKzS^7z@;c=nMX`yHHrr@(mDy$==OU!d zf>Y9FKQyC`s%B7C(5n>-q;>5xE%P;;_g-EN3$`G zsiYN{G;(*#4(gHbcX%p3Nd9x-y~5)xzPJ)R71}e4F>L~e{yWDtE_7TYg2r_)G8%l4 zaosYSeYTM<$NQrX;j4l>+G?Xh!UINlVQBaXBV3Eq<|}x5&QoJwOrLjt*)#SW(%N*M zjEh+(1ieas4@hCt2R4}9Nznm~+qI%jQ`D#0!%1*!4paU*wL~Z3qiaxmRb9)P+4~nNL zT2YamY0`*b-WJT)q;FF~V7ShNVKMOg({O=d1ax;G^L`NXKOQqfFs*k!t+zX8aa*!p9iDsQMP-t@*h<%>1Mc$bdof)|{WN&~S?;5Z*IClhyou z=L`Hsz?+6Ko?~dgRbO3jxh4&2f@b#$H|z7ke|m+R^%WA{Qy=FXspBQHK9MH(buLDFZ0UDyUZtfmopC%F1*Z|bMGs@)fC=wHRLV7Z9-qhvV`XHkRYB02BR95UN!$Z((TH|A_8z6-u~!x$X;(QyM`|8Vnv z556uw{*{uQWFB60q-)c!X`9T=rXak1kM(aT-j;!Xg10vf>%rS|Lh$xB(g@z(V5I?X zb>@KJZ7X5d^A|dQ{FZ-<#s}f-B%$#^I6D~{KWy_e8x0z7H*r?@oQ1RZ0LR>~gR{ua zEhEv#v!1D=Twk+Iug2Evl?7$c`RhzR9bMld>m9~R)+sl1X<_;FIpCh+(<)t3!?mPS z&i1Y zvw9{zH?XHG9$DXkj`|>W>0QOntizn0^E>b%LEUAE=;4bC>I;y|IxDq+6CJDQY15HM zoY;XS(#K5jukL!S{(RmyGp4QNb=`+PVU^wMIs<*enVuYxt7=zi=&p0U8!BvGf!_pZ zV#)BtYNzeGPC17WvoWIHSO+^BzI@V#zZ>|h!%=S=r3Iv1RS#=n>7$mb>7Oj5ZM0wB zKjIzT@~+4Karf>|?MZDSLlxSSsyEqf`t3Z|KB?6lg$BF|Uv43dz(~$zmzHpE7y8K) zWvt(4=Q9?0j7e_&@mt=gYjQ05VC1>@0w@+D7|!3jO##?K{Zak~T`7c*#o}1y2f2hAWQf z9$cxk>pF9{1HH@3f-CG}hQpOB!{Ew3!VFx&|LmwZ16MXWu>I%Ez{(VGCDp{0Vf7vJ zhSzuPjmkRwF?(=~bqn=g8{iDDg(vfR@I-U~f+x~{3s27FUB=UQF1Qip$vG7++;kea zaBUDSEI0)&#Px#wTk{ouk#6BpK@!;yJ0=OnmL7=jBiCNBJ*JbC<&F6obl zh%XV7hwO!?<8!Lx)9LjuLvs&Khb}CFhr~fki+gy;Y{7+5@DTnM5BVEmiY|}mbuYypFp#KKGBvbw5?dx-y|@Q`)HQzkxw0-aCW0v#I(drtVuz^ud16GvNQ&+nBX z)HMYg%Fhavuc{*G1a)`w7ujnOx*`5=UWMkD2#<-1&bp9qDI+;1TDP&Mw3)ct3{B6N zh<*-uY#~iuY_z_EwIR9y_F|`&)~$7v${OWl{APYAUIo=D@DLu8D|kiU*hD)S)uYKG)x4BKPO-RG$u$ksdVUvkTE(~Pj(2uDGQHRTPpkF)fE~8&V=7YXB|EUz6$ z0R(@<7hX61VD~YR?^enXym84nM0`uQ@GDV^?T8DVM=d@9_bta?B7P-YUj=+#*#!K(=&c=d_Oo6xX^>Ew^3VB#d8PGHOe(O!K5BK zcV$2LINQX>w^*MGK6=bN;pp7Mv@e*>WtsSRf;_kJKV3Ta8ZyzT=-kSRzH~0J8z28Q zI`;z${~XY{v-{Gy7L!j7H}Nl1bio<6EZP6;!N1;g%)%cF?kFSusl-l^zX z6~1D6tCNwMuhkWGgACG#k&qgaeI{EtSpXK0De($w>1-NC!Z;Hb{AQkT zbfL2*h%S(4gXCqcej|AB5&2G+E{rm9LCMkm=xsjp^rZ{;{EN7t^n2(q5|Wvhj=Zc+ z)`W6rg_5I#^fxw>zlc8cRmRdU>o9b$vM(=Be?kHBFn1QLMjnpRwgl^SPQ^ox;7cVG zSFG|a9pB%s>Y*Dgyq}D2JjPgrqZ^*$uSYj_GloJpmIdL;xBJ1B^GsZM7G03gjqjZV zS8fWym1GlF1W#t43|E??dSv5#ySh`X0~??fvgVo>UN*i?aAj2Qwfq6X47$O6s-t2J z*|-=TUvmU&u4L9+_}nZOeQ+vku3`0E8`1IYHrHI#8#|D(*gL)6kM6P+e5qTk)z`B} zokYK1NB=8&z0O%Zva#6B$Qn%cDG$=t{&c-}gy6yJlxxWlH^}(YCRuYAonrix`Wb&s z#=kl0q_U{kOBniGyFSkx|9wMyWQboJ3PUSs*Ut$T8R9H+{68`CgrgOlUFao?KCbd6 zG+fKrze~Q8`i6~m?-V;s*^`icfkoG0tHj=Q)!(Xj`Kw=O_j`ZeUiHtm_LwWy?i&63 z7urWZ@Q3#L&)eF^oae5eiQm@c_;Nk(OLyl#m*2l@;Q2pq|NZZO-|l_j^Y#a91AjNu z7S}M-HlX4DD15>W&<-raCu};shLrL5&U-JNS+cwpE5 z-qP{pf~f4si!&UFfbCAGG3^b|&>#Q-9mrFSL(+;P>s%zwmiG z{rH{J7SrIwM=idg8vT_C=$aB6-a&TiSdkYva%Wy3f%W9!vb;dY`pCeMry~Q0H%4NA za=xkWN^V%oxr5H;3v@q!LkE`JFsggr#DkZE%{3*uihR*kjHvHgct*XH;V(Y3zGLA? z{98J+4zkwtQGZLbLyu_sYF#Jw2Pzk5P2t`bMPti)=1Hio%bw2zWOWm6erIYv({VW-t9J03}c8Jb~C-Irni|!)3TXjmm zWv;Edl6gm;Zv}l>aOIKjwdw|9JW$F!#TxZ5a)HYy~&{?5$~$dDu0^ zc(q~lc>%Um*ns#}M|*9yT(2J+X3j+NJ;UppRi4u_yPPzno5yqYbgyqRVN>{57I=Nr zdFGerBrtAAXs;i->>n8w@XgvvzO6ap2g?;{_xk2-&2bI$r72%l~Zp30+!pN%!4=$Vjpe>5}`5 z7UePi_JFie_WfFEi+>4W;K~%zw4{?}C3iqIJFvy%9>Pk;PV5yP&T}W|FZ`Wzk9XPw zM^@O`%SvoGbWGan*|k&7t#U?C>hN4~>N>XK!>zwM9t)}CFJ>M2Qb(~-hw|HTihiW0 z^k2t4A$2sHb$nOqSYp)CRB-Bk$UU|F^`khXjs~-iMN-F|Mjf?NPhCfg+)35Xc+3o` zLpSTV0{UQ`5%Qcy9a~RQ$Auwv+-25LCjCJ7D`W1Vgi|ChmP??Y=e5-qoxT5sG zOFiaz{q;wj6@X^>kn6@!pU@ZagW+o)s?Wf_L1ZXbmbR&5Av{*Xne$!H>cYiZV=R1B zXv4N6oF{-E3XhgKmuj~Ac4&l^-dCtKekErBN&kwOK68kXet?<&p`i4Ii?qgeGkt@Z zzDoQrQod%U7yoJ9<$q6W{D+zTKh5<1-CZjE!J`HZ_*roKuhSYoGSfd|rY}i0%J-Y; zw*;4et=9MlGyN(v{q|u-`oEazu_5kmPvJFM<2Ez>-DdjCGmP|qG}C_>l-{>MYkb8_ zf3ums&Sj+kt(krRcwqIn@G7mb!AzfypQ7}u2kMK_7499TeOcTzK|c#x|I0xJ9WEKA zO}N1tXW;h|<;gg&1RmcgpMnqjr@*HcMRxNkSG38auK1qu=M&`a8$W!s z6+Y@R`KZg}qb`$=ro%`7B_4|WAik*lpGI`IttrZAThs8Kwl(2nsTcn&)&g7YHtz-B zWZTk!+hpPIJ#h1waPtJg%@Yc@C0d{yxW#;vZ9^^-zg_-CJ#cfIZF2{;%^ljdg<2q& zwkaQ{-_)2QBl^eFwx@gAR%o`ZFsN;Xp>12F1&V0fYxwl|M&|=^s5)oFI>nOPG_!qL zQ2Vsd_AS=}Hrn^-H{CwuV*hlR6Fu!~oqd{ejo(XLO|9FAmvgo%{u0th zc;*i1{>GOh@gnD{_+J_2$v&$3{^>Zqi1>f(HO^~^yi}(l3(w*_9Zw(UkRNFOYTZHj zoyZ3&Zn_zl<__FPoX93BJl_oGEZ#~9M^07Y*i)#o;@yE#2}kZz;gikqICo%$gd=mR zaBMJD`V@EICJA3;hL1PH6WoC%5{|5`(vLI48H*yq4+FoKSv!jTg{*UBUAj6xrsfrM zUD~>Ls)~ta}zQX2s^%E-}Y;w>h@6 ziJNDR?E>BxR_4fgsIK*tCo(kU9kI%zKdQWyq^mT`TWyw?5N+VfEyS%b%e#~JGPAso zDG#_wd7V~yz)h9+H0d^)tl2%Uj3$db7N==zv;BP+q_)kMU9Ey-vDj zv%I$~TsF&lk+_%5@?PcrHM6{hlm{M2`;J=Wfd{I*Pf54eEblW5er9>^61Uqd??c`{ zw%|v3;G2|p%qkCjQ{{D$&T+3X*P`z==30W2IOf_H#C4eE9pU|$1wYCIx23$}lvihC ze8FugPwt$Mc`J9n$-I@j-=wVC=q#_y+1ltyUKvyI+ZZgrmb0dF-;VBb1U^Zi6&(vN zW9|QK{75%v+pyWNvuD}DdUy}(VHRNWPEdPrV;f_HN34 zm;a~4?FjS=h*4HM%}Fm1p!|dagN{S z?1}zuj*a>?>TivY2#7z7XX5Yn?oFx4*^^L_(-L2i5Ifl?OM9(hu^%rlgFALGT3V&05 z0hW7DXf?u*CeRm~8J>Oa~@qxj0UmANm9o=CU=&yb8RnOU4bcnC^`aVzp z7J7Qw+xdr?C!B8oF!xP%+nJzue3~*ue_RZ#|3to%>h>KuJH;=6oV`9?9IyYcZvW)E z{er>BO~6Ucg1(QBqJv-L299*(2Hq3h{*m0k!RI3aM_!Bw9DW)3K0j0K0mxl%>q=$+ zbS!5i#&(CDcelAG_L>8~fDZTy|F;~5ee2#c(eb;ox<*A{`^tYTWsWn-^pB4SbWV&2 z9Gpzp6yio@WF5+99YMQVn$OT*d=s5N?eZtg=&>844(t3xu-(|5rcGdpWj96{oKp{^ z@38A0Ik%4On1?$%3$Y#ZRPNxpCc8C1FR&EbF;As&CzhwuxD(4$`3CX#k?u{Nt9Ul? z^zhuuvz+HPo)y`Jzq9L7-?r;KbBBYYvR8W*@T=;xXCP*n7`F+E)VIkTL|G zvQJPt8+{G%miHg=&bcdd&mgr;^s*j%YIUl^ra#7W4D+S;o`G>sUea~4SDSOn{Q@8Q zz{AwrNqtB1&(;I^8Tv8oijU@NdY!Rv@JHDLGc<>*L~I(rmlN$uA((9^hxkgr7?BgX{2!i zOMhE#03WsrPgT6B>rNovUpzZ2lRJO>OJ-+@zbt14<)G_c!y=<$S&)vqa<0N1+Zf_M z&1E0L7Ld02NZ(2u{GSm}mK|I7$;jpeM?k^yG?05jfBycu?`l?Q(qOXAFQab`M= zbY|GOR$iO8L3FtJb5x(orO!cqa;5d{lV^BOp9<$_jYpZQ(x+R3`Xv5C6Tvgpr-Z(J z@-r8;$OvyM{c_PqZ8Y)-{gU_A=LYEM62?AAEB#Vo^veiycw6b0kuJ^*L&l+BMmj66 z&3n7_tMW?KuUz^O+^;5d_Mv0tBFq}A+8J8oZ_R#X1@)^C-Ew!oidknb={;6j&{%0< z#!5p^5IRi< zJV;-L{ejp9G{tC}4t|^)c$e^l@Wh$WBH@n(LX$YZq4x9~Fyg=+wLElTm1~`YyOg>3d9l%uCu07pZ$yDn2#tLRWMtM!R(}G~EZyI0HFR z;eVudYl(!xYf>dl=6QEmrk@4|(7HBSacnk5JRhUto zU6kvDKAn$9lm+rEcmNZ1_t&{VN^D|{rOH2N0FLke;?JZmt?{%++r>^qkxL1FN z?}6Uj$}8}*If(FCe8=&9Io|`k%km;hOYV2-t!24JImhx!ORga78K>@M|5|9Wo4sqH z$8Pqng$C!cZ*Al5boc6MYCV}-c^Tg}@A6+nmX<7w(_3FN&-9e#mX`b`vh=3g;OEc8 z>26@4Xgq6xrEg+)u{uwc*HW3U%JZ#utMXbZb5(gi$cQd2nK?*rjWf$jbC;H!A6+WC zW*72SI_IcpR$*0w=TZw4~fHhYZMg^ZPfeAN^i z#rwAGrl@G|=uxvaw^qk(X?`KD|)8437EPTHsv${ zQ&)5W-vhnr;KWv7>SDZ`fN47Tuoal@%b2x!-{b*X_QlUH-B*@cx({4jWR^M8EYlYy zWhQxj*HY#y>`O#RnF-z&yOf#89S~CH5Wc0%q24&!*>-HembQnkENweBth5c9ztSvo zmRY8z+L`9nq@Dl3CPB4xnAfJ-IovCE#y71>;akc~^}a(pKYwlDme1oClzv{8R{A+S z|7o+#%PCWA)xThl`S54i6pLPga}iC0vVXFD%l@*fOZS&Wls2up68w($HoejW-g_ALd3+C~4fDbOLBR35e8=%U zm+t}I{l~~(X4|s=*fsRYPX2|&(}#bMAN!D|RoCz>eYlqNPVz6{JCg6K`Hu4Lf9*S4 z_P?f4#zN}1l{Uq0&DlC=YtFWzTXS;bBE0+24eejZ9@YJeye-vs@7AcT=u91y^F8cL zG|IW2{W6<(f7umV_Qz4qvFl3rr)j18kw==4o%TOBP~Xbay*kOe|1%@Z{i-KtEwtw5 zy|JD9k+qC;15~;~ZBX1#c$$sP#BVC-CP9vQecCMAz=4~|eKQC#9{^w!K z$LUs|q5rXbaGn85*&bK|fv9AMfQI?zAJ`TJDv zTN=js`!jU^qT%%i7jQmuRCHFyUe3^0ehYnrUH|omU#&YrJ33cfUpg}0urWNsy!M}C z>dWlNyJOse6!7R`2l4=PIP>M`Qgxn|G7^>=Hii?4bB)q;``wb5UzeMWpYh%X9fLplB`l$>eD7hr}KkTR|MtbU7*;HFuu=jfBX zFXKIhb=)Rw3}3gWnEHa0>LcLzqxO{QGr@1s7rX-AZ&m&q41Gb&)#wZ2u`z76om6Mg zb&eMJEBU)tMqpbQ$v>+8Ft&*wWDL_w41K{%%FgiJ3T0=w6!;w3h&=yXq&nAhl<$t` zBLn+@)z#^mzJqhd`^Z1D{49MY-`n$?S$@8qwzG66-~N%<3FZ$7sIc-;%3pQYJoDQ& zN~PJi(O%zGY^BLC@{PkDafOx63=jH!R) zG^N+r3O)3z_=JWc{I`Ce_-KiLep+BVcR(3&i7M|R(PvcNl(juuZ1--;8kvi{%(}_a zXDkc4!)kjJcU&L`-uTzyH8WLmQ!d`?M;MHzyCSHfV+fgg!!nm3%F~Ku>NO` zNZt8gvi@3qyDG~?8dWZ`c9qa^#z1oo(~k)KGv8atW6#3>H+0ZXy|2qU@cB6b=N;Tr z721v)!?c4is~t@bYK?!Ab};7>WgUpjS#mM^x8vB4UQm@IdTam7g9B2J+#~Ko7wq6n zn&@}6JGD&`{E$_q3sQjn??835&nC(+1}K_6xL4N5C7+ z(ZqfW`)%B}<3yL98DscOQ8pOV^uqi1&Ce)_N_wQ#AhOlzEG)?KyVsJkkIx|!dqZuUI-)Ganh)ICV*W-mr?$Q7n; z<6gMl^GWW4vg-ESsWqNs*1hw9QFq;$)D6v2b<3W7Xun4pb$@{jwmq*vokz|6Uf+H< zao14jT$cNXth#GgXpPZk-7cwnDmBYd@x~y_;9f{UVj!ob#Z_; zjJjIY;l7l-Lc^QRVILS8zQQy2iztJJUqM^8FaD0=0UN@!rO@5CElpE;+TvNHHGbc0 z%QTtyj$2e&wcN|zjf2JD))Es3cL(9%Ji-?Q;ou^^7aBO2DebZ^&l0=amT7%qBz+1U zkJ_N|Xu4KwbO*!e^9X$#a8WSwjMmQrUWa9zD(_KsxGpkb%T{h0})NZN7; zxpX*pc3Qkw{PO!*$JuO#E)5-sJ~}r-&-}YHOLTIF*k2t)diG)AqfvSb@K1-I3jchV za;1CJ(O9`JuWB;boCJdW@W3IDi? z`O9}a-+TG~lypMVupN>6-Th)81s&4l&X|s>9JveL-!_D6Y_R*`+4b2Fb!I}+i|vm} z&m2|hkD2L@ndy0U9U;BUQPPWTk4n$HQt2IQjPm1#8s+osiXMvXqLE%~ZB%-At4bed zrcX1|^Xy6?z3?K+7h4*Y9{!=yCz$ESn(29VolAP*AEXys8I>NIuhOTP=_i}%d3H@4 z8nAG_gY*LX0&t@n_POx}?2Ccv5@0%hO-{?iH97v>z<$NhfNvh*3kV-Y__=Gab>Vv< z-{bfmOFDCIi_KkbD1M~JlxFI&rJ1$?rJ1)5EX`~gR4Ou|!jmS>ISHOHPi2lq37(j9 zU;}M5a4AEdj{n5&Jgy8Aw=PmR8;E3$jJ&X0#$2t9BCzji!WU|_agWQmWcFW^0}0^T zLF5-~r-RaA-;-vhn@GCx$?DG6!^n6a^h$?M+mU9vDWsd697v|TBhbzdd!>6b+c(Ng zH=T6($$=Eo9eQg{K(#GBN}b2*q@Ahxtl?y?aF37u63^VX=!fsK?cn_O9N%-*IW5mu z=lDPVZot1VCE)vz@Q(>!NBH_`aGvi^`QFI))73f7jZWRyfrJg;^|z5{NlL(fjOPmS z9wXhWq$%c(cE=7QP2AjoeLxE(or#_!14J8=hgJ=pI=+PtkFl4lBW`TRR*_ZR%9^FE8T zvq?LTzvF?NJzaz!p)bdHE+Bp(@k{up5Vwdl#rzX^kADC@{s45~0q&Y*&9pT^x3Sl4 zjeBbPjMAgfGFjWo{`76Y)V)4VZy{|ucq26KCc;`$-o{Rd|LO>D%SfK1SK0M&ec0cFZ66z3hi@U(P^Pr2H>Frx=%9(%lfQ zybw4}B;B=P({U~|Xk5N!wsUsawA?cols1F3)54{z#U?K(T`K9sj?0(8S-EGk^k0H! z7g^s`S^BrF_sv=QN5q|PeY0;RX~!7f>VEg9_&&$__QdPMS(9g2>0g?li;mH#=R*A{ z=#=cysqgD9)UPG2=zP@o=8N@7#LHQJ^_`ui-%Z(yUngKAt(~n8Ctmi@RQwN(wket| z{kXwMFZ@@<7i6Iq8s6}K=&Q0{f{w1ho>%lZ{^mJ>n1R?+|2Ss-NQa@%DMXKRy#|Oo@IrVp7DFuPkM7rS|s7f6Kj{CqcPXWDh!$Ap6?T8>L64Ya!s71GuJRG4B6;2 z2{YGJDh&B*kA#_PPZfrY_6cDk8(Q}*b+^^+(pO4bMfVe;qghMe?gIZVGIfqE&~2gD zhaEwBN9L5!>;r_2pUyc0_Bvh9Rpd;V2kqWCM)%=ERQTn^a%N~0aWA94TTWatHeMr* zxXz=>X7pj%GuWo~y)V&=BDweBBV*4%?nSiZnATSGM#9gvq54JW>eahvi2nB9t?(iG zbJn|Ous*?h=X^kc_0AlfX1#0idY<*}9;jzoWg=Ur@_svWX$gPT1~ulx3^^WoyOBNv z-^4{`yy8K~?iuhdNk1CcsjzcxqmzQdE(!{d=_lM8Qy(@#T1XnPR~4I6tL)Fs`lUW8 zJ2c+HBW;8>zonnFlgKA_rdFA6pJqA>mus<^`OPWvh%M{*pgR7`Oh1M&nM1*Cx7uUn zk-oK#wT%}2WI6UNkCWH-HS3!o^*{rwkR=U#iqtPb52W(DQ|a><}qmD zif3#)Wq;tT)nY%IWcdFT{BuX>KO=7_%tPC4!BgtKj`DNtF*Sl4;p&JBt)nSIe~>x^ zJ^~xj*I8p5T8{-E)yHUUQ!aI7oTRQVSB3T`QorqM_D6g-#+;;%4@2u{iqx+O?hpLq zbo$dhUhYW!9cY#4N4vv-(OVJ*Y`Vi3n{7hV%r#Cotz!-T26Nq_*R{~!8nIE9c@53p z1#Pz0ZxZ*Y6(@X`c3Ze!PTW1F&9nD!gqyTm!j-Kx^m~~R4@rez$-^zW9_#=8BA3ulZxdVsrPk%Tb-DIV4Uys;cUxH8m9-nq% zQ=HuJd%}!8&wl(7EyN!YWr#nbLkkUmL4U5Ue^nw!w?^k>E#Ok4?8rwR$55k#0QJm z07zLw&3Rg{nYIi0HvQJUVSFIb_vM6(zqGy3H-Yz0%{=d8r*H^97wqT$=fI%*oCJBU zl)T9N!DNj-vsO(=i;AcTisZxf2vXTZBpJG z*8)s(ro7`bLJEJI+wrLT^yVpNjsys zgU_ZrHSVyA)OK=z_5s%R++A@Q?V83tamIb2GCtsYu)!%bgnB zh3cVyw$`%U0z>h=RYdsK6J3pk;E&bs;BqgaZ_7v%OSw+gZc7Kb1ItO<^`ch4k9piS z)=@8gi6O2)7NC2P3x(91og??3Wpc` zn!YhUW!(E(X^fGx2|uT-X$oWI{s!}2RoVh?YP8xuK*o$V!j~G0hW3t&l(>HGdHrfO zap#!%u!RUN^N7TK+l;%ocifi}cc~ed*E_CN;%1t0SM-kCBXL)mao6^a`{IKlzF|OPY^)${hQ$%UN?H|I?|j*sRYgKZ>zB>q%$g>ExXslJ{crhMOza z+zKAoY2+Z*+5{-Z?vdnMuLD;fMs0nbvI z^i>d9I2gh zX0tBeuGU)3PdIB{TXbjr%Z{r%HE6w!`EvM*>WP%=L+0GW9kH*1Urx%h6=}LBFG82F zUl2BVVg&xVjlR@5uI#L<9M)Ouc#nGvpUB=2caPT>&z<#-$?6QXADxfvDNT0NJarHK zz@LkbyrW=tr-IptwjIdqr-Ip~z-&!aV)Z22=d=y4#%@C|u_wMQ_>fAN+-bYVk=pPe z?F%g{(=oi-8iRVqpq??XvCpV&kUph0cvL^Rx9a=O^|WnBEOE7t53{vto}A|y7fufa zMoXVrqaecsVn=h&AbN_WQ3=(Z@RsqaO$n+^RgP5ECOct!fVH%%Butx190}DO)ZK5p zfZMfZyO!PTTwfKf4SB{<=5^DidfK!PzBhw*mC&x*=)2Y3fP1(XQ0}4K!#!G=4tJm= z)zE*|gKJ}e7k4Y_lX)J7ejIz=Rxf+3Dld6z9Urj2W#l_bn_XgkCk*rOmhIM>FSi4%2@N&tt&zUoAB7d?I+DA=JUzPq~S*RC#8bE($x=j>X?P=&>b0~-yYGn z6h1BERSOML^As9%jP(%JT_ww$>#g}DxEllBJ{G6xS8>->Ni1-)CAICL&)WwjRNK;x z^-Gl_;cbD{lawL2zk|4a%!x6~zXHZ(q$8;+XuSs1uo1TESCEveLr^{CM{Q((D`S-lFzHLdI5LEVN6;S7?@u zg~0gpXtyedyIb|-BwJvNf?G^m9{7>T{;s0KrMGuh)7NW&+brOA&=CjT#kJ)Ew?tqj zYvO&Bw+5Oxe`#jtjL~xc_cid*tKp{$;Hy``U$4Y}=6vq5i!$!;lyzNVtmwC2$}60# zZ-`>=<%F|F{4`th{-NWn_xM(6w8?ro_1r-k(bK4P;q5U-e)lBZhJM^hocIq=>1!t` z|20bqGxwAJsD-3IPWgkSK9i@e;9LCT1n0ko{N{dApZuSb-evi4a5#42F9shD_~4W$ zwDBpPqC1M947E;ew(GYOmPl9^dF?!H{3TA-q4KPyoaK_Awbds)BMCo9S{0XX-+8CR zQT8f%QeL4vS^w@*;Ry{ZsLN0K&-kCzhQ2a|GyH~ZBeXlV#9e=^a;Pry&GGy}>RvvP za|)-kZYQiB-zV;f%h+F!^13ephq635Gwx#Dz7hE+!Z^?5j*xRukzRKMzH!*&c1Ps% zlyCg6tj4!T1b&X#@1A!jXLgW}w&CwVXj7 z+x9?h)KtO;cx$7k@f^rAk7q2;e4cSUxs!IalV>i^81D%g!0`ua0#0-X!+0f-+!jrF3LDovSJ*8CW z>Y8ye>qXA;#F)Hio-I(ye25+CnS1||*!Av6+8@bzv@F_R?#Y=|>JGH!+XL=M+8;U4 z>yD)Tk(^7z?~ErhjwkJp9Ke(IN5=4^{gJWWuJg46&TE7D7Ce=2kaZFVXDH{uTBu{?${r6kMon_R*FW#>Ae^ zUNLPP>Cg^50sk5Xt~kMw-tyqEwl(2oX!D$u;7H-*-Z)ao`D4M6!stkzc|7er^LaXW za<-6j#eyS+oF!fij>wo+LDxlwyh~)r=u`z)k=0Hxx0*uacLi(VVIg?h0G{sqns}NH z-ni0{16DfM3(mGspOo)eeTBD*Iz;|VAdPn4Ag^a7bMeRc%y~NxeTXgKS$(-zyKexv z{vDnJdCue+%X1dbIGzPOojf_ycwdZn#+@mpGtK^%nElO$uT~*b2_8v*xAxQDrHhUJ z%Gopv=E40vU6@<_t)Rch!5JBYXU#s#8PXE!84Z88`dm1|kaU<2!zZAZ0vDklF5o9LTi_xzTi_-%Ti{X%%@()`y+~qgWUs_;(y(FdS!YHMGig{- z!^89?wEj5q_-~6_ulS+a4!7BkR@%`@I|PrU9m2n*9fC*F4!7A3!6Rvhn|3ID0dzZK zW!!pckF@JH>J=L1zb$FK&})l!wL-6Bpx0lAb|tYMdeSitx*y|3XVkqW%8XCxUK2U# zx6tkRGUm|C(Zub8X2_bT3c4qASY&(R^fknd{`<7RKE^8B#+nGcI1;ob3Z{`clvn4t zdb7~TI>tVjMjjdG-qJNlyVZk_ieOrI0eM1cozQoocZU+(fupQ(g{D>gxoeZi$wL2x zzI8xr3-j>N2;CH#c_!tQd>j6V^;m|%lTRFV)>yb(yNYw~ z;7sjLnA_k?o!zEzw|3P4aPu)!V3jog%=9G3LZ)Q zt>DtIzeffh1wTHu8*9I+QRDPh;1_GI{jLK)W`Q5UYd_(Kt+IYBipUc9XFjO~CINre zW-pm*yN9i{-G+d(Mr;OITRoh|+D!BtMeqb0eU&wy#UqB2?kwrMlwqvb@Oy8p?;a*j z&Pj)hTSHv3Rld1a+((%BEwJSIW1Y?#S!eaMAw{*pM>=zj*Qd@E#93=Rp^Ym!@8N?l z|45$T?m(V`yVazVHJaeR#MLrKk_f+#@NnxqAAElFQNzCcp6&@~zJB|8^ z@BoC6mH>k*e{aqR66XRk>-Dp4!e(> zv*bu`9rj-jck8ep&NJnb-;&1EVfT?Y77%CZu$7!7GSX(kOdWQg^s|Ty)?sg>K2wL? zoxhGW{mD0ziL>Mz(LKMw-5jFBzEqybH?4;a`DPyJlzfBE`M-!09rhK3g_CWhoS#bm zN}GNjPtjrLoB3<=?K=Zz+3!=f=&*J9Mu(lQ!tvWd+KK!x=6_Nhw!_)2!#;|RaYSLz z{`?g7DbZVF>xO<>^v-r~fs60S+|!`Bm5-o=1qDhEoyR`C=or_Cyvsbc_UT6t45x=S z{C?ME$o^Pz=LWmmyTOs=#XdE$uF|3Q>py(hS#uPf@-LU%#-9DWP7V7o(SO8DNB`mO z(SJCpztu6x&?C=xDn0UyVnhESKF2NnM<;uvX`=sN|7qqeqW_To#CT_=qeFh4{@A2H zPNf?z;Jof}bOAHF^%*H`MTGr|wuS15w*z0<(<->dx!#s;Q#xY*AVYt=l{nc;yY@ z1vWTJy|!|vH)esebP?k|GoQV0_Wq@9mQHmcI#t;Nv~;RJ=%;NZ?9quHT71j**S3=Q zwCYaAM#{RDa%3$n{gO5=BYy#W#7+C^Y2OU9eYv!6pF;~|(njBE?qgdW$$uvQDE{2P zwmO3UH2&NXv-&droJ(9imA}pFWNo*7xM?Q<9*sdiY1s)JhejMjHz_p7C|B}JxsqSX zwRsPrLzZ;XW+|%*n}fu81*M&q%>Z*%^hYvRMMo=bE0OQzTA;`wxEgPR7+do$@DTI@+&{+J@|O#Zxp$np16LK4YS?1R9L&7z_&P1UXAV}Gb5Q9Z znS(P{q^fAB1 ztJ7Ns>yK?4+^q|In|gZ5W8Zc5s|z&jK4QSdGRA~GHGJaBycXMn!}gk|wzJ=KkEvr3 zyMm8s)6<14r=<16%2##iWP67UsU18crq!+hzP%SjEjv^!MB zkUS;VCat&1TuPZTm!-_mc`S82L>YoNl1KWcnR6s2XbxYAj_uFDE7;~B6Wak>x?yur zVA>qqLs>G`6v3d?Tp{k=-0M=)-|6vUF;D?pOL3*4lcH#Ujx>`HU|^BZ4UCh z{~YhG_uOX#zU=$q3sdY6JlG&SR;1NCa^+n)#VR58>B|4}&yOA%SJR0Lw2(NJh+Y)$<4cHdJYdV=% z{z2%jz%R`<1UrSKhKZyX{YvOKSu|J1NnkGHBrsRw1YMH8JJCZeMGrON40|9M8a2gX z=%Ji@2lui;xEeUl0*=9YD9Z++o;|S|><`xDvOnW+o^*c(9n!<1qk2Zp*O~SQod*pa zl|?IV;akqNsx+qTcI6>w&DqjN$&Y?Y#hLmkKk4NRkO~XZaTSm!wVym6lSk>OOc`M= z-vYy)G7KHnM9MH_xIXp%jy#qO=VKfz@be`4r{D7w8SZMHqNCbFIzxuT_c>uA!+k0S%&@K8COYge zGFvNtkwbZYE&E$?XUq5KgT*UuUhAxR`Ig)2>yXdHHeADQU-(1q)Z^=FvwHZ0llod6 z;|&?@ZxKpHTe{eg(SmI%M*y$;QxdA(?Au6PvQN+bYxBk4$grbK>9(T`-ltyzoT|uY zD>v;Y_m%BlOjyEa*p-P554K!>=1ZL;rSoOS+)MoV4qY39|A>hm;&x|q+h_JlWUDl> zousWLz@!a6yEM|YpG+5<(-CcAK>FtqH=g{Q*%dtSb-YF1%50HuoWr!n zVWRV3o{U9S+DF+lZSG&RVNW^wM)-1^$S8>oiF>CSG7$S>VkfEgZ^8ABd`Fgyz2Qqn z%5GNUyvQ+3*-u(?pc47V!slN;=&U&g9>0v-^BOok3|!DSb0Rq1mX95at1nI~nI{CN z1>cNyM@naJoX%EzrQGotgwx14rp=__v?b&Gf;k_I)6am@Ucv;Y1^&ibVnL_KH?`6C zc>TyX8a_RK`j4qfrcryG$S|4kTD8ZCjpQ}((-?Sdx-C|JY)?$LJhP5+d&x5`Vj~%T zZ?o31OW8)soLBRya^59=WEIUO^Xv&=%=ougDci|p=F>;CN69!+H*)43qhi*Jd=n#b zO~_uR$jmbD#aBTI>BMeifg|m0%N|GUB!!=Z=G&f}R&C|A=FcABbpvT7PH30cF%NEi*|DH~ zztA}%>%X2kvb}qbxUs=Go%tZNMDV@J-?d42jm!;!gX|r-A`QIH9Ku`z=UsXQpj&EBZyPq2z}qQlWDMDt z6IsLto@wc^`kwY5@3s-=r2f#c6WS(uWPB|7B`wz$NCwZl z$ReG&$JR%dc$GMFkF8JKOT@_@n=0RwhlWtLl3z^znL(Ox@=G-7`jcOtB9A4%h-|S0 ze_^77`VV=6H)DB<{PGLZiTon6&Gm$d{Ng1nocto?U=gR-yHJQR@!&2GRqz= zPodB9L>J{z;Ry}twD)oHJ;uMQ(zf&H5*y=SXFME?O9ZkDXW;T}y0qsYatr6+>hIv( zKr%M#DcFu0_3BsDm+=gDe?9%^!5zOT`!-Ehz9j@FtTB)?ayDQma@?nc&;PnG0MAmuhdwa)TNoJl z!oy%nC=8%i-7v`c_hHZ^{$UIl{4vjjLFa+qFlaJy;Xmnr!q%!n=@Zh;HcyPnazAz}985Rcjgu-A$ z5FY%;H-iTkg}~qhK0bvWd`$QpfkCszIpChNu+H<`^)cw%m)$rMJ#K8bi)Li2nXK=i8NY7c;!QtYA&bm6o#mA8U zpZBP_TNu@o_A@v8(G@*sz&)Qt zC(7B>pYRNKcGF22-DhbxAP)nNB;X-)yJin(fA{o%_V*p?QfD-&UwE3F{|ttwHCA%A zcPo7e{+2d53*G9BweUad3~BKB?8Y$tPGrogqTG*&KY?8KcRG+G3cp&^Swb6};G<@n z@%mWTj{Ge3Ol%ko4u!(fImcaJz!_?*ZAHkgr`xu>gW5I+xQpyjWp{5Gd8Kx1Epo-k z8O$BZ8+oC2z=o}xoY$28u2r0s_0yI$z~mz4lAM#2^GPzMoaNR(;5@gF za@pfj=ecWx&T}s?$FwTXsH2>5)qtyoiz0VbArHy?@d(U=@V|h(<(yp?{PmpQlP8bx zsyqYF)=cWZOVvF~rLpunn=sw&zUwD8@J3n7$fejOmN&nb@!% zn$fxFSIB`j%pF8r#E-kraW=tGs5J!G+ zqAZ_$dF0PUp8Rc{;8NjQcV`=Z7Q{YI-u=9f zUXHxK$-B^R$fA|;W_aU+29MZ3+ypxS<%-Pz`nXJ>M;KyS0h4()-1-jA%U6~SN%(ao} z+JU{$CmA!r>)X3iwJ?A+;K-}yTJ_M}ZRZbGB*>!s*c z5p&eW94#bY@Z6F!^TIbh^gEdMgu?$O;2#<$I4Agen0CIJVbm{m|0ivby*dLvi46tH zk3d4hUxCd${tCa%eum>ebE!+p4yAc&ZVWKy^-}sa;cN1bY~ZK(2QX0lgEIQ#9~Y|r z_RMQ(PbfbO<|pE7LX8)2wBYL!+y-y%0k=z_PeQMSkC1MD$(~%ri#GBuc&fhf6G*$} z7hUWQw8+>)+pMxI{t>6z)x$p&&Mvm;GfW)35BP?*Q+V9p#ixVJo9_8#lyT%z{KYVa z5_g|Na0kCeA!Q^Y8(4hi>+nF|rQvztN7QNcN8lQcUM^Q{;T~bLO|xl}=E9x?yWns> zG2Wm|DJvXb|BV?Zc$XP822PJ556Bn@olxJ5fs-+CQkU>N#;TWW^t@TtWgkZ;2Fqpu6ld-erz07H; z=VWvGF4`GxP9HMo^t$djo!C&XeCSzoI-z0S36bNI8d~=|Yp&-XcCP*#vfg)r%jwE` zm#KdAo~x`Q4BE%o3SJC>9(FnGI}b02gm2<=s4Nyvwo_Y3RDT@9y5C+Ntb|euB@qV4qYUm}h@) zCtoZ1LVYwTSVe1r+SNJS)r6kD^2|>00am+F+u89lZ~`tezf_yKuTiymkfwY{m)KcP zk#^jA(y_NvMW20QZxSTWy_a)*o%n6?#c_s5@^dDrg#0VX8|=49##8z%h;81I?&v_I^4i@zQzCyIWSg^o9MQ@7qzR90^l4%!Jg9$D zp5c2ml{N(9|M@078p$*IUxde5kM$1^;SoYFdck9l0gr{1z2RZ;6AK;#{|$ItX~N?t z0*lW>=>hQAW58n)Z3u>kCAa;Me19ijSEb-bH2COb{=}fSwg=50gMMmaBN=VZ7xpzR zI{K%dnQ-|Ubkq&cITam!EBoYh^mXFH&#M{qqkwreoxPCobTrz8+XeLhzxu$fhmO8; zUvIeGd(4=R8RT0ha61*!%TEw zKKySe8Y%N9h{krnCxpH_nUBI#oZwqhi^lvIB@5-LB&}bP&tc>Sk$1mq!t)S3 z>+v9-bo+Hdu%zD?ny`GA^iu_vj&L+eQ#{<&4-apzG2j-KReRI9HYGPDG_0pDgH0H8^JePaRAG!y4fO}l#e6g0gXFOb98QH(UxSxr zyxKp_IvEXLXWmU{$uOZb+&8(uxz|6QSTane*DQcvlX1!? z-)8cmul=JI!5xqIbrHGYMA_@`eNCVCVRTJ;svEgtYn@9IeTor2rJwMue!|Cxglhxb zf%88!bfAS<)w>FR{d~Kp=*@QDfxop&{hrRXyPA@J*4`Akt=)I|K^5j&uJ7`__iVds z#GCEz!cG6Z`gDtvr%yLQu`+uaKfsdR;pJh{vF$(D9s zXLGx+X0K7l1wY+Ycy&X&Z_RJpYX|*Zg<1X6SpSJF$6bs~A#+dqFYU6zf4k3FBd`(~ z^oNu218S}pZ<2RYm$^*dxnDujEa5$ua&F|Q%3Z!yQ*YM-^XbkinT+X_DHRI*@V!>_@K&@wC? zM6j;qLV*wS@g2rj@>?*m${rn5cB5JL&nVk!Lpt%{)c9Q)7?&m zL+afX+w;!-Yl5pP+{fL`)_YTY&wK3<^)7mVrDr_3Yt4H0$EcieHfPyCDx>vzqFeyM%O(!aK^*&pZ?Z!^c@KKg9oMuohac(IcAV0@SPP(pnr z)VH1bwyXM_Z5xmUJQ+RvIMTNc{8f7JhuQglbd8;{ly|ug*O~)v=w>(^4_AIJYhjsB zogakGr=D?}FKwmHJE$j|{_}Ec%uV`KpuUqD{wVDm>}J1C{A(w6@7c*dkhIaF0l!o7 zTw=qopmALe@ju+7cW7^E&K<6z$$KYy#6fo?Ou($ zbV#$eSkw2Art=ABP4Qw)S83ie(|8ip9d-wZd-zFbjiqa$ZiQQWsMCo~N9d32HLls{ zOicP9Ix&%d0{@}>gU3$BV;z0Xps%6h5Ss46(@a-+n(0dWNf%yMW%P^vgqSF3bU>`{SJC5mn)V&9kCRv~`A!B4>f@preX$yswd`m+7Vv+|U*BW;OoDj#Ln zvmT3CI^mKkY+ppTqOp#*#wd7S#VRv{alX|o^GnKbz6+gB01skZ?yMituI<2xeSuqx=%2t!i^gAJ5UetR)ppu@ zH~o1Ezvmgi%4xH`ExP3yz*W+&nN}`vy(`n%lXf_3uOD5XTYnev!&o;6jGgF>G}|y> zoUHt?UI~n|94Xbqur0kdT02lk8=UA=oVH=WIK_l>p=Alb z68yA9u^*#pn=%P6snD`cluf1Y`M@9#Sma`h_J)!@WKTulIGnP!0>?KLY?B-E2um`< z-X=_B|D#JB)0vuBnu73PF`$m*y z!I3@JtfgN~-Mt-pF*l&ixsv599c%W(uSEoj!T>Q<012^Y0IqN$E7XLaX<1oZF&ITOrvA8opGhh z@2YMYd6%4DSvf{KAin#!i(seFTPJCjZqtUu92j{?73C+`lHacSfHNJoBw&`%)=XMS zXR{?&S1EWWRqvsXb*=c6u_shl0c*jv%t|fGn9DuuvCc(P!MFTwo$1B21s}%x4C-{2 zuDC0cHifIR;<(Th;~smd>sH3;F~&*mR2P1u=09N@2wQ4~3EnO-!)_t0|GBRA@v-aJ04>U{jacP50Hgq`eBk^o8omnvJL zK_&?*VBHW!u`K~?8^EPhP$DXmL?sZl3WuPXr<44x4rH8R zryS)OVsAYQd3Of!OvfDLiS}yQu4RUP6`B&+K39!5BP#=V>d17F<)Tvx%=ec5&E&m{ z_s4+u55JS^U&mZ;Hg&`#+R^k>Xi8*Na^Tever9KK`OVaS0-ExGyGcq%q(W24Cfrk? zsZ>?}$IMaM5}FFqhQMP3WjbZ=*~-?LWisyYaor1T8GIQ8u~f18q7`WcM0)%mu8__bnTsLHS16B8*?^&sDUVktMK@`U`=n&}$*G zI8q$!u{&N-`fCn4s(`wM)IF@`6R&jFcbJdJg^$cKnfENS>@Spch3`Y)+sdmdcIi?6 z1m8(Ee5ZXy_+AXY@96^H*K`x#nanX9-$P8?+VMTeEbAQK!YA$cesZ{0;f>a67lq+_ zCpJ$cd|P(N$Lt~3x!UcJg{G_}mvu{-Ndq251@z*qQMG7w|dCp2mCBPl6wy$!YaU#wNlK@g_ecm~$Z?_itPk(w6W;XLR-Y zOD^QDK}Ua}zR=O{6&=MX{&|D4V#*?o`G=pk*51h&E!kR!?9#9s3Mn(>mqFu&jJLD? zW&LN#$Qt^ZMPDMjx}w?E{8;XhazU%QkNvWMyLVpm@UVCnq2*oJG*gOt`^t%F`ug0t zS@Ye!$_wuVj!p2gB=e~>v$`88)WIjg1W>TzAxoj_fQIg)r9>0>au=y7Oi z26Ir~=XU-5`FtP3=7GM!sn&88-`(}Ce1G9!+Dj&81RO$lTit<2r%t}L`uo^QQ+CF9 ziUQ~SVCrx^W(vPY6lQ3nir?F|6j!OD6%;cOnTa2vhgevCb?b1qzB^+GEW8H zSna@G&ZZmi>H52)zas9N?;?%kuW9YL*)~+Qx6-vO-VX1Tt}xu}qdmD7F}%G{eh=Rs zX>YK@mnQa3@dkzeS1AjU%Qi^v#UMFsWv{oP^y}>Ha))y16t%~@kvk89C6DA(%DoaL zkLK(x`9aQ8*Je(71^0eSH@QuxI`25Zp&2le6$|Ob#HJ^y(Vx^&%%jBYXIT<{F&3?@V$CZl3vl|GVkjCC6FFoA`DR-^p1_;j=1}FI4^q z_)Yjr_)YShsF(_9Q{?P?a3VP=gnqr`%4vKCf7s1(meQ9~HSBBtv`dlM$eBv$eH7=# zZ(@80nL~H`xz^T?oH=aoXJwAeEy#J?&CE&sRLSVepyYp!(yHG-jlRa(`U+y7MCxn3 z*_YK%Ht_q+Y4nw9>r2*Ak^1t6^|cimdg?U#(rkTYa7I1^t}I!T0L%_aOwYii@_XAsidSCZEO6D*(TYZAyx7hwB8%}wv6k0;k3vIACVwt# z`-H#>ezQN6sM^f!y3I>FX|u>|GkDZ!a}mFPO`DN$A$%h=X5syh;9>%E@*}q^oqKYE z+)EG|HpnmfLUI*|z7Rbi`a<-8=nK&UqAw&LiKPb~XV27+QGWNaCZ9{k4Q1O7gJYaaYOi-BgNv% z8B{A4w;r2IVsVR!U9iXEV&`_66J*HfV~Jh87rVL*{>#9#Q*UYPska1sUJY)us~@xA z*^SAJE0lp^T;~&zm$5vj6-(1R9Q7-4cjeQ{9_Y~icwf%mQ z-xu0`uj99zp*V-Xk!HDFe%w!c(r+c}JZb+Pev1!Y+PBwRXx1x0CQCiZgCb`r68MWZ z>z~ha0DnSvYJBL#?@+Ig?e}bc$Jl;PMz%-{j#d9semkt+rJCPrr!#rur&3(}|5 zT|{1|G0=Sid{sMGVgi!_&)=(6G&44d)xXuOf5efn`v|hx9@FoqURz8*eO#x`GIDN? zzGR)~=Xb$u-S;!~J1($~wr=E4eD=rgaNv85?6-H}&yamB86RuEmBX|9_*TeSm!iVO z)>)VBl;`CnasL6iyy_ z-u^z+{{8}aPad47?eBxe`+UB~KTx4%X*HX8Ukdyc&gzZ#+j+kR7|1!LD&Tz=a7h8) zFPiYKw|qCifVFW4cy9xq;)4Gtn$ zHNF>oyd&?=)oQM`zb|Ni|C+pK-k00oPiuewvb-Ou)l9Iz|GM#B@bw#cKSHY+$NM&X zd5rh7c|RO{DH<9|naQvFD4$G>j>WG9_(sC{6?{$G$XPdwU$3W~r}&+xrL?u<1b*Xe z?QEl+Ahi88b1dq6mob*T^eHk@#;D4J$%&v5``NW_VL2JqE3oe?G>leAu*}mZMz3uygvL7S+t0EU%dgOh|sgMMuB^g-=@P4Nc?otkemdcELGt@iS;aps!i+!}rIalRckP7VKPSL1xz zHcmTihIRuso5T7%8EhW4^*ISV*kLmp*m&Z#+TuLTm&rTXe-_vb0yf?_jlBe5IK+cr z|HM5)ixvj7$bLnl^0(eeUk$)_h1^SEmfdcaiLAHF7Lny2?rE)6^xMmjrLw;+e8B!} zg{PNRD>Ned!rHUg8Efba`<{igBYMc#n~!JDgZs1jUW;wV`N9akY~DxoW&e=7>rdv( zz8)Odec3^1zh2R2WMB5Vz`*ili;XjwIc8F}4Op#LurkVqm}QaV@aJ!vu&Ob5SN0+| z(auxMwa%f{R=~p|`$gVc@S1DIMA-ItM5Y_?iVOS{z2fQ74yRdsFaGptVxl`1`R)a zf*Rvn^e1rL&KPB$0_)c(n?+e8Wvx3TKVCAnRthl^sl-T}LA(XI@sd?WSGej^EiphFLN94kTqJ6ymgXy zP4d=B-nIJe+&SBuJ)3J&eO1H8`0Ic6y?$xw&UYkdoqxz!e;Ii(UE30TlcCkBVdMN& zJ2<1veXv!-vi(&jX_n;;CX%w95$*Z;|r>b-sdDRl|g>a8Gb*0YT$Pe)wh@a5~ zT>Z|e&E)h_`6Cj|{1JEV<&3tOKSKDuSkBzpat-7NPT`ZP(y7h$tZyo5!)=~#5W8SB z?`tWy)4}cn}Bb42grn-H3jbC)4#LfV!3RxG@K|qtkJ;knf6h4D;^a4xD~h_GnssITB6G1{Dukbg(!R)-@6-PO zn04Zv@oMd8Z*#4!&5vyL!ux*2R!_!{uS>N*gZAIxy8_~Cy~NiBiLdn%Un?@NV?3i4 zXkb3jcVM{Y@n^Uc&$JLDcYyW&v@7x?FBv+XbwP-6YmaEnvy?87{4MQgrB%FTl!v`N zSD-da;Ev9~;}cX#maf1vF`zRMIp7-LXpHtFB6rQ73oZ($DhICQ~dhxy7` zPxHH*BEZ9)(0+#cTJwG6_);wpFYpz($QeW06kT3Z;_y|@Cf`VjW6yny#a|H@ND#Ts z*fWp?m5kk*S2puHWX@}nH7~(O+q^pF*EmOY5%^UTZ%q&3Py2 zoxBLp`au4`PmOD+_RC65hWiw@cddp)}ssF&~PT{-pk1>QCn{60KTvAo9ebk!dpb*_!Wu z_OlBI5x>HEdhXfSw(w^hc4lS|?)SvbRC14c;c?{*RGa40ISGgG^_YwU1E-;Go>c|9r&+q3LZJdys z!6pyGAp+N3-+X$hj-TMmhrQ?Y`^J@3Q%>!DXU?&%nS%z~>p@qvT5$`DlJYUn09C zrb+NzNBepYXpW~vyFW4OoQyu&X+!jswkHMN5gb~yVd>b;^iX*x^KREeM!V9cleX=2 zvCh;($C&d1{=#i6ncD_nBRr{xo$r$kAMz(QUllMB8nEd2qjL-%5}wKU^ge~-_sz1-ct-fLig{zx9;jnY zta4wm4^Rf|g^$K!>%@BvdY^Qwz{`*`_Ik=bgr@GIop_V}*4@!wS7dgGcV1vCV--76 z$^_n0W?#pJ!@G*{hnI<*Xp=#0G#MYbk3QS>&!EvS&0G`7!0l0B*7i+_#lP`^fy~MN zO~5?2*^6(A1y5K1mh~jLGg*ho_X2P61!W?0#a?$Y2jOM=8rND66{)eeuZ@I8WX*?f zTk-Zm+V2!EC*hOX=NwzRka-9%UXB0P;sb%F-NwI>dIqj08u`p3@Kf_F8y}3Y;iU`R znb!$kL`KS(_5u5X!Md+Ev@5v?&SS3f&ai9RY5tG&-OeL%f!7qy;sZaYeg=Q`wT&Id zgH5^)w|j)1%dlw#SCZrObnKc~U?x6{6V_wcMd9l)O~IjkeI~To8BW{ewV6{+$!jyW z)QCj}O;|cgcthyQzP=6TgNBijd818F4Yu;d#RUe?zFl6QZ^C&hF#i3Aozr34m?P+z z?-g}2W?AEPqGM`KHs&^d<}MW4w~sl-9P?R>c^zYpl&3<|@FC#8Y-R6Ok8)jA##+WP zeEax}GX~$@z6y*4hp};!wnuRN zDR%ZWWT51+t+>jy{xEk;7oII=8ngo$dfB?!$O5Uqs#>~-$mJ-vo+sR zM_kh^&P|4f<@uXN=K4Pwm+ybNAvSQU-fPzgJ*Ir}Ydd#MDc-fZOm~&{ma|gZUfmT# z`4xKXu1VGPyZpb|xhqio+UhB1dfuAP`&)~5ub#^{QfDN8leX3GnoFG+y;u1;@|$nw zQK!84)z!<*da9gy%T>Kt<2&lDpiX#Og_OIfrxowsW%ttqZ{qH2h$9=ab8K_wpz;nD`7>xuu{WEm4OVB^Uh+=>iD3iKws(1t%>u_vbK`vaQ4mR zT;K4h$>qI@=5lnkSJNjwH>5o5+c0AT@fAU6=HWB70UM4x7c}6<$Y5W7F5i?LQp$G1`oBTQGvG+KG!Mm2nkU59(XSYa>o57mz^S@0j zn#|o)7t7v*=3PY`M$H+sf~k8@hi8VXP0wga;A8K=2%by9t+t!YuhtH z&#xtykk|@^z%-8Y*JAUyz~R>zcWYm5>jp>qg28-Oc7ODBt{y2DhDLF=tRHd53EC*` zBg&ozep9KtAmTRk^*m!B6ss*$?tn~SyVg?uA6rfU%GOdT-FYE#v{ zte2|W_8s-rcN4Vi3cf3BI|mxqM68NBi>K+F1ssJR7M(r}{8l;Q$_r!I$D+PnA6e(^ zjlDtREMV)i?dKfrK3~z%vQHMl@B6IX@B8G#9sR!Hy8a+%^$vrBINB@YJiCjttZBNV zi8vRvH>+`m)i`rGFwpz~ceI%2SB6x?)!uew__>9*E`AhQTAlIw zx_}-NcvxS`H?d7m@or?{tyvHAZhpqA>*n!ptfF!Uq59rXK3tY zI+~VKe>n4Ur*p;yxgY!EJU?fYcJ->s^W2d~z_tM{^df#0SSMT1{`?s&{iY<9_wF_UOf)l!`_p=V#(ftCisw1uB zfi>V_!D}ybxfR>z9AI-B^M5$wwRMa$Fdx_~1)g(wAM<0UU*=gzz0AVGtohV)0hbto ziTO^>d3%Ucjbwj|O*}B&<5&4IqO=ytL%R?jpVW5#o17Kw?})56;!H+oRdAkK@?eZ( zUuZMu6D3wq-W&NcB$oqn?vIi$Bfc$PMjbR`tP3SyhIKAc;!BKkj4wXZo-f0Yl}4OH zjaeSC|F$#Io#)lC%VNn@E;fO{%ihO&vk%Fu(aQekk?FDMGjen;>CO7qsq$oqT+1}q zo?>&94faT`iQ~b6+VK!~t4)H=WuHD&YOFnHF5><$;=x1vwCv5u${_bfvZq&F#vWI= z-xFoYnZ%S6&Loy`CQ;hXgfBzv^{*jzd=Y1kZ>OI%_;+3+4!D@Hc(-$Am_G98v(ove z9N8u?Y|b|p0Wb@uYFz_xa_?cci@tI(?Cr_CT%R1q}Fj>D}%KX^dHrEZJ z7iGLX)VSjU^B8xR=YhFb{TTMVX6~V@+@Rd!to36Z%vmc}CbkwiLN)KpIlA|i9J%XR z^K$%+nGNoxHSktlvLIUt$)bf{t29atK%G? zMl4i1euBnLz5McxX2vH-{a@d&R|KP>U*uRNccKULg~o4e4wVxFv_WgB>Uo!8=X18H za+71v&Zo7Cjiom>gzz1Ae?By23MB8&k=>oErr$;Pnn*wvlt2#jGQx zTw-ZLo1hh9-X`_eR=Tep2q+h`@7vsZPFy7Bv|pR3o64=(Fjz5fome+F4L ztiM0Bx+6_&{LG+v<>j?Y{DcvyZJ6{t}!?x$KjO9F+ZC;R!hl7{@-1oDob%9e}Uh9De-RA4!(60rz(GlR*FyHVA1i#yk|0nsrD|p^@ z3h;b{HUyqsovo~6uChNPuu}6d?~=0SaW8EQWDX58JuTb%X|>qt3WmqPy~s}CeQ7@l z9#3g;s_DgGAss zDK@1%1wZplXJV6wy{k%cFdfBzT*LG8LIY3Yi)x(1o$o?d@heh-=flH{q2VH8VI2?V zJWYR%jHhX>*3y9I)T?CvA98|Md&m2o*EctA(ppNKdi6+ncKP{H{<2Ma_KF?YD*3D( z(1H3{+AlRZ8+W;=7S+Jx>ewY|@?{@>y7JxQK}V9!bZZ}J=i{zb># zW4))XfwVP)-`_RcI>ed4(a_Xp_H8N#3-6+9iHSPQ-mu7=Z<_UvfWMlyeUkXV1ZZ92 z@T886y^gbrLumI}v%cJOFJqPVD_GBLMmJQH813(z*xvr7owPqJtow0J6?!$b$mib$E477f?eV<7B^73sQ-zM-~Kl3{o%P-8a{Eqk5SQa{yjIp%A zBq8tsFtLy2F!e3nG@5qFd9&ase(jGP+JeJ8#a13-;(9N27i!wrV7~7A4*#3+%C%#3 zZER?V=F{~1o@<7tL{G1!o>jJix?*ehly;DFw=(VqXgtVYYrbPo^UNNsfudO}aHq-= z?gntmy#U62wwlDvI=$m{)-VmRT1!GfZg%1=x!Ia`M~>w4aSesn$>)<)n45hVTYJ^21WlVMBy(Pst;?Kt)%pD>-a=daM$}oPj&UtLRmc8~BE&GSNwCo1-nDDnH zJA_7G8p?TZb1mdG*FCJ4)&8Yb@A#5QjQw)va2YY#?33g>e7_tj>z@_Oi1n6r zj_wZuA32{PXER*DYf^8m<|w}C!{VY-BICwm_v z%O68Ny_=WlOT;c0T2l7`#Ovj<&Q)s{?#$L$yJWIP32`2xcDuv(k^>t_bOr5*&AEZ| zwMs|xyY%m@Pc|)5>k~N-l+OCZ15O)qjPo7hgOGd%l2^w%pOGuM6E|tT#Z|`n z49S`JyfdzO=~7MUf8hu5Yj1i8n;L%G$lPj{MOPFI)W%3#ZTc=%);QNUhb{&_S8FYy zWx4Hp8Tp!TrL<4p3CTmBnVz^lm}<^5&6sC!2v1p~adtti(MIxQji%<0Psf@+@^qTq zdvFvw61+@;P9*NXu)kI-{2uIyy&(6}P)F{4f2lOSd8ELXI`#PB#I_2SZqHG5C=+{8 z>TRZ;@_#s3ms3{8eF;JHOu;~GR_X6;=vHD`?kv&vtWoiThJ7tOTE#o5Z^hEYK+{3d zVT?m;)q&U<&vPC}?DIQ`f!h0>cKdvijDh}TEJ7QZ{I#}{#|6I>>!+1!O%0CaJbo^C zXi)zr2Br!gT-un8A_@uQT)z>inJk11NqKnL>0 zHaGjcW}akTe;9IX?G5sM*xXbb=G>mP%}wqX65B-TE1TWi*WXS%a<1zdWa{xHH^X-` z;J=&T!yDnp>72K?fwP{*d5g|;^i!MkJ)+z9ylvb|ezJPMr=G;ms(Lr3`AUFoUS*1J zqsu$>#-|NEFS=Ry+3=(2zTa?GUg<>S$n!33+-1BsWQ*}`0>78hu2ps(^5r7RN+=Wk zA?0_9{}+8Dco%s$2l!Yzd9nHJL145Q+e~On>KrHb%c>*%Swa7qw0EmnU-<|r@2qjFwru@fZtG8UL_N6^5~+U^ZP~wh!Pfsrs(&*+p8gloe}b-!6TjIN<`{%t zWo$oZ&UY!DrTP9U@)chBK*`;>z%J@e;IFHFurc`6UF>US;#Zgam{sh9sx#qc&Oqyo zKJQh|M_{V_PVh%I>ynijhce&|@&+)TeaQGeoGUEA|2t>4I#;|hBWkdEFE;VkB+f>2 zN9vsI=DRx9H0HPDNvpu`$~)axsI}Xqs*f9uHuhr2&y@Db={#q!F6Wk4W@H-gN@#!W z8MKcdIEbEX;OuG>c8lG&-oDRijMC@l7ud%;6kbRK2KqWNtE_=h9u@@vi zqX*wo75y1|vR0m0$sI5ICUJqqz)jjR@|7B}ywijwarud&>m?TCcFL?h^zd;lCSR$2 z{FUfO8Nc7m$13z@?p2d>ykq`Y>nxGg&or|iwKsASJjz~DRiAuy4yXa#t?4A^X`Pwh z`lNUbqyMXhLdOHaYXtglN#wll00XbYE=0s@S-*~Wt>av1B)s0(_vCmT5r)@Fa))(= zSBDL+kA=ad-lVfiIqwXf>~N`vZtQZQSn?Ev!G-fY6~P#-R=sO(r*+9wTY5HUws|+_ z70svKdxo^hjC*;PE_?z!kqa#$Wc4;_Uz2Y3JFD;Lx^q z=Fv`&+^E7+Wx_k~R3S7T2Tv`8rwZYzLgHBpn420y)tNq_;T+=FX7|bEOq{U~cxOC) z(N0^vpBwcqq@JwRM1RP4&r}(*MeUgBw>_>QH zX#kzc^K@k%vgxEUPr)#Z29^zhH*C0+xaA-|6IHjLf%EOaX(YPf-zonJ-s+zG%L10+ z@^2Jn8^P_1Hr$@q1#Z7e`4?xyt?UgSyTgSY=f<9k!LIALPpoT_LsP3BPW(n_WS)ON z_Ll7R7vM{5M7K-6>_%+d>@(Tl*rE9@V$GD=KrFD(_Oje+4If)j)<>*O<40**iS_a= z*{A!;_)FTyH`pI(?EBZ@(>q3fYwr(kY%ZH)+<|-_j$6tt6Ae>CwohO zmlHhrP>#3sC{eJ*D+N1J&Y4W5nWz2vX^g1I(|E@cd|S3Oq8R?pXbZ=9ubMzwvfvU%nd;5QjN zcv9QGWh;5UnrHR`p1rY``>;;!%R1HRQ}A?Z)uY}7p4>GqaRV~XvA{90SogWF^=zFW z`_1T7t%vNdM{(v})`2~EvUZU5;3n4e!2Gb><;MD`fi=98?*%U6yQ^ajv7I$UJ?n>e z_p&CvLTi!u28oN?JA`;yM|{&p){+izB=PWvf!#vZQX(G<)ZDIS%vUk?E1`+6W7`{d zN2!=@>RPhxpHZ?d(tL0BFxE#G?cw~-n-a%m-2LUwBt{Ne39>)#IwzNyEl*3YMV=NX z{YrTqIz011PxA)d)wG?%Ju=*fQM%hu7@vnp?Zjz1W? zq(#Or|I7Jf>)tJ?Gn+HTc?GG+a#!GP#?$4VYN>0F#7Mes6kH@Ud9h;;saP{DztsiuX2ZT&r*Cw$Ci0ozIfWxvUH|#ek`3m_F&KG z>U0%z(G$MnH@PKT^b@*SYdK1+<bD+~?y@!qVw_o?HctU8P=VjG$58*6)M8Tey^M48dm$H{UvAWBrG8@vSktQ-%EvbBn1Lx4H_BQOs_n}d-h3eLzdEtd9U^=b>w#k{xRoQoV$aK#Uy z;x24(U1`C!FEJ6oHK<}Gh>@VZ0%9Z-9Qp3}l5YTyn}N#=;Bymjx)FIY9p9O;t`<1X z7C4sb+}Wa2$3a~u-*E5Ek{-nL=ss6E{u=xi5-TZd*?8{K8Xl*8nqJM=k&~NQ|GazN zNT2Xu*hOTrCAa;V^)zdzv#7uPDUW|S?_EF2YZ=a& z#%=Ix5cqiU9hMP;EA?klAGrlR>46VDj*5b4&7Y>}O_j)+X2v6TEJ!?bGqJf7*vAP1 zw`6AzUlDV2;g?CffH-^F)$sM`!#pi=FF`5mv_E{HR}_5NTBGgLe8Te@Ja5HP9GRXE zEb@R?Zd+W17kf_|I?ku$fcI?QEbh1Z?i)gbPGIMvz8lzeytmk*Hzf;(0!Q%!j9^U2 zggRt#;}G39j=U@~{t)N3(%>(R@+7^7Zwq|jPBv&#jlTg|OMPV1)Hg0AXGL>m{bQk)m5jqq76lBjV*wZ^c_*oq~tvDww9=$}o^wae7675!j7vhi(1ktxu;H(P# zZXS%@r2Q<$W5=)HRq9}`D!f*KSNXoo#H$CI{Rwsao#3((TvjPuCItTR5x4{fg3Cg1 zS@}?u!ljJO!eh|HV*&V0)_VB1GG6hs%6JtVg6(j4#0CeC&{r57G|}6@K|9zH4s$Iy z5bLFIa^WfB?F0PL?)!~PN-&>(Qhj|MISc^^l; zcZ zhwnvrxIP6Qvt%*$?>5f*Z$I19Ql8+b@M4G6LDwPL-4XAoI6^+EkNc1xRAd|b0hQP{ zMlPe2=E@!Vp4-pX@r`N$nR{j*WA3|O>{)TU@RCiwd1Z|_*w|+m`G#D3)6!d(Tq}gv zL|;XcYY)=ismQf0eX&l{uYM(`p&Wbh3iKSdY$LhJGFES+ob^h%R-M6Gj=hm; z*-H|;sG*eD(Nz!R1k3YyKA1Cm)kFMGTpn^{_9|ou{i?iWmuM}sR+Z-5rDV#D(EW7i z{|5NrdiY@){Bj*~#kkuRx$>rI2fUeQ+5z8wjr+!Et1o;c&)()UR`_a%$eZ4@(}(u@ z(r!Q6N7gJEK)$!Aj(k@l^!aTx)}k#aF)o zHWpuPhOgcgc?e&LJhbzbB@czKlsts5lst@px68xu*4s8V#a9u=Ho`VGi?5b3Hbs+R zd?kBQ5(^Y8C6<@?-r(xr=QOOYXDvqlEb)bi9XVZi%h@daA$}IM##m1OyP zbTGeJ)_n%wOogtmg}$$W&aZ~vuYzx`BxjnTXCm><+E)#J$u;?Bg83ZJ^EB2ZZL<9_ zc=X-pQcihIG6_1X?8cfThx*t}O5SfCe;R8N3-7iyiR99J=DlvONluVOdBC)_RCIY9 zIEV)q3E(6V+@QyoBxB=5cd&6h_I2?bNBg=M8^`cXh`)$z1aR*>CCnm*}tb6w!ic%?S-70FOH||x0Q8be+T*Iv4^zg1o3&XZWKHG z2tLXnx>xvK_U{XUbEfEJ<`f=p^Z9oruby$PTi1-UWUeT~*4H%l@67mC*?WCC)yOY$ z;+Z~T>0H!Be$E93|C{`IKW9G0%ylC+v6r?i|LjjG?<_`f1Mf~Xe_jQ1u;--`e^mH< z#7|O2{u#BmfSo3Lx2}Tr{p4BZ_+BTr>YXg_$&1&BkJ`*51kNS_6QMafyzG1ba;`2)!KGu~B%vXZB{C-L;0nomGJ z`1aFXk@KFcr*C`S6Ydy+e&PeS1IK-QQ_3aUc6i!zy6j6a_)vIG&e(%T-_Rt_=egig z#-jBy@cBpT+1s#U?u8ECGTZ13C&K%M_zVOV?fJBfd}y~SxV7ig61WL3bOpD~^cN0G z3vNfC)3qf=+XBOBv~SP*G0%j}Fktfpu<2~fF2+0w`73x|YvwSLIm`IvY}?@yhc7r= zosHP@I&o4*fj2QRH4X4HzNwlZbFlb%MT(ib5*QTHrlJeUYeHN7X{$s2BU?U~cr%~N zW?LMVz_E?CZ1OZ59=CM@BjFK&kv-qqleBNoTeO<} z<|}#fW+8vI4EERFH*7o{y>T%=@%UHpemH*TDK@{ersM0sPxnjx9n?pbC>wA5#g2+P z>U)*H(i}7Ss3lgi?9oe`g@+m$OBG|V=8=wF)Y&|=23gN*zKOdX+;^DI`9>!`BKAU} zqj;L<9hb3Yjdt+cI0tFp8???bZU7dOL@&?Kwl*^sZ0u*vwdu3g+VrlyzfAIb+xN zJChALbKiMdobYORF08qa=4DOD&=wTax0Uls>V=>c4cR0x*L!2<@U-}5>)1;oqx@$7k@_9(P8-nOzSo5H?V@ihN2bU-YmDV)zg@_gZ0-wPPzJ3p zm-EHdLr*DJs>qBrrd*PFCNNLI(P4CH5L@xx+4`QUi?xab{Kg`iDv=xM$fbrp#GQu&6 z!nkgLpSl{?cynAzZ!~kp3_iE;De_mz!J|gG(iLVbsYR1V*!vb8I}-Sd{MrmZz5r|l zE}|Q+u*t6!_@Yh5Z8zp5b?#+eb{WTp3p$?jztrz-|Hjtt7+brdf4*VL#d7Lv{Dsrs z)^pME=#dxXN#7RjKYy+fFDgD%Wh+tV0@{)~=c_j30(a3~Q$4nl&7O=zgZq;V-fP9L zbLeXJ@|Hy7Z(=`B^JHTy?U~SDJMfg^yUSPy5l_EEZ#x?eUDmK?bYK?iw1tBWTj_oB za|-;)9i;GL#W@RJgnqV>k6P%-qM_qU+S~m-W0^;t7}|BQ&X@~5&ZlncGn#*YU(QZ( zR$Aul=AFp15bF<#uWua2I%J6EdmlKx3!MqR1iqJ;I2jcIw)@W1D})})9-Wxwg2&U4 zFCO@;06(V4lUevL?ee5D$*{ZQfv@_m&y+0rCR`>JTxNbhrQ`Q2&F?K7Iu$=?YEM$( zumt#_TMPCAU!`N?0zDY_J>am2zwot#%+XbspDi-Efctg|-~lym;AJ28_vyC)II4G? zJ+Qx9+E8+VvymeIhfDj9UfC?R zldJ`Fo&~_OokrVp_zZ$Z?duoOL-zS6nEVup*ZP|8!ui|-Ef)64i%3s)9d;LYuvoML zA0Thy0{2222YwHq!>>Y*xu$K-J*Aj!}qw9n5em4@)r?Lu|IJ`N-Sr$KVc8H z7tbbq#QzvK5&2BL9@;M}kww>_Hx3aO*FQ?zlczh&hw9GVe|0){iwzQk?Eb{rSDlwS zpEHO*&|SM*$u&0^`}-li&+cW^-S6xb5PczMs`gX&pJp8g`{f(3{kP$Zj48Y$D{$7X zb^E{UId&;&?iPKmV%=tPxs7x5EpMj(cfcKu?D^Q?YRV%IL##8td@22u$p7;eWwr2k z*clU8swdB{#K(5E-n0BK$m9(UXH$7e>AHDZ-}0xm*z!ZpDE2cQfh&mBJH-7lGihTl z@z$FYJXwi_^RieM_=s=YGoL>3=g&uWPdnu76ZoeyT8;e;@;S-;@`;C%d5QiC#pY%g z5-TsT5dLmp9LJYj0WPM1lgZ#_5`M%ooc~x zFZ+cL0>_6;I10?|Fx-oeRA4B+QVWJLtv$zH&U_Ei$6=>4V8Jd8*v%$}x}3a20=uX9 zeO4wUH6z9o`H(@1k+Te(vuMunWPiK$7 zANj7aXKwZ;_8?uFvs_|qnxeGP(vHxZ*dA`ZE_;HmUoemVFXsJ}p4!;Cx;C}_`8exi^Z(a*-*?;0tbe+-0k6kv1ODMo8C6YLHUGbs zkuqxcvDPte+N|!c4VcgWLU*tC=Dn@X(_gfXd6@b?&rTV&A$Q_}{m#;Ls~ETYv)0kW z83*?@jd_IM#QZ#)CuiTmr`!W^_baXnRi+K1EH-c_zeC_pVhq#aC-tswknc9DUV+qe zt8WV_yM^{1s7ojA$otlx`K{J%*PQLsi766!piypr%KyPl#c!p5_`+ve!=FD3RuI`k zS*x=Le*S*YR)1)W{lp~$;ddj3p#VM+onqOExxlY%u*b;7Mr^u@*&-ho-wu$jijKY31;bPFy#&I<*#wqbZZ`%s$_-=Vda>P9-ms zjOhi&bh5lm>`Ao2Q}|NyGRe190z>jL$($;k>vI~Jlb>8jjjMCF_)Al^G^TmB?tHEX zd6_;W56qrnNphlr89V+v}NaWm-6TAke8`(h(?-))62^wV{&0*l`t-szz0}W zLSiP4snzA>vmmE&}+1uGa zQfmotpSl=%V~gX zOZ|nOErkzhTaPcf4jP{dtzXMN%{9o-9&PIt;d5hc;P8Ef?iCz7^|GPrcvoEHr7?)yr=gz3+7edZafrR5r-!^1=FD}>U@{T_k=*h?_3pfrdxQ%$`vVmf9MU(e~`6}Mr^DOtRLiC)*&@-au1Y!%bd#)&G#3H&qlW#Vt$?RzvQ%3yx$K$z4#tWwki55 z!}gKAey_@@u|7v^D#^`NNv`_5!a*-sJrGCQtT3Y=X2iiO0dGRmQr) z?Iw;1{pfaUE!P0+$0*aTHs*PS%oF<|P19PWAI+vgHLOVw8H+*1nb`| z={Jpb6LRzxKk?~x_{cuq8&$NNeuA7e7CvjthgR9+7GBeex98}^J8~+Qjjw*m5z~~5 zE#msi#Gn+&_E0WmhnT-Nk63T`NAkNhL4#J#3-Ou!kD|%Az*dvLu7ozX zo8L-%xBm{`D|Gc^o-*G{dH*8s<@|l5bN6=oE$pS$9ASS^Xt-`Lalwj)6BP~Djo`PU z;bdqyx4MozaaDuS8}qf6jhu5_{Od znU6a0wGtE2Q2KlR#~;i7XG1A{BA2Z55YoQT;96+#J?`mLG`Py3!AIhtLE2OFH_cU) znB-`IetbdbuXU=cs0{k6i>@0lbC7uV#-+l0iOqE-J94&_{4QsE$;&z0Vxp@>KWr=6 zp0mxt-HxT?F2q*bhJEImHc8QBCU&^HuAgr|b7`YVVxbgG(r>3U>Gn>I)nnIth*>Xq z&|Q6HhNtB=zt)n=*@9Wc5$N<<#tdv-CY?$iVa4YU8S}lC`Bvg*?3~Xzr}KbY;lovB z;6wMCe9t&7z86^?E>jGi=y)dFItw0&2YNtD@wB6vxVU$R!4uu#fkS*Fwzp=^Z$7_8 z_8NL6KG4^sam}Rh3X8s>t6xIb!Y?uo#VW@|5sUaEII1kRL-H=N`Vl zz5)-GPRu^I0lmOptIoPD9ET;$SJBJjVx|9H9?1TCzpm)zGU%m`8mo4%F;b_&oh>%p-*J2LT^g1EKF>puL8yqWXuiB!Ev^C>O;WU;$f1w7(D!d zF~%ntW1Yprw2>I>(ayu)PgFeINL!)jJuOY==e7vUN1zuJUxSCblGowoH*)G8>R0V4 z=J}|1Jc+Pd>PmJ|zMJws)paGW^8ai6-#+Tf`(5By(F91$9xgoR-{bJ{w=u6Q|+E}^0bN$u_o>2PD#L&R(kfqRM^UIJp?l$#ql5SVvoo;|ccJx1c?xn@sq=v#tBO=}OvAy2+f^?`Wfqp0U5GINK-d zkDC;o4h;OA`by7Wd&QWvF5^(T$+YFJqORzs$N5%t(+#$7UfE{YYgr~e|B-iB@%Qhf z=U3{#8hRe~{}4SN>i_Sh=K?wN#(G29QRaFh0PWf7IisDPiHA4V8|u6E^~Rfd=6XYw zv)*`|Z|wBkFN~h+$(bVb{1f#Y7|6EK<_*xK$Zi>jou1cGSLk^wPod|h%=fbXIAqfE z13X1OpGAA?cz?3HP8zVYj^a0M#`ba}qlVw>UO!@%wx{u+{@mQ_*L*hlzMbnw9H031 z+BaUC+8&7eh7^Fa+ga_;s~4rxeFtO+$#xzF~F~oT(IjLuH9puuJYCa+JQ;r z^(cg1T>4qQ<(k$nX71ft!`(6E>3Z6`k}Ej9FE-*Zqffc_Xd~x#N?3=@a5|dy@$PMh zqg-O?2GRBtb2OjCwrwE4soZ;ne>hIs(CEY7MlrV9Bw~g4Q7&!y9r)9TTS?I!P5G3O z=fszwamRt#rnINi-VJ7ZUe;3f_H^{#q*(31oY=PZifFG$+S@_hx)`Iq!{9{5XtkGT zjSqciZ?70X#U$dL_fc++uP6}X$=(&CWn1k!c}IQ~HO`N1?XsUfP2wVONI`Tpo8SV^S1Vj8E=^*Ww)%G8=cS#u~eCEi5I#Y zAKPX4?Ji~iV`S|bh@ZT9R!;0oVJ=>spFFpl$z1WpT&4Lf|KT@jdo{kH@crnAfQON@uw$OW2KZlMx`I1&pJS+Z>Xm#?K9iLh zpAPiR!B;fL>-3Ele=oc(bq4eQ1N7+`iH^P=tJYlDvz#@N zv%QQ<^4+Y=nAFRckKbyJXSDL4OI{4Y$wbEb^kl~B^klRDIa-Y~+OXF|7c}A;fz*$ z0CEQZ(ADg9FX1i{r&FD85jqo}uFzSf^G7*CXI0KY%?i$%%cQe&Ia7~+5F0^o`~b8z zVJ$e`1W%YTkrq#=J+hM1;S1x8vUM)G+hdKu!!llrhyVQ0SINU+W8D!ATsbqegq*0H zi)o`;W+~uK*sDaaBtTItvh1LRcgvYa$E>+#aLs!rJsTG zx@?8>An#?2QP^p}a4^PUmq*5VbkA(@QHuXa^n@eZJM}O!o4(rO_6#{Ad$9wd%{ayv z56s}T(i8cNGkK$r^!e@JF>+q%se0Dy3<}~UR{u-WedSvb0LH0>3^I=jeI?we=6-FWRa<-Z}=kSu_F|%!}5FIAdP~j};wXas%VPo_Uz(UXc}QekYM(&(gQz ztuEx}$kUWz9dMj)?hoMU}x1megcsvZ>7LNHnUlm+t#{Ny|82guJe)B>n^Og0XHSd+wk@(5)@svHRk<4?14F*fioX*csHna;E zOlrr?n|U_eOp5@6Yr6@9KIVK%y8#2;{N}DxfWg%!49+)Uu>Uu%ibnn{I=IAy!R^d{ zALU);r*g#+$IIH*$mwI)tn2rxeCcn!z&&NIV?}S1ckQ_(;>)+@X?s$+4ux1_nu znY63%!=BGIe!Sr`x9%>_)H7G4Y|}qeu_ZmvSdqs6?72;Q7dyManNa>2u`{whNzqeQ zq!5Qb$yxV-tAE`Gg?%TLyY$2rnFC$B-95;kp$}}@#`;9pW$hvNoDB>-&OFk;Y#k%E zu>+iIJR{}jId;b@RZ2cN9mrn?>kB9Aj40$+59Amz&r8U6jy`H)9WQGID_5x}O`E3f zfMC5bm%Zdn?$;bmzR#P84O@uqeGhBd8RcVqw{n*F;W6j=ZsS=!{yg99JYWCONZ%bi z|9S3tzVGquclLR{1w1bpbe@m(%$wX+?VH8-8J;n|2cCX(YE<-3zfTNJ;M=_WNw4#K z@z_fB#9pQ8$xWUFZQ7rRy}Eh+y;-%a+iq@c9sM`n?I0#>F=tAbvj?5XTB6lq-0?T5 z@Mu<=88h`~;IffBd6sI{yM0+{J@gB1MV7qByKUTO)Rf8{rR-O_bh%G1sc8r6;#@7U zypTD|J#R`>FWB!_NKzkq>gFNND3Q@n&sv zWL?(?4a)pj7ZCpYLOzi-Hn#Obd^4}v`jzv=g0C&KFL`j~{lm8R zdx@Rj&bST{m-Yo?JI2_W8JmphX}%F0oa&e?+O}x@AN2co#`g*1ld(0K{nyaH(5Dx; zLw5$P68EWS6?(jq|8Ici7U_w*+h9$OLZ=C9`+bN{BD<{n5T!217*$Rz!O3KJ6?|ru z!6)o-v>+46+10gwLGUF$xxpq(<|(+v2W0HCfL$x`)D}*q&TQTbOeJR2Dwlg2zhRdD zf%1vT+M5q}CFisQT8IT7iGfdk?W$1a!H(toc>h=4DSStrBYuuI^U^a^tlxCXBklL* z60>s0AU_Tiz*F^#-xJ~YflVdI zRl}b{oC`Rp9SB1@3Xpxj;r{?u5^s} zW=Avbu`cd*<9vJwoVlX3mNajBes3?bsEYZ_bqwfcXP^nBPX@MDk<;<_<0w3sM^GDCa|qiu$6m)lT6rJIjNHZ zZ(~PnHeqY{Vh0A|GKs5;)oNYLqasiD-BY4vZ@{0nk^50&8K1<@2;KdTZ#VMotBUU8 z19_CaWR|@}*+Oz5ClX_OH#TG$FhB=1)iM7v+x*8c|252iI)2Byt}^B%@6{d5`1Az- zuP~=t=tb%sg>2#`H6&t@>8YhdzkAzozQfu zji#mE2VKzgWj30gaSAj&2)KmP^r83IN3m#{bxDz;=`&8C>AogT?KB-@mVK2p-M^bO z-RL`!rvE~j@LwdFzUwq;`VF&9J5BGR?B7Mx&)DYK6-^&P*BJX&IyMaV93!{g>7MMx z@RJMQJ7;zl;Ln~W{OnPrFQ+yPQ1}skiS`zJly8r3QZVD_2FfGqqgmK4H?R3wy(*CnKX$O}U$d?oC$p z7ctLd>{Zceli;t=V966B_X;EgB)5ADF2$oqVgUOrGVFiGi!ODNNs+a|M2^g^~-<~L$t%E;JO3e(EXET?=cM5q8n-`6WO-tTZVlizUHOi zO6WvrJ)L_GBFTfzVxN%5^8eaCdHcog*(Xl}yKq^4J-H`?y-oXMuhyx3@&w zBkc)aX4&}iIewAld?k_dT6ISs)WKV)st?>|-R|mxWN4y0`ryD1x{?v`fknjetzpkRTu$t? z=+&kZL{3P(mmbv@G@=v4XH+#v8!()+TCV%tsjmBaUALTjQ{C^lQ-`1FSv8M*4pVxJ z_DwFDySQ<+w)il6p5m)`X@s_5JNxU?!G-KO;r|Nww`={`SIa&e?Rl&01JN_Gu842i zA-O}Sqf_t^AcP~wchnFYUbw8JH` zEid-c%rz{z16eal9YfZS%MyRdD8}?Sa1{TCbq9d>FT_?2ABTr=$QZJz9|E5foUW!i z&H|4EpIP9u&5p$$V((A!y71~xO;~Z(75K#~KHo^$MqoPK2InWtdNRgv+PmqK)><`R z6K}QrE8APsN9G4)o9+`4GiCJC_gf zfimJQ!|kZK<~l9hhhzC+&e=!Y0B5x`k;kX%gW3DA!7uxjj5c)8N0bT8Ja3kX-hAII z6IuS>gqK$~cMmU5GS9B?GWay`GG#D%&$@}1dn4fG?g)7K{wd<+Kg|zT&`rE#b%~d_ zz^}=<{cq8y+?D!&?FZ`*?7Fj0*I0g{K7GHz?g#69pY8*`4cDjdm}Ot3KK)Z|_w;EE zV+hx$&rlYwPXp#yzbbwD8104YQ=eI8*QXDg{o3{EGRpql`g9(B{x|B=8=;5p=+mz; z&#vTl4RM3r)u$J4?!MgaW8&SePu-M->(eN+?7vN)epb^xyzE-hHD0dj7G8{4q$iQ} z-PNa6j6>v@9WR?G3&+coX4!umULNiyUT!%FUP8oIc9&oNoZfwY$%}xO@e%Nn^)J9n zT{rf2-DchHt_#lYCSJZ=-Zj6JM8Hd9XM4M>+dA9Z9WHS&ybt#air-3Nj*E$D6~A8< zv6zeDH!t?_rG*^~+X_nrj*|7mNSVco=kYgt$Lj|)hweFuE} zt9*w40ek)LKi9oA&a=QSe6RnaG@H+`i@pAhd@Hia?lXMCEc+_gIGdPLcYKCR7(@6P z=Pt^G7wkU61?E_*;7j{n#p(JCze#)HYn&U+GW#0mIVaR|TIZRs~D3%8|rn`L54f0Z#9 zLH3hR)t}29sHf%6-SW%s;b!GYa1#e^(A`_Z<#(gG4{F!jVuShbkGhUr51&dL!-SXJ z3-Yn?`Vspuys2brRdE491z7mtFUE;V-yEisfySM*!{pxz9_PfNhYNOt_T)U}Yae6PUs9(|d7Jsdu zR`h9q?n!X;nIB@mv@w}8B=GQlXZ#3>1qpG+M$R`2Put6PVs~6I-f`WnjAj0Py;A4j z*Z(>h(>#B#)G6aVt3F|D4|8^ExLey3Q#5b!iiWhs`#B>pbGUY3FSf)uVyKMx5O?|H zZN!HhNXwc;AMu=>u*Zn(YmX5r7ujOPh+GApPA5iW9OG$XY;zf#i*aQ#u1NjP4vP~> z0M8O9@{wtuhz-@BGLd1ERX4Q83t>uHv8Uq+X9?0=dabNJcr@xp5lbtR|b z0@r@_{~tT%r@*c|zS{eNUAP@{kbC6Y_CC9?WA5Nvk;`^FW}aF0RoXENm{WJ`n8}PG z+>V(@nedF=j+tPN^{cXDM$%rm9dou>X18N9%zo{5%o&u)`2L-COzVTEX2*0#KBRLd z@>F%@+~m{Km4APxd-CCB=Gpl=H!d*wz=`rsTW^(^*`zmpIHw zG?hSpP8WG_{;&6QegyowBO?|8zi=7xlV@1#^flv}w|9(dHrD$_T<~}JHe5!`GRu^V z0G@5JQ?lM??_A&>?kB=#j9bVVt?(G=bhCcA?Z2gq80c>@f4e;KNL*?cG0f~{A=Q(|MtMC$(ZiMS5$T*zM}E}WA4r4qpI%z z|2s1QW&lCR2DlJ{LI8I_K|vBg4Y(tU+ExN|iA!x&Tu}*$3y7j4(I{FCP-`-pR$EZ1 z?MD`?pjM42YOR`tstIVTvL&GA_k7)ZPI5EMB!P z>nq;={r9smPtwlhHYPoG)R*nV(vXGq$h_YtS1ipRN6Vu8zQ?<~SljL3v<4aV)*gB? zRZN;>>M5U0-DJ|9A??2v?<`=Pv9J9=W%nP}4_x{^c{HH|9=-gZ#Ou~M`zm2ypmE6y zU7afiFedTauni`Eiw#4kS8}$DKhGqSXTceZrd0m^$u@hP_La{q@VIO4VzWk=y;KV~ z9CqiF1;70Lm8^YVRjIY}?6K!w(5NQ|-dc0+2ypG!D@G1vANG`ZvT?6ZHg=k{2i!Ez z-h4%xY~Rbiw9if2t0rw3@IEtX+HcjKT>Zc1U%XTG{dB*Ib|%;TwAj(em1L!bU&K-W zulX1M55!V$g?``1zxWCCi}x?i=ox7BFXF}^e*fYO%EtQ_lT6zGU;f2OwEz3~7YBiF zynoS$w0Qp_)wJusH_b;}ZeE*yN#p~2*W3e6W zh4~lzHe_pbR?IH;XEw4IH_hzDeGvW3iQ9`?grAY)TgQ1k`wEU{&+KA+#l>-ZakaNe zdF_1d@$4b6c{egA_Ry8yemv!I0{vJc&lw+__3`H?!=)F74qT|bSDEuAa@@VR{a7P^ zpjji|m$mTPyL({lUfO#+{kPqV8|I!V`FGyllZ;r#znjbMr!DJ!b9I&Y7n^~peMgD? zjI>yoa_V>Hv&X@kPwQy^fahae4nAv;gL>EQ_jUcui%A;*j@+4!@7dR#_xq_y)83}` z`hxG{2XdFdKKmGvALwIDfj{3TWp$+{+2!lpCDr9+}raBRL8#h8!h{P=6Uu&^W#b@Ms7YgY5u*{pOGeCv&_xs?JcP@ zX}>XLAj85uW0H|rnl%NZHxLbrJTVAm7Axz=DH=@}U(Q&#)_ zK}^B!uZoW;w70K1pEmjX{EqfjXMsa}pML;p>Su3pb;FA(WEfl%_4%8A!2XON@T8NY zeLDGVk(V~kS8pR}qMJWPxs5d8m#BaLzqLPO6Ls4Dy^cORoRV8v!=B%{v%+aQUp~=U zbPe?DI)^x%#hDbWCkiv?lQRH2$N6{p^u;=_sFwaZYXE!sLhS#0mh&p48Pj=onfNu2 z2FVk=Z%H0!1L~aTzc%f0?{luFU4=7sW=7kyz3iFcxwOMMUpmB@pkexc@Ygw<0q$0AE>WI9<+l^q!+HqkJ`8p$L*y9%tO4cO z?s=U-<`oYChktd_8EdUP?FvufZ_|3UQGOX?nE+=b3im}#d)&Kx6P@R!v#^xE5ZTPA zy?)~+%BMNp9~=x;_nU;BppV*vY!~9UX zEa<@%%>T)EI3F@Iw%gU4)EH-!P*-~F6KHiI&->qSRtxQ^FzvB*{>ZeYOjy&M5I~M|nI?+S=OCg;}bz1E4& z;a!-G{_JjESvV!PvH*RUgq~d-uJi3N+(xd`sfE=SJnJ>-h3Nhb1|npZfS>1uWBZ=`o6UA7@YUlQh9^YTFDmQ3zNTpp_2 zGT3PnO(NLbU7S(5tH0CKa3uB`nY|EsQOvhvS(yYM^5MrR>?J=LJK~*t5#JZ3(if$- z>5G!fO22kwrQvaNF9r0Nxzv-5dytDxk`2zgXitCZId?Z+f78+54DMyqI^*#4jE5X( zKk5-rS7i4R={0wYw8%&XyxxUg??SJ2=3$Fo*Phg_jD$_OY1mU&My98`dR@yM-+sM* zch{aWjhi~=L)$TV8=b8=sa0pW%PpO|-(0)x`UJ`O@Emm~)7jhM!w;r6ac4ih|N1@X zy=P?-djF<7MXJAA=|s?vsAb2Q@m_v{Woa6f2+Tn$~|xC6ZehQ zfp%#9=I_F#@(scTx$eCLHTVhvd@Q%mrEjzL^~;@}-zh!tpR0qD)`Sq5%7E>-WR`JGfjz9_t5Q z%vpMul6PPIz>km%?S~L{AY18&(KDYeF{^vSh(ax!p@Rx?nI3miJ zX#ZiHH$6GhZDDSp|E5H~bitzB#;wiGWk=9v{U&x;Hq5kNextwr@}qX(8@`Hijp_fBxrT1NN0eekL6 z%)X`ZPIP3@DczrR)vq&rbpEi-^Pb6b7f47?nBmfAFomv6^JU%7EHuywaP=`!L4wVH$Yy=!JZw+L3V)qCfc6Od@_8}I8QXa zh;t4L);iG-(Gl@R>7ws@oCTtKMBfe6wUcvnJo=`^n#n7;`@u8$a` z*m0}IG#SXYJ9aG!L^l-&s&5$P@z;)B<-?0N{_#(I8(!Se!T7bE+IGlfM#@u0Wz6qS;$F`Dd zjSIu{Qx`+K5%}4nUpjXMy8h8j##y_-@po6SU$P5I&_W;r}Zurdk4iYTzj1s`#bGy6IU>FJ&AIv zlbDtp4_S@81{e>_<89kB#^i~|E0JytRtFOpsd@Efq z!`4cFrP~?AchvXosH1HUTrMu9d3}{pftp>o88hB&d&<(t_*H3n~5SV^D zp}UMdd*an095c{+=~X&5ViUUi!Ev5`x_Si+>6KvkZA83`{(F03y^?$>F7zyRL9nIw z>wv$bB`%Z}YjR~YH8vf-z5QEnY~z-p&1$d8{CITRGAEk5kf%`QWy&O?tK?!nc2j#U z9oBy&v*9mn-%}>td62%#qm5@jBb+Uf3H@FBS%Y1x3smnu-e*6vTWO=bHWn98o5z#T zMmDp6HeQO{s*k&mc33;QvCgYccJxE)Z0)DgVt2Z7o*ql3?ei(qyiW0eE{s3Jj6;b9 z%;`!DGN{5Nly@Z;*qr~A;P#k4exapKlYxpWw(XkK{@@#!?*IEA#R zXulJGQ?Z=6LB(=PTVgrKfRh;)-eY3H_t;o)z{s%f*t*W`GuXFF+Ce<=c18W$ufL7= znLOLp7rBuP7od9&r+9tc{lG{h>yqu3zS5`DX-20%b^XBBIInbCaNE=ArfrFJS~4pA zENju}wAkyw_xF|b9c~|g3HW}z+_T5>S%jm%&Kl~FO>Sd1>3^&*@}BuV_}k{pWbO8k zQD$Hdmr{?~X6@n2+xC>XK5~!ou8*w#O@6Yg*Z2~s&&&$X1jhR4ZuqB);AX+M4UTjS}u>r>AkRr~(a$=Kz0-)a*XuSzs@>vtDEMZQO)Uety8|3LN5 zX#sp7=A`F@xQC9r;F(XBui(;$HWsoDZk!X|${1*>e7SztI;D!U6{5#!+-amS1o8jq zQM8eJ+gCjr^k_K$W{-yT!=2Hh;rt9|c>QtC=&6Q=kB;|fIR9pkhBlvQvEYc#!yCx! zmN~&0J=;ga`BQoiZWKW*zewFkW2`-X-?8)P?z zd{zY078Z7O7-qDc&$jnls@>k1ysXu_E?jywZPxn1y~oPleOT&e!|&Pi(t}%Rr!0NAp|iZEFjpSGDx#x)bSV)OkO3>VCK8k`U*WhdGZpg3sC&-?bb3 z<6hx8`!UBCipu_L?Z$Cgxs{`_&3*9ipVM860|S-1d+mAf2qPB8(cAPKGo4Ep%>WZAh0umC8G}hWVXWRnXbtPVm#A-D%M9RA@OF znoi=3=X`W6st-{Wfh&O+xEXJG3rsp>=9fTF!>1b~eRgP!j}H}bcBoZ1GLq`X^Hw)lPtu|r#4O_N&;;>;^=y*y zYo!~k2WV>Meu%BaL|6}yo03;mb9<;NKMUPB)oIFea;s`ff>l}*P)i?sC3Z=#+jW>PB-^*KdC>(0rhpfb|>5heDeaIgA!5gVRrzdxAv1Wif zx4b?i0q@@a4`T{&7yk}{{@i7-A~)sas_~;%kDYf%=c>H$#HtDVpHx-6D5dI_;!ah$ z;qg^9gRxKDCsY*|2dl*E-SE2UKOV31uY(`Uou-o8LT>+2b9<1t$A8Q3=izsu?AO}R z=wql;^;^Cl_f7LkX!BMR`wzmbp(y+Xwo!biPYT{OsjBX7_zXtbFr)IF|fE;xWR@E;@c5ZN*X7&~iN^^K4Tb%>+jXy#rE<`pi zKt|3-R;D3C=OIH~Tp0?O`Mc}>!)*zhLOyW~?>yw@=xN+H>o~`bKxZ=H?Y48A$_=0F+P{BR=pACx(FT0gFk_f-?Vzag z)SnZqtRLt^oAD*;&q=9l8Q;vphc9uWr=1-xEq9!e^3w&sFYvwk(qjJke~l&G^|IKn z0Cr95p!-h?r}@{=9uW6`hg}VE^yfms>ZSdh6~!m! zHF1Azbp9D|4dcxAqn#By1~VpM?N@-g)#d+Yu7Nc4B!<7;)c;>8*QbsN za9=5RmeZ%qtxLJSz9gk`&ymC{KAm`dPNp*=6Z^8hE)uPzuA#&%8a4-_L-b}1+lFl3 z(?XRS$EQU5lGcy=CDN$}`o0;SH#%BBEKr%lxkZtc;b@q%6|~;Ch&!C>O9IiX6PQ2X zuCp*}?}m}*(p5)97qC9z5_2DRR-peTeRpQ0L@TH}jrl-5 zFJUY*4H-XR_1N;z{bL$V;O?GKW@Ams%dC%IKSr{W)yb)nd@^^t(mB(UzYy|QfV_s0 zDJy>s{kg9v5Z)SKPtbZ~uKy6mf!uq}`kh`IK25p4fi?D8lOH*>>qDwfyx&57L*f0! z8R3PtPSuw+C#R8kK`&_36s}3Rem?hT9zgsce_X&FM=k(9{(#n|MEeIKTbFO;E})VZ z$J8^A;{f*nVBQT)EWYo4fxh%XhkW|dToS32ZiM%DMyT(FKG86;j}2*(oM!U-e)Qr` zJgd-)CCiZCl3=ys=d+Fvm)?jkl3#MsC}jT4OW)aB=5r@7-v!L`$*Z>2$Y(wUnZjp& zA=GEosobx zt|lwHr*E4+>WonC=-7ll&pkoC6`{V@MFs|*dvaFaQB_y<9rgQ?zN6+-PZ&7$$fIO8 z9*^~WuYgt+R-Vvf$x|ir6p<{Q9(kxdv}ufFDHfX6C|SzM3@`NLHrJC| z;zailYj_l&bNN@zQx$tS5Z>36Y-o|41A*c92^yzQ!G52OZ*W$NZ-6a)GqRyGcY%Ah z5Igx)xE4Fv&1u@hy5HJRZe?A!+@}416E4l6jy=*Tj&aoY~^me7|0*AJ`M zzA$F3NnTX64MXRkE`GRcFvlLp5HZR z_W#zwUtLon-=Ga$4NvX|R!8&aS>4*7KWA@q%l!Fz$%>gj*Sc!aTl3Ws@+6u^AHZ40 zc0N21Yc5;CJo4Teok!nRY05E%dWL!Q^;5jHrc0rVe;xI$pYJK# z#J9KaV1Dyn>>2bb!$xYJpbuj_$=5D)t$}6U+H9wbu;o&7^+u^z*}f2bpQDnJ$@k>u+!hO{G38N><_$x*Fu zJ;qm79-ymiSc@FR?X!uOqs^w=Z2Ap%Jw_5a+P0PT7*jGHN@JWWo1yg?b)B>keMeb_XLmj;Kc90vFmNhJ6LZs$+zCdZ!fgoCJ}E3 zh_{+t#Q@NlrO;p^Tn0OuJ)?ByTCiv9enyB8=L9?IX^k{NE{UCi~uS|=+`S!|m zq;FqrNv>~yS>oxNc=fK)r&;jnJ<>bcLo=U#ZFaU3-9X=J_Z+Hk4JX)d7(iF--nGk- zdAoN*y3(>Qse`?11*V*M;NQCu-=98Bd)H?$K1Ns0fd_@z#M@Yx_J6cb$+vg;`|KB6 z)DG=`0*$w0+hjk!;w(qm>=bB!J?ZV8HPSqxTeZ%D*^WO|ALpf0< zf_TMz`uO=LI!&KJ-#z$pN-r2k%sW&(roJa*K>UH`=1^t5VmrW4O!XuB%Wbo!R&Il@ zO;6-DZQGnu*@RE%+KX|m`3@)Fj!UOjjwIhVJ%NfN`B?pl?C*3-|)X-G3V0oyDRH) zY6hlN<^&k$4ot7K`5(x0O6wQWu98>B6#b}ZtYTW!+tT*m@_&i%|04eTX>(=V|Fiio z8v57b91Q=$jAx2|#JpMPjxqIfMTd-7WWPy`ff>1@$1x{cM_k>u=kK&zya>~mG>GQ6 zpHfxOrE^vN;9iv#v%Ilx#j)(+p+D1@_%VLh^aS=P_>PR(H0CZUxn)cPai;op(CZC+ z@-7prin^p!)rKZi%?pL9>SqDB%Xrc{RWYt$QXPu@Z z?dun>Ol0N`of zT0ZSF6#=%+&J_>Ja=q;AqW~;6K7QjfGy{uJJi- zLKctZ`^Ulbt*hlD6SG^%ny=Zs-#^kR)t-v?1V?MgTsWyNoI3?)ofAFp6nqzStqFMO zF>BwgWpl1raz{UXKa-E`I!RVY&@T(f)G`q3Y`6U;O>c5|JMFIaOg@`2v&~xHoLm0O- zV1w%ihDPTu{^yvy#UG9tzxbmu1G)vPh>11kZ0ppRxA=Y1{y~~kmACkVF#|$@D%;jQ zA=-K>Fvbx#VqJa#F|hI={RMNOYk1eD7L9#{wJ=+TVUMV<;YZZ<3#Tc7&FI>V-(B+D z^-ApXo?0`|iJtjOr&McA*qfHAH4MxDt(e&AF$Id*kzPp5PBJ}rsNw(@z>D+Y$uxL# z9y~gi*w9pBL!I3@uepO1$8w_g0%IF=Q~3yVOgDQlW+R&g*cQoW_HgnbBkB0TGq5QG zuqg$Mm+g9&SiQIQQFFuj-(YWmCs=m9=Q6(k6P%?3ipRM+121PHTN*Fl`+$+{IGyPv!deP6OSs6I5glC``m8h)gGp3;*pm0ON; znz~Yc1ZT$7hr*Th=R_(a#B3_TVPsw)dMtX8iJk0Qi#&1G8#=2q&An(6e%eL@SC#2Bk@8Q8Tl zJS_8}Ed#q%p3fOMHQ>8!t8ncb8y8C3n#Y|5Bj8ajGT$)pRPZHso|E}d`R#M6aytd9 z%0usu$?aP-_KDDiji-(#9(Vioq&v|32Ht_Hq3Gxq{Gu(PNKA2hhc#G}Y6DT}MlSf* zpc{FCysGh?R*yaH@QIb&@jx6iP*q2qXzov(uZoE6=HALYIR3%p(dgDy>g)4>e|#0~ zQOpy*j;@Lwd0b^pmy@f?nJ31N!M=W+uUre0b#B}-)U<--{k8^kKRF^wJusVcJL8=M~Ad7y8Zu~8DL;*M2d@2B+-3U*<11(5=Qj4wZQA~$KxHFy zi|QxjAMEY{%-c??s%71P{LuPyoTj=(6RPTZ2CF`~cVgAQNY(cSlOU5 z!eNEl< zEiuBG@YS`;!2EX3dC>J-=sOkrVCM4Id2{)$U7X-VU*YUG_4%j46Q!kvGGE;e%x9>l zG$?;JJ+_QJC_AjbK$!;0$o_4h%!%UVgih>}>P0=hsV|j!S<8UWskz)8?z-4;Y!`B& z@#Akq^OC1Ps6G=N%V3U+GR}VCGc;eUHFn$Nw_=mry?pFdY2z~%2VI}B-$5Q95GhbzK?22b-TWPT; zn}4Q#RyH3p`C5EV@~w39rNy2iUyCgR_GRvPJvG(``MryB$=2eiUX9atObAAul!@5z zP*wOWXt$90sTBHi*8BvV2~|sjLEiM^L5KB0$SnCw|A1{kw))doWsu>(q0ZB}oF7y$)0`=lV2#eKPxoYMPPqo%sbSn# z|F~0m@v>7ZBf6J}x#F(3<~D8#4UJ7+6S()%OE}*jdEYWTf_>^*xmEt)K|CQHjnx5a;?jwzml(B|0}1d0eLUKEw^gf zqP(hkT?17my;-xxyzx?eh0cD2w#G*#W!f9xlk zc0l)DhVFtZx)*7jXz1RRZ~nPZ|N1E6;rBQbkB)|*$E@;0qba;^aSn;r(dJs#h#X|( z-HjQQ1fqxIlU~DpqZ&8;T4V2lPIQ8NOlWvKZ~3drtGP@6Ti=gSK42W^gE8H}aKAzO z&**;(mIb5leJ*>Q7W)bHzjYt79!h+Ep_TRUA>%8%_Q7{#Z<&0@`oWBohQVv_lOKF8 zalD4*xs{WM?QH4Ed0g~U^M?j1JEH6JpX@=Oi{8?n!4By7QqvUYEmET~+MuG5sw#>@@rHzx3tXhJ5(*E%D`(EPlLI`kNm6 zB|NR8oc6N#_pV4*w0A|Z4cTSwZECT}A#6H&JLD8>vVH^a`25bLPA6xi{Lzxm#38#* zs0z#rRs|0#8e2p>qozxcb+fG1#qQU#&KCcSa)IdAtZ~tLBE=Wx5%+WbCVZuQ>MW!` ztHqaDqcJP}zO}di^RGSb**03+=Eg~}_co3o+i^*Dpz>nILw3!)-9wVpmV%3H=_}A7 zi**{V??C(hjZbRFB5Lmz*GEl@4K)4y!O(88XtyrJ{9QCuhnq}xX3py6~=vZLrSdf5@@Ko9|85&Niq-|~tt0Ni?ilgD=Bs838XgJW&@H)zUu^1Xo z(D{M^>I_mhdkW27MZ2$XWET74@ZoY&oThO_&gcsE7xoVXwq_A)slZRam^eU$eT96F zRxp-?XReP%pFMg2e#w9rkB4qfRQn@0W4E6Fgg&RMvvSr@?LE=Z?-{ZR$2~(_Tp7 zTEN((kpGkL&n&KrZ8Yi(*eQ9HJNTyawsjtr+N8TLYr$3f4HrSDP3$*(hWvfHIA7)B zD^yTlIFRA)Q7rzBI0`n>+xwRm`}rmQv%9@Bt!I$76!d2X+cdA^1@-2qOY=sz)%@cz+9Rp88pHS#BEq%{II*@V?7$PTLG$ zQw?8Jlkl}yTfXYd_eAt-?AbA2`^58A=f}6h*Do(_j z`g9k4y7}mn=6zqww>LiW^v0F@u1V;FKKSLPfU~<3(ua6PM{@rrwxNyOGjGryeJXtP zkv>Sqmy;&Bzsi++FYOVNrgK=Wj6O(OGF^C&Gv751v3VD@llQu&|DN8=Huda_-Xyb; z&OXS4Yv1B*kz*mhBgKr>45eUdvaG00Fhh_hA!z^!JqJS~Mcw~6jEN8TIqyAH;^acE` z`Pho}_^k`FnFC`Upa46sIf49J^BV8KzSqnGi2nwTC%HHlSsaJ%JC4lvjMlth4LC-?v5 z+@zo%@fqSKg~t;gWKIctL%X$CTl>*keVNAT?9n#I`a_4xAA`s|B2HqUdy|9%*EiQd)?$ai-z(oE?`}oeDGCKFJ5QU z&mmoQW9+@e|M?bXP4RkY>d?m_ypayeA3F?gnO8VEWq;?$sK5n%6-)s%@R8x2^N4 zBz5jM!E47CqFsR}Cwa(;+FEs3+q3Z^(8kV%PB(b$ecl4+EQIkfklBl&(})?YRpxA~ zma_?$F&Dec`6>%N(3ylq%)!nhUmkBeuFJ38Q>ODp3+bzK;Em|*#(7Qr&40H3Shrnm z&uK_>W{YG=GEs<)ioZ|crK4KswET72yA9&cVaamqY#jR-9EeVm}$4{wAb#od_T`^bK5j)CnO8cj`!+PJ-1R{>luovv3D3} zsy$!w)|j_D?U_egig@B}N}{tYZw5D&xAy6oA#wUjA7}Y@RgGu=;`KER`PvRoC2#Ym zE3Dc`)mv8l+BXH#4C z^i1%PJSYaBxAMPh@;`UH$CvfcVQd0gNRMT+mkcoQPqFa5Gx$aU+tS4HLh}5M3pXwH zM__g+FVL<wx_c%!F)p`{vh?gm zIjsqaw>855LFNGkGtffEw(|DP$L7pI@?1Y^hWUibwN9ylp@V2sdG~aZ;r@x=K@%nfhHHbFE+qY!xk-sw= z93qD@rl6lrUz$=aeJ;u-4gx<)+0VLiSxWT_%Tk_RO?&2(HwT|b-(TqDlr|ci*3*^( z1IOC#6mTx2J^Cj8M`SzT^V5{`Y(}eHm2T==ie!K?ffgBP&GY3)t@dITa-eyk0FTc4 zkbF2xQ=;!sS4O#q^RHb!^3J1IADCg}dRnvBZ(W2OY+S_rACK%t1!ZNUt^f2k^|>~~ z@0r$BqR&H-)fd@xC!hnqT6SIe9<~|K<7P3cg07mpOf05L5uC6{jQF%wnVy?QR`I8 zCuVI)wQ&5n&Uv~9_-QrR7Bi;F;;i7s_+MIIBHg!ii2%dOSv*|^bwroC*0U|ge8+k) zGyf(X*@+LNKA{YnbQfJ{Yk$@s1`bVpk5@P9YSZV!TYH9WilK?x65h`_n?0CU3_VAsqZP|yV}&Fj{P!q z1_$i&Ea0h67zbzIaH#-J=rH6LzN9DP%9X})xU2p8kWa#z6 zUE$I)aJq;mkv_Px;2=wVoh#hL4_SJ`KHb&f%^T->=e0vG`FWC`9pF&244%#m zRBr~C3}UDnx0Itt$j^#ebgq`MlaU}JK>D1p9`OqM|R@bwO*T)=ULii^GGM3JXGyWjcp`< zzQ2qQuFllFxqNm)UOw>B-e{olD&GJks#Uo>)x_A8+?-C)-wTaU4-gGF)cA~$NPYEx+fT#D+Hl-zs6+Dcusc%cjFI!{%zZtYgeT86H{{D~JHi-R9 z2eHNhxcXgVVBcZtD-3z{2I!~R!{fp(;hX<#amBTCXFz6}d>+p2UKXgHpDuYdckqDE zHSuLqy)xITOhGWZYi6*T`3}bMtz|BzOyRMf?FFx?!u=8XD!c;&J$~G!HUwoK+s^SR zo|3wshwn7tsLaSvYg@$2n^hLN9I15PY9lmq+c=prZQ5w?owk1~zIVjoJ2pv~OkbIs z;>sLF8QJjq?!3n*ZpZoidpI4cytLyo@k%r>{@Q7#9n(Y`wFBDx%CzGo^Ug43e`3o1 z+@$Ys>R(U&?%J;&C%NamS75XH5I>8sUOMya$V2jf`eNtq5B6Co9tA14UU4z{(y-zk zqz8H#f5aCTI~3fO@GY11g(p(C-WKnJ`PPTI*m0pgTk}}oUwDM)qnBHM%h=U4@)a&R zxiN=*2eN^QcztI!cA2)zcT#zOtTjdSsl#tze^fFWUyu=39)4TDX8Q+}=iZNBaea2+UTE$@m~bckfbyd2=bE$=P1Z0d`Ub~kA^+cfGsD6YO##rdhP7w=nq@J31>uqP?hcQfg~v@n3X?J%eG zdeRDgX)kqiN@tTc%cfCR(9ovdrcstVHcKxd-vz$3ne_3hYsojwW%z<=Q|vcj{F{5a z)bGD*(|~abFqp?l%O~v=o|Ab_;+e=Jo=UfBC?_99|5wj+qN5IRN>|tMrtE6$OMfSG zEA*YJyRlxTt=8Vk=XhUl(@2+P1)CY_oA#rx#l}Onz%UACiO|e z`4`Z`kMjfOu7rcwV=#u^; zov(5@SIq6t)5q-PQx{;LxI?|H;I`aG+mC(lk3IB#vTbe0k@)6mN)O+8QlrKhFM@C3 z$&4wmFS92zKg7ETc&qsq@4vkS%y|E84QU0Gv;Ny(`S02N$*$dx99A@?4}EzVHd{V@ zQ7{ngQ_`t=HTY_c{sXD(S1sjF{jEiPaURS|oOTVlbCLv1X$hC1i- zEzk*{je0d^w)Ng_>UI0@MP8p~{S=IHi=T3l=2B>v#t*{rHgLQeJoLMS-&YD>#qw!m zJ$f^vv+<+&ZtJ>CG+i{l@mlh`{VLyP^IJOYjuq%jleP8h%+|I##JPV+TTe4>)wo>! zpKupVZT~fq?{18?rT=UzV}BXs$ymJXUBg(DzRQil*U0|@uKIAjt=t~2winA6Z3}Zn zR}ZG!{~eRKUp`o6*9M{|(q9y02ls+8JB|9!^OZ$5ZJT;h*3*kqUA=e?JMRAPewzFL zAF}U@&S=b~Z|xO_b3Cr!ysv(>E&eTiYUlBdrR;MT?775lWW(zhgk3u$8~aoK>s?^q zv}4`D)Lk5mUP27xLX&~q&mjFZ>Qf!{?D@{9 z<$eQr{4Dx`j=1B=zcNqRI_^u2ohh3((}|wTTlM~h^3Qhw_GUU-x@Dy9C4ZQuosAZ1*Ll1bUOz8 z>H8*LOqo6Gq3%H&U6~>8F8+5n|82i5S$kRc@lfv-s&`p1`g`{dqhRzC=CahbYT9!$ zPqKbVvB!!<6C1;MPW1+G?7vif(}E@aA9TK2pYHZePYpTS^i9_nUT5!SRo>9nWs& zd3QdsenNL@?&^UZ%T3{~%arOmbjsRImHCc7S@ClAcb9S2Nt)7{Oqx5kz&lf8b*j>k@ySS>VKayg=UOWI2qfGUo~Jd z_7Pk@gXYTfrZ10c-^t^SlYM>I_V;9K(qlcui_3GHmdl>-w(a?x?_PV(@Ni?jiu$u_ zCxBa4r|7QiPStB8;+yGbXwM%-n`3jE?h!2B7S{VMuuf?MYuA`oSby-rQXAwmt4$hP z&NZ}OLRumozKiX!JiNk3V|%}9Irhk1FJs1DE5WCbyH)eYI4grek7gyNz8S)udM)lT z@@fpSk~oxnXW@38$$K7o&o{VT6^C2I&@1z>);3-f*Tx4-*`FGCH79VsCom_N^ovaT zm^hqnH8>qhdQX%09FzCxxV$%*yu(OOF?sWo;QH*KR$Nbw!}SCMzi%A;nFf9;>7PR% z$@Nj>Eewut^)HS$@`p@V|6(fTJYG&}D--**;=oy=E%GJ0_cJ&&VpDgUy3+TduF=8~ z|FGsL&gIaUl;2woFFP5So0ab4`(dVC$H8|uEKAg z|Cr*dUu7>hZ8?o}`8>kuV$uq4_WV!$tEu8)8GUskU$IZvvo}9BaPS*ej8X{JrmFi)Q|9ov{MVTLgOyIXAtwI>TSum|B8zX?2H&wt2ge;c^ ztPB<+Pa3MMsU zA2u$BIWf15(n+PA=Z@u94%6?Sx5Dw)_qGe?^u~PRkD^7qohmqhvez&t#W>T2?ZY8H z@0v~AMUU-i!PmD|@6XiZ(b^kR-6(s15pyum`sbo4zYC#hJWM-QDx(e7ugxQ#B0qKT z?cUg>6g%gBgI~FP8-OpN{|E7&%(uz5EHZoy-{n8(`@J@ue&{d*vo|ou8hB4yxX9ii z=6hFDr{u9eX@Y&U$v2JPicPt=P**13f5QJE77n(rH)+52<>|ryYwZ7<*#pIYwe8E> zytduOw|@3JFoS%*o&N-2Tk83iG45TY_4VaboK$l;UCGzgm;N>B%lWVPi^cN`(kktL z^t6Hh!r={rgLMC2r2Wp9=TnpCC7b8++@=pm;|w(qF1AYkhvfea_O)uvdL#DW1B*9( z;&uFgm;b{o4ANdC?^~n|vT4A1jgO|9R{4n`lPjuoVbeXy1S;}4{TY#R9=7W}n=Xjgoqg7Lv0-WpX1@Vv1O441 z(&}s)`9m5%*M*|jQ^)NVHhHf$bza4Lo-h4Z{J)9+)fNVMFEM%Le~8ypY2yap_nGGV zTi}1Wg+<-Z3s>6xC&u)Jr2oZN=3L6mBJEk5M*csTw#gpvo@nxp;VqqZWtY68O!~3BC;HMCf*L)@_cEdC|6I~7}8GQIi6=U&nTYb zc#h>6$uojyIL|RWNAn!Tb0p6ZJff}UXg6ki<5>0AJ<$()AM>Fm&ott~{yd$1c@89x zKi-oHEu76xv>Jb0@t!mTqb1(s`a&78e&qAVdoJKSje@nrKr~NL7mV(Keos+8h4LYu zpnYFC^>_}+rg;D__v5X!@=t&}gP{PtT|gTbS=s_e$`o{y}uSAnB#t6~7B za#oFKe+6}Y>MQde{IqinXT;$>S9k}5(Uf7THyAyU_>_FKO_YC!=WPS$IQEtLX}FR# za<=YQO`c5rCx4zNeR-sRjaf1V}2JWp9TadbQ;j*dSU9oI6y z2OZ_JFQeR2e_5Z*6ua>Ic;{L|$1kCyY*ZuX^=YnYG3D;{mG$Fxl@B-Zpw{qUe|T`K zugrVUR_h4Fw>iuq_<4RIIEn`o^v(`OQ;Fq@7roG%{?vaJaIWOJ!Vk|UL))+eet3h` z_BtmjxIHO9i*hrQl>Jv+**=DDr&3n3^bzIG;hDnIZaj}TOgQ3HU(C9c{wJAu-dMfe zc-}oj7L4`gntbs*;g|{E3TNi7qU_n)$CmQo_#0+uJT;y><)D-6_7-V`7uiBh~c{ZB16!%llAQUtoG;mV7VP!P;&&mUblLhSibiuCCBF-RAcm}Zu+GfYN`0#1+jph3k4oyJInZ$^x zOY-?+$yQy;Uh#xO`g%0_6EJ2EZGZ0WU2uw@yL*eY0?OIByVv>ejj>K{T-r6a>B9_g zqYukD#aWpLzT(FN)aB(db6|#^$7QwBGcAsu3)`XRdHX=m3gL;4Z8kD-Z9DMB?*qJ2 z!9(sIRUhk@#yfd!OP&;+LPMz|XFn_(KK%zBz1C8QA?fueRU>^863pgIRAPp z{~ns>fUg+fYWn~EfaAskPxt1!p5~huBRIv4$DG;=zP;j)(FLRKI=gF#vvO8>0dE_h zS!VI>ai(jp&cf~x-)mZ*ZQ>SFil)dPE<~4G;uF5TJ@*PP_$s_Uqh9?E7`zr*yzZRr z;&mwBJ-g@4$!Jb5lQW{Q)Re8Q!P(@P0TB z@7y@N|FOS`R~o$6b2dmKykGX=UCvn`KLqaq9pK&9hxg@ic=wLO`$>a$xxqVfq~|M4 z)4WIx`d-(m`n^!cJpQJ-Rj$sCt8)k6TzNNgbvJbuUP)Z36X)FEL$PjirRJRD?b_-? zlgn|9ufCCS^}Qcg-&NFCKz%iw!>+e^UqsjcXE zIkCy7w5N*S0r->}Ums~UZu)>J!+Mw%h49ZUb41Y;=}#fPSw3qzgnN5?a&E6qzNW** zmVO32jrlG$?<>svI`h8Cyi3fR^%!pcQuBV;yfu#`IM18+I`e+ZyoG-qV?X)&o9CIB z5^0-F+D9f$@gKoC)W!|4Zy%C}eJ^hM2w(cUq#t4aYYtT9WDl!Jx3SSFzVuf~Kh6Bt z+?>t-H`0G({x9^Uzd-t}=Kp0jojzd|=|4CBK{5BV;zuo;VNBeo{r;Xug={^Rxd(RG%FeBWxmvyjI9eg)tEG%miBb%-r7Y4Sa3^1Wm79o~%?IN$*hmiq9SYw|Hq;?k=V_d@8^#(3{36`NOu0$^vO&*}QCSYUXj68PDSHdNDWmKOlsn#EcC9y-R@v;hc2$Zt#lh&a z=8W2#6@M@04ispA3$Sv4Gni)(&!I_R?iUBM)WBS3U|wus-W7C8e+A4`;PmF{#j}4B zn2nV2(`T-M>7Mbrj5|^c%!82`t-JefE_Y_~e8aPcNAl~^+}HNaaWF42Ft0Osjx#V{ zgvZ)T(Eyx!p3itbO#<`vIGE=en6nJbp$6t3BtP`csqp;>V7~>tYMwWF-be!b**MrI z3ih%<^fbX<8;GU~HniBt*_!f8UZuY;SR0DIj=rQ*$131H$MY=DGfC=rB(9D_4gSLo z{<{^sLmt*0;_3Yn@M}4+mhmj*Dd$NR$I=>It%=oI+?Mkp*fX?gS)h6je3RYLT3r8n zJpW#f=o|PG#9E#{RPEY(&BkYpC&lOeXsh1D%~w1NeFR^yKSNLaYbE=rO~Ct&f%k62 zYf}?#xSZ#gJeRf89_>q=k8h)M>}SiLGVRjb-AHJ@lDc&^eF1BG%ecp=UTcX>tgW`Q zx0a%YayHI%0qv{rjgP~6X64s@O8J`X#h*GE{bSvDQrb)wZI~a>n%5lJO@0SBKUjWP zynj0GjpY83%B>|vslG#UV)v2M(3bVV^jFiD2CCnIu3DEu`>OASrm`dAoBYFdoTDk4 z=0j7#_#H3~;OWN`zXp^2Z>!ipG(v3@jiAj}-rhEEpWXT$&6)cDDYVqw;NkS??wmAj zTtnD|Yf1Lrrl9*B z?Qwkpc)I^fYZBy77fE(~d!OUwHo@l)qmx4$3x1#sBO_@%vlzc(0~xcfR2>_s%1kbi44yOT$A8CJ*Bw`ngp<00TI&S~8bC0bme zJ{Q~c9e(BkE^`ui1;)@ON;* zes7ok;B8}H-H;uXTS2)(v+gkmSToQ++P*@0ZF_7xHvL^X=h?v)y9MrZX+uwIt0;FF zZ4~aOi65rj7m?Ot&nWYp;ta)3^kv@4n@8SfXlIB0G;4`$Kb^)p#!akczT1tVdUqI! z$Fd&yiN6Pi)k%%v79_cuAz{ZBoW*x5Ww>rvuvM;Z6z9shJi(6bG-eaH3spEL^ zi|5JmPB(egS071U(Jw%ZBT-*HH3{u(zpS#a4EFX|i2w29iU*K6zu&wcV*<&-D%So; zjz&P!;gb0TWf#Pi{Z4xx`!c=ZR$9l|qE<&*5M_=bIs$!x(vE*)~4j>E3_^(fQm zQFfdjS$*gUOYuqdB+H_+<8+ zIN33)kK14K&H-spS7h_nw$skduVKfuuG7x5g7;GCJ^0#s{-HeBH`m|8Hsp79R(dh) ziAiO++&7<*DDO0%yx-@`TR14O46gzQPZv&V%%$vn%80hf@>lutuckdWlE2(1%a5r| z_*(sIov+ql;}iAY8n?u!PsWB@`4+t1@bnO4^TgBUFFc+`r8{*_bPx4vk5M8SevdJb zU;a;*4AaLoF-DdA&qfBW;z?9?LtI(yK~mW*l-0OvDsSn*7nGmLGlQpqCz-6s-_;y^ zA-*m?&YMFH-P^}0EcVF>a^=bicGk+tS`1rGo=-BLyz=2>=XT*EW)u+r zm>H=4kbKt8S=d>eyCIpaWlgF4o&AAhztzAeeT%R681XVlUyKZAalY6L`ruk*L}w0I z+&XQ6V|eBk+%P9guv+=qD*caR3%`x}IZ)QT1N z3G5TDfR=(;#6ICIl$peN$`Rx>pYtguGpE-41ovh4ba)3V8~Qs?rfQ4B z`G8tur~g?cjyHav=Xm4yBF+*ncB&Wo?1N-wB)TJBKL?Kw7q8!R(h{B9C;eEBoNG_? zJl>X8Ig(}C>3&1r{oe-gO=H(E_UYnm)-l7QA)O)%M=;J!*SUM(x^kuyEuESCp1b{l zu}foD`bz1Nbj2NCn6YwLbsRw&G{1O|_brWYBli)0<0}UKP{v%~S72b+`^)@i8h-JL zbg}hpK-s8d_5_`1!uEd^=B^Fb_K)1#_Iq)Qwtn)*omeB0y?3nZHz{8Fqxdsk-#^~- z6No{%HVEA9-l5+TKeskWuyjsBBA8FGkEYFeCBU-ta({#_>TBO(f2cR!YKtfLVYqVE z+sK>j?RTurk$gXNgU{a3Z|)*)Bz!_`>~wl;M1$9#uQGLPW1dE`n2sFY0gMGa^93u3 zuQ{W8a$8*t{)PKE_PW;PYumAxbfcF0p5#j&%-vqX>pw|waiING8f(%|*)gE?T?-Px zR=(XPp85}9CX=Bw*+S$fbs)4WCa-COp5iR{a!sqB-` zP5pxVKb!Uc*fZI@@2>Y`PVg3yN4D6W(YZ4iel+8sm?LE`A<#GWvF#)*;n#whU`f zrFXsH!EL~}l_wefWp4}V17;)F?VXcyBW;ggYk95cLAiiA=k6;0cQk&xggoL!1$)CP z#S8SME9;kr+|>1<6HzIaMw_!FmE zaq#fbrAycY=<3l7^yt+t+`o>Vu0X%PlD_(R>02k2FWl+7G=2-ehWr6c^PMx~JM-JxlXy7}Y-q=Krrd+XMn*sf$)@D-XIq-fjxhg)<0X90G5^zSI`q1V zbotc*ljiD&Z=P`jaYnyieU|z;^y4D#GtzkSP&W=4jDCS_RDb!#b>Y(2dH&8LTwHkQ ziRdfZ9)j=dhj#*aYToYx?T=*MB3JRgnW5+f?wCIXJD=3d5)(&o$>i7PYpR~ z-+Yv9THl$yx1DA!gqwa1lYJhJyQ9OT?J< z>SZa>!bi|CVvh24o<-K}Sqr~#ZG<-;mCTo!yB?Xro;<2?JbZ|k6Yh6TD_r8mHYIQE z#WpWnpIoM_thB^pi@Co6o)m!p(eNT3C&zU@y@BY0IN6|LBjzIGH z2ry(1B`4#3W&Hb5V#tDDRzCQY`f0oNE~)KH-2Ndg_7}<@&2tpbkvui8BF~&HjGb7a zzRdRVN6}vSx#3*;re5B8wbwNx5?&fdYN;CPs@F7K5emSkI*Lj+s5Gq zdzd@Fk`}uhT5Y~IxlXAb`2kv=Xk+Q=tWVs;`oyPPS>4+YP+seIzx^_@+QYMNza_ux zA0>$uZvg*zS++R4Fo<7CUh=@XrT?w-aFIOi=jv%|?7djy|Cvto2(x}`IOQs6>*MXT zSMit%_NqkKtHPMTjRCmlqA~ViysEL!Q$x<(+pdVFmnnvtWPgRu7Zi^1?Q_0s&XhdI zr|<59{UCjsU?$oBlCANA&fk!nDJFKjiHRNCD(~@de+`WVHxIa;O>29;7=g{I z9}my;O*-F4wv@W^7@tWV{>ryw?05LRzwu8i+4rsfXqfpH@AoZ^>xW*{-Ic(dWZF>T z+Vr&8W0dd5)0d|YPtyJedmvuaU@vCif64X~V1KRc=>?5+R!s$QA<# zdP%xCu~F+;*8?{||KqM@_2qZ(aR9b_nNO5I+w*h&BVU%^);IY`-#DWw7kR1Yo6^< zPSP0**@5UOyd?*f*P#DAkMp#^8Sl|qa301__rv*|d-?>Y3v!|Q2U7n7lr7^~O8=5f z4q9v`er=1*WIqM|a&^7S&jdEp=L6sF^2ww7KQ-5j{j@%95#OvYQUo8}c$DOUy&|q3 z%l#+2f|2UC@Qtn9`27g~JsrPPJ;b5J!1j7vy{hcf6HH9sd0_?*mKyM7X=RzoxhNf?pqR_y4)2b&bP?$cSRs z(ntA^u8jwuGf3}a{tM__529xUu~J7pFk< zNXg3DKy;_Z=HU1&V-U%V%aB44q%_sRoR|T_s9Wlzm1#iwN?4ogQMbL^QcShS6X-GZG=x}@R_6ZxcaSc>+fH# z7cbF+-SBA!b`<$sA)U4|XYu;g-(-*5#s}pSjDWVPvtb|W`-!Q~!ulm=eaGV|TPWSq zdhBGnbt-T=icgFuk9VKK1b6+?ci0abLnxw;&^{&Wa~?-t?NLp`KH7WD)X&a0u|)aN z^XQ-DN2{!*&k)Kf7B`=?LTD#iWFjX;$lD*ZUJsb|9)S+{XJXANsLfus0dXTxj3oI{*RGHml{TyU4<6Zu}uJHof!vs-23SH|82qyzBn zHRYwwb;KEj^Yy^~xAMoyjOE44#7UCzqW;C?cJ6Y~z-Q+^RNfBk+}q?)J3dy-U|FXY zy3E_!Y6C8y{bAZD*|%rONC!rmc0R0r93K2ld-8zwnt}Ce{0_BuEbaXx?d{0EFKDOT zF||eUN^7$d#4DGQM}6B#--PiN`DPd(35PgQl@;W>)4mUvf0TZ-?kFMf~m!}Xo6pPDzMUwqr*G)IrkZr;bw z<*a0}Q_)Rij=GvTYI&~3hUD-1wFei=*}p{vdOy_QA4wzWOOeOcv~QC3QFQkd-it0M zwoz$YPu-p9h5?H`V;vV>>=@{F*q?`0ed&Ixa-A($QMtb2Zk(rX8@LzH!HlmBYLX16~H}YO^@1){Q67^V5aL=iR?gGx# zklpljs{PK6Ji)LdJCX<#FyJfBwez2dB~hx$3xnz4>+8 z%R#$2X+Ib37(<_@-*Xm8DSicsm3Cu?4A$IBl9-dIr4Ogxai&-FOR>#=S#xml9O&>6 zb5e&q$ZL~5#5_l9OnrT)ww8XI22CZ*;q+{W4#(ZplVt7oK>EQT-WS0u-DV}JGqi4> z?C|C+XJ47gj;b!m#)lMJ5YA@c4x3^i3HXUGz_h>p4Jq(k8+ukJ1*8a7ELxZbAo-rei$_-A(Bl zezVMOsb`*KjCaDvrVa6(j3bjY?;WDIk=Jaoq4?%aW1Y~? z)cT`^FPc@nSMsypPrGJvX_J81K%sqVu zp61-sI=&5Jz3jKmAAPmD5#Jv5m;~-7Pnvh>Q)e2y`IO8FP`@*kEfeEyM_&_vz?-*( zFt*MiEv1guIi&W6&65G9FUmJjY@P*;;Q5T;*@W)DOmN()c`L9<@;;5yA18(SUD2o0AuLc@&TK*KFUgEM5C_BQ&5w8s|)&)*<* zBhAqU&wfvRF5_y9UqwEMo?xCwnuHHh&R~8~&CNBG4^|)KIZ`M1#KTx2u^x(dqxc{* zo8Yytm_HVIze+Hqf2w|t&r#|k{an`dSp9~d$ap=qu%6J!Pf0iFAjdO2$MUS;(Txzn;o5)9W89TjS zeaE+kj-D^F++tI%yU$1_yBC;3jI zy_fwJpFWpeeng5v8I7-0Y^u5NfYk9O@ohCBKNboWmcBP4MPE~8j^C#q6x|}^JKTOq zmmk8P^VA-U4)0*rS__{#sPFC6HCmrkJbIyiE~Dbn(uO=52}3zwcn7-H$;e;%9pHC= zehWX!8AVop?8|dCc9X7*_c9-q!WzY7;&S&FXjPx{tvQxRUYqzY{#?o9Q+~_c5u@t? zV+ETInYHM1YHgULU(atD2jusE_$@v#`9^d>>$e%kx9pbtyio!=l{_ApX1CB=1KE>7TwFzU%%p;=`VTe@GAv< ztq%G{(Inl5&*8WDT6@xG^1;TGfgkam;A?Lu>B~i=%TxWIIh=2F|Lb|O#)@)G8`=Kd z>u((l^Rs4?UTnZ;Z`RvDzU^tW%PB^?sBwp9$wu4B7%|{m$|;ETp3Xgy=T8{li|rU3 zQ`UrZ$J^io>zMMPd_PI^e)lzZuq+iH4_Hp-x%AyGls%6;|HgH%($^D+3POYA4vPF<-f?U zbs}4#e}MSJp#KulN3$H>OVC|}{!gKK6jx(*Y&Bz>*s-#9!p**FgRo`gKKO3;k}Zt6 zsRz&W*74p=o8-wl0b=7v5(|)?-PXGzt1V}*CGDtW?3=;6(b(EsAcjsEGSI8K)`3I#-wio-;|G zQ%L(u95uH2U(s{7kXKXos)w}KkhTN$ICPWl=kU9_`=)`bhx{%jKao58cqcN)^n2tv z-NlKSZM{pK$;x(p7#sxeqtNF>Z!m4wX<+{Y-`e>u(tOf)Z^9R}r8!1jO{_|^F-K%m zG&}JeHLujTTzXH+GW0+X>8*0f-q+uHvvHeaEIcW+50?G~pU_sEPaW#BMc541KI=!u z2%WWG>3y^x-#rON|KN&7ubZxt-?$SyM06*K8IibL*`KdHb0sUb%K3w= zE5etlxssyp&*$b{B>nF?>SmtNaf`B98tw->bsIX|W}W{LdTlVZH*^I!U9I_;sJfkQ{yOnhtud1m&30CDk=_D?#F zI4P_C_o`q@z5dNzWPSyC^y2Et745uh;UhP3{mQS#c)1iGk)N^c;R1(O=r3yPsY}Io zwFO?2n9$VaoOMTBfT;r&!2@NyleFUF68}egaLR}8PQquMzlK;*D_7{3 zvB-L_CEw4N>19fJSD=sXb9FWPe4_6G_*%+IFv=N6IYA#6^%uGQFgm8y$CU>bU*G6n z^cB~aTwieEA8vHc!NGij@;{!JKmK%N_GZ?IZf-l=OI_>4|0wb`758ZuhN*CC_dyFN5`um?Kw(E;az@89cnKcL85!O<#nUw`A^Vp$`0BJys?VozNy zdtmfk9^;j{j=oFvn5&~@t^>bEH|9DHGQW{XzmYK{$#rybNiWt&Ft0eXcdYjbuBFbS z)w(=+SLP%>)Y#{xg!zkjp7mqQA)eaHeBsVC$AZVlF?Pxr@+xD!V6JxK; zAM{)h*mN3%TnGB{frYwfvWvyQxe$**{IE~-&r?V~d4o~o1KJ79W{pyLs^^1#WE9vtkwm$#HzYi{!GRh+OLQBvkvfwefI}Ba; zMbi73E9?z#VvnZC`MX**eHeYCivLpXesnxPYhbF8H?ySd-g?=7TiH*N*J9EKY_Yl3 z@R1+AxHo0X-7I?{=>tZrZsk7X?B8_kE7r|wr-$sKBGNqkQ^hxZKnL(cJSJj_qkx!&NoZ{bM0< zA9ac@!kH3`b@|BrRF|XbOMc5abG7iZ_=4m-R*~~|-_sqmo9TP{h%~0&CEv(-tO^JG zO~UJ9rxY=lSR&Zq2NK;xo&|^rP|v87j#qdamx7z{r-^?j1G{4cf7)K=gRFj@XDQd} z=Xn5~KZts&rshjjaoi`fJ&B>m*RvTdb=ekaOu95Fb zMNg8?2R%Kwj;y^YR#8kOOzhs;>WtiY7SXpB?cD+vd$aksluiw(X zGAAAVZ! z5MDF<({>D&f`Rawn*T+&lrxg0pWaE{Rv!Ca=CjDBjlo+9&{0JF>$9CzwO7Rwv(Sdv zg*f6j*n5OATiH&sCntV%vG1qzt*pJi*w{PdF?>oI_5thN7n^&Bq~Yf(YGm(_1$;B+ zH|!l!M7l_Ohg=O7=H4Ouv8DD~_70i-vA%am9(-+%o1y(bMnl^uXgrI!4E9T5UzNWo z-f8$;_}-L(Zb$gO9~!pAI@!0=w(rM7=<=qF7oC8(C?#8kPX=&_e@0>kGttK+|KW}B zjM=v&X3EqLl30JUne{h^vBe_wEo*#LccX8~9Of?4tG)$4MH)joHP(OVFAK2Ih3AD& zf_)}SuZz@Ux3XD6eI|Pg<e8kglWa z2;Z*?mrGI?!TGS7(@pf{Nd0VMhr3eu`AZCFB%fE+D*6?5HRavA_<&S9c-ScaR&&)kr z@i#sc$|uAv))_`Lyh`b>(y84#djX#yN`@|y-1z@#1)NalE6~-C=nZ5<~3hs zo_sL8_)3B3V@bYe@e`HMrm~)W2Dap0a2Ng5DhI8;Df{@*QSolLZfW{Ib$u`t%Q%Vr zO`rZ^RX%&tBKxd1#ndl!88s7{e#xW%b48=gly$U-lqF=Uo*zTtBe=8EqErwez>gzrC|D zcN*@`eQ{GfF<$eUWgm-VS*lM?jid< z`CBoWfQ%HmQz&)5E_&alz3SqR*Q(B@O@^~~T)$HmJU*N_l}hY(V()i4SR>w}r?zt& z_$fUA{uZ0W92aU{(_@VCi4|AlVP|9nKE{3UV^SLZxR|IK!D(4S>I*N{&p&NGdA%|n)TmUUG&z3eP}hj|vAKy)g}Lv$=NkLziB zSu1!CGFk4XPGHu15@o19B;&u~NB$P9)w4;OcN}dZKIU-;bvm~2Zk)Wg)us1usLLp+ z3*)v~_W57QT!_pCYTnbN9NvvZcM-haq>R(JBFSS@Cu&2PP3c4@P^RcGUz#!`sK1Bg zY)>$dam}h@Fc+tEpAU`i9#_~T`5vQA?YV^4%A~z$Lvs(ljz)XQ{vop7Y%BfI)Kev$ z*(R}OI%^)rIDGh3otN$SzK;&pR9pZ2D)>UHiSLtNhwv4Do4orw^a#G!Lc^EWhWDv> zi@oqwlzN!-h|D$VsgiPOL$h2t>nW@+TE_MNM9J60%r7zw*`@f{QpQRtqd@b%CVY0X zKK7~gPo&S=s;|jj&Tol5QvcDD8E+@#4l>ruo*JsJS;)lXvsphq9zd53?{BJ4k^gVAP9*0~x-Im;m$VJPL%tb3?aWB^BV7`_ zD0674zP*?mF!uf1Nqb())mWcNhmTaBG1fyyvLmj52GOrOi{FMeFyqLq^G_3~o4wCm zfc`Asxs30=Rr>%X`QE2a98Q+H%+VlW*%q0-S;t?7;hisWo%NU8G(ZzeM65WWAh> zb!AT0v#r*=|0J$EeVaqAkE_H#^D58R8S5kG!fWfy*bwHwvqte31Z75e_FxK&G zH1oz{C+^u;znFcKQ~bR&ZwJbg`}4@bni<=PUGdCvU6n=0y&P&XNc{^Pwe@ zo-X}U#{2-hmrtA8%NoVrq%t2Za~VR9V33SXvYGTr_$fByrYqjaR$uKe#$3iX&~yP;v_88UU#9e1nMY2IlNi2KwN~t0_-yl5 z_CY3It%N=@ow-y~-sIA+=h9b|Y`^~Y;9j4Ze8Zu7-n&SOj+Db*+A?v?cI>yrOkyF!Q&8X$pg;h z_mir%s=c(sqtt7~R^6T&iVh@mR_2`FBjD4PE0Vkw`>ZcxfY^)!i763%GYK78)nS310Zru5b@Nr0=X{_&cA^OfM z^wARPv)SpWn#8<~_&k!~u~N$INqq!&vreB;r#)aO{t&ZHjwo|#AE-Ko_qVXVMY&R@ z^sNoHzSUFlAZy3L_NA+T{}^0BJ@d92;{@_a&NERw$GB|L@=wy_{>gaWEA;$Hd5*47 zP21<7XPD_tJ>gMBmqpLF>A@nKI)P&jxH*FJ40`%`e5=N6-tA}Yg3ulVjge%B@S`c` zta2gIkP8#`hs(OrzdpeH zy(8Gyqz(Cf!g*$BQ+3{|=Pg*?j=Zqe`K1lI?0km$rbXbRePY*%{nW_b5Z&O19C+1i z{}1qOt2U(1q{zBU-r?_7ZRw?qHeAtUrnISy2cqMYnL5t>4RxG6L&wpGwGn%Mb-QqT zK9UUk<>iA-uG{(HWzl&Oe2Tt}PXvXSj=4 z4g3t7cy8_qAv#Z)Mdy)kOr6InH`Y_G=saccy{_{l`Cj`}*LiY!>G5%Lk3`pvUm$M` zJp9s^!9(?BWRTf6UnGBB$8IRwU)#d>QPw0am+w^DHvF#thUjC3ijP^NdDFl~bfWo_ z83SnB5_qwPmZEf`BzXRAi%&)PvjhAnL}^F0RISM(o`p%RU@M2Id;$ ztBix_Ua#bXt%=8t(AAZC74a+&IVNQnA(KS5moO(%28J>hFXw+tTx&{+9%JfJc0`Jr zZ!W?gu#R`qj@Ehmi^w~_m&1Fz%w_N{v~HszhGXGL!6hH8HWBM9@j_=BSjpV6yptH$ zx@BgJYl`om%$e*D#<(W=HdSF$P~JqNy#G`CCnft{C7=FWCrEx5zkv?xV7}GK9vPaN zZ&jF`fKFwLa-ik>82K?FL4hJnP-D7hi?7U&c4 z$Lqe{q*C?4>77q}UccC!$B;Iax=KE# z%&mTj@e-eryo;ATCcsETXL*3{qzt=mA@8awQ~XSh;~LJ{eE50Gk)U?0K$e{Y31?*UWtq#5az9s$|<} z#-S^S2WB0s#5hjGhbnqc3GI3*?V9R}*JT?q^?Q(CMF!7E{IC0z#~)v3@JltaZm-Bb zv+rT!iH@`y-83IO&A#^lSW29?@X9^Jzp>UXrT?zJ;DH{PLQrW0LPg zWR}$)IE0**wn*eIG;HDfaa`wcZQiM$hZId0Xv$ZT4UPIdt>KrBuy6ObN*C05!`$ys z@K(C8;WImhe00B8xbDClzv_D`o}(bNPxX7Ym?5w5+g8mhbNpfhEQPj2t^}?~>qLv_ zCn7^~!L9h0`jk~a)~8JWIeP4h`+R+VV>LXKXO5T1?p*k%l>VJ#;UBv#ci=_Fb>8Pu zrtm@XZqac#TgjN)jue0Ok=palz|4^2f|*s0|Mx{OL$2D((>QCx{>;?dWxjhdF=QR! zqYrX*8K$sZ7TPOeAU2Y9&ik5Az?O2h8*|>H!SoHj{Wq7@x0XQv6*}GEn&;H&1gq&; zvQI~%?>=;8kxyk{Aat1a{L9dw;vM9hHdP$EZ&vK9;^><>N@>gqM0KJD&L!Wyi~!`Jf%o{6-dM5?OSCBJ7dT^lNE%)#r_Q z2s`dGsjK~&&?R-!?RY(J;n}UWe*2cuUw?$ITpQM=9%}Mb;5EUQy=n~}GcnX&6JD^` zI+QCu*poNvvS1VWp4~*==a9Ex>^>^1b~O2?yeegJcATxO&aXBsE9m2-%(2o(o$UQ; zj0vw&ZvRMS_XShim@ng|^w&(r{9ylsS5*I_9?}k`{61Ft#j=nu`xDu(c~VIK@3<2` z9rX0vEOJrSPwDs^v$;M+w+mvt-FPQ_dq4Gaay2$)eP;MkWULaOfvo8j9ef}DLy_01 zYh@jh!z*J`1${{L@HFU`;iI!H~lO*j7{R#?J0Zm@Lc>MCVk((a8Rv% zlzy|$pxwHT_#56gHSXjch(7Mfx&YC4{FBg|(E0q-eGc^&z2~hQU1kL19#s7keUGE_ zS?#u6A~X2DEpceV+h>5`3w--Lm*&yDx&M^04f`0pDxtvveRH{+G*-Nz`wvG_rW?6Z zWQ^hNd~7}D1sGE&xY?6kY!$I3taENp8sCaM#42 z>-Mr$ACY}9r=izN`Xou8r=1D7|?R2h4vRJS-{a5k$9L2w&d|2dDG6^3Re!B5$ z4mr9H>rd3v^kJDYSn@J;VY|HT25$Ce=6EPFcrj&5xq{Cl*jQFR-fqbJV&Pk^NOp?! z`GDysoU3`IE=ka({DkCA&K; zwx%=vS+|pq>E|xl6-p~(Xn=S5&?IBMw6Q#s_L65-zP7i`bBdO5Jy6<9c*pMhE~Lzm zuAAsPMe!i}x6@XOuF}t^R^Jrp^aw3op~?EqgGy&i@O9yvd3+PGjhm1Ub7?D)4|Cxc z*8kVJ(Fv#Y!uEq7l;0Q(6hF|fRunjP%KG1;f~$s@eyd2laRYfq(p9b%ohBK2_El@u@KMRyQ#W_nFF^3Xr>N!`Dj5&eJcDH}E@;~`7RsD} z>6a4zG3o6MJ^FfR_5+rAWtlrz%{ju~)+-y%&RZrQN!h|r;@4P8+I;HKLu2hLcqHQY zIm~z_vM8RoDa?6@9#H$-LDqlEyb9&e?=}+G zZI1W3&~LVN<@L7(<--oXk$IIbNL%OX=1Y4pv$iK|?}{0RMjP`gX{^VKG_PXK=X3HQ zR=d%8711a1;ENpU9WG}Y`i0(kPUKC)=YsD(Q-8n*^faDED$Bk_}9Z2HtA`KP}lPqW>G9+5YSo<{uB3l%L5de`!rcXU72i<>?v+4oWk3w--5`F8T@l38^T<#OmgDi3UqQ9Jj z&(*G5NqcG3dxF#(-U`)Q*N;wB^|je3q+3fp1@mX6EOa@+Me>rfaLuv4H{S}+g}t}v z0^QB`eW|M@zEtY^?#AeKt=wqT)wa$mE=pZltgh-hm%2vcTftt&T{&w=>`e0Z^~N@CNk}-pKsWI&LQTUS}MT_89@qtFDMlx3#~Doovqco9m-0 zl|I~%_mxd;(BgwullNaCz2f~~9BDZ3FNMx%^vHLE?Yv(QTJuz8*9FJibf$R1$r=8_DxlGf(3jJJVjhI!d0O8F_v~ zp3&@9HC8pD)0`tb#@P3F{0hQnqT{N4?UMC*2N^^6uW_pV>@>!&(_JaWukv4b<*t48 zi^~c)|47z4Fn;&tonwry-)bX6e0&;Z$oL&*laRmJzxzwu_YzyA;aIbOx9s0<#N+pL zdJ`y9?K8L9S*3hh)P?%NyUD)Z%zavYTL1otb|T;J@x@7f9|kKoR~%QQ{u{=}5_=o; z4Z%NIF;%Z9pGE{eCat*^rS{nnAD4+QL}YkSzJ&AfPtP{a$6}9%$?z<_9zx5N&=k^d z6MPHNNkxXgqvBl>eV0JvhnKTfkIO1It$pr8%2#q#>}@j+65Xa$WH7SWltXKcbkX|5 zdXsktg!hLPioS;ZVW7dg1E^!PJcqNUQuVR6;dz!s$+N$aXE*Y+>-I7~Gr`bN^O2!* z;qz<%M|_>(Tajm0{dpd3sC2eQ*6_?GjjY9a4EZQ`bG*A#+MoO)t>L*v)jgzt3-)Tx zNxrB4Zu*+?$smU|BZu>8&x?t<$luES7afnUhe+WKat z(Kl}}`sOXr`2A&^|H~DPR6Nv|$HOCH)4ET>HoylW z^8>4~-_^5fJ)YcosD6Uj-oaRT>9-yExd3N;@T#e@F8FQuGmv?bz7b7*~`w zH*H{Tvcr2mF-pn??&;KRU})CY%Ov^+*!UoCz0LQ`rjNc-5bKq4Gj^g+uhHi|IJ~c`_HMI0$wQa6$7RvqTA@9TQmPUx5Xo;UK7GXkXzXF%`Imp0UEPX^aK!&X8rPslynh+RD^ z)V8M0_d~h#MVsD?JlRN@GH&KlhE;D?`YpPG*e^kUDs5%@8uOvo(XyYmK%u2R=6WEeCy5_)UCRR(=}@ zt)_kzl-rDFroDV3??qQkgMZEV4g82|Js#t{@&%f_+tWxJiWLd<)ozLpLjQ%|qP2T) zT(yifX1w-m=!??F%&|uLiSz;MSYsbY4wgk8JA*o5aBNBRJxTsnop-ho%X9;6P<=^s zUN!41K6}&lN%ZTwro@0ps&lx1KYYCZsHr+jAK0qTmmWv{);d4Qcqp=NICXx7IydAU zC$R+%pU4RJ7Eig`k^FuShjRz#IjeX_&5>MO&G%dBrw@?FI%h(0QCqFf9=|9wRl}!} zE^h#5{$RJuTxq?_#r{2R)e_pHrJQVyN9LHO1Uj(cajmk1pWbfx)a2Nzdr+6wdkXBT6OYH1ra-nohS znCp~09ThoOYUMTkv&+Xg;@=m)+0qV<+J5BQi+t;y&K+xzyCQ!aeDlP~?nS~oGAAl+ z;g8F#h4ADQN0~iJ?7OfJ~VSI^qdV{V_4%gx*R&a!pB0F zA6U&$Ayn5tm0>Vwq%H4 zh0m|w4NE><|7yjqDPL~hRes~aT|FG}I|6-{c3VcAxzLp~hdm9@^#wa=uR#_p<^Mfk z*_%2xz;aR~EI(6N_Hcz`Ip%j@*{cyOd+v-=?P_8=3j9QdI)j+fcFenlFy(9<(g-gW zlBO0~BFUBdwQ*I#d-%;N{Bc@^vlIJfBxrSIYsELoKIGf9s;j71S>dI%J#w|3CGcR$ zyqOgxap@K1u1jmnU5T}&g)=HjT|;;_tHM7oj^~%x))Z@XJ+9DpR>N0rcyZ2Qtvt`E zvDb{|^*^gEx|zC{#N9=iZAd?%w&qr?uGDoWyc$a$qqtlZHO1JHWBDfTtcsF(XH?YO zitgbWSy5Uzw4%IsdbxjIHf0X02#h6Wz;$%3mVrJ=S#LjmaB&H18U(A7d3RT6G0ut- z*OwVuYW}b?>gFDz)s@Vf!E=p#XL5H`_}QOobb|JR^Nq@3{y0xXfceY7X*v$c?2mam zalI)W^T%&3bW~KQQahJ!OF?I`@nfc8_m172m4)Zb$GX)M!gh{^c8Sy zZ^1DQ9*l-#WgFT89M_}om^hX&C;vy_RoMpl0$%I7Xmx?^p1QZ3?j6;2^%MNdiMgg9 z^n%U<@GR$Oq(~pXjkfX^uF1%8<_`<>5SgIW!7~l!YNWrL_`iCQE`vlDl9+tCmw>}l zKj~+Q%75X5H}I9pno{%qKf>MFu(_$;oGT=j)9$kGnToQ}wzPRP>E zoMjh7Y<@#t4nT*=%a0df@3J?m@UmZIUg6srC9cOaY6f`f%3a-Sqw(x=a5zhN*7XJH zAIm6rT?X%Wtqt^sKMU{Sd#z6Er1Rf#@L!r+=Rbd3mg2Lh{8i|vO75xY{Ka}MlfOiF z7yc>|{&LN#z`s=yj%~ij) z4g8Qo9a5=FSNNeDYc<+LS*U@W@wuwTUzr)z)05)rHYq z7y}(T&8ypL6>HlfM+~`>c`%&M#+>M0w9(+R!{rU-&Y_tTY1>O_<4fSPi#d0+jm~EV zhL2qsLGD0X&zf*Pi^ESGsR z44=hD=CifZKlL$m#eCs2`e$d|{wQ&MZt&SeozLJeg%jgbxhu6+*6>9dJ8y%}E;snh zKOldY@LA1d89P7AsD{6MwA1zr;9J+<;j^LTrSOS&{K0EZ(!NnfV6$|khW1x(U zZewgrMV{$n;X@6_LS&W6XXsBRpB-hBRWklBgTDB#TAgDqI)x*DSdiz?&-HOJB)e|1 zU;|$8+~)=s6BQOB%Y;^uWkRc9Q=)i|z6#B%uR?S6fXZRj$hPg1J$2iWZ6*e*k#Fx= z5tej`7`pK_!8HqL&! zUVeAcpI;}xd+NWhmfyyFTdw>zVj`}T-=p+2m+`y4(8<{lG3*Nw3$|^*I1a4Y*K}q) zh>kN)qb$A%s)J1!*GYTGmx^h+xk>(MJoQbN49f*7&?4XviMI$k5BQ9fX9_z zkaMiNVb65uk~6G(w0G17I%;*dkJrir;2h7myZdRa{OFOy_j2B?_QY^?j!!#Rx8kY9 zZl8xP^og@uaYv_?p3p{1@7hLN)vk?J=kBH572nIT@~DYgdiyK2^bV7>^q8($Xgu5?_9-wrZ)f`wmY>ZNgj5ZaXyY`#F^ODCkcWP) z@6ZS$lr zaCz?9K32PHK|4?S_9a^S0Q#cTKd-0fuF-C7;FO-3EBo?2^sH*fe|dMqDW3EjPxqwX zljSs&mMEh%O4zb{>#OVcD{7dcOcydmwM8dGACEfxik;*jI+{GI`VvX ztS9|u{;%S{iPZr9ui(G6?(^~2{MLFu&-dGhdsdn4u*}FSp4j_x=9ZlC?8}c%C2^KY z2Y5Al-qw7Qz(Z&sTU&oR`>%x2m4n{9)S=z-W8BhiA70@}|0vg!E_4=Bc3Vly)t>7p zE^O)XJKAyP!z``*K`{Rr%pU~vpTYcN-mx}3rG|5g#aCVfuMLOS#O}$Pt(6aSh>u_l zd_5Ze9tEGD1;3Bvyx|e(N=_w9_QAKWZLe2$yzuaM7q}M{q-qak`TL-|ia#OIcPny6 z<~J2a#|`$X_xXLixvW9D(vU%me~M#$oqoQ8+@(Hp7h6&8`^jfFb5|l?q@3da=(47U zF;MzXE&1HYRqu+UUnWz}6zZEwy}MF>bgG%%@mc74mGsL!X{?L*IOe6k$3D5seXM`i zQtSz_v3vE_CP@FB-zBkl5dBm7=%Aj`N0U{#m;ICdV)$12r|gS!(B<+5`)E7#QshDo z{Z#eQKG@s5KY_8QUncVzPdm!p*J$3r24}hG_DA!)h;rPN5y18u46V1)CZg+>xE{?Y zL)R^HrPP)cUbwQ%m9#SNdqxRL00POh^mwxXluV*?koV_cm{-Mee> z-o;AKFL7-qFVXuiTzUOzBUWDja?Hx|!laebHuI4Y{xO-j&1BIx_}gV~OsM zomX+f6|v<~m$a@jK3`gULb_IWTD2qHM}4MJm;SS~RVR4kR`zu`(*tWgtFAxIv+{&{ zwN(>)JH357yI1Z(Us~$yy2F#CO%NNbhojpLf1)-)&gzlpT8hNUvvz^LS!S&N6WyV# zmnXf%={e+|tQ`vUcBPL76X6GqbOG>u{Fk^zlKyk#P++nPEY1Rl*b3>x?#}pr*b`9p z1C)IMWlz9ok&*YU()SZ6o-$>~+41d)Jq}%7xl29iQbu2RKEN0)b$RV%_MvF2t@uCs zMw#vTV4j!oJf3ue9S-j^!*ay@p%iKGo3mY*}r#dD<0x|scTXac5DaM zyr92Je6{e-WN0(ntc*4+!v>NzsKKsJLmv^I=o^pCFZo`4RJmE-J7TpJGsw3Hn!8c1 zV3x`~k9#ur0QW@h3M0xbD@?BK%d?I=E8{M)73;XSGty|K)W_wl8m{U?`Sd+&`EJTD zgGNasXIk_^W|qXwG;9viBU7yD&3X>rUjIr0wAZ&`-5GSNJ;~UA(-WwlAnRi!mcqkx z!6J>a#SS;qr2P;|BbX^#N;84kbEw3X{3|pKxd0l(mn7eJ;`>|K1I>m2QNd8Ohlesid?w_`EoIG@FIMMaY_yf26ucba!{8O%f~mA zgQp-H#m9O1kGiZA{nNoE^34xlpT(S;$jLKEC(ncqxtBo8zj)_I=6W{k^G5RAl#O!6 z&u-@Pb=jEg8}W`V8+R%{b&~Hz^7|8)-ESNq53s}6&faOng>J(CpTHWG6$M(AQ*2gb zt@!2beq!mfdr5mc_PnH(bo;)LGla}NfLPN_dGTD4e0MU>;bv@O-0dOWd-;$s(j zSFCYzj#1JM4Lx}eaR?9dUu4zLADNG|#6AXi7b*5}&oX^3$UbKvexBgEZ{ixi22bJ_ z-cMTXRQnm-PC1mVX!!}hjg^*M=-5nq+VN9#5Q8CWbY;FGk@=e2uoHxbZpB7j!L=yM zu~Te=vVzNN%b0VK`M)&gZb}QTQ0taToL2r3OPyEg&so=G&cnRL^K$&!5|=rK zm<(fm-U_uQrI)^5Z?42#I3!I^pYzb14KMM{w-MSdYJ0FpfY1@|LQaf}Uy_7hP}<|x zNgC(TB&xH)#IGKZH8|8|P&NC!aITxAk@Y6{4R>n9o2+wQ8C-v}8rn+XlS*he>vbRX zTIUSKqpUXQt+dcvNSf7@rM_j3%lvkhJZFut&{~O)(R_Y~L2Djq<(w0l12E5=`z!B0 zRyc&u$0$F)Wsf4&mb6d2v?cRp35?0IKb6q82n@hsr-sa#OWt#3&W-hDX89LWhQt6_ z=W^}5V(n|P-dxtQss6?uBP*6UsuDi?4gGDIo>ux>9O2GQd z)|iJ=w85j_(!M$Lx7VDB#S#}Uxce2q>Achf`gW7f4-QL-M=K+pqo=-(Ry!ut4oRf@ zF$&f)uPbuHzm<6|_Rmm#FVms-J@TfnsJ>Ug{(e@v3ZQBKU(oBaBcCB5?N&q|6xxJ; zMUGv>7$9==4(jRerFnCHU>}eIjXfO_ccj6idDl-L5+93>fKMZvzF5YbV-NI&d}2VZ z=bJIe!+3aMG&=m*=${sFB9xg^i`5^CR}fX?6SX zNd)?6b^hL(_kZaAob>~rL^~6LJwCw5?MN(^vvEYeE1xrU2lMw6=W10OX&YHb2t8Hp z7z;%A6&Wo&F&M0#1*>R0;HK}IJRoaSO_{rBl1uS`hMW=}2pGDUA6+aGKP-X9-F)Mx zUK{ZR2tUMM;i(fFx2LgwH-{K8EmvOy_aNy-Rz;G@LB3e#^iErA@I|gm=L^bMG0CO) zqJ}sCD_{HyowsmVV;F=N`Wk)sH2SXeW7(73lw&;vSRPvEU2l|6_EhLdGkmiCdAc7za0YU%6KUb& zz6shd%17p^9JZA?)&P2s%m)OhQwsIoKODZDnq4mE3Fa{0BlS%MPnk>Vip{3#zs9r^H#d?z%>xoP{rKx1A?>g$%dDNB82u1d}0$b81+&^*pneP~zo z$9>ojW#hXpskuPr&qh?lcg8Pg&L_~Xq@D+`E2O+!@yQmh*5`ZB@ABG;?Rq|KbslYY zE^RlCHarKNZ7gTA7=C^OuOa7${9t})9RROM%&$J*1VwbM_KC^uDGR@nq zw^rU2e&p~9Zz}axdKG>AOUBkOiF5m$F|;eP?=DyEYkq99p0w|B@;^Y{In2$ckl#?A z`B@`bjsIsWX=X!nfV=G9BjpQ^=23?^lrQzz;}qPZpTqZ$nz%)RrCHwR=jqrl=DA7Z zMxN<9afyAZ_oEttC-A7EQbu234zjZA7@(rC= zR>B`Aakb`Hl-k05Q){AcehIzJ>6-_B2=AMN4D9#t-0YjD@XR_Ebu{|sdc*HLkve=# zn%2bq^(R|aCN3lY#$@8GX5#*Y4fieMbe@0Ig8K%ZS#f`{KA_zx$xM zIsCr_cb5qV}Hr&6-*X7J(2JZc+!;`Iy`}`Kh{gx(hKc|_vPqpFx^jKZa zTw}p~8PBY8Cf~q)sDbrc{y*q#4!^gz;XcN|JSec@8vu<<;?dyv-11fb96Z~ z+rYgeb-1UMalg5Ralg0;+)r&L?tii2e!qeHSPSk&Hr%f@a8EOEe-X_8)XKPbZeiT( z9&eoAH$rc7=pxwk~I`HgMky=GSwzq`x%%#Fp`wW`l1N{!)Fd*B>x< z=Z1zq+F$zDwAS^PjxqSdoU8NTr?C1QKxb8}?kb6dk@;`Y&c-z?*~DHFfrnYC}Oou%VFi!*^l_v%0$3R@ZXn_3w6i<-dw zlxE_7z76;L4BXGQ;6BfW`!xpcJq+Am0Q2Ly>a$~sXXwaWcqit>J2N-lg*oyB;u#W& zXE4_TWvSR=_n(=sKaKf&V~wpt%T#N!X||c<{GvamISrao&`yfg$E%LM3~!t^N~hc8LpGj{k1R1ji!cZ(iB7 zRrA&oFQc(mMAnzpKX!02v4AUxD@d&8d4M=a$wT7|uw}jU^^w)g*=O7>dq?1}WBsi8 z?Js=m>7cI}O45jZ7_4F+jJ2{tW1EV=Y0!A9#6@^2widdeFSDYK{7&!f@D8G0i=k&f z^vF7%ZS!I(M3y`@V^Hm8=G6BQf3T{sTW#%i>`O;n&Vi}a&DCwkTw;vsucNLK6G2`5 z65l|crIQ_1Tj>LxsjJN2SH@^7Bwg*zp1NA%H4faWe^30?gt3%U%bfch^3yoewL5Kd z@MdB{h>4Iq+4o_BM(l%wHrPt+sbKiS1&&2IU?@IH^V>?|BGk8()7ZCLjBiu75w}9D z$hXA9udbE#MtYowtgl_z1KB>9vjyte6M(kZJHS)7g7)7BhH_qx$JYL`U!t6MnXh8Y zV!dUS_AjCROD*lclJfJZyX@t>e?X}H=SchSs$XHY>4&4(-^LObBe9nL!vE-TAH&VK zj|uSf1@QKGc>FK$`uW6toJZV;zWzzpZaTQsm;rqk5Yr~{Q$Ns$T5~)Y4Q(x{tNoe$ z8ygSWArG1}9-L4eJ|0|4+em!#aXdH2gIu0j$AjVUzF=L)c{ws3ECBO*(zK+m_EEo< z(bcvrZarP?AJFhe>uRybwyv)B%~?8sn7Y~~>{F|*R>gm-u67*plENzvc;t3?q&53y zE^XVAeRB-?H`X_ggXZS+&1`>o-<)G$&n6MUzBz+u*1mbkOdanoM&Dcx=BcfWyQ_t9 z-|=YUxc>)wn}hpz--hGf)4=^(o|`i9XdCVaX6U%TqQ;>l-$?54I%!&y-=6}PmgM*Q zo4`Ga%uR14!ipb6aDHWT-LHr%f< zaPMuwJ;#RonFj8)vQG*+zTs7}_JHXfWqupaY72 zoI^adzq{;d@%M}x^x1Ou3z0RBvR6UPSozOh1)SAWO**SSDfUGXx;*jMUO(4$PmpH< z`}eh%bF?(C#O3EN(H32c{;03_mpvwAy?=78+RI?Dv6q3^6x~^m**mVhy0@&WM5i^@ z-M{w;dm|eA{K)!Cjs1M2ZnBqw>~Z6ky$sN=iPJXrG7#E{@$QYSLY#NC%TrOdHhfP5 z*&AgmG1h8N18f3w|COkF8lYqEN7vqZ0WsF(t`?+s{J0sZb6@qw5NgWtD*1D zlB_V4cnY=u2(+s`4WPZ$wJD<-o5{!C8rvsF*wX-;QDVQH;$j{O}9s7+Cj4n87!}yc3R-HGI z|5ly%x|elbUnbfhlaaQvv(;jEFG5g5ltnU3+dOOk`ZuZ-7v{QbR=c-vRmY~%=&)yCyEi$%p?pGNf&b^}ce%7|+Bl9Xdf0MD= z@oh%t&io9IBY)V>(m|u{yvq%a;80)alP^V*+~n!ZFf1-OBoy5;)m&RNGosa z(CYfJj>Hemp2v{W(Ccom{YBPtPgcIKMBmNW6amT$K2K&{5$UyDhc}OR&m&j!)!ttV zGv>2CrJOo=95P-%n&H`5nIUyx{AF*PPc!_d$vAUCZOv4z?q}Bj%lht|E`_A|n6coV z40D|QW)~Y#RIL9i)A83i4T7#d;-tgR)Pb zKQ6vPFz{cHKdib?{GV~OZ&rou>u@^lJB0Q<0U9{RmvPx$k^YXuTVCj_8p=KodnSA8 zcH`T-8|;o^-y!iQ?%$T3E@QN;-I8bPdmXhz_Q{g{6_!EA30<|ip6or;i}qAL#;aJr z1K-q4WgTJ{gJ(Kuw=76`qTBXuuJmfwXAO5G>`0?MPJm~&gUMjw8Pba1%>&PjfoIC$ znG$%$1J7i_GmhQ)85(QW_LE1AtF2Gc2YJR)&V0(LAx$ZH)vO(nJ{*494^Do{-5w`r zJ4hQX$~Ze-_$H|~4Y@CTl(xGv!#}M!V>mpg>bf>2-2=}F#*4v0_8F+bKUkvLd{Ksv zHka=;<9m(ob8aopxP!DMu8oQpeXa{@ee8!(UYIgO_`pN`b8dY48(TlA3u!S~Q4b);X7;hkBA>>u!;vT~XV!5?y94a;XT2`_w9(FEsY4}cS`+tYz@;T|f4B+UZ)zs)_uFt^pQ-n$c^2H? z=9v}uWw-0NUvA+36PQnG0(Ujut35e&yHktN=fpH)F3i8&g-l^T_ZMVb)8$PrGO{sS z@;t^y`mtB+$vo^BIoq_W$e`ZHk!?WMlG{JVy;hqLU7R(SS@f?IGIcHKY(t8z3N|}RaA?e1`UCs*q&du zDVOn3=FnuHX4$_-_8pROSL|C^W1PhJn#dkIT`BhfbskEct6eb_67%nN#1}iMlQ};% z6WP9>xhcQ1YjJ6|OYLjBnKm}(>C(4hN2)e+dS7}z)Mh!1o4*-n{0K5HR?R-60kNAE z=3^D+?pa^xSTpALJ6I3a;}q8YcrF;r{*Yq7O1q04@PV{DdFcO>e2X9DKi}&A6MYZ! z-#)L^)How&8z$|M^$L2sIOzvsi&lQ2>%=mK^ya_ZgEj}>ysm7HMBhs8<~U@&7u)zH zo-5x6ZSg$6Wgnr1yh_0PYxZpj+P(02Ccd4ZUCjGUVeg&Zbn*QxcX$V?KAGTi z(^j*{?{2P^w2Q~~ZW+7yLT}@CvHK5PbKeab{^+@&f|S;^i!bwpbRp>v>Nteesc3!%Fu^^>XO-`Kp{S|F6}~msjFp11%!yxR!Tkvv?lTPB2O9o}cffpTE8~8A3*+9t3ETtF+Z^2EY`A9| zxH~MkpJ~JWXao1n>|G}OejRoAiZn+eTaJ|9-+i!U`TcqFZ;am;G!ysoE#dtB-I+SS zFXy=_XZ$>~>f>+Ts>_)>4cz0Y!|Wr({YYi{6mZFjVt+xYcJqMifi-baY_k@9$l7UuDN4>Zo>RnXfU+49S0;XHn# z!QUAE*JxbFh<>slH2@hyz|&?azCY9{UjZMgr{!2M(k?o(~Jk1=p} z8MrS3^Y~WAeb4d7E@!4$aDSd>RylLOf%_-}_bp&PPT~G9VvZfe z9y^Iab`e(}LtH&)bGXd&stiA3DsxK2hiJCg`mOk|0@cZFxnI9^0rWThL-px5%moYcCrQx|8qqI7SSKm5E{G#mL3vPnhWH960 zuOWh24s%ZCe(L(UUn#XRha+=V{#}*OcE7?(=Fjwfq8Ad+BYUSOfX&8?YA{|6{i~M;{m1`0re*xc?-V!bKmO#8+Ou^5H2l&2<6WIw*MI!}P`zI&nTP*)4ZZ}c z|M*S*Tm8qKeR?1LAN(`&miDHE^b znN=o^yjjP)ev{mjd=G(nY%Amb%Yv50eGB?>6dk=633^gEaMpa%Oc~^y+r# z*GFN8wdY(mmww)%hVD-6nA6Q#f_7S6*<|A1UHW;4A1K>lVy&AqyX3jp9$GBvJLV6Y z!WkLnV&b$`=UTh!9r<^?Ei80e0##w~yd!9NOo2NH6kJNju zUhgN3daq;u`!ecWiH#%m9L;}ab8+@>8Fdz$MdDAyR*^Uc>%QxQI_YD0HMWY?Zq(P< zuGVdr6y0_?G;a5g z(^uc>vMZK0oWb+flv&r%el0mhk0bxa#)`hp>^q}A4Ie8C4g52CZjKeRd1jSam%}qM zr=D!|ou|S4=p)446J@@)sk!wyaLI|{qmDEW^9}WD?mW!)qK5M@gTdxV=V1a>`aI0{ z+)b=|+pu;RSfBifE~n0cj@6`TO&)(1x?7UR7m+cQLWlWI; z_jh<^&Ma(U+-Ed_`-RQKeYy?z7X}&nzXkVacxII|^9|gy4cs?^`IsZb{Yb~sf#C9c z#?p4+)ZDQ&g);3i4OfHBk&dNFU@S2W2^Or+w_$y9XZ6aQ+`@T9d~=|69w- zmeu6nm~43hnwukA{`GOVY}tRh&f_b1ZpxNjJhSrnC)ew;WkHpWdw1&akiz}n*Z~gg z0Vj4Ab6(ga^=sW#a`urKHy>>;slZy7n(Inuya(7CXk7tjC@6dNK);&_biE z&HAl0$$m^hdu@4WZfRdT>^0^K#a?R=E56pv+*0Vw!(VTHTc1}l@R@0}x0*-Fc2y1i zx5Yl={~-R0eU?i5D*KFb`+TUk|37%vg{vj~?A0kP<7eM-Z-e{(Ayl`Yd;Lf zeV~E+E}omX53u3h-oX9ckM*(e66)|FX%1W$CH})U9%@GXhkFR|9-N7&8F3(LJvsZF zY-Q}U#(@mF&WHmcu0vz&c-0kCCFde;XMJ(a!>p&;X2gVy${*$@7Nok%+ZiQsjEh~~ zQE?0J?Q+-3nppeTdZUc3qx5))nulfGby96Niaraq#AGigNYI8BR3lcTYg@+Pd7S&M#$VQb@y^LJX$v*} z5+9PD?eK0b#8=8YGd^V7wGtn4@sJ*1nZ`P1J?>+X5%<9wWLaMqH>5&qr>|v>-$bbW63k`&wHY_!u*HoGY>S*HZsfg4aU*JM504u;aGeo1V&GqR znni9CH}VxaThRXs7F+l)<9ixBtHyWur;~B!_ftIU#?`0~-QZVuC)y~1Hgaj+19!7# zjeRTwE{8V_9jSh-L#=I;Jz7d!OETQ@4xe|4>&py(;XN7RhjzzmFS<`z`o(No0Q_yS$mkwbsM^!%qz;e?tO&^7qefFPvcpj zKYPRwTjNit9F~u-d(XGda?#iJ_AvM;j&oBfSN1h6%VrN9eD5jv-6bA&558^LH%ICx z`{soC-T8k1B-st~)`LR&}nxv$ZE?mZg!x$gmki)v-vpN>ZiZ7*x_)_kDbQmTEa_nrT; ztO=*?)A=7=ugjM*?k10a zM}AfwU&~l4JpRjiT~F!&9fe@slD6ac#FnugF9*NI_P)Y*@Q2xsJ)z-`wjJlYTi14+ z1TTm$Pal7r-b>LrthVEY{I}YUWhFYV+zWpk;M*hVk7-f*V^ix+znj~#{s*L?3;)G9Nss-x<<$Q(GT>#*@rqj(aN~bYhm1PZUXnSn~D1r z8}3hmvGDw43+^R0+-DoO4>53G59VjKGVc9a828Ri;Qk}@HizHa*>E3a;2vwiJQDggEqxZn^e);%i%#wz{Va-88lFW_NG#VQXGA`W;&QOX_tNB96w`AW zo<%W^Z|!GM1iEOyG&R>?J&WQF=-CfF=DdT9oy|RqVhnX{)>#x_Xg`ZWFdPAfO`b&& z<=fMZZyP&{;^#K{+(%<)QCQnQ;#m|%`&-YVkh&)s?QcJe;;T8~XHlF0pErz?Yu;HD zFRau1$_V;LR9~X2UD({(Z}BCTWxMnk$KH;rak=9EnxOn&G7q({u#LCeHKEp5II-6B zC6>50WccwVRxV`i)54E3)-3!uqq?|F#rA1&wW}At$N%^FA5*b<;RhMAUMrGsaSr^c z`xd?IsdyItyN(q#(?;P-i>>vuZpO%g{W!?{OOK1x+tZClVsX|&VClSB4_>>)J~KSOXzz$dET01_gAx9cI-Kf%}P3-_O>%b6!FxPQqrtDISdP9lE7TMgV}sKZ@Hi2ITHWUmI7oZk_P zeg<`Hu1|IpW!inRi@@ecfI!1nvpV z#Qjto?l&2@pJ>5-iVgQs2JQ|6_k~~{$F=X`H;4~)5Fbj6Xd&l^x*R^y>DRCq`yQ9m zm&aPXb^Oka@zl-bo}=k!gKk4UY0w$qp6}3B-1ezfE_2qm9oEYGG50R^!V1#sbKi-+ z-81#Hm7FCRujPN5vrH?W;?(L6&CH_wOyX46syIkD@1)P}Ib6SD2lh)n^WoP0TKdIk zFRmfhL+a?JPHpSvY`Dr1zheyX2@5E9cxP?rz_|+^pSykLhWUqQY#8p)cGjdU?beIf zgucxGPjNEOUo&$<&2mS%_y_{5+mjfHZId$X?YKqtmh>;0>8WeZcnu8o*bnOLmAyjTv_Yi$Pr^QIs{S=UI9?ia+QYm0o#x-w zFIKBs${zaj+a?xopSQGI&!6tzkOe&w&!FgucNe>P7Kx@JvyM?{T56-|ZZmxpnl_wp zGSBPQzkvVtKaQwc1`JHp{acYns^qCren=IMxp6+8%lieH5AoMxm)7iad~W zP=@!^Wps&}VIYIu~?&|A1oBvYp?Up`WjqLfCQ4f)ORymM^99WGU_;hW!9FT9G zGrlQ`Quo*>b^lGW?E4wWvb!S7vhQX@#D0N^rHuwtmX+FQm~EzyQvXf;j=bO3uy6gC zUIn}Qv3I@6PpaRue|&>}&$DQK3+obxg zh;4GbS)VBN&#=|MtC>DZ{r@WUFKolP;mM4jDU743j6q#lPv1t)Kwunq`;u}-q$ge- z<6Ys@2JUkai^}Efoj-mT{J3{=Z2G!uW4!a7o>lPC9IJ@!ROzy(vG;wU zC%wm|#HZqq4iJYYWBZg|TKNdZcXWkde%}axlV4dQ`F(s-D8CY7?)38oB=*vi-q)oK z?3Jp0l9h8bc@lp|9m*V{pE|s5VgaSx8dprYADVI#B_FAy=6!S$zlj@^al=nssES`C zt}nnjdU9q^UI(pi4tj>1As2|_{2k8k3uHUe)wy)MQ|Hu?PSVJkFG6DtWu}>B_KqnZ zNqL?w?3s34J8yNH{PAxP10rYGxHZhemccPexcgKW0PkR;+~%=TapIcs|i zr0z}OIUx$3?Jam_wE~_y6TBUV2J*j z&Dy3yeQlHbpPA)t6Fqg$Aph^<>VXb8&N2V-sgC=)?Qm)7eH}%Q2VT?4w|6wL)x1|2 zbi;?QNL*-O3A{1yyoznb=T=N|wyDS+O8oY`aTWh9K8OD?6}cTa7lSoV+ltTTzq3N| z-q`$Mxm`G`zIaRp{)&px@JJxrogQeHS(i6MtDDrpQ8C8gvB1L`XG-Yr{e>~!NnN!? znebT8C)#^^r)n=u)=u{ZcrN_qbmou02RiPMI%bbfm$g`{rTrhKp2Ya-`NX6PkE?lx zxVQ>`Aw0w$c~W+OeF)WjgF4IOT;?m-?=NmFmy7EhE{WkD!{y*Qo6A|@KE|_9<}z~C z8DyGwDD_i);IBt{Gttd{O*p(bhdv`^=dE$2C#bSVK{t74b2b@x1&WD}g>HY`NS;d> zXK|PFM6$VqS=@y%WuTb8$)^KTjgM(rrP`UTwSL9|Ki2BQk&+*jZ(+|PrSI8`dNAL(iY~$$|QKv z6(4ckp2?H1kw)awzv0JIxFX3VP09CoUA}W}os#d*7%~VRs)Ps23< zGkF*@4PF`W|Cv|*A8}_MA60cW{(EOgG7}&`RyIunE(suN0c9kVNg_ysYrqW`0#us> zum#)@D_LAZ0_bQgt=gA>RWk!YtD!>G5}>wWt--!-ecw94+D<@G!j=&+zwdLG%*~K! zV*B>@$9(Rcd$wmg&w0*so^#IFZpcc`|3_Kr6DBMBV*hXT);N)sF7(!DLq^6RA2sKH zyRWe=yLaQ%p-Sv0aS`6+uNAKo{qIzipy>YU@yd*o_6T1qzM2!*d4V#q!y?#oVfP)d z_wt=!Oh|r${>d7!<5KJ*^sTH>%U#C)#j?*Qvi7xXd!rV6kZt#Pf2vf;UfbgmZ@^xP zn(f?$b$%~zAy3)gQ!|YFa?iJW3*^aMsen8I?o~XRt$Nly{y=Trn_u)#PO<;@fyZS` zjI4d*f)#la_SP;s@OV`1|LlDv@7B9EE;`9r+nS_o@zdTK#7DyOlNZO~c1|13Mx-vL>Cj9pCOO@L|ji?9j*S zrpLLPua9zMu8diXJq|^!bT-bqf7j$ydFg6&uH(q8@kKGrFL>u}tr6uzm9as_&;!p> z-W~xBlc3=s-#d>(JMP0Oh-3a&mdhG_pIZNP+L}dMf2Ll(#{rigShO)aKEZQ<|E<$x zA4l>2=8-pfdw;#;-OqL?ug?2fpJ%VkR2us#&WfuG7qtFa?Y-;Ezec_K<;QDUzEt~H z_Oo4B@x?Z^B@>wUMZ{Em%)8p3^MSEHtGWNH1s~X#_<#D@`c?F6YpeTGt^cThZ2d>C z^u4ySzs*_k#DM<02SkGR*~*b^-?Yu>kAG_b_WZ@RA-Vmr=lk1+=3Zp$KjO>NZR5rW z%u&~Qh3}2bHMCfg$BLn$9(&+@ez7+Yrv{s#$6Dx}rmDM>&r*)mU~34?ZOCB5>8Pr; z#6r}_J)bYE+@C(Gwq@tuw_9@VI^5zcOl?g|0d6B^qK0@0X-i#+d=W?DpT}8O#6t+L z{f}{9J7CJ@gUI950g;>2uA6fI)axSeZ%xLQdMVqh zsPz*aPW_I@6cwJll%;)>ck_G0qi(PG?n;2&&pw>;Q*EoaahGKS^l{>cNlS4)>%Wh^ zUVXuTDbE2sm+?$sFP%Lz=)4#h=kcF9{XgLu!E-TBXYs@a>Tz(#Sp)l-s-Xk-xYn&L zo8C%Wbpd;-&xT)N^S$h|E1RLGu^-Kv_8ZbJgBPce+adT9E)u03)s)F)f{FL4-0ZE+P(Gyi#4Q8tuse1W2h*sQ%xYEf$tvos)?u_;0c@Wkb0`0r>1|DN zZz=fV!FL^*il@--s7yUq`Hkp^VrW`ybLO>2dbXa`>xsdKk`Ri+O!%uvd~2C z-dRL`>8IO1ZmW|%Ds3*{+gIPTC1qj%X4NEk=JM^U+uO9Yiy%5q1-D_KNIl{aSRu4%vHV zZ@hj5W4U}sUIX%7X*JN)X_BDZUKnlkNy zmPePmgHOpEY5G;(nJ=bfY-;6LAi&n#*ou0o2}7-9O8$rbE3yCQ5_Wy zbeL5Z%aNtUhAgf<9g@X=-g9boGi@Gt%pJ6e&xHM=+i1hT%pLTTCT+_d^k4R4%*~d# zrmpXLHDzb`x%wWwrr+ypgsR97vg9(Je&oAy0Qw3!cwENoD0grr&yl3RL0QQwc}k5u zkCGNkTAh(5<@zzdm2=Xyyo?b))5iS>&r+U)_%3rLEe39fz42bYF-O$KQ)z3F*x7JQ9r&7^lfh<=8tb*4e1>`8aH-H`D2T;`SWb%a^*V~yOL9th3Ju(_>pwoHv*@{lME~z>vuQW6!Ie zV)8YSFV)D`pYO%M+C*M~wU5C1&q(jlGRG2=#wYHJsxt8olF!Y4+81R^jT-L_yrlaB zihr!kz!rHW_1Ezp6PIenfH~0bIr0Y9TpM(-?^_{WG38Gs6H|AWOq6}pDSs}RI2XBT z2Crk#wyLz3ry|z9`4I2(GB5HJ4Nx{8Jb(63^^^+{O>#o?$&4(w9+OjeG=FOvD zwQU{--BTn!RB?FZoX^WPL28pnlfPk`!#e z=!cZ5;)lTf9Je<*Lh;Z?gKbwhgKgPP_BK0%&6hfZQ=y3?b(E)V0^cS%gMR8&ihFr} z9|NC;U#-cf=>NbKIl%%uW4a1|-pC9d+>se<+o1-d>1R_TqATNAcNvSFC~NRla}>|w zIm!_QJF)~Drv!alTsjL|LAOV$?&dC7V3hisS7!!gU9{JrtOulxUQYK{{&9xOC(ky5_D`dHu0@uPgj% zYl^M+E>-DUnWCgrDD}FndvWA|ib>nmmee2Uwyt7xR2~C9wU@%)ZKXm1epRXeD7An6 zM`}!FWh!-*3{ZCuW6gKgK;70&MJEkY+*`7gnA}u{dr7L&FE>+BM>JvU3Z6N@-#k1< z_m{EeYU-ccDwHbmmzwfkBKkvkpj_-3c4=|mNc3WPbd<-Ty0-+7xq`>DmuS4tzQ|K> zi?YPjJ6eCQAL!YHt`+^lT9GG}Iz$&qJ%gwxK!1&U$ ziQMH!X4aKAzOAr4!Ta7vQ^eZ{dD- zPcC{?vyCstXTLge%TZawx|DnEne(NAciU?b!NB^6VB5xA``Q>YaN13nH#4B|t&>O9CZO+}z%oC4oMQ74hx;kWcbFvcT zyxzuU=BRz(L16u4@-nwAOdX%ri+Lq*_p>Kf%6S0+=0C0Wem-eu9dn{Jk;-pmyg1z3 z9sJVn4jy4VyM#L8X?vhi#)NBFKV`<$c?ILeW=lJ_;hDfUQI{;U#~&&vt9qsnuooh4 zyEwz(;FyYM5YDaOoGq;j<0?F>+{lN7p zvO3j1uu{fUCveMJ_OK{rMzWH4=)g>6hSRQ8PNF{BEy|3-qWtmEh56$ZWP6etJ+GL$ zjy>=84g`*OsV5xvEY4K0!tQ8`x?~=01?>HO&G2oR-EpWMIvlk3_AR50IX5XYMinj{ zf7QIA@za2rH8zh!Vg}T{^Qvh}V7>{M|7pT(AK*(Sj>1nJlWd8H=3F0wx0LsAc%_bk z_L$1|DK9h-JA>zwUkp)#L+$-`2Va{U47@x!=uijkPF9B=+Aec0ZR{I_4j$^8@Kscm zmS;F?D?{8tl{=z^?}|F8Qqr$Ehkio&RQph5NZL9z+e~{0N8S)@ezt$GIEHbvv?N3Nv|s9G-YD?p^M3H9{=}K+c2QzUrfcXU znXVzrGhNNpnNFPt!DaBuOxGY!rfcBSnXdR>X1dJ$ag3`e%!P+J>nCO|S8Cld7dFO^ zeBlB9!w+Okp$-|>n)#m+q0}nmPhlP#K({#1=_g-Swf>pX*KxH{QpVX9%yUZ~&M07> z8(_RSfe!up{214%kuk2XE{t&n$Hcf=FO6{>n-JsTuIw#=Nii<}kZHksZ1X0ug)DQv z6N}jMasITRX}@TBMt02eIeAWunHCh==C|}k6ThTwV%H`49^?$Az@^iI4b7*1|4N=eF0nJ@9<|hegMHcF?9rW zC+c-Co2=FCUpiUy4X8hJJ}Y(qiMkbgNFHRqui04mdoOG+}Dk-5O|-ofSzdj}n5nXaiNs>=~KWwVSGj_JA|W%{pFm%@4JZeUV4 z1I7)n1L*B$^mJeXWv^f?gO&m4V)db1da`Y`_T8Y9_)yy6p?!t=+yi*xOK~Ug6kp1; zX__y^jhrgL?2h1x4e3S(#g`&HLszlZ6%q6^4r%hiSY(x_+IzNRd&t}qb8kg9EHd|Nb6zK^EWB&GtbR zzr`N?ka@qEF1{zp^Gj^F%NXm^>>cO(;(L0p6W`OJg}U!a+ABD0_?;N1Q}H_$TYOGU zUDXyPJDz1&$12_B12DTOqQbUtwYg@;pv`8VmigJxv7OH?Qkj#=++r2BsyQ##Ri%aNeOE-SGwlr@bjoo?3({`W~3JZ9N8`$9Y4 zruNnIlwUA-Oqw%hjNA#4Hem1=k=0QH;>QHAYyYAuWmR*0j*+Gp^)+CBJm)TBa%sKZ{y3xbLlQSHFC>OTG{1`$_aQaY9dI+W-^%$W{FF4+OotA$NK>#0 zOnX)Alb?~E0ImLAHlM)qZFb*u1D?+G!_CmMgMJ8`|Bj>Vq;`Cge7^)AIa65L?5w`Y z;q`^-n;}M7@rP(Mgr`5mza#QGv=iDU@ogA+&o=WLo^!2v z(ZvnD;W1;4@JHH|ca#5x@IRUF7Z^Mi->;d+d>7ct(BX0x-cjUcG5$=m{1@n5k(JNo zxn1#GM17kS>>TomA63ErzYP0c%a0Cy8+^p}oF;N7a4=Vt@nDgR7tFJs299WcPJVKR z;2HPt^vdLX#UIu(9&&Hz*{!PL=Iq3YwSiAq(<@UOGkRf1d_p`RaY3o*9zXN1{76Of zHxQ@bGVh)-@0{^J#d()c{ee41iS2pnZT5>}58|U}=A1=rzD3p4ksP7N7P7XM(X@CQ zXJc}P^y2O8xqdD~+MND4uz%gQNp!2|#jf(@kgxhw+a?G3@VRxFZxZ?PziQhgdar(L?Dk>!bgb5l#>P{|9>X>n1%Sx=D{y__8~rhZp*ca43zl(pmq7PtzFZ z=H0A%R^Z27P*^m6g|lyEF@9X9;$AXh<%&ERU+41^|Hg8)axiN>F5>Q7vJZkhTXL^l zl{aEf?IKx+kH%Lwug}W7T(x&D|3~b!E91mJ6keui3k{eR9v*3t6tM*6l+t}h8_2-s@ zR~>GFw}-ajR}*~0^A?R-xj*-=4J{S5ds=*Ve5TVp#qAo&TDwW}<^7a8skh?lRr^Qm z+1N5-!M-l@rW<*IegCeF8(MNl?`f%6Y4DPI=Ml$Y)|=j2+2jp_DSgk%{oWNDTXtTs zw$s)CnPh^vJkBCeh1cn^7qdfJb?e*ub+&}NG zjVRjnG+0hV;^ zwH)Sm0*{sF;d0$6ox*ssGwgq1*#AjWS-;@i-$`!eh@5{i=_1asaR@JvnGN)5Xt--7 z^0mj11Nz}S`onr?Xv%`nPU>y8ccj~L%J1CxLd)_Eds>_uLpah%9(2VhcsBpA z#xs)#QcrrqnhyQhyJE$D?;{&pmLpf*tEtDLBQn{ClD>d;YDwQidLMKM^F>pxGQr8o zTr(ZrG2&ta2oPoxgR2&ik!{b)GM$ zeDtc7dA`HC-l~XpFB!QvG-f#aDr3|7D3@Fc3^L{~;z^rJq)n~8Xt%3~I{?kLu#Lyn zkgq_`wcF zVc~x{fWM>UY)4gogfdq9{`b)LrF@5fV^3foYH5nIz0BRDrI5CDigKhx_)cG#I=Z%{ zX7s+6nkx^t2(0OhbCXoZp>3qsT)Aq0&8m$pY4nwb4WG6wC%&vb9a$}BJ=U>Ty-x0d zD@QL#JVO9j2k+DZniwv=sWUS=Li6NfQkZZ|fm7NCU zQu0W@+Ic~(CSQ`rDvJfZm2pC!nY5|#>YZp$Z+N8P1YXP;7P3cSaGnlRu(|K5{mVsn z)$VE8iS9zacR3jYD|9?|@!!|rP&Q35@~1Nn6<)cq#k&C=gs#-`%lNhtU59SkwQ^s} zh!wgHm9l|Ie0RVjYiYn9Ec|Tc{^c7sv^2y2owc9p<*#+O`u42c?|Wfm%dQKstL{3i zjqzIfUdpB#%AaTA^I5d#{j(f0_gN@B6+X*6Na}9h%h(BQJ6G&&Y5x4MUiVMktp_(g zvcITLEjoBlOA%uveNn^9!MSb@>JXXIoq1D~+`Tp=n5_LVF3)fcGox{&JqJJg4$J!Bdkd_7K;g%Qbnrz;=c_F&-^p zJks<9wxDabZj0ms^N93F{D`EBj!#F&AH+5mn^<(B$X@zN^|~K`3wgGf`cTsS=uj^( zSjSk&lS@0h&{LwDuwh-j;kjw=`N%(ypV%pdYDI@}N-K-Lt*EuweWO<7&D$8VpQXH% zZMJtTn;r&-j4vJG`gVKv`^=@H?8e-ZIGa>-jQ?MmTRN54baX*_rcIAKDJ&Ro#+`IE zf80_@+y?VZ2e@)cY?t%Lm&xa5o+e7s#g=^USnw$@eVz>Nz96fcnG_(N%p2 zVO24H-E#7M+dTL&f$v0{)*ruZ9{e+b?|9p$2I@2W$4lQa4|b$-noS~-Qe9NLYr>zZWQ^t!@FSuUpII+P~htZ?_vbLPIzaIhur0$>#ik+?pjiK zzd0777hIDX)rHCs?CYKC!g_iBN?n*a4E@A9$D|k3g-xltu9AEuye~&adJ}`BmEA^q zijnsb(&Zh!CV5lky$|ne)rH%Vi6fxgX=GX}M_Z|U)7p5N^s|j}v^`tir5tUm@{XRH zv{zlY_AK7x^|~|VeIW1D(=?R#p}c=e`|{3MIB64lL*CEfoqD!`7vqC#(iZBM_ffoi zs9)YM;vE>)4(1&{^`s{7=Uwz%qX{p0*A60GXhPmhc^5o?N&5qN7kCAKc^7#98~o&5 z;QbBlC-E-uLYLX{F7N`QD(?a>^{h?gUEr1a!#OP>vP)?P1!Gm_z#_}$BK%-1~7d%$dKK7J` z2Yf8y-3wi?soMEp%~&?+L&_7A(@r0GmwJUi;vkhy9h zw0B$TDAu9KQOx2MFfrP(;hP^HD5${C>BQx(|L zX8Iv)a?=LdX{2M@wx?U|u^en|p{W%nWNb?`^;IzM728YvL4}><`8J>Ba)&a`+ew*S zz>&*-Ck0 zq@66`oA?^Abq|ihUxDu?ck~x6;*+b^@^B{+^STi$@Yh|9Uk&?M(%hOai~FdULsX2e zZ8^A?x#)_|wY1srT=*77n={$~mtE2M?pFM#``6?5+KmrpeV;E{OrJ|Su>#A(>R}$W zf9I$TE#6go@soYp?js9_QG8_7ulc;Bj$D4>J}>c+K!bK4Y9V>TeI(1nc#$6VKPT+} z&anT^F!;m$C&!py$~jgt_e|@rG$!XLN2a20(%G|;o@zhC&a4qX%I7Qdc4B{vZ>0$t zbI|6pNX2z4yp;6x`K$8qBQ9dDlIz6>QH0!!-0**d_#g_&Ur7FI$T4}brSoo=evh|N|c^&xsgxo+qC&B_Ln0M4IB5glwa^g zi+6-Rm-0S>e`^nON131X)#p;aVeTdCS7?4_eNG0y3Yhby8}*5O>lnRaf5Bb&4EEwv zK)%fS(qDdLzxRR-E$PVJ^3k7Zb2DG8dyDvT*00d!BJFh&=e#M$s8f6j8ZLhi;gSU| z)ryXb*U0B2pN;+US;}|~XE}@I6Vj>1?Zc=-r7a@bhh~5*@%_8E~>!));mHOVCtcq z1ZC__>dZk`RggEAdMn9OpgMA=s*VwkL>`(t+cj$aSD?pi*~?egh-(_|EXW1ZIi6QOo~W#CmveNwOZZKfG@ z7LHnh-v&R*XRIfU*8MQZ!V(|-UUVvL_!`*Tr`36r?5WXxeC5=cLZ1!5Q?V7a^nmnz zJ-wK8`o4~Hd*uM2&@oA1@V@M!|$IROY*j8^J?o#lDD&q&rpDn{>R>MDo_3&;Thon7d#vI|2fYzo^o#7RKCmJ zu>$@}+_M8%C1$&Z@1O8Y#h7!q^*)9x2DaslonAsEtplE5DDfU*;Hf zh;OqHJ4LGlolt}xJh(ykGx2Q%`;0XG=Dd1UUh`g~E%I4pOVc0a)eQ~v=Uos&tA%Zu9dBjF&8}{HkRlK^skTcu}=8fRiAN?CVeJA zd(vlWcv|~R8tKw!#15F0p&a3yl^K&#crve;G*mgF${YckRK^zHRUyCOv<)lrrZG;K zW5-TnytI6M9?vUUQQL0oR@Sb{t3(dWd~zP+G-<07|D>#&RYJ?%qc*gxU$wWT5*tx) z?Ts&Z1N+K1Y^ZIy5*lB5m%d&~ns1h@i-xVoiA^kP6C+lzro4i+*A>{l8+7}&dG(sX z2hU$KSZw@4;0U)F+p?oLJ8LlK%M9TRp`qT>_NexAvpD+_d9!(J=M?9ikGyGedU-F2 z0efYxJIxcYD_Z(G>XjJZ(jxXZ+SzL&dt;?6XW2*$y;|}}hJOgL&Lxj#G*7_)y^MW2 z?7>q?ib*RWHYStzQr^ol0#^{Tquswiyv$>hYd`6I1?LOdY7cNfYf~lX;t)Th#kjFg zw3t0h>9pHC+~NI|s#H0MNz~5Id6aW?XfOZl;)&8u{-fL%z}*D1OV!$CoZEGJ>8;>< z3ujc#^n$;3wo==UUeKXG-v^K$%Q>LEEay?NUqH^IqHXQG683zA(*ipQdI-G~k4cXk z)`-lURgcg^RR!o}EVlwZgyh96c^gqUa2|1hS zu}o-@4J{&T4y{K?`UWqJ`p}*-i`28WLL2o=ywS8q#Pn*+PpvaJ~*&The%OR+k6T=g`N_fiIVpYx3X< zupajh?j;plQe;M9zuv{bD05}@k-6?}AOEhW%^AQloinc@G+4~DWpbk=ek;y*F6};( zNbJ@QITJMk_#)wz8sgPs2Cw=Vykei1#;b3EbMaq8aK0G^XH=(fP65uz&`Uq#)Pxb= zh6dx;z_(Cfw9C14@tlX2K>kEvP4b>*U$aR|^ISU4E#OQh`Vv1mlj%xuJpM_qPR?ZF zTsr6{`RZs(`Wm`b_KIkGR|=7BiP1Z5smn!OZPazRN^1x_Xxjx_?7d!i=TYsj6I(!>$b%X?d-0q zJyG$G^Zj9dBaL+U@=EHP37+l9%L>xf2P6hfZ9KgczGkZ)i5rMU-%G#7M-%Lgo@;wq zKeO!6NV`|oO`W7oMb-lBv6FLIn%Q^fAI@1_OWRhk^`W~J<}`NBx=>OP&gKI~`grPRd(3p}q&;7qrt(I+QpzromxFpzx) zC;2b&m*edNwR12&u$+T&(#E~iA;8%Kot=ZxaEHDZq1@Pqu-w>( zkk1&IPnlTSO90=RNX|)%P>!s{mvWRjcm6lCS_@b&cc^amw@rGlW|6y9jnHXm_;Z%4jQJ*j`!_yA0L zf9puAy+1mYBy^U&POn27p^Ny>K4*`J+)pNP0&m9acO4O5Q}_CI9Vf|iHh7tNWPbjY zP4A1BB{-^HwwAHf`@W@KDf0^Fyox@!fHLbS6W(_}r_THXs^^eAx7$6<@?00;`KLTf zqdcF=bB@#Vi9EA7qg0;5`m*Oqk9YWA_L+8|TJ|e3~+8t@nEPTSOjn zJS{}N=aIL&>yeY$v|$}P#~`oyw5_GZc1#;Z zTESrC7#S=a#ykNU#G@0_BAk^8hE9|-9?*+jp7Ah*Iz%THoUQAhe5uc(_u`}t^quIp z!t>n0v4+m=ZvA$%{t?V`fG?jqto2)cIIVMK{0iwe8Mne|g)9Wi!B^-iHqQ6K`EPR# zoT0S_6FQ(PnBMIKrml3ZTa)J~4~GmP{|?Us_qVOiALjJjFV9k^=U#apaC)A)k7ri2 z=k&ci*F}3Ad@m@yQaf`ZANkI=_4eGyS?&4j`gri=R^{7zYSnXco!WTMFGMG>H&ytVtMA>c7X3#2k7-}60rz`KsV9$mW_DiBTx&fy zbY9O&spkOo+)h1rc3#hQ)_Uf2Ue8jgCu^i9zleGkbzaXTYdv>O4o*dm!tn|p%kI$l z)=_7hc98fpMOR7enLNcuBhR76v&TAbSd?e5!Sf%ShHvovB6-5|(ei}n3G#&Jx$=bP zZ^{!sV*{ci`*?n6@Oc$_Js&dXC2etNbiyF-xDGBlI|6<4gsf+ao-;%X6K>bE`Z{<-9I^e7eaPpSm80Y@Tb3 zI<7M6m}b8s-t(!5!*c8 z_bYg+m5a$8FJ;KXSQUyN%%5VE&+S8{4+A>z3hjni8JMwB{Qqt;3qwimKcH+w`!{qu~ZF}G!oS~vR={k%l8PE#j& zG<-t3Ortk(wMK>vxAv`%lto|I;=L~b)@HK8EvD-t!?K@ z+SNu{UdOa-Nt1k#ofJS@)B^Z1(?raFu=YyFz5bZ_vhTp?_nMllcTkz^Pr=jK(}2&-~Mq*=fN3148~oJwv3q? zZA(=TF_4-+-ycQ|E=TVWkz~H#%*-I z=r_~ohoBrHF0|)Q|1^ad$hXpk#^;eOfuxWJW`kQV(PHUc|X$2 z6Zt0o&X}Ip-!@C{N9D0b{nTNt|0L<a)dX6+4MO<0gJs&Og{@^cAZfnDA9wQa&^mo`;X~ zb->z{@26JMz)dR$uGW6^qNJT?q>bp9wnoyr=zqVEH2RxXXI95@9!bkJ(ys29Rv~FO z7-=&*rj?OaP^9y-a8A$1lEswQ^zNO8-lYyJ59UeztFCGldsFDA8g{4IZ>+S=hhNtJ zVsnWeD`34<;hdlkg8G_QmupMdj;|5hBx_2W7)#<=YqFlNuCFWU=c~)Q(kA-I2mgk3 zr5}K!oUbnJg`aVi!o1WxSG}{fpWzzL`W=(jwIacNz;w=rVICts(Lv-h*On4_&qN;M zc}l)E=1#}1;jYi6cGhDR){YhC82Wxnbe4-)$|tg_qnTfDPVrpk9iK#1r7^!O*Y3KC z^SOQ$nos5%ePDmEZMA9pQ@^(6sEvo{-oDIrWiInsj6N5VK6#@ymc;uO_H$JIgYP|s zDKQMDcwp+u9KZ2)eUATY;I_{3HNU_VL-y$()_(X0qs;0qaJA0wQ^_Oq`(L-Vtrq`u zEjVtl;Qu~n5Xv}nG5EjuE%;A`m!0wCJk^5idbdxpQqz~x6h!2e;R%#Gc^zX`kr z{~sCnF965+7W`Km_#ffhor1p>bJ3r5&jGAm#j=LgG5+EJ>)U4RHGMo-&U#hN%uH{x zns}%l8>Ts%JJ{|}JlxnW%#v+s5Z|V(Mr%co4pI@>tfa)70w{^M-@+uW*zn* z=g&4juecP?A2L+W+Zi^`A2Zb6wp!;z=D9~BT2;?BzHR55QmcA)WTOWuCjHALkXb_e0L6 zk~4Hu*-I|IzTYCZTWw0PhViooT~sqOTf@l>PJ+vLaB+c);CC7L4arnJZwwCMq;!eX zHgMXW;pW^O1=!sZyK^q{c+TB1ao7zGbru}zS*I1)1qa2z!C~MaXa5Nfv&m!PuofH& z& zhUrsZk&$HFS547-gx51KCG4Y zMF++ZKV#SKJQjT=G2raMVICUqb8-goq#%1_gcp&VQSg%DEk@rtRP2qnI13)y2j(iC z|NSkoC=xHi+}>ZdEyGXjP2k-uFMIHUb;B?7))3RNGe&tLJ#{2^=tO#_mVKt(mD4;N zz7CJ_61VZCBeRbu2U^ygKfx<^`E0chZLK+fB6Xh!`U_36ZH=w7 zBFGm>{wV0ey@bSbnKVgEadTI4;%>+3$?tw_gBJGkXVQT;@RHpdI9~~#{Dd_+ey2A{ z99n7Kq+aeLX&040ldLF5TFHAqa5|y}YU@}c8*-NJPk^;P8k&8gc-uH@8voO#3y=qe zH1pdf^oirch%KY;MEb#MY=VKrOo*RY;(pRn20rUA+mS&T?QRaIQwa($91)bE&T{0@ z!Ps8RGg(PGRE?j~fiIA;ELa|`=PQSnQvYpJ;3G6`V4Sb#{9B243vgC-wa`2&Q@cxM z_Sf{=;fiO(0nS0C9f=#(VumD-$N+VnUOE*TUI8tqAeY48Wb5}A%2|36f2YAm8_mE! z2AstHi8t2wIKSOfHAi3Hn+?no^N??ec^D4O#C{6UFB@2Y_fv<}ei}l$Utlt5T+l~f zvliZ52)|{nBjdf`FxrS2d7`hQDuQ3z4v~Q<;C28%cTz5mrf-B~;Jp{lu^`aer zw(5C$NQnP_lmDD^ZsmWI=xu1{Yts4u*G~DL3;lAS<5c*61^w>d$N%S{>$ma$S)sdy z|AF2H|H1F&ULEU8Yj-Ty(R`i3&n1i@9O+TFP@CK%#AJ8QdOMATTOd0A*Km1s5>Dy61 zTyDyap)(S>2c!H3k*$P7)r_wvXyYXMqM7G-k)a*>_&FFEI)yxhPL z^f4~skb+DWMrDtGR%D1dx!4e#^%BfQzf{CxKiF-WJgEb=WhgS%I;rz$Nrvcc!S|O- z(Xr_5rZUdH8(vJ@>mM_=l`6GzFI(Ui^bYVzzF{kg!Q@Q*5@b=#)js(if0^WqqVguUg7g4ya((` zFo|^xu_w5L0e`fN4N1>R+_4g2t8HEkk1y6^jo~Tr(35LbRjo~v`v!W$2kMl0Nw2fv z!zY>TbA3NLL+1K!Py))O-KNYK`HM5i`r_L`p8j4N2K)f?ygeJAi}bEGbO z6-y0xVu7c-^QyayG7*$Hy;P6KK5^r<$nQ1iPF-%r4v~43Jk2#?S*O(EoS0{9V+}Z! z^y$b@9zV$^=^x4(G3i@)%D(4mq~#jv((e}1rkpD?+4v^wRIjfy*QpYG@z5$1+ogD( zLw;p0>uRq9TYzuEJ1=z!FWw~WVt#F9vbSI$eQ*%C3`VAh&^Os*u=FhSX_Tf__`jp?=*Ur?ZCmEAv&C>zzk3Zyi*0crUptE}b`gE4+ZDa03-0r43 z!9@{!%lI~({cYv9i#|;{#P~g9^IUu5hmWcrZ<(#}GSR2BIe{@bgFY80^`lcyBq{H_ zmvw2Yd`W-L?ki)I4X%@@g=g92wPaAqx;lEYS zdhLnhW!x4$tIcW9vu^Zk4e(V1+oT6L4}-l9)lm~_1*uA@IPj&&5uJ5Cl^mF8p&J{U7Sz- z{>RkX3Oo0&j8wK%jB#&1_?m5VGvk~8G43svyOWcd`U@XzfWLI_rJyOL%-j&PHmk1xbAb1cp}jg z<;2TzCUJ)~-O8D#R{z7IyFYN6_JhsyB7I2u$^+5*x8v0PbNY(ZEpnej{jwgf#j$`- zBmF`8%3Vf&!Eu(>N8)@(`BuQMt9gg%lWN!ZncVFy`u-DaL*!4>_l)VislS8151$Kw zpF`#X79Iaq(l@J{pU?Cbve#Jr2)d1rEhxI!(A6b!C$pXNcHv0?dWcRH*>;HCj&AMg zdgM6hs@ZK8eQUMbFCblX$edYc>VM$qQvWAw<>GzV;8n8s!H?|_KBipNNuA%O!=sHl z*HUM9b@=I<^>L_*GF{Doy3*l4rHtt4Yk5js>H%b~iJz&%3ygGp!d0UCKO*fzBVFb- zLB5-7IKs15uK!q&u89NPv1Dh{|}A2^#4m*7h~#+l6Ia^ z=ZKCz$u*MJmH%JTy7K=^8vacU&T#*~q;=*0C++Sz%yWydFBoH<#?}@&4v*PanCGoE z=C9V6{l%1*eo%0yZg-e{K=g=;6ZU6txXZru!%505a{Wt>s7>S;YLSN#?Sjt?M zF~DJoJLWD))^u}7pGv+f$Ug;rD*I*hxthpc8oEJZkk@i1%TeIFhj<~0mzl~w6wYPb zFR?{8Av3biV2drWGG(~p+3;V)31fG(ai@|(xtgMT$D6Uv*==nzYM`0aSv&hTeW!P@A0bR2$*w)Hlz+><5pUPC^We3^1DCV5PMPYSe>{me4gYQ>J=Zsnl( zVq}hR*DE|i8Oy~#5;(yfY~U$2gz%>; znw`GsRFadrrb3VKy+}#G@&a%QO$8T;Ws`*# z6Aq`NQsU8)<<16tfYr97%9E_k|CZ++#PZ9SS1>}4lajo$zbQnsjxkZMLMwBv#JX2Q z#=Hc3(ry`7->2?Pwg|@6MBi1^f1*8BD&F^Z^qtUT7_?XoEo5FdeF5|hi#Pf{d%G&Z zUFtUDgi_#>b-mQwTOqPg3?9;UXYGEUeMa-c+E!`1tJpQ^%jSLHv z`u(B#P-~QK2WoSs?VYiRO%FS2^bT4qjYpG};lUKtDKwh3+Ge1(+x z8)eLXE%6j)KlR_(^?JSJ>ud~u_eRDx^qrQ5AE$)AX4bcdw10K~#T(S2jc@1`nOBQm zF~>ORGp|V-qjfv7kTJcdcI5MB{pgxBWI^l#YyH;s@Lxb5>;KOB>K|`C)870x+pvuG zg+GJgkJUDWj*O?Fc*6WC290w&(s;2^-ptEB2yI-juAP1+@lV);dyH6|0Q|p=->v*Q zwY}iAQ*{R?u?N!+9O>NuCF3Q&0d2e-#+Vd`E=geQtTFa#s`zz|F{Tx>SF@b4&q4Xl z_G%Vm!%Q(?HrLa$_@B>rHR8-Yd=sF#%xPt1)XMA_%H z{|Ua|fRj}QM;bC6u2XM?Pu+>(uKPx(r}#cDHro6JZS>{Wl`fUOBKpGWD>CDN|56#6 zGZsK6Z16gPU-Fv1qHsO?)eW7GZ=J;fze)YpIAHv{&?&(;4|x5NXT||P2!5T)fWzoh zz}C|~weJR_&w`)Ur>LW=KD9%`Efh~AeabpMnq$B8_08lxBVA$)jXj93Ski0I6~YH| zPn*}0CVE8DtTbP1q$`YlN_`T0YK!xvt^0nW#LLsY_SyaJs8?F*3;)(qd^p%5-%R;^ zlCqi9`Gir2DaR}L|6Oqy2k`Y|x%=WP)nh~IK8mU;j#RY!U&?I?_f^OFesfDmR`cnP z@-2qGY|2S^e8^+y67duK2!4xADEZx*{*U)H^X+zi-GZxL&Y;raS|xDV6xO1NTbZM3 za8&}Arn9=a4`eEGA$|7auzet!e(XZOO)$#rr%Y$~TJ_wk#vYI-d5UlI9Pk`&p~2IJ z{;T2JS>2<-D_Qj+-dqI@*4V@s9Ot{ThqyZpJgR$u``6d&^m?irxGy$vpKjp(X$1a% zekT8KFmNvf@4xZA8~lGIOFI)x=YNdB|1|nx`7qTbH0a$!8Z;RA%<2IR-Z0AKb%O>! zFlZ2K(BRkL`MiY&2?h<)puw-YO#?Y2NvFZy4@3OlGqY#1zudqhr3bh_Xp~{^z<0|2 zQHdL7jDMG>$o?JR_ah7L?@@>Jy=K1M-d)`5<$N-u|ATvb|BsB)_+QyW8ca3t`4||j zw$8Wqf1}KP%6w=4H)!yrL4$L^bGU^DPa8C-;oDi=rGZ<{h|_6sm4*LT_7Hccfk$-@ zaQ}LS(f_-F`(gw4=?3nf_M-puYw!OC?uFp}H@YNf~gN<78d{X zcP%z$az{DQY`393q``;NbzSt+9?)QqQD$y8Xpn8tK<*M38f*g3ItvZXGicy~1{=Fe zgZhvR{Ox_q_*JUgFMqwMXZqq720j<|fCiODnPJ_afz6=70rt=c4ekcd#TFWTO1kKa zR=zFhE)Cov`{h^A!0eaLfqS@~2-0p>{c;iX7ae|$1)h-xPyWKUoNs|=DmEkQi!SCm z*pwk1zC?Hun(Jsf{N5h&WQ;-IUBKSmzImQe=B+O9wf4@SkYl|7V+{ zY9BvSH*xoeCX>^_y@Bst>86hOhh(z#y^i>wxUpw_@-+jO+#cZnqESY0`Y!y>GVni5 zjK1*yad2E^!Cx`(j|2bm?&5FJ&6~mB(g!r%ys3vYSY+Vi>;Vn#Fv@%lUf)H7{~?d` zfj12rTn(OAS!l48c117k=i3$Cqrnqd^?lmM=ljBB;GQ1h{{sV;oxs;!9dNEuMsWHr z{GT)Mf6%}`1|0iZ@Ly)&|0Lg{x{be_!LHjUmxkd#u7~)yT&L@Ri4g9}u)pfusa9nA@zm0T}|5)&UtlRj9#(>ws-yD~J+e6$J8+b(b0QWnMGN-}k zyKw(s@<`u*%fS5_@VnZAd%c1CyL{t}`%Zo05|3A)`GA!p1^5uxYHJ0YZ5NZNtpz8t z9?o8cx&+p$S?g~++p>;Vz}k}da*HW%`f@J;e({|hN;<9yi+@&pRHiT1 z#M4|KKKD9(Jx*I|W8NX{il4l#yyIHi0!_B#e9wYge|~LtiRte}j6(#m4xAOcl)W80 zRALW9cUiDc#WVBGsHy<5N#(4a9G{-)C61@=?q0302kc{gNvD^wmL2bFVh!2`E+_EO zRuemDe!E6-RLR|yvR2&$Oma8HUupYZXjdHLxLVFrJ-ze_+Mfa(lZmys+zVV0g|e3hZx5odb!hB>uv|9ofonwoUZgIltJhdK|>6{pm;SD|num^z%8V zR$|f4??s%6>Iy{3UN7~~TJe#SF6&eav9Fql(GDaLKiH3ZSqf9fr%8-5u^>{P#IcF} zMZB_$c*ZAEzvQm?Y{iIajQ2g1C-OjC1+i^qb2t}M^7I*`qn za3H?ZPb_4Be3JfO%SEj`t}(4+}z7nR%-VYAg2!S(0K3*J>PcP{rXzH zKIIts4us`EOxn{$dwnbH$`-`4N2g@Anu=(w=EbrTV6Fs+B z`WE}zT8TS8aib00z+U8~z3AV%Zjw62rLgCW{(}4mClxEMnn&r+^cO#|!8PbtYyYSL z4rEL38^evhA#!h5IFCc(edBzuU)Q!eC0f}u*X$Rqq4YbhZd=VgNt@;#Fl6rUdYZ_I zmvZ^st;+r_mxH@CPD*S&G#&_zTcL3P8WSrv_9!rMj*A9kKKn#u49S5{W*?TlVXgGL zqj{O$8`3t>pg^_L$Ul7(U4NVZc0#Z)^GXTkRXMLVTOaH#v8!Gq~>OPDCsG)$|$3=e6h{ zfnOmmDtuo$eAINg@KxGz8|{2a+uxVR68|l9`A!~>9jx(qJM9XOAEi%p;Nw6&{Q&9f zbN;h@9Na@bwlLm>^YL@O2_N6G@G-!*{{$cR8SVT>_!!n#_n;#+KAL^CAjIc==*9nJ zf2=`&^`t)*cf!Y|o$&GA{}3N<{WtLO`|8}8@UbhM>tMX>&{v<(dAyFkx(_?$Kgr_@ zd&uLcPIzoHcx=_Vr~mSw>8qa@?fff!)!hx9%e|mqrq+l0qUhYFYp@+;?4+-X%@YvY zT=IPo(!CMr<^Lo<-}t6yefBBn7p{9(@lAB^8y4NW{6ECcpIG^6mwjZ3#HS}QcN&Pj zGzfcXF!mC6*6fIEKfk4Ind(iW?@0W0%??{*6L$8bQ>Rzg*smY&z&?@vP~~E;kf+?H zxMbgqX8$wqGh-ktuM*!(oUcBwXFiReY31U5PqG)TyFRU-8f6}#%;}}KfYVHHyBQpB z0@oYa+jIl-M1615$xm#anz-x7bI-z}dTbNfYmteKwY4mv)nEFDjJB4DR)5RG84U(* z@~t?wIK#i_?Tq5c;)!p=L&+<17DbvbS=zZ+`C1H?%~K1V1=fM=;~T_& zsv7bR=6wk7Qhum>GjM6LeY4s-{2s59`?By^)CpXHG0;x#?J?SFDpNhfhcO3XuiJ6* zoVbE{xlz8_LPK=J3@3Z$1V<-(<^*TKHAVJ0L;p>;jPn+=w=RW!auw`d8^OG>#vZ5P zJ5~0{f$voI&3Vh>pbz)6*o!At(~jVJ*QM;4yOg~VoZ0Fh6O!W(uROJSFEqBw`(^OT zFMIlslfX#wA~Rjdi}2IS-sG9oA?I-{Pf)e_aNztt-Ud0ZLmgz=xNJ3Z;!@_s;8|mz(JFH0FMXKz#8ydv;-9Bii$C4$ld_*JT;9aj z6tG|7vuS=9-R@rteuB5we=T@F%lCu$8O$^Hn!)qXaCdO)h2y+F+FZZ>Qm?F+n0qyl zD-CWh`y>UP4YS);E8r~qs3m4LmY>Yo@uO%@Ke#%1m$e0LE^o|3o`zQKd$6Ea1^>-; z8Ap3w)w6;#CuC2Hl$G`KLF@+`Pp)>604(5)=y*X`Vk&QBclryc`mf3Wj$ex;-9rnhixr%4r$I?%)8;@+E z6R+#26OliSrtFV2b>b9gD)O-Ox--`xZvcMU!v{4P7%m5vY+%X)woLTbA2q+!NoZCR zcU?!_#aO$wY(T3&wtiyUB6Qaxi|*o^rn_3uVdyS7V?y$_N&h3wpHz(Q;+z@wri!0P z&Iu@B4(epCSy-xQ=jOUo(OdQbNK@^NJ@PM5p=a&jL%}ujt)a^zN&f z=-mP6A^0ZegCs)#GCTel^e*&V2d$E4qIb)(Lwc9=YmkxqA4SLVPMrFy4$-%qB_uo; zV*bZ>A@m-s>0o=~P*X=!r^wy_WY#-;p?4>C)>JuHC9!^DV1nr5$2e<3_JXUPrX8Fc zl!87+5C1oLPJmZ9eXF5^;H02$i{-qEquVlyWgoR651$u(i#!0o$itEQp{s#oJ$u9t z_7*<}G=-Kq7o*>Ww)esND0k2;=WRjPO}AX^bsIW9mp-QJ_(YAi1)}4jZGooa6E)ff z?BWvE5iDx@aI0p)^CVS55R-;zbnRA5fe66T+G={ zGFHTD?dfAhT&qd@V^1?yoJX6SkyXRFT!E$1-{n14gDc`6`dBdx*aFbkiqnZtI2f-vhAE@*c;v72j8Jxy9ZC`DtpBP^eLy??egOPtg)+&Tg!&F zR@?t4BYC0P%1JI6JIPmwT_)f1u@#jg*cRy9vw_9oR$PvA+}@g(GQ4sYR{%JxsbjG8 z5BB<3NBvOS>tAjEuM9amMAAOLn|?7w*Eid+xnv)HfuSc0Xh&#;-*n5t3$rviozJ%d zY{DXJ!g<()r1XCC*krHU+^=rVVqIdc>T#iOE<^Xo89CyU zl(is7f?8P}>DJC|NRu@P#!&O@H-)oyI-HBcxX|&uhNSlM8vK#y8P03)w{R}bC(sf2 z-YtZVWq;z_l!lCI(nbGP%h_-@Vnf;ow+4Vo^1XK-G@Z+N#@OQ3oXwCf_T!j{&FNxK zPDgjsH{IBg2d6{V3Cfm(VpR_QFBU?o4X+b3TNE4QZa~ zwYF71SLe=s`k7AKq|Y!ns9vPs16Z?2ZLL98gooAWeUX*w7F||OFP#DXr^AOl_;DS4 zxt4LCb4#-I`x`}fSY<$Lnz1#E5$Mb`?lJO1XLFr!RIYw5sOdky7+IHoA^(LIZ?TU~ z`q*IP-pupAhHR|iTfEjEWWB268E&R6WXeRdoin!J_a!n8Y4X7t3S#dVJlF0mjZpNn zaWtOGSw`Hi$NVN>hZmfKq~MeGa?VXNH1}ekH$(I0^V#!doSP;5Du!RIS-FGszAP(y5v){f<@+o02_8L!hfRA6$&S7g{Wi(0E=B&t=Y_*<(j_ zdrWB2di9xYxtW)C)z&7XtzER$-T85iQRXemSkF{2&y$n>Y}(;goBDF{i%rd$jM|wu ztAbHgEBQ%&(XSasdIHY@;Qc6Rj~MAf=ckYn~b#1VER7$lP?d0>qg*` zb^Fftqs5EP{SV!Pcs6j!p40Dh4`M&cc6JY(7x}dE%i#7NMqmkA@b+*JLBF0<@?`VfrA>g}<}euP(j`>m4!4e3$XadaufB&@g|5G3K$? z+&bpPk^f)0SH(_wZGSucS^9POy(*`!pkJdmwDERI$F`42+SNu{UdOc0C2gjWc6-OP ze@NP$Mp{wFw2viik&$+9$FvVfV?AEKL*}8L?+b3AyoPJ3fh%=bby&UB|D;iWMbGPh z#jJmoQ9pH9>#rfbt9w<}O4>RD?-x7b{fwk-G}2z}nD&&U{mw}HeaEyFr2VV+sw|}r zjb^(Hoc`Dmr^V7n>69+-YY4wrMSPK(-IAqx?#2$0dsQxzr_JWk&W)O5^V}u>x7$4P z$Hy&gj;84sBEP@}{j8Yn(q|`hLaUls&{^k1jFxMcoZ8n@YjZg z@gSMs<37C?D?<0_J7`&#S!^oazcFMbN`HEy!#3T2bZtjMz zacVGs%Q+X8b1c4@Y|Oz#cA58QqB{gn4>-uYtp>Vi^D^W9q!uGT{yCp~7h6G%=r|TN z8+nM6Z8X<)qN&SV*Aji(o3hq3%dG2K;@2Q%HK_R-nA4uXFE48})ThO&h4ZjrRc5F9 zqci=qeX?$InLND_JY^5Ti5pdXL7{t9B*t2JHc7E9ER}dVVgn~Bjzgj|g#Y_?wXK$Z zTL3TPiSyNLcj6r{LQXjkf6E$M%EDokD}N|*x+7xn4_JS7IfywfPgKSPE>&DJ@JWf^ zVojD?tH1oAKGPk}A?^8`y(?Ml3)#G1$X+_c+Zi>oZx;}dDO zquh!<*JCB)e1mB7=d}3+ZK}pyIaecVZT4R9uP^-LK8U6Lh^x?j$(x>68~Y&Fy?eP` z$ln&nuiaj`x99T#$}6=4hI&>hO8=J&=a1j#>{nT@CcjsK-?hl5`E|W_b4P^-TGwPL ztzLY*zOq4^>vjy@EdJ@O%Q9I18Pd89pL{Cu%MycMJzQX9N>~8d)Y1HwetAjYV5bRTFW0JkL2r5zr-IE-~5z&vp1Hr zbo;rtcy|oh+)R72##vqV9C!~I@0I&7UV6YgNp&15rap~sDMR!%je26>;qk_u%o!~( z3O&!mu8}_Cjm@HdVhDEJ!f()KFYr{C{SWm&L;ZuOAD=TmN9bCo)$JeLq3+e;bwi_m z)GfYp;m=y?qU~Ct-F)l=Sv#*T`;hM+Y2QtJ|8g@v%;$A~w)hL5DrMb{^{BPzK>x^) zjpDsr*D-F!pVLdPK`yVx$9xs>FunACg#0Oi6weOiXKwyr&mVX`tPJ+7dtPa5iY(51 zD9u^dyv=JIrI5f z8QNN`U2UAq*jfP&&Doi*K-^@`T*m)=BWnSi*DUv^XmK;_Q;_w^YWs5;Sx#bk>}Rze zcd$nVnajJEe!@Nqk?nx!NZ?&d zKPBHLIcHPWmyqQx|Bt!1kB_Rj9{=y|0@)BAgoGqKCWuM`K2!lAl9Ww?8lXNB1+_{L zTY^}v;sZ)82~h!2VI?(Iv?gLT8>CVRLZmH0tb)`E;$zVd8?bdZK@kHamq7RTKKIVe z-XseNe))Y~pFj3>_s*OAu3p z!|40t^Cm&FiS+pd`rKv@qTa8MhDyZVB=cQ@)i6@FOVpSC3i1xwTf_UD-y-iWL*BVQMy4&mN9MZ5 zz#LbjlrQ!IL)O*5ZOFPt2eJ-&yP<(4>t^vT^oG7^-;pcC$h7ny6!#yH_C7M1T9w<9Q?f@#d zc0F~M4;|^N#BR*_C8Ir0Q=YUpG{3tqFjMZV>eO79_@4)6j5pW5$kb@y`rsS!KF=6_ z=T6R=dv2^YcYjiL+Ww`^wAvzP+L2dnt?`lN)UURhGSK2h zKm94^|6c>wb+;mOvxVQEO~)^S@q^C~_C0@8%<6Lbpw#8uIcym|k4|iUMGMj$Mfe4{ zuEAD~UEH-Jy==)t*geOre#!MT=~E0FwzNBXFz1{KIh!;Td!zC>OJ)EI$ul?}E`5*l7+Uos3%yx8pKh@E-BGnO7kvarfyRe%taF?cUDvE0iVP`jZZfrqD zvYcPK3A@xrNyA@=_I-#P#COZk4+nS0Zd#PvShJqCrBKdV@o~`Nu6KFfC)0V96nn_l7%~)j)WRK1&Qya*=G}zFhM|9c{#Ae`gCE{a}Yx>6x2N%jIcTL@} z6&sp+#CYRQi6FYIM{Jl2uMg{#!o%-j!`ukH!7Cd3t&E#w{3!fAd3Hv2V#mb~FU;TY z;ePmg3H-fZ@wePFl3EBqW6LXbdDBE}8AXuQC_@{UlxZ-ss%wD>-4A;6bj)`1DVvUm2f)Rm>B%@#)9DpS6_pfsD`T zE{!qU&e&{cEG`q8F&2l)d~%Yp=%0-JQ+RC^`&}`N8E7W*pc?yaa{WKktA9W@bvcnA zuASpqr^Bm_<=pG#Tg4b2ItG8QzQ_ubj%C0-lMpJ|;JUi;b9@r2imry%<~Tdd{AG=a zu7~1%bLfbUyQ}I8_ zacEW2uQ?Yo|1N}{H&tge`xZ&P^xIeGhDyq~$8UOlsInB?t+_Y{`aHurp%VV_Gqx@( zrLP$G<)W)GzN~frPl3DFHvj*OZwhU5`o-i64+r6W?yE8N9pc2J@9ePjoz$<6mozZP zUIhOJ=5SB$mhp`;F9hp6Rdo%Xst4JlS`UsXN~PGd@P* z*BKAI_@l)Md7RPgnfC8PhMJ zca*tu8`rzefF_-GelbTYUJt*PK@YRd`0=_-AA(KbEZ-I2LsI36+mMj0LHFFo;D7UW zJr3=KKcne8e=p7joBH}PrLQj&eSI(eBKrD=2W|Q~b!?=qRn^4xzo%r^HF(96@< z+g+AAVL%((wN}8I9=Ym9=azkx8>mbEOS-IY%3Xs@U2}`JbN^zE7zT`Q*T6CO_8DjA zOGz)Aq3yi#@8;Qg!FlWDTJhzSqj@+}fE;&wG8?UPh`w+lO8P~5w zPPka(@c!gH>>*L2mw#p8R_?lmdk{2TWYvjq+W~I*C%|o}!mXaN1;3uxhh;-4`pBFG ztcfGc@n3t85A65MqrYUW>h6U6LJ!JeoXJ{9>*P7^PtcC%^Da7*qydu_Sg56ic(-UI zbqb9-D?EvIkvraTtU*a1Xt6zU_j#Z(R@PUT@yPy7-weni>Oy1DEpTPgt zT3PD+mUrRF3I!u{HsevmR$R~?ul(W!yu!Hx>4SL6o&Q_SH-YD=^z)Z5h5I>{elCqx z{Y<$=KlfnGpo=<^$43U=$bHy~ZyvCf`7LvOd;Bsr0>6kH5q=qJ46Gzg_ADExbz_g9?Y?ERj46!FH>Iu>2H&uU(pc%bsqxTCr>|U% z8*`ix^Ge#gkGnW%FFfEYE4rz%rf18&iqN>Gl80zVpXR<Cs-?ihP>&ph9un>1eo`ea~ewz040LFY5%kh!l%%q7{^>r=5o)t`V)x%^DZ z>5^dFH7esABmA^T#q zQRUz*dxn8mPfVwSTf%fI<2+O;-&lIWI`EKv{qPuC!T1W(=@IB;%FF&rmiI8|C-mQ~ z%C*)+TXMtWCl7gP>>);wm(NnC@X7^@ADMqYB^HI;)9T=^S=ncDBA=H6BXcHuwT*Hw zq{t^f`nAkK#-1;7Uixk{cjMakAseS5FPZnm&ePubi7bc1{IycGPwv?|;aGwWB6}Y_ z5Z04qej3eqkh$C1+Z5eG;!4Th+tt8YviKh64B4v<&)u4LF=^7?%M_gO>(5COnr$bo zz5DwbhM0E>$z4FkeEve)u_pU(ncTU@+|+E}z6hGjH>;^TR*f5(m+Kh|hiQ{>KR3@q z3mH3;=MqmMt`0kZ;jbE|wsR*oIrz@G(@))Ut|XDQ>=%r&d!eh$ z%f^{O*0sCw9XHOM0DpKq{8(h358|wMu3vnBN5DT<(dOBju5s?e9~H&j>2j9E<@GMX z?(g!f9&D^(bJ3R*(X)4@m&N>Mb?L%1_LpSceWS5{2^5)o<;I#}xY|!*pWYf*dwy#2 z`29!F{}w*DxdPa|f6vzRJZvk{ z=0_C0N{!e?=sxFY#X`So?oSeW{+qZ1qoAG0l2X_5bkU<^PgB-dn?j?JB?)0Y3V12A zQyKf4w7Z7)u@7p+$>>pKMN`x|f-@d!9kH5r2v5lR4!eu)#;?SXg{B>%Sr*>MSP`6L zJWHRx=ycZ!ZQ9Ds*oxZ~tenY^vIU<@FE#J*lXq#;8rswzjUQ7q9te%a*5BSegeMxq zd*LS;!^Pj3WB6?FGR7ye=y}H7S-j66Pjovg{Tb3l-@lo3Ns~6rL7vGN-D{YFWS+G6L*(^Y^nj^ZjPVhk z<65p)wm)XgaRbL#y8nR%#+o%y-$}2p8?Ucjd9k5S zvIjLLuw{VPNBdICqP>B!E7N1hq1=1ZF1>>5Z|*mgzljSV>;=9o}G-CPn$v`kiW5w@cWv<$>(|lTUdi2cVB)H ze&3SB*~qTmjr_0nJ4d}lx`zB4d6#C~5s<@}Tf`j!H3!D)(?4?A#$0U0Q-jp_da=-4 zH)p$y`a-lbP}fNh9q6Ptk1^`-XAku*H0tbY)cLmu*mv6P92I~j!TRxf`Ku?O%W&Ft zfk~GM&$OaTc3*Gm>eEY?TWoZ>kN*Y#3e)AgJKNHwY@4gnPaCYUo+ET&y&)b%^ZqHD!@0HWro?*83Wb!|+n>La$wnlsB5*cG_W_Zq%F}CIr|GD11 z@S}{eANEHT&!rtAPs?ND$8d(fC9m4r;9K0b4U0=pZyWSKgn9K0+TbB(M|*A9OdBpY z+W@WO8-^7}fh|dCrM;`ulVcy_EFrq5Ye7Z;86o37nSHya z{+W9JdmWX5Z#sFkgCC~nEqE%uX(Qirmt!Mm8migz-QaY1rOdUQqn|%WyL)ywDS7Jpz`ggsmzihoDS7;t!{2DT@Fwvy@=EP>Y2N}P&_e7puGs5c| zKEfw7uXxI&xo`MLpF!`;3%t@N0s6#;d$Y{nXxF?6Oz=Edl^@SNy})`1e%-O#%pI+?WU>fQGUu?)sJ_0S|I zvF2#g%HCz5iUaq)X>Rre4i4$#J2)iPny0Vxzh>$BL5}5X1S)j=``_Qt1ok~mPtAm$F+F_~X#LtGhjjn}(!=6u-Tt}CMZL@!Cn?Bw+n${Na>KC!#RS?Jw3 zHgkMh@&wN1)-Ordu$h;-o=Kmd#5vPgM{X%@B4WGsxvoV|?c2D~6+1>7Xzr712YIsI zm3pNQjxI!ohKRq4J`$i_(MJN=6Ahaib3$%ScBa0WHu%TU9<}zmaxC^aU;-}puxMy7 zu9tSuMO*`PY~!xp8qPNB$eq9xzCq_5z}RZMDpT)=Kdaaw`nU!xDTVJ=7lcZlFOoaX z2h^4FjeGWQTHO5`VE@Is`?o9KOo%3K0{&*rcmE=9Yem07w+Y1{v(asWv7L0;-*5vj zcN#ic-2t2g?)%Uu-QZ;OFJ%~dQU6Z(C?$Ev5PwbLhty2Y)Ta}B(huHNyE*?ES4(;Y zI7IWkw6Bi*5M|VXM=f~NfkQ1gh#ndM_AvH8(F;W<6diFZZIUuATWHfIO~#(L9UlWP z+7nPX#e$RnfwwbCWsga8BKDY?vb%B)|5GCdhgQEmUG^|G&Y9~g!v~}Ze2#$+wp#jf zD0_naE4({HC128y0av=RP4>q&IiO-U^#`(Nrj_687!|mDW?ItC_(9Ipa<`*z&+awQ z3;&*RJGyIXbk`-x=&pfrS$fW29P6b2gECIQL*|u&@lNje6&vC+=|22LeXQ+eo{_zc zYVh`R{<~W2-i%|R^JDBe8Ti9@K73<>@ZE;H<{-1N9ft}tq)(4EW$RO42It|Leokju zzh~+)#*())hqbC-8+K~-|C0JQ;5+mAZz=yh>_ra7CG|EjU;W^st{Ahf0++K*U3nLu zT3wS=U5N#4>teo%3+&3$^Z(P9rlkW;t)3kA$U8#Qxq=7rk)t|McO5Z*p=n-eTbh=R zIJNr4eknBFFu!d(b!q1wc*p5%!#jE1POY9E9c-sT@BW(JN!nSj+WCFkcKT1T{?FKB zk#UA**nso2EB)BI`Kh>L!tQA-?p83@bamQ(HB%Z z8zYPn*3)r;mDd`v4GKSQTbC!MV|5vOeaM49vJU}G$0RX_O}|{rO+=sCSTwn@7MY3v zR9v9x#C+;MqhobhvS+4h*XO@!%cpy#UEi>uI8f`I)E(c&sDyh}bb$@%i)MWxdb4lH2;!^6HOkt=H)NC%tE*z=XkTDH^m&*VE^1y! z?_DPA`ZdHDw`lwx|MQli?=tUe%wHa2LN%f9iu||c@huzBUtTrm-OaD6dAwn~?p~$l zan}4Yk1rQqTb^meippHsmPXYflSZ=dYt9G6$BHl?81oZ2A2P=DE<=y0U=EO2QjOpx zb5f8xMK;U)+QgjDc%L?MFS?44{R^XQ%x~$mMSLOIk7xf-c+aS0&t~^!O+&kLVHBIU&G5M;7^=@k&#J|g`t7AMr`V{!; z**n_u)qG+r89X1Q={E~*2b7Fl+7`F!e^|J6jOIQ?hi9?vh~Jx~A4wlubCMBr3m&Oq z{ZPhwL&hk6b9xzLer~>2DPy#T@wyS&R*Jlu489v(*EjxDaBVPgEq$deuKvbT!?m8h zTH%kxnQi-Qq|~*FK0}rlzSg#`>VKPcbx4*E@3<`Y9qeW9)hbzD;r@S@1LTtfyJ)=<8Y^~N6 z1;6N6+htAT5qT_n0pp+?y+Fo7GVvU(aZsw}D=+Qa2*0kNzI=Rk18bwJ^2KKtT_@*4 z=LQ*L_A%Fbyam@zs0uERCU#)fh6(uTwjO_h4D2dju2ZIeiPesY1CMJvacUgek0?Gb)m?J z{`jt#eKo*~U1&#E-T?2+jj~5!+7SY*ZTt=fCEv?dztMnOij(0!>{kkTr;9TzvbcF``R&>x1`)-N6Cx|RM5iXsygM)L7 zveT0OuHEgqfw>NNee2yGj2lD74w+-HAH+t_n&+DF^^)3$G%`g5nbZM{#@w#HG= zm+@%y54M7)^{Q?7;WYPKy>Z5~O}`zRY0fE;`fV@eZkR>euv0W$Mcc$5XtGnEahlt< z+rZ)ah`h5I9G?A!Y8&>7rk-k?JYZ`Z_J*IHW}MzU2~N+0Q)8aOX*skhQS_c+!>LKr z`$piU(v#5pG0Git3-rb|)RYaqhePknoq81I5Z|$?Z6Ecoc#v;CU&$Vnp+t;g})li+uYe18M@VW(=E2Y&cZ1?D^TJ(P1g<>r)=&^`kk z60cLV$F|jUK+*m#8||?>y>*&#y67Z0C4$r3s})W~;IvTTG|h%nNYj5OeG?VAZ=!^@ zzoT!W=o@TDj|1CUf3nZPO(W^|pK0riF~5a6-&1u?vDJA%)90RMI(+}j6VGX%g438B zMTeE(^s2&XrVXbCO`j}uh>1*xzf;DBC!s?ObXei2$^q80`&{r)*zV&={NJ(rl!4F5 z>^^UC)>!O57LHwPIOfIu@8CGM9UQ$1N2Nn?er2RL8-3@MDy2iA|A-Ft7&?sTeC4s% zj|sSv(*mQV-^4bvocImSonN3k1NV_(QrrCLWJnd;5rFeTdG9P~(|6Olq1hQ>>gsmC-BL38@d0OfCmBhA{aUp(6 zVxwu^-(;;&h_8n1Z_a&&v-_;Qs>OHZtQf;jWyK5lEj2ir{g%3bujrW4_UCB(lqT$Z zw0Syy#(wq|EqyK#e1&$kG=jS&ZT7=yCxEMM1vd;h(WgZh792zHh5Wbr$ZD_f(Qdx|+@)PC z{o6s)mDu;Ge@U z0PfZ|_V%xkZyYCYzu0m+g6j%9uCd@c%~NHs*N*GM)I0YV;Q9@7?=-DSY{TM%k$?QZ z>;6D};!8(c&?#ZTsW&N)f>;tLpZ zCf0ep&fHwy<@~~>v`>71N|!lv4`WjmA0*4hkc}Tij`9`QjNQMUwm$Tfhcj~c{xV*~ z*SfFr6}ZV2za(#n=6z`{F+mq_Ka(rIu7GcHX5ZhUynxMDU?ShN@fElUU#)5Q2;svM zn$7>a_&>*?i;r^-@R584;%I|4XB^`DLwpyQ=fF>(tM`2P_eh4M1 zIO8OQ=HrtyA3vS>_~nR?4r@BYXNUEs`0(Tl-!oREk3>&2o-!B9JGzPSMAyuhcgBbK zvDD+Y;>T~rsIx!5R37#Zu@7hB^X2id7mWSCeqS$d3jX$ave)%0d%l-vv7T_TUJBdI z*h|YjoI|V-{K1T}v59W&jC>o4ugU9tGnsE@@Qtz|I>r$<1U%#(qhUN7&=>OYA95c| zzz2bJ&c(|)?%IP4OX@b5Rq>xBN3? zf6l;{;CGs13ND3NE%K+$e!lJ{SgED9bF*)e>&Fz$sgk0e3*b z)n~P+cQA1E_#YTF_y*ql5i~f1G7K8*gO_PjYZ|zv4tzO`I(GlKIvOrib$k}NjsxUd zb{?a>@2U1~Z`s~|3!L(KFyPiJxQ#90b_<-c#Tam}D!5fG;dTmKlWDUt;7SzSik5Ki z30%kqw@|??X$kjN;Oeo18nl}K<7o97Wf=W2FEXuO7F_CVxXf0#+|?47=L8Np6lokS zh=P|Vsqe08`P~zIhkiWLk4(fTwz4L>W&R`NudvOLGM|=S#`z3v42I9tRA)s0y88tm zVC?>NL#8-$IhStu!#UUk72mV1Ki4WH9+LR?k0^6^8}KWOXWo=K_->ikSj&q4T+P*5 z?lI=rhH;F2{Da-O+~;n5*VlXTVD1#-n;ZE?&VdBfH-*=j-yFF~qG;G4t55)^;Fs{2DFbBsAUw$4wTf!pVtaE`9!n>KSax@07OKAEEfz(<;+heIoC zjy}rwM{RoOrO;aD=ueyp27X@fYcTLjsPq3!%iVhW11H4qeZDyr{I&ug2|w3K@EfS` zYjpNmqM_r=0>5?Ox5wG1&VPl_@4ge_SIakT@IzNPk&Y7pJ`#Sre-fr&YaQqCr6&EB z!`oVVraq^O>BAa-6Z`a6nR*^+_!lNtOx+Z!OeB69XRHp^IG=e=V(ZGhu!ZtvjCO^; z@*c}H&MV58WIv!XG~CJFfVnpHujjl7b_e2@>2l`u7^=gEya<3xXsx3v zZxFi2CiDoA9Yro(_U*+7n{#LAXfAw|)px*(JaS8YOZfk~s_#8j-*T5O^IvF*f)^O% zoB=J075p9rzeT}s zRPX|WUEhFbKQQp3g8xRr?^5vF6}-SO2N`sVaa8$dqi-F6PP<9lXQLDU#Sba8M|}sZ z_~#klvA5+Z;{H2X56WE0+N_zr{10r$-}XcE9FgpU$^5J1Z_~IUv#J6Ah#-DJ2EHrF z+obSikHF~PeVt5t?^fRn4D);n{d3gSwF0?xE%$b+{R(fod?WXHNgql6CReY<5dwn_ zA$73NajnD{GWR#0Rq%ZqUBGYRoa|W1$8U5Iu=pWgD{;OIJC~fl5`L@iq>Jt(bK04g zndeu9|3a*@(t(#e59^hS9a`@Yace}cO$4ri^^X&{1}A=EF=l#i(y7=;PjqR$$Eoyg zq~rf+q^FTCdYRBUu*Jgr8HIO(fw!Ciis73eKEtBd*0P?RhW|pW2=kHKwT7LwKSD&+jnT z^B3dC*Vh}}u*X{K>@e5!qmA{vtaHTw&+r3OK7jV~b*y!Em}mMpTflngb#HjB^RE0K z<`}h?bXm)fo8I#5nyhVyeq)}8lrw;SiF=S%aP0`%Ec(l@$P<~Wvu0FS1EUT2H0QGdM!yW?IHW1CFvsunZ7*GJx%;8#V^z76Y{tcCAwi9Fp>5;w@W$Gvh=c7DMxfdRnB(G8N)nXOI~fFDhGYB4wy*gY^Iz5 zbslE#(Y+*8DSMrM&Wnkzuz|8BgHwRABtPe6D?i@IUqk*t>az5uf%k^>r95IB|8M9^ zOTod?H(TpVzHC!pl5-#By2Iettv$6kEw(z{L0sIRtFw3T!KLZO`5*DCTw0A>9t2-L z#vRd}jk9)g7SHmp%=nh}vF|yG7&0F2{WD+-3(^lW*U#sSpPaLkvv{#C2j`Amy1U4X zC+~>Wa`R=bgO3f~Hun!rd4mj+bF%?>nf*g0Z)D%3uXph-8*iWb{^1%+=Ey$#)62qq z?c;xST6kaMOvTqVAGY=<>QgZq`pWsc)GpyWmjjIL0Q+CTdFI~RRnYl9=ql$MwL;Fm zFrP_`2=Q4tZ1Y(um)M}3W3l_JRAX;yk*=G*Db-c2(vPe3O@5_JDR~k5*5{)d9xmx^_j5$-C-8lCGp=Qtp`3kFU;Sq*HZ_x6o13JTCB)alXo>@r3&9#a_o&@ zs3f>0CvDt7?O-8$Pom4qJ;G(ox6|Lm*9N&|$&ZcH_b1w1L0;ECnexL&U#8by6Tm852UrSOnp^q$@d;%WLG$H*4aAJRaS)2Xw zS*Hi5Gi^Af$^ZUgn!EunV=S7CN^U`u;4e;3{Z3o`efjTC4A=iO^(R{O-!RBK%f=JI z>8Gduy-$VtROf$kyy_GDfvi6HwY^VBKcp)@DNAZGb|&0>dT{!y4X2O!U)?)QlPkbw z7xl}Sv0{6$4hWAuZ04)wd$E&qXMotu<=%iDV*BVtIpoWFU@YZqw%T!CQVZHfPdPp9 zSYm6(OZ?Y*D%xVVvS{1aPFvDnFmYPrcJyu`17=-&dT{!s4X20Ye@vLRM{d@Ne`C?4 zYETP)pLONwssA!t{WtU9?^ZOyu4mEYWAJE}0i;j0a2lBG-A2D#vU=Nu(}UAs8%|^R zU(i|Mgg=sn)9ZGeNFQP0bWKaSkb3Fq!RgqO;c*!YPRY)2KRp31y{-CN+3Qj>Pfz_{ z+Ul?8e_lvywu|3E{XaA+8E{|Av6Gr{dg}j+t^Qr||5&*GpHcruR{eiZ@-DW?#niOZ zQ~&d}`q%Q`uZQbDm-^o@>tEv@+;W_zjygT{|HfATa{ebbgzN7{{ZCu%@6H)Y+n7kb z@buLGb6fp$_@8$uT>t)`YsL3i?cdz1g`7$~@ATB4ZmWN?{6DCf`V;73-9VB?9!DW?ag1RGB0^WXEG!U=y~3#UKYaUwm{qEk&vIt7QE9-Mx7A}lAO z!O346?xzLd!kxdSPWLE$Vxvhg>Gah9k*)q9|C0lXCirh#G|98mg!Hc)6i%NEYB6>v z^glf~t+wIx4*#paRyg4|V&OE_juYvdOq_POFKs!VeDTdVEjz{az%u(j!6F+@FY-UH zM&X2?t%Xy(9VgPCvv4}xlAoh{pB|iM*l>D?|JwhAd8hs+t@uIeZ>492+k_r9S-zL} z^)@~0{^gYO73C;BtA=uBwo^`KgmP|^a=r|g^C9J2*G@SXL@4K4DQ9=MoWD{|c01(^ zj8Kk8%K2BgoK=)_VLRo-L@4KcDd&rDIlrfzq;|^DiHq8r&I6>J&%@;`q@3>Ul=Dr5 za=J=6pM}f0k8+xhoV?#ZiBL}C)0FdRxSSc36KtoPEfLE3kCgLCxSVS!=d*Uo`E!JF zK9+Jm4wo~Ia{k^C}(Xu~5!=brH(>T*`SjTuwISY@;0UZETA2=-*raUEI-W{g2_U zC+mMtkN%DIKh~pvZT(N+j41!pC`a}UFUGEOqCM^z8D<>lcr9^BHGV>`{|eu4_9PRF z#Gf~@PUDU+cmCXnzAkyh-|otH;_EW2qp`n$kF>X)oI=c7>fOs;w41$-*8AIO;3@h4 zB465c1HZOD<9#Z6P)_~a&ZBEKW$QI1|84edlsH>aLQ>vDabut{E8$<44=}3~efTi8Zp=#NSU)_B!^6jlFjATgNfmAoe<7 z%P%r*abl9S{b=MCmQd|=mjU6=M?=N>V{^skLq{=L_bxmLO$}eh z568FiE#>|wXnr^O5=&F|`fK*!1M9K%EB-UH$Pdvc(ieHe^qfw7PqEK9ur1p8F2&+I z_SEt@w_?Tk^l*Qn_{jwD%dyA#oU7t|<`d^rY$6WqP=O!O7ryULUti3#^~KZtFBSQ( z`XWa4Ma`b^dLj3dS#~BrZA*qmC5-J8$*Ht-&VaEl6u!3TTyrS2&Zl^N5#Jj0HT(%o z+gBd`1a|uF__yM9)+t*#%Mhk7HeUSD%JE-nLEi;t9MycMIi{ye97Gw*rp>9tyzcw= z>7(xu8+|X~zo8E)`mUX7@_Jd(HI2|FOkdiz^&DgiG!puiHq$CB1M}ir(&|x*R_vX( zq}7w@;)5sm9JHX7(`m$<&0i3vRmzW`)r2okAFV!L6qXAI_;0K|6s_``X*IR6kn3GShQk4M`CJPd==m75I%z2H;sm~b0;J0#9}5jJm$v;GJ$ z#=UDQ2K3#)HAHD~1rm>)SkW`Ehf1vI+j!bzMb8B8+YZ3p4BWmBz)c433*dyeUV~ok z)qgqg9{?|Hmbv9Zna4yn_Evrr$i=*KTJqx^ipD9#{giqx;0#K8^_)jNYde7d5a4_r zfa?p~i@+H+Yj78vwb{pya!!*zp6TRn;S zY`d5Hnr(cx-r_U93-oQpXO6|`;)@!fypzq>%{Z)3IAGfia=t#q`Fab7lg&}jSUB)q z4mwH;UUw`>7ysb^<>`tJesqQ)b7Km3vg+K;8bn8uxvG%6Rm#Ki!8k{U{eDery&<*5 zIXdk38%_CeJ3M`=dc$+3%N~c44|!9R-moG|cca^Kccm`A^>VJH zqk6;avz6Y!d5o?2ls2D9p)AoGW{}^=8PWjfFLJt52mN=VI^;g7NV>_jRvn_#!Y>ZR zKdp6(USF%ZPtKCbT^uTYxWT^;WV)Pn4`t4R*zdgwRJXt%de*58iv)^hsD>L{9n_Q=TQPAoMCD-MSx%TA8z)zxzSK{j= z@<#f|T_0K(;LJ>mzNF8jFTX#_)Bz1SKwsBzo~2Cuh?Os%ANlYNFrq)#;D49-4;yaG z4}S7){;xSd&**>*J@Ro>@o&Jby*BIz?jGRGbwFFcAZrd=yif7RZcSgr-DEBKV`+L| zH~g`-6@L`j_(S>S3}##hehhy+fBN|2Uyp^y^+EoZ{x!@Ww_E(NK1;9p&ejLCZ$5o+ zPX}mU0!;^Yfc8%U7pwT^=N%}w5csI(z6$GRTC4TxAgixFLk3@J>nnWHHGB{QpV3!a zTJ@F7X&cMRhiW`y96tl4&vsY_r!GBxeRY?uuO8!n!Jor@6}nE1<@Y$dWgpA5FOI%i z+5wuL3r*j^Z>qgj7MG2jDsZ_jm{3j_wj0fBWtD9=Q8E0QVo@ z?&tvAm%!cH0l1HVo7w@mt-xK`0l2>bC;o2j^;;!ymvjKG0=S=a0In1`iD%wkz0UwQ zpaXDE0N1+%a0`HQcK~iKaQ`JHTzmN43EZI$z}*I1Z3p0P1kT?9xT}Htv;%OL0r!s% zz@-ECb_d`t0&YVG;8KA5QwQJ%0rzqT;NpOLt^;sgfm_xAI1RYRIskX%Bj*1O!0iX_ zo({n61unk>aGwKrO9$Zo30!Um;NAglVh7;f0?yL`xHZ6C+yS^(fIGJXaL)sGW(VM& z1}?D!aEpNJ(E+&M0w=NY+Z*Ti0(X@7g~07lYyKT-&A-FG=D!`d?>hjO2i$);0Czob zUv>cQXTW^~oaoRiIUmvV$G!+S1Tt9|RQ{7PTlrRnZ7TI)cp$9JIv5xcC# zdZx&x1G&t-monna#*E=!Gh%MY+FjtQS^LzpF0V=m%hRma?f4OE>mByBwO$m~!OwVvy|>%Kdfnp5re4?Bl%-FV zeQsB_p5o@5)R4&QYY*rABdvXx4>s4=!dnk?fVX@*qlzzR=B@BvlQy*FKFb)rB00PaV)<67u|fBi_I zvCi66;t=FvznBgVLC*LLKFGN}?v)X|>y2SzG4@b7;tjFyq_a>i3fS%`lWdeYmYOwuDS>EP|lvu3dgn>!ufF7zmv1A z9_-bU-<5Aq#b#}uXE)Del^qLJYMq%|)V|I=$=IzKOK$qA5qdSoa2{KoFMDECsN@Us zZe`z5;sN?y{VF6TVA&tdGir(azn1n$KbObSN5lj4yNLA$k4ry&`d4h;@VW55#yReK z;ssl>KXXSYcOi6aZ$7;PUid*`K{D3l>~^y1U*qmk@O}F&Gmf9!(HH1XY%1>TYsu4Y z?_&#;ZwE2__f7i54mDbM+imc6oZ@Z4yBxf`(r!6ZRU^2ih5Y(bgBBUquWsjsJ+cIDqU-awOCV z?Iebh$dy!=!yDvX_M=nO+04w&*|R&qD>WZR70-lMPGp1qd}OF3)~J7= z*Ep}oxqIzN;ua7yz=~TSXZdU9y`3R(4)O{YF)x^B_iH)(H<7b{!#KMi9Gz7~{DCUD zhcC!EeTg?Py>PJ+XCRMw1hxCJjeFl}iESWp27=h`CANXY7pNt^K#=$bwZu2bBQ}A= z7?8X4B({OX7N{V$KyVWI#5bseSIzQzc|F~kuQ6e?BniJwaj|XpBjTb6~|V7{{1x;#_Sb zaSQ@6Syd9lK<+jPNX&xeJc(xzSi+N-2HbZ}Oc67#f$({VJJj=#n@2bUY0iWF&3RDb z8PpNefpe8|p17s%M|{HXzcS`U>?;4yy5B>EVIKDKKe=z1hr7bV1ufz(b@l%6X{bcv zBFR0^gOZv`tnpfkju50xhp`)p{Yb`Zw7S!9AF@2BRh+^HTg53%WX_b>D3=gJQ09uc zx0!JYlT@6-l#|3M9CnIv3R6xHr?7TV_{?tWGwGcePgb15>8;`v{tfwgs&NW)TE!_8 z+qKBoNO21PJt9={3i|x&H^Dgxrx@x@d$dqhf zr`FSSDSB=znoVvXgB-`=NC+xZFo9ABV$iEFj<>1)w7T=5l6@Pxz-OdWup zr{+yr5BvEa3vA!MT5&z&kV|J1i#+-&Lb+oEhWmoQ111KTj}?r83+0JzUdpwe zhOS_g+s9kOH`2cM)HmG}tR07Bqx?AUAAlupjQ4qYa>wvT@+5BD4xWPBn-Os9#kX=F z?RyGlbp#l4QfPRNcdaV#_YulFBrvQY?*YcYWstX= zXFtk#O2JkWi%t4hXcE9T((Onz_&mjx*oKdGUn6Z+e1wnQQQ^Cz(?DGy_@}nS*je-ecvVR4$^M3rEMl{CTY`bX@4Q@R?=>? zrL8AT?h3okmi7i|Q%SqpmbRL-$)ruPrInL*C25!0(pHit_eW*g(*8i&c+%2sX}>3J z9BHF%X~m>nLfS>Pw56ntBJDg|+T*1CgtQb}+M}cmCvAu=t$?(1NE>8Jn@8GU()!xc z?k8;kX>qo+yGfI~XL{Pw?jWrZI@LBF&!Qt?=D;3Kghd>wA*cI?^*EpM$IN~26>_@h`f+H$SylaE0#Ma zZnnNbhFLONV!p_nnBrxbf&-5Pg=eV^C%LCvaLREFXd_b}v*R?*qX(H&_ff__@22xE}n1usPAVfoHkmx(Vovg3YExyMmGf`^T{sKz9lWnN(1hnq~Yrw=d{v* z+eX?x(vELeACeZdrL7_DebTFVx>{X^Q65=+74S<32A>OZM#a-io$#(u|%cM zwmSQmI$rOvj@Q?qxvAs*#VSwHc8x`2>YPvczo-1Q77S?*k;Wt#_a|Fg47}xMo&Wa7 z(1!0{weo1+oxm>w{v})5EYgZddx5mcR(-(EApK#|OGv*|rC({~Q}<2e-$(vZRn|CL zUM_ielDEiK&sC(&BCW`lHj%X3Nc*iV?NZXFk@lc1%|qIaq}@xJj0y1*>&;K}X}N1a z^q3y}y7Ln~OLR5S-$mz<|Dr>Q&Lg^sjBU{oB^ISM&V^sIDc{l|JnFy10$l%wse^v= zW~iiqZzhAowH9tJ=g!y37q~s-i(WX1yot8_S5^LJwbLr>#7kX_RBF3*syK*~&5IjTMe6H5nO{(9-XWO7B{d)Tbb4~DX1tWd6m3$r9Eik`V zup-N2!Fdnw|5C7a{um|wxMiSs|E^F;1u#2-`BZ&thZ_!@;3siZo7-u%kJzt9yJFOn z*t5oaY`C4q`w;cML_OE4=Wu7$C92&o(np5<3%bs?{%_~MQ@guf>|!e=9-D$$<)~tf z7k&pHxo4<3AG*ukSk3RypO~xR_u;%J+1}|7YzszyqtwN|mwbCz{;xIvACdpVvyAj( z{GSGnI!`}wRaZbmi9`D$^qX(%moNV;H16u1%y|D9eL2^b_ayR6);mk&xy7|}F;5v! z3+2h0tKFC{WybtuwH{J(&A2!|xc;^}K1H2C!@BO{wjQ9TD`*@1ZInzk* z=e-9UiQj##?8gY7So5Z}W|uiR(j5H9D`ottaWKN8PnGf{ma27g z&hI1*+%>Vu{ZNoT5PFPNZ5EmIEcEy(X%|~`pxoOjPtFcrNZN%wf5K1j6WJzvDi+@_ zHfY(`n@>B2k$$!+qpKPt($>w~?ISc5{vBx5fzC35Z<4LDfV-cvMDE5Z82R>Y(qz5f z)0TDzX(EHW+R|o{Ci1PbE$vp)1Yb?1$(W3%PLW%Wsx)I9{Qo2~j2Or2j$CXRxw2;x zq<-uEhv`O|N0)itx}zbG@M6Cp@tWO^=&t2*|Ib?NP4W%454rEd$lq?}=exAg)?Eye z?smkQ-)!{gyX70syfuHb%J$8kES+(5P{wtT@tfjs%XgziUyW2x;8@hf{`DUHT`5!D z{m@+Bv8d6J>M_0{#&nf@6QRC*jkfKJ_dY23#KmsLhrMpW$H*^=_ueh}2e9E-ZD$W$ zXp`TG?_c!jWs+ZS%O7s$r*wig4YqXTO7nNb0$(oQao)!&mpz28#y6ao3a9lk>v`Ry zFBEv(W`UuZ@Qaie_^@CY*7Q9a2{-JPi2O^$QJG#(Gl( zo^u6Zya$-{Tj9}fkUVvli}ZJjOVO5npUcQwuVEXW#61GC@0;D*d!_K=xNtl3EqKl| zT~40Zr>^070rG0tHgi7AX|>OoS0rnhw)>28uaL19)**T(5KBV&+{E&Y#H(kt601A5 z;;7nVZ0M~O$ML@>b@kxaonJS8G5m-rzw^*l-F(OAb@v_5c6sZuSGzS&+G6~nQg;sY zKCWqJ44;)hW@2>A5|1P4Q>~yHo6!sDj&AUcYfxjQ>*mIQQEyzuExGJ@4)Iha5m$UV zwud*-Z}Ym~V~uRicWPB-MK?E+z79IYx%u8ItDJJAjM6RI&bNr!oP&L`+%<3vcHcEw zo@67vY=*XT0C%6+%k%S1G4~_qihS}^<10~+;r3)U29Vn+)VV2?!M!>I8x0$wr?1zl zi&M`xCU|`M^W-G?}v~BQ3B{OAAH#{*_kr5Ptw;KcBODoWa{6 zXZ1LPw?oeAy+nOtKYwhixu0Lpd|Gg(!@HF6By4cz7COW+Hu^9&I(uclmho|Th~^FOyJQgkrEK3a z4{gQvEjE>Pw@QD)kFoSgPiQw>(@VQ}R{Nt|s{<}4W7Of@bz4;N5&oAsJ*%r1JeIzB z0X}z=%yXgsA^1}bDafdPENgZ3V;c8}-`E(qNyCm8S5e;MvN7v#B_1kgz>=}W7Yuye8#vA&|b#1(Z5DL_%ty-S0A5u z9dyfuev`3tT?-#|Hu%WshZEo$fx|q%4L#r+BQ}x5f3)mveCPf6jpGSYzE<##At$2GWzPjUA^fSG@h*L} zAYB^(-Fp^f2=6@dIkAi3D~-D){V~XuXz12o(>?gY>}8zQ#B%1y1sz?Q_u~oJbciug zlc4&7JgYC>N-)Q&9Tyo>;w?PFcU^UP!55=&_PETj^Db7AeA?Tb$4# z8aj0K9WNqog2?Pvv>4oq7R9V}=o?*lRQfD~@`axbdeCNr9z!(FB@Y}U^eBye!JtQ} z>ks&(ISd(m34HK4Gzn&BrUhaz-2h)#1*UkaIM=ixZ~^q_53QmKu+vK%`WMo(pxH~v z_S)f|s@fRt99WyRp?0md!H++hKcOH)=8kdjRH68kKwJM7WHLNn06h&^X2Vxx8gT1m z|A1H-X~7sz)vVsyhTvMyhFM*-D&a>z=X~Mf2^#d)dyNN2YY)`zYw{_8n(zSaW64HTa2e2HD-oqenBZ zMfZtb5_nbP-a7aTKK2jMysNN_F*oY@a!(v%Pk73>JDGL|qPPQvbGft$-6*=Q6xm;k z+(3uh?#8B<(-q`(m%*v;&mrOCx`d&il}1NkiL51H+YhL`pSFHG<`t(sMrj} z$Rgy?!DRec3RP@|0^8kZy`hW5W@tS($lgp~s5#E5LwCzN{Jj;rHlM>}Y>F?D!=P;r zw7Hxyf0++j8T2)9&Fk+iTdD1=`hz*=eQWW0k>1ba8i~F zIy2U3r$uM?g~+|`+Clm{*U(QKXSLB!`p^e)^g%JSsMH$YteeJu=njuBPToVI^#Rw& ziiG3yiOU~XQG*}y&iJO1Ba8#+v(8Ez1TN8(BRY=E6VZ=&d;#$E<419P-gt1!2FEO9 zTPAIFcq{%MN|3z{(aUOB_wA+ZKhUQ8p<6)@_mz1I3eqEeCvw1`k-xvU1|In}G?M;2 z42_Q6^%njC4(f1Hmy0^XaxdhH+Zj}I(XlOOcn_gZiq0l{sBwNU={oJ;^qE?23VwE} z-936@U-*$2;h`1$R`J`&Z#%!;{Ob5M@r&UMbANs-HT?kb`oGUU!+UT`Pwv?0>HTg? z5AV0xJ-qw3bobU}clXwA>E;b)au>sF{7JHS&eZf&dCuV7!*iOZZG# zPS*5U^1MpZC&+UW{$uRNk8>o}mExn^7nvycaE0dg;NHic{LbLl%NH2Te47Lh!rK8C zx}7|ucu(dTgG`fr##*^NW3gAr6MZFLo{X;?c`|n7jzzcpzf03c7HVF(7wmar20tHr zmUkZi@20Plp;-zvi;i&CAKzccuWpR0qP zi=WU!Xd<`?uCn)zZiP(g>>Xv5e>}AA5Nk2fcXQB51Iv-aQJXUgh(B|P{tOm%^2&NE z=vw?7YhB~6mShKVMswHskqL4~iL@=nfgD=l(cQ?I0PQpQiS|`bgrB5+6L``-5ARZc zAL>6$`|i7uGHIJej2~&+v>UZ`6R_Q&bFUffALuo7#bjdtfZw*~qF9$`6^D=^HA$_` z_cCS<^l2(N#QFt2QeT68ab3|=0&aed1&wf<(A$(+Fue55^AnJX#tw}MZR`EBy#mfz+jnctRj&O^Qx{H$+_ z`Sv0Cc8>Y2=gOAfR;#uot8YEFZy)8``{mmu=C>Mm!U->0w8!VoprNL4E|t426z%Wl z+lS@bd8)mWT7K&pV18Sm>aC{z*0(eH_Cfjf0rT5D_}N}>DQ7=~-!=7ZGVj*6Q~CBj zzMbC_|NBc#`riaE3a^xMCP2O`#fRGHbKZ0A(MGMHZ?2cV>7S)9nxL(-%G!TCR03}{ zZY2hU_+9#Y7G}u3PJtm#eIoD$+^H+DW2ti;aO=JanR4VVkDe?#>7;^;eA4MZk^L^jBMOUJZiz?TX4YHtujb|%eXFeElZy*@ARwr?oH>M zWn~clGT)z0|BiV)NI#kH%hQ=FD}(Tr`Cgo!C-2bReE(fKK0=j2`rmwiCVij8W0`5a zm!t=gO+L~JWX}S*BDR9=$l|)D5bLdikIp?7TGxx`ojjd9*YNDb)6cUr&%x**U3kvm z8O75mkN=_hy?xQF4`jZoW#4q7qhHraj1Q5YvmGn?v2R+rf3`<2FxvfWy6D;>i%VTQ z(hJa;#W&qwQUFap;=PFXUFrUn^8PXJkMaIVy8m@~|CIN|ynmMN-&lZbtj;J{@C5J3 z)%OZA4vv8SI+6-NJ5Zff;eW(9AwQKYGuxL0WP0?Q%c3+Sh#Bl_vYSb31FrkHSZme)hpJ zr62WDa>b_qjqAnOFm$xX)7KFPEVvwAL{A$h_5|0W=ZK|L87z@;!yKhW*CnGH$3vHB z^t5P)7EwSP!9zn=JOVGa#v_$E z!;XjelZ#GzGCZnBnRs|cn)9HCcfn&Zcr<_qK{Z?Gi=i>vx-#h2T3__QCmGM0`r_~Y z6sjy^oM!S2uj#q3Dz>TQSDbS*bWHyMZ<(PVL{|)AT`c{B-rJ^J4g7~vuIzpMl5hX7 z$RW|A4!>&Z@hJyFm5r<;F9yHXbjgD*4J9UBu5Soc*1VXhJ9via5??V8x~xTqK!@C+ z6`W<$APnsqcKg4KTMDI*4~)!th^UP-Y>@Ykh z>xDzm#KHLVGnZ7$T4|%$Odi22}SF({;g14*H8jkee z3Ow_*z#FiaE7TEUW@FR(>6Sefeuc2_G{(r*^ng*I5x z0|a(UD_GL671$*a`*w8=E3Rkej{~?pC)p7ncCl2mc{-?0kX^cj479Qi)^y? zME0=H`#Ln+5-#@(Rj#Z>q};*8rjv5t<+}#erbSKCri2PPqxyfHN3!6NZU5VNorQ*KXH?j(D;2UNNH!sSjm zLAhdAZe6aQa&_)All?PeKDPL)L6ut{E_XFLs_-rCsuaF5=3Jh_$NnkR=zC8PgVv#o zUyqx)Amn1r#d|0eF5~6Fl;OHGjeWsUdeo(9a^Lq+ba-oQT#;<%vtKw;>hQByywb&f zeqE+HryXc17aPyO4z^q6?P-~JQ1Z5`yboLE)k@w*mA9#7-ahgg)}sTxj;!Ws&7X4T z?w90kK!0ik_axREGT*kQDd$PAeHoe>`%r4k|6tLM^Z7D1lXcF#%X&}A3%TdED|^VY z*O}w$+qI6dT^H-rJ*;8MWW5p9b+w$K^+!!yUAKZ*^J_KMew>$m)#1(Je%xB-i`q@3 zeO8^ZcLw)=Gtbm+=Y0<_%ultSX?pEUrvbb78`7BH_TE*HvG+iA#{PZe@6+`C2Q>Xm z&Ia#oAitjcdE|%4XFjfNBA+u4XBI9=--~V^WImTWLH8~Mrst&9`&p|jAP#$BVPSd! zvF`j)SFA1|{(wK`XR8+!K1$jn=|yr+ddyX%KhD0?m8*+5TUcRyb*r$?LAx#eSwB4! zTIXLlWp!ScF01|TVY9mg9$ucQ=RX9@!s|%ywA#P$dY+wmPUh+4nak6~^BSHS&ue)) zR;NT5+j;cs`D(1($UI@#P-%Bhr&cU`omW&VyDB_;gf#IJ%(2q2cMOD&Wi4uc*TdV_ z{*E1_kNq8+NH6<4_7Tp|7-fo%YL?N>i*2sCOv8_lcgyB2zJUTKd?t2^dz!yAs!KPUOBZX;jSY2+t(^rt0X)otXfI*t4x9{q9h zrS40p`}Iv?yVtPYJFsm!vE6H7+a~9-i9mZWpBM_*HkYMlwzX|yUrt*LZzo---R-_` zaX;*!Y2qtSx~|d>lKz~eV@FIoJ}(QqAvVe_nqiMUu}w1!m-t6w$e+;m8HNk4G}hhd zivtbYWhUzz#-(A0690l4#@(T-{zf}#Yqqpgt9TV&&VzrC&&vd_x64_+Q_=lrcNE`dp zCMi$&L*{+_lIl%2i{b<-1`)YS{#>M3KhuiXdr2aTW z+kZ!#f<;};w#L&|>7T>5!UHeKJrs_eeJ>1^#Itwb0R2mWOAetU^kB{Q->{DGF}T*l z8+q_XH8E+X1IL(c)*;TNOsT6t)n&x3{`NP!;@OMsQ%yZ@YdeQ{#6QXOAMXfW^*;%f zTn`_f46i>ayz;?^d;BU3;909rWvokj4*NZlZmj9SDH1ZJ*iE-e87xMa?;c}6rI~)#yme&Cmh#%}BA3m1N8TgJt3-Gy zzeiR?ez42Ruh12(zMf;q=eUYo`gYr2Pdwikatgni9DF5aaW6#b?>i=^M4n_q6Ok|0 zx@5S>DR{RMnNm)EB6CrRGjR!VFDsvM${ZF~@%L*uyT%-r=yL3QoBxN{*N{0Zk8eJM zFJ&)O$|zN3BoL$J0caSHZJ+_)2R23+ccy>1eDl8WH2ve~RB)~M0E_%sbd;Dv{0h5A=IEpe8qq9iME$>1vX=$(|;)ACVn^aGx`WwkSTkZ%x5!X zFCxNt6}`dWXYfB&e$KJ@nf|nN2|GXAc{C#e&&nKZ&CzzbeG#yNvoYr@dE)5YaxA7Q zm=n#VB8Q|8CC1&S^g|rH@G1Rpk--abM*NQ!IuLM?=8T>O-YxYa!AmgD-nZMc>VirxRQS*EW(S>$@9VeINe>S@wmdt+QYf zU9O!1_j|@^imUox?q2+kXYXE3SAxuwtG(V2fQucU3QeF7z2=zTKZ zKWX=5{4=E8eXtWoY&ZV#R=Xdh-G|xpY}xKECv0~=+MUBWh!kiw0sq{wO70I({-pC} zXx`^%urDHWbcj;Zu>gT9gT+M{tCG_HiV;-T^VqVLhiqO%45 zKla`{KC0?`{J(c5%S^(ag;mL-l7LGUk)$RvNkrM)0QZFi+L{opMXVL6GD%zlLF-^D z7TS`4t(lRy0SfJ>HGo};(*6L@nKI}vokZ`(jASNz-1wDDGq3Ud-+Vg;p0r!VCKBx(=vPidy=+EXt;CLGEv8`${WSjQQqeJIA}12FVQmpI)kgYInCuDLY4OML$IB0LzT>OA z`r%*OAKKFMIgb}P2jtSqr;dyA?92FG<+9pRs|y)G+tf zd!IiNcaZdh6*^~*9KK}T^KxAQeuFy=pYVaa56aVg8}c>Z9~_>Sg)fJ&MYsm*Rl(ST zdM#S34{}bTmiyPVXlz_j>|^%Tu&K$}5q#MXv@bnck)K_hpbZ#)t2W1r&0xXJ#`BMI zj>Cb?jq^Ya`|;=CtZImU$anksj(B(K9EW@(ZPj3F+v4zS;C#u3Ef;v!ht@=|m-wj; zC-%vq-dubSu(cKN)9ZKPvwpNf&&Jne!$haHp?S^t^%F;H>qGbm1!ME-Rat!7Q^dDD zHqSo}AJaVSr{e$q#uM#Jo3N+6$(((8y(cVw{OXL%+()=45&2_oY+IdqHbKr26b`^P zdEm{QLj3uMQ1(mq_2ewdQ}}D$6NAsMS@r;Mlkby}TYlLiQ1! zg+1Ud{vQAaB1?s^FV%r7LB6&0;j5X$$a5=4Zoh{3Y*%-jU+Fwcr2F1FYQzxuK65R0 z3F+Hi^i9^p7&A@A{VwJDllDC`&5(H#I7ej2JQL~H3P+N%C0H`x#!-gcr(`GU=*ND& ztW7_4oX+nweka3WsbBW*1P5KL@U!x7F!R61GmY+ZP1fRK;45o! zs#T74)Ji!yBPjJo>K?ZP*Vjy&-m41kNr9asZFUg8KbQ6e2i{RnbT#V!KEG^!S^U}y zV&N+T;VXmSD}%8u4#8$H6#L~c&auQQ`z3OI_z-;-zc``igII?lr_(o>r>x5%tjSN{ z3;%#Gh#cR{+Dv*#^9k({`q>?y*w`(fNC>q4`s<~K;S-?&2A|O6p2V9tBf|5r)0wS7 z<5Qg8TtMK64yX8*<@it#_+>T z&dyeRkW*WM-yLTgYbx0PO84g0Rp7@wSqs5d>eDi)z z1H8xOG%qthjq?t+k(v1LFQk|kBK(;kbHO0T)(2z zzlu(u1s{6F#H07FFznKz)4#)i@fq!D{XXwDY^b~YXw@)*y8#|`J?D^Om5m?&rx&%aG+(~*<;e0CA*W8*V4Rf|J|w!F)HRy*k-_^S z@~pITNlPc~VJnR}?n|4(f4!v1Sz{@i%+qcUf0{ALTKk##ou$M7O^rV}(3^E6x|zk# zZlO-01*KLyz_doz6l=^uo~$vUDI!npp-d6KLVoQ9a#lT_^~8B~zES7Gz*ku}!oyr1 zPj(&m1h`W?{*lOtaULx@Kz^WNXx2TzrFtZLx4>iVs2smP{SyCc6{od@cC+`eN^5+U zIGc6pdSg86PtsgG|1)a5zZu`7)zt9<^1|ah_d4SOEzZ75?%#{g@bjbE7JWXX)83V`Kcy_<>upP?^jlV=RB%kcB$da>eGHri#~dG?Du%-r)b6{O^?e z6uutd9#mQX2ckOVB)(H}(%jdToOEpd6mVlQxL};y78xMOSbodxltSkU}f%g*fV)?}goSjb2;km#uH}!GGbUrZO?C3cE{2?)jBjw^l$i+{A^Y6FJ?~sd+ zxQ;Guz=t&Wi6Qq^o|Wg9^Nq3>FXyCz)6~ek26(BzKyMraJ#2C6zUz2i&s>PC(jg}& z=~Xq4KA_}eOE$LZZeV}01-WM;@s1a97Ji(ZlP1mY9Ga!|Z^)@ZF4m$Oa%)5`rv4h* zdT6tpZ#Lv&`Ti~B;N~^X^=}~;Gk+VJN8sNeGBtBtM?LtJZ>Zy}duUC;`nn6W_5O;X zZ5njcn&&3Y`^Y@Mzu1`P9nc<`!wJacur%U_J@h zPh@>h@G}=`U5DsHu}$s`n)D_K+sgakrtk`hL%VK@%%@@V5jnRKeNxJbtxt68rhJpC9~f5tZeoJs(vqB?LY8J#;B{E>N-bFa+@^p{Jn{pEhw18*&N z9UH$x_PkyA?y56*Bi#PbG%b9%0DXwx?!x2ou?>9W?8e%p)=qr9j-X!>%+*%|25`NswcUgj$tf?D$-ULow%oeiC&7;9* z_N6`WSi$EIZE}ucLrCy>biw)%_$=o$3vKvp>2RqgK8p^g@cC}m5HzXoZoLzqStml1 zYS29me4fU9Pi5Y(Vg9cM53Yh=T?t-C8+c7$P6e;qCwIl`2@!Z5j6J&aGaFu?W8$^I z!)@aAU(K{gybe*f9j_ZHFL=G#ssp^PHTlv6aQaWAw^ulzkui)bmho{Od_L##Y0J{P z44q5!2^|yu)C{c={Y&vF>h6%`pk=|>{I2*?!8}5fFW(}15;9qTZGfDUZ-8!!z8{1} zLA$bRfOP}(Okmw0^vu$^j~Vo5T~+(if0=U?ocoZeXGg2K5}iZNp&Rp7Nw^G2`Z z^_vE8s3*Ol9JmW@c%-d;=^2bm&WKmq^qQbar!3oal4+Z+QuAr-op#a3O*(alsy87} z+f9E?q{rN5_Gc#jIaNL88uOcL`R3UCiOlB&=Jj&$m9y*>##wgJ8D#%ep1sVc=q~5; zjp#0Jo~fi?1a6GsXX!4PX1>mIF!|?_C%7s3660bf{8wmhhM6XI_E)Lbu(Kxx@_>`I zUn}%=q=}outU5?LV)F23X+!2>1$l}5+}P^;)E5VB4e)eDdBQ@cH0Y?}R+K^rdU zth5owQ+!7zQ>K(}&{@KMY=BmKZd-eqx}%ZymMp>!=$7_u-?;eCon+w&^g-F=u?M=a z2MS-%q8Iq3-QH(-{G)W*#727s?XHG~KF&Tuz22wlg)=qZIeMRMec*Quy-#i(n<~p^WJ%1WAo68d`E6~rwB>bl?p6GX_R6r$8tL!~a}VQ5 z(!KPp23lGMA1dN$(zI{M5q2AE88ETGN5aoNw9_Z$UK4&3hqMor zcrI2fmpH*q+7TY_W}hw|xVOKc`CG7iwvKZ8Wz25!CNO_OL*;yb^9b+|{4XCW>vlYA zRaZPk@VsO0dUx(GU2nD>Ka_hN>}71@y3(3oTfRHFv;UV_`SelF)$8Ee8G}4W^31(Q z4SW|2rD!Oy8ucLoW^OOvF(3WSlZO4(l-Q>G$^Y~eJ z`L;RyXE*tl4~@*t`)2-6R>qu?e-iutFJ|VQbzH2GZ|k45Z^X&{lU7H6cmJfL7YRQ& zb^oMo^y@m-;EDW`9x?kR`_13QKj|LkKxCy?BK(u8&+O!Pv(_1Uh~kNx;E9_=4@nBV z!MHkjBK+=t)5o%j^4HnFnc3<0^q{R?;gP9opDQ8oH_A`s7fHMCq)y@M#38RP+~o9? z$a7`1?{;~X$NGLK&zWxDEP3X~`-u#rOS7%Jj>%d@Z=g3PkP1&hcWNeq2`@B)Vx!NHSg)bn639xpPB zH7CpHtMsoY-w}bG#0z5n#lPvr%v(>5&WUdk{trv#EQxQ$dh=UirF8g22|tLW<5vJP!TSkvr<95J;?Iyk8)}VG_a(8+W4`7)$b8D0 zmiEO)FY>ijW{g>84`syOc^-2lb`0GrL)~XnM)3P(^5nZnKdO3QWA}ebpe`x@d&&>x zSHpal@w4XpbaTEV@zKJKLfW*-CIF8j-70JOQ)+5W7=GPqJusFInpUp+u80zNIehy~Kks|#d+VB>{q6*ZWe(iEIUkIV z?+5fTu?Bj+Qg3`YtJ4-B^63QnCF7E^mhW@qoPOk#HG2Zzrj9b8{dci8&r$G5Pix0>^6m zo9xkjhx7HuM=tAJE5-OeSoPTbMSep)g=so8rt5gy@rx7ty^JxB*hq!&)a$?}!COfe z-1{isXh+s#DQz7h9+R^7@y$5StVq50DjZA-L<5iefycZPz{HwI(OoPXK%y5|m+Otg zvb�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%0AC?6PT(<#_voztbMi z@vhmNW9R)#s6%M}h8QjUngg8|S--c$oq!%)B|6BHipH-ELX#}tfR+D{JCEW|cveL4 zE--g$R@JmC?wg$3Z**YI-F|PyyE)GT-v($}eZ};)dgK||&!`)9x8MDn!X5F)ig&C= z?%d0ot6?5H%Ci2XY~}-nJ4$Z7VGaCyB(}0Z-KY!v4YDpP9w+AZ4Q;F8D|Ho#oc$3w zJUMVPW2<3Y0%L(u%g)QQtEOG1`qQ#z2L1U!b{8yN)xLLRX9Bc{{opaYSk)W)Aebj(w)1RkF7@G%!nG2yH$9{S{swNuRF* zmQoM*jzgOh0_RJ4XtPV+Nw;Y8O4>ac|M)QJ+wqTP`Y&-%r2o?Qg|yWwGH3*hnt_p@ zc_?8oz4QUsv|m$B^jML_y{y^s%w@u2<6bKn%Tn_$^{1^g;P^baHIj1joxta6DFbYN z$8)TiE^F{l)R)BjC@YONZYNEA|Bh6}a<0>=V^H7$zI6%DLO*RTMIR6uB!XwjzL08j zv&+}c9j8KzLewMnWjUi{jpG6OCvjVhvN67L-UUacyy%E3owYIAOqX{_7oAPzG4JYb za>n!%85?E)MZd-7aUF2jMw=(r!{t6aBc4kbyJQM>whVk$$D(W3IDO#xfVP^=&c>_K zp{=Iw!=BW#I?_b<9FKjw&UsB+F}ywn{7$XdLY({P`jm>da)P75W$Ki^R6~Qr4kB{l z+E3>A{S`~HGM=2UJ~Rz_x_RpQ(CFy(zZ*K&U+0|OmQt~m{gkJ2#^vI32CXEHFMA-~ zsqp{olihtb5?pDW=Go9XS=-P$di?syMHjh+1~YwR_#7pt+$-K(_~BIhOr zu4U|E>qtXxlyS7T_wkE8K=!Q!hCdOWy9%E>_@<}_{axdj2Zsuv$9RGwfMc1C%7Md09 zmwhIy4_DdxP?QCKQu0pMKJ;hL(dt7UWvp+Nd|~##jC8BbnfQHz8(Hfsu2K4R4S6L_ z&jx?R;PoY=J?k^q^j+_b6y~Ib9Id2|~-0mC*@9m#eS8?Nd=-q~lHCL@K9<8lk zU(vrUh>qor)#?SdD;e8v;2<#mknyzvW6$Zb_nj0t$epe7-f)_>&Vpx+`HjG%BwpZg zuV47Q!0iLa!es(S?>Pn>wPC=~gn=;!Nr44?BXy<>HQM-x*+%fo_ON<;FF=M!XbZvP6?mIfcMac<}CPeXD4^a z=Gp^40|_?NvzdBKYycdM50Ue9|i``fQM`>&UFWn6-H zg(5GBJO}>QJepM>94+hR$s7web0{Nw1F!sIj{nt)saYvcZple~5*i#E3q9JJlXBqU zod3hzyT?aaUHkvfGXrEM;hq~;lMs~z@Pb^DXf%_cH9*yJv3m6Mkico11Z|soMYKtX ztqH;E2$dtYB>~%JMro~L6;FEzV0*Y|E6{q5^|VaD)=7d@E<%FR{NA7Ek_;iSp5OQN z{k?vF%`bW8YJccy49*$jW9Gk2}0&T!%a_;x|(*4yt2 zP0hUi741DdyKKSz9k&}RG4`P@8HuaF)vxm-*!@n8h!36K<;m;5f;+M~6aMb{`Ju=hGbmb6{I7SwL))CfJPQxl zBu`z2?2_IzK;I4`FQi|Ku4CyYi?n#gUNmtD|J&9U}Hcx02cy?rQ4{b}9{U~YK zr)yvOA+X&9?2=8wWx#9mUzY3*1HiclIOX@L@qVB4(Cydb|H*iry#4x6M<#j#ed_pG zV1?*3GT!d1^!S0sk~nqiMlx0deZQ6OzEAo71$UgFr~9}A`dZqO&L`b)0za+SBzyjj z?kK;tq5M+ZbjnmvM)h0kI^@Kw-OsrfmNHv_ zNwEHu{F(gv#!ijmdni~B4V8b0vG}jp!-$djq4CM!;NcYR=Qb`0)^HYcUmY=LjKGR1 zZ#-(rtgtVTw-5P+57#_o*c9w&GxdEhaWW*+tnb5OzGEi{87+BJ(HTR;!fC_zV9E|- zLBUJdA;->rU=Ma2>HmWDFn+B^@Na$BJ2?DhXh~yKfj@7Ec=Fl!?^ZqJtqcL{bHK2M z_i6a^R^iXP3wu;(sGX-Cf8M$H^A;3hvqx_31BY|*>5XmEC%bB&_T)?Jp7B)-KiS_t zkN9BP9OTxz&ZVxiQ{2R*NlF?Pg7A$xRzIbmOKGKNY@l=rwzid4g?cOnjdBctanIfLSkK0PWyElC# z>Fo2)Y%Ic;0(hgfW}ag2w$ji4z*ZZbVXqOewJ(;fTl%W}6b8b>#nds*!9(;k_pi(V zAJBnhOxwXgUId*x@?uSXWD$M`i|{e#=H%>=i)OMP)&rW&(ALTmH4ClWi@IF507MvzJ zZ4@7oD6%k$t}6S6C&7{p*7rfki+|&Mjs-t=AKvABPeoR^eI3OA$J{*lu0$u>baWqm zTuy%K&C4PlSPOK!gEfTZ@8Gn5zuHGf`Uw1JpG@?64>TwrsaQC4zsS8#8^!q8xNZ0x znYDoY-T1es3qQkcA9LX`8`&@2)t?Z^+Z&_1QpZev--GP$`Ht*&b=#~V#w>T7eBB=$ zkS(Z-enk?|{m=s=iNE2uihHQw0c-~!eH9xIafK8+L^g?c*B25O;aplcjXo$mHnVrr z13&d<(Fe*Rlf^$aZLbC|u`*d><~`B9UOwr-y)AUnqYL-EVXqfTY#P}X`Ze?1>szcf zM1Zuu?O#hf7dbfeor2%#PnBdI_`YYM?j1XqPvtAz!>fJh_MWeJLONT~gQLHHa6oZu zd*8bcw8y@8cOUpG@8Uc4{9K2wpJt|Z)MCr2L;p|1M>WcS`33GEUIugV)^qWm6utzUJMf3@2hYM! zHgs1$$p~ppBEQxYexHz@Lwa{N_gWq@LTB#6SL&|8q0`t)xWjQoB*!=_c~$65X^7y5 zq?k+Z(9bd6u??Mx`1)dJluu17BQi&M z#ph$gUt1Qpt}`*vbvgmv7JNQMJi~MHGsnc{UmBA?7M_=ZCxO2BfGG-0T0iN$&~h_% z-;ymxWhwMiW%@b{p3-}cdJ-Bs&?hRATXJti9}54yd-fYK=amkj-|T_z8#u4@b@ZE? z&~FZ*-{=gJdtRv>{U(flvjqJnpuD4u;Jfsp!EXe^=sB(WKg=5!x01u}&f|RAW?N?U9mCeRK-a&=^^RjJxNJh-bk_#5r#<#=_E zK5)}E9yx|zy6PYv%S(zaV9m+ZmrBq4uqfaQHZhmq`W<{IrGL)6%ua9g1x@tNg{13z zM~}YEI94CCb=%W?>#Nshah@m5^mb%oC&|LkG0pUJ;9tI2JX37=_RTlE4bb?)Ylj;% zkBl+44u=M{E*uH0m+<@m{%G@#41eey5!QIR|GUkEjz-p}#~8Z{FEB>4eVucR`S5ac zQ@@z})gz73BZdU>jxl~4t2t|i9x-CL5gZ&J$oo-}G5VsEaWgiy*y$gb zcD|oa8#iN=51qA$GiJ!%5u=TuTd#ObYoHPFMsU=~aWmZXHpWBpeelSn8ONBL-SiN9 z_XWQ|w`OiD_$e_Gc&6{P`TQAkQ2c9#!I6>bg~Rx%PfhG^rcuwKX-4G{=spdZpl7;g z{1wK-<^m(jm~LFY@wPN$$Z~9}+zE9_Jn=8%+lL!D!kb%9>8b9;vO5=ii@6_}(r6m- zEyM8Z=iQ{-0@GNypSGvOl-Y5z8@}*{w+uCMR`aW8-Ya12Cb7;hE^D*&#H0Azqq98! zaEo*n4?2rC>|v~q;1j%v@!!Qf=8mD?8N(0BC;PqI&unu9u~0`gqpg=p(AXS15oe8!Vx+SV*O1LT*LRKciy?+}&x8D~OF1J`Osv@o!@qAS{9QIh zck0+NlC*x(ng@P<)3EvcO_$IA<=YmYzv=M#n?(+v-%5IStRm*h+C6>-wiOW9ykY?7vy_*SL-&lZ?gd z(VL?9aA-crV$Z#GexPd>=PQUQzqMv4Iwf@}_MmNpO9`WMGSA!fzDK>MsQ1YU#@0@6 zaY$vG1{*KwEEl*vkl`KIV9SbO;d$oReFez=4AwVGOwMd6&LRHzQ@!yG^1Gjl{J2DG zVPyYv$o_KZOKaQhj_k)TA@4@sFLlnUO7@p?R#kcSAp7f`wQV)FW7fu&?5}{9>K)l% z0eybgTDK0jWWVOx$o0TWOhcbR%zktH6=~?_(h)OR`?W&5AJg|JeT^PrE#zgMwf0OhbneAT$M0aB_T@Q4w6%n@XQjj{YJB9XEhYF*H*!WtzDLWT5!T1yVrRW~ z!x-jN2ge#S7q^dt+tbwbvhMEyuRdgeH6N`+m$TYSveq}L(4MPTe4DzX*v!&7dn0%s z!(K95zEPa9*7>a(&EKTIG8`MX=6J8pz1epUM0xkgA0@%)+KFDFd|ER;iv1*~pE`aL zQ%8t3fuFk;V(Z`>rBg?0_(AH3(3aYiKh}@2vo?Eg$@O6a>90?R2OH}q(U%Z@2w7c$ zCk*qeKlGsknmmp4(hGjX*k}$dN4L~oXImocN$xo z%4YfB`6Y{L@=Ip?Cch+s^`wKtM``PMi?%@5&f9{lZY~YQ@(YfM^wn)!!m5wiaFFJlC z)1VxCjMyJdXz=i3==cs@#PVFcLl>u+=hWsW(1yk;@x$)*6F%sEX%aB#9G0tFo?Uq} zvSKkZV-d1rAu?nEzU5yaPS#*MUMxH+S{Veby!E&4m%cp!E*=6GE}h9%8bEjK#<#>P z9Wpgw#ja^ZrzvEue}p>vlW`Y4+`o)VBi)+I(k~6#>uxi=i8NQA|DO+Ry=F&D+I3Fa zFG=h6#vvb5=vyj%97A8n(&ur=$MM9{9TK#4pTQl=*r$|DNqYW~S|gOlK65@}xzRhQ zqnK}Juyvhaj{G>&6Rc)0ww}G%Pl!RLcyw)ce6wI=nGyU6cVVB-B)0Oh!n{=0-5>dl zS9!nzftxCa;LMlD32J;FQv`EUkTl&d9!D~ z{HY%2dvop0)}D3=``IPjsb0c@c$%q4cg^eOy*5*W5?-vC{5JG^iNy+-~Wja}>; zAiGO>x^m)i`uv~pMcWMaR~X00i;Sma)xq7^zSyIzO@1Y`D>=86eU*sr>swS$o?quT z)~?UD`<4`5Dtj6-)G!U*qt1Em+oAK@p!a`*?r(+uZ-KYJNG#|$i?=_*2G*E)Z|Ftn zqlEo9i)vK<}FvPw6Vlyx=LbC@<>A?!@@(j_xdQRshakWDJVYiG*+E7awW;dtD#g zRxz%|N5lfQS?t+;utb3=@$#!9+`XweT|zeN5Qkvk=c(3of_5gLPr8f*XC zqM^3fv11Qd?R=GXqWz5BNz0yDlvjMbdzN6>jqT8d;o&|o$Q~K~w058ErI{VrPfwt4 zs_kOhR(yPymSbt>_ip=tv)ey`O`!PC*u`ULD;5tC_V51@4DGb#(rzibi`ttk7^wRl z_9gqH$0qvv)BxkQfp1R?@NF&M8u-@V{CnN1{^#EU(zPe&<#&!v0XWaTZ_mAl$z#pO zq`lkGy|ozU zG4r*)bHC4z{SLlf@{Z@s5iwuq=zLmIcms09Eni4^cR#{l56Z2hCZ>)i(JFfmzO&u4 z4D?3X&mxZ$;>&QgvCi$6cU zJ5Nz&95Be9B70Pnxi2ey+|!Y`LhJl%TPA!yin`^4KLT2I;A)MjvxajwU0zR~zO@3Y z_G&KII5}|j%j#uZv?8rE;{ zlM%dtHN}2#9(e@an*Ac#&RbU*TWna8!fWAc?9tfGiNQ}_(=8h4KX09rSGLbA);?|E zV@9cA#Y*it@4d-7Z~Up}z1Qw{&bA;YccXJfs3-QkLIdCb(b>>J?k9AR(K?eiDu$8Uub)}kfy*QGyY_`FI#9|%wE zTd&*kDc{-qT(|90zUT4%=X`f*dUJIgu`yhq0{H)^eIKALJ5s_2kS~%wwrnwii`s2j z@|&8tbyxB0_R97#9NlIFI?hORol(e^(a09!h2X!fJ-1Hu`Kz#LuDn1oExp$MTauUg zT4$9XF}KulR#|a8Y8bN>#Es5M7~9~%7f!Nd1Tt$ZYu=|=U!VBE40RIw;{^7QGuZWC zMK5jp;M!0W`q%k(or%lmT)WN<-&*B+`V{g)uoLT3XNHfZqi^n}tu%AIwYRt1ITx?9 z@U7kn*igoY-=|O2oTL1&O`Q3@0G*vPfxC7Z!A{mt2EHV+6ZoK)W@33XT4$}jTN=?@ zMbk~Y%>9RJkqL|=_gAj}7+ZZSc_lBn|8wDHU}?U%C?weyiSur0pGv$3&Vsh{tv%C| z7mti-ukwewGvh;Tx5GpDdM)u1*9G|~yN2#?c!B*@^<6mlco}!c(AVOde8_@pkp-L$ zpUQchQPo$sp=_*7+mCEs^2d^Y-)HHYPqq>Irt`C}az+C>-&&S1zQG3_tzBvalbekFqJ_JlG2#(? zs$6*VOmcSle#{FAJvv*P~WyH_-@(4kc($mE`qlf!ea~IwJ*SPH?f|$kvY(| z73{cJ=ftp+uut#Oq3HHr_8wztQ8<#UYotB#2~qAk(9flXX}8&BW3t0$HHj>n4v zmjw;(NtuGYkR8=Zi(IO-117(nRdMUm-LvlK0>4G)kS~h0-^=^n*mrp3D{bBDWlvUp zRvywyNfW%P|3W8S_DR#N2blh7$)7Rd>EzXTJVU;*{La6#7@Cw$<28b5nyc71)!bYP zF9~K#$FTfQ;TddG5#ms_0;hD057|rXd!KOM`d!^1-D%^7m^PYd!v~JruzO(x%hP@b z__k!-xostd|3F(YHZ1&au4jyilg=D%`QLc^-o@P8udl?k`C0n)YJdIOb?#l~vHc1V zOQSLFnk@nR{u{kN%(rwruepB`XER;>uGQ^pTA-_db-ZFEs?Uk^d0?Gv0y^0QbTV`? z{74!X{lL=6)J7BaYh2}1a4ufvffw|>UH#*wFWj0}1h>XjG@!9PiA~g{gB_BoedgUy z8z+1j))h0RW#}m9jZv*|*c;bhbERl6-N9eFi@#cQWcs&E_{%((9>oi7lUXnRjQK(K zNH6Qf$*dQd`KfDwO9)~|1 z+C5<52Ho}3aB}gvV}!k<5AF8BOY9g$GmYS{IKvc04%M;Fjyz)1TEx2xTW~KOus6q@ zF3g3<-LfJhPx3%{p$+;{$kW{7-Z9XNgWh|(vhZU@H-0=jb}q8UFUAx_X^(SC+WVg=3VQd49Yk2UwXOwZ7=WblZ|Zo*eS-K$|+xzbjdaS_t6)v z<*ao6L!XvU-cV~id+!QUo$18J$<7i@ROh!nYlh0nul+6U|7$JRcO7Ssv0>9bc5B^t zUPu42l32Wu1stuJLqgqEadr$EV$o<`c4L;j@mu2h6GO|A$&WZOXyyZR09^unEB;Jt zZP6CRo@uQO@MIiV*Z3~9*A9{gHB)5sP7HG{%Cbqz9klXp)j4?J{XGY$+kMzB6P+r8FUp*VAqWm+E*i;nq9YZ}eT(aE0+wL_=G zrP`-+6yk~KS)AP)HT^;zskSw1Ue70kUL_*4|_g7 zbQInFT+Eudjq;t)NBt+=Go?ScFeb&osIiLnfzgI9DSVoFQ1E5RcLduu@p_5nP?&cY z?M46IJyUd7;~BHhg*6I%QDCj(DR>2IfU#13&EFa?cWkt-?p#ugenG52uf4uT?m}za zTe1?nL9Hif(HUz!OUANa(@ornZttLwO<#kduOSwFMWHjrxO2yO7W5Snze_Jwe4{xI zZN)jX<#lMwYtz=*mFLQRx1M_*ilG;H?GMn4`p^hnB#Sos!0VG4t(O_t$@o4QSgU*?w~cu50(xYGSWB&(U$fx7-hr1r!&c<99gm4MANE;0 z9uqcW<`wb9K(K!<7Ix_J#}4e3!2MUg$v33$-KN_25KX5Tfv%3h1n zT>Cp|w-LV|{re!aUybg}J(JdYOy!@YtmX!-RqN2Vt68^}K|{NXWbf|1YslS8-TlOiV z-?Fm@D4XS!JxV{;G!^t)wve*;sRb=whA#X!daXOBqdyrG+KtbVFJne$Cd9{o;M=nW=gY_SW?%bs3q)?6ofZgAy$ND#8D6f`7V^Gt&L` ze0;FU>35KCjh7oa*uQO@42=(Futrn4)qHEY%*es6pA@;2HTrBjUg5)}8>D|C`3^n= zckvt><~I7@w%Hkn(&>zY;Ed^i49q3KTr$y^{S~+E3AV48+Fni@k*P+`5vL6c=c}AC zf7N4+cSyLWE#bU=mWwk7_pO%&r%|?F+Q$D#v~AH?=$d|MEYpSQ^Fw=h=5xRlm~7rPR5B`1du`k1G(;#<}x%G8lL77p;?7{R`JY7(U z?>75mQ)-L_%)<-d@hg^(YPoIsL!L#;{l>y251EzR(L8R-^oDU$X~!)Sz!v*i%H+nB ziC{&kSSAKn4~D>u(#U%Yyu#;FV0 zvY2_?YO{1!FnR*Ll<|md=SIODZ_MiK7!>;0`F`R=FO7dr-~C2T9^;KsX8-A>+<(Si zu~lblZ$J9hn@hRVz}FIIT{|?!hU+g1+Vcl-zF{Ma)SH+;ZPb4q_v+>sXKs z?(F_dqV6?r`o!cQ_x{>>jwSWvSxP;%r2Es^Gb%BHq0EAiJq}j|o577GPoFkIZSc1R z|dJ84^cTUNba?uF?v z>D+T=r%&%q-$eSYZhBi{aH0Eue_~I6)c#FMk8S@4iFW&qdFQmR`W}NvW|80Of57g) zWJY|(mA(BZ4tr1k3ln?#Z{sP?>c5K%7xx<1LDWCdg)ua`2gX%=!(L>!SsmM^jdS_! z5+|j%%^ODBZKh{AJaT1kn-BNaD||jo|Cd<&(rY`h@SA*YKG|Qa^se4?!F<-apZ#x_ z$0hZ>e++vD_Hi?uZ3IFYtQi%1SawdWoqc~A;`-b%pCpEjM~%)>)Zr=wXzTNUt>4}f&9jfuoWMV zZE2$hPw!wKKJ5>KDv$CU1C5T!92Z2cS2iHm$5Jt^*;ZO!I~ zO>ZW#k>;!2W?)LDUAw*H@XPeeX|Hk%-*i?88%AE*DDL@FKm11JA1;1!gPUJ?aPwb+ zedW*O|6ULL$>Gg0-;c82oaarRFZeq+_clAuSa9g?Bc`vR+{;zfqyLR^QBTVJv|~nP z^7Mb>o>So0bPKcK?0EsI;!M$~&w$YS?XwHBnDH%3sXW_sKm6 zi)F{)J%j$5l-K`4zU}smw92kwALXqf#wgz>cOTULEI@f`i= z8`E3k?Ssy;usf8q2A`RMj6$#IxdW8-*-Omx>GWry7=M4-WA9&;v46N5`YoXz>-;|R zl?Q(L1K-Qo2lWAe3BKn2-3|Ksp7ZZ76I{)dAr5ya`y$`dbMd3k=FXmWuZMFA@vE_U zHJIE>TrJ+{aUdG#*G|jjy|v(G#|o0Vm`3^J-`|8GR}R`{!xSIE_IU>Edo- z*#o&FIe6NWvM-H0SOU%#W`y0k)=$xD2No}a+ zzS}bTjGnW^N?oG2S8jl@EWTty%89 z(ZK3EoBH%P?22ZVqYHI?=NOgJBm+!0Q-+iH-&sZ03OvhAAM#_i+xYK_f%tF zh`FcwI`(m{#a=rH8)Ff2qmVt!-!xxt(OduDL_hjzZ{y5Yy_6e7`N7n~eMl?0(`=VX ztae|x#)>~~$Fs&xmUoDAL?zJTAaj-p7UtYk2kFb-zdf&lSOR>T zLLJ9iXfw?DDeK#@-fsmf#(lGdb)}zrbq>#}^P};>=PH)x-cY_g_iNDNv*yrw<jQap`1;-F>CDN9 zv*)6>`QGg@m$!HVXVh00rfYTX#3|QuAT>Nhc%2i-GXtd;AO|arp{2M38A&jZym0k_+g=S)EmN_m@uHave0l9UWiQd~fdunm)t26X5@bJgwi| zD^If|GyBNX*gO5cwflUzskrN(cAuBMFXjuEA|IkBj2Cu?S08T6FN_Z=@aaCD0BI8>H~HPS&Y~z1ksS(QZ8(qi>Vlb(Wpc(vle&MU3>`jqtt zy14Ik>#f+KMK78IuK^ClZ!AG}rPGe~SmZM=zZLn)j$HvA@RWa(3zv`isO(#uu|?PZ zNB3WyrtFxmZtUASCp{*7_kD5ecA~cyHHsePCyal_{kDIC3)6D)h!?U)+4}{Pc?y@3 zwR%bxpFr-}x=l*>YtDVN_A@!WhWbo?n)`g*_2+}m{OQEjJDl2=X zfpT|HZX^3Mn@N+tKa_Iu{M`C>!fTh5-EseS8P6>lzugcf_WT;NiZTfuoA@@h?2gU_HJPg{i&JI5ZbY4@0yy|*G?mSHF@f{?Ag2TSNrxRJVR{qn%}OCf5r^; z?cXGP#)my$6dL|qVd%25vd*LC(7nIqe!(~1cw;YjXf=F;|I2s0zV~&?tG(}!m2md`k2owJV_UQ-a|cRNcd_-x037>UR-<~rZ0DJ25=g>V+!sxs31e&v-+cOUlTXMa+)nP2Eou3{Nfyg?1VH_Y$XKUQ@32{6eA4&U;24?>p>mIS`P_R=Mf>8> zlbofteQ!{*R`FPu=eaGuBm5lUvv^}zMoP618z7_xUB*wGY(VZ>-wuj=MZsUxQcr}WBP4nFm zWZWz8dDI&SNuQOE9{#E?=nS58l_vTO+>(2ichVgTKy&X8`!$A8{`H54!mWfInjZ_&>{- zaE9-N@|(YReD2MW<5~}BOf*-uGcFm#3@eHm6X}&c()#PuA{WL1`t(YlK3(tTAD~Z1 z@9BR`K2x9GGhV3w%6E>JeiwV0s2(ir%$8Z`~&pqVoUupQla3TL9*uQKwoISbuZVC1!3WdtjRvtFnf!@O}#h&21XX*}-*A?(F(W*2&c z^N??>5#C&0Gs&7KI;Ju=)Y@}{tEtd`w9W=c&)Yx2gG9|FF2_ z1&3%b%6*kK4JL-0D2x6-Tks}B2X&Vg=4w4%3cj%ESiW-6zYJXON&494_A#d32I`f* zF1;gm9q6wAq_dstgK6Uz8xQ-Q)suk))T`OPTxc)x2bR7J4!4mtBqh*@MNatA7G7_aAeh2lM!s5 zoF58LzM8vUO#WZPQ}MIS{r`>(I*F}C=LW^+%b|0{ODNA9XT<>wFpl%gq@(+z z$FLVW*%}XbcM^|h{@FvhihtfgOa|-y{X@A`oPFKP9-!WD_|u`>?Yze`_F?ip`o@yn zpZbl_H_*l#{&Cz9J~S-dZp$!YsPkR?^K8br8L=>M-^^m^Zt7dsRUVr*=|>xPgW0r6 zd|~>kKFU9MyLV!z`sn(oP82P1cDR)_R^h2$zjx_^FTQqW{T9}O`X*W7$_agYj&BC_ z_Vw+QE+rifA2-Y2>q2Wj@vy%3VhGS!Aj3(nKHdyIiO<25IQiM!M`=b{x%e zCyu84Ywkd9tG*1*@Zu+$lmLGUW|OnLNxWA8vmacF7ONCvg!5}d`^L{C&EF?}=3gkQ z7*ZX?K@vQT>;behubhT=+IJcYmSh{17fvre(|EnH_#*PEjU3w0SZGd}3vRG)=S?H+ zC^3($xkPESqkQYZ&3)jeTQQHWBOSP7>y2DX93<7t7~BU=V!s)D^XVJ7y8{?c!++;| zpTk}V^!Rz`vK`yp>%iSf9{(<5LBT~vWe6QJFKU#bCEm02Oh;h)n4{o`n!Vv^1F89n~MMD(qEPBqU;p#v;;iuCYF2w za98sru6Q^eeB%4rRRKPAFZTq>6$7_)pbpZf0{=>2)A$RAQ>oKRryt^n<@Cd%19%}8 zhgb1!CH)yMUZFobnB#r|%;SMm_N4^i`WSgq23%>t<(r9(bdI6BjMq2LFlH8PWnP?N zr?C!QXUs5iWD8WDXLzr^!pO1q0(pOtGR75lnH}5>raVuRrv(2u#kAD>dfp@Wyv;>t zuKS{YeEck9!92!m$$n(Y<;LPYL;U0Amt>`V8@a`OS~|1UUgRC6w1hd{QJM#)@m$06 zPM%wM4u7b6;k<{2kN++)6f3fakDpKdtFsfv`}pR&dgP+4iM|4ZOdv*k-Cv zY0#fR21>%}X;p_ou#b7Dfxarj5_ zXDaFYfS~~x#M8n}Lkw;d3(B2q3%OrFa>(E*9mwzSbGgOOehV*Iv_IeB=lKpl7dZSp z-{I%^G5lP>c*o*J@~J<5mcQLV{9MP`P|?9Q&N-wf_ww#;?r&~Pf-a))H+Kmr&-3KL z6Saq*pX0rCgt4t85kImMM)v933qz-G_i)Yw+m!BqX8&At)dC<&lh!dJuq}LP{P_7!S~Gf2N5NAI=il{{Z*KG^EYIRyG9p{QFWq`@?!+&= zDE{|PEO{~NoiODp?m&8VkTF}lk>l{kcYrnhz3y38qT@{?O|s?tl?mew&Z%oW6_;>6 zW4WBT+EvhhG4E*?8pk}Wp{AL}@)B&m8wcBKhtJa=-QTNNhd1(nqiKBecgY*az5md# z@sB-ZF8VFQArd$$v-99bgy*ko8YcO@E5ihM;YkNlfMiZb#`Sj`tkMX$)7`C zz7DW}nKqY0bV59#o9b492kFLR&}4 zga$4B4SrM}Km6$GagtL*;m4t*4}~9Nbjn#ef!m&s@zXj% z>v>l%aKFv9*5dXzYmGkAcs}Eo7X?>wR^Y_sxFllkh9jgI(=N7r$_Gug?*;d>cU&;b zs6=KXZ}81w?_M}HM`0_ES*O(Qu=r*52==e_E_+t#7qfNx>&edt6<_ zq?P|<)`jQ~%$Mj0i#6`pf1b~7y7)ZbKRd3hegDM$#Et^+#Bvs{TfvzxbCxD7KD& zcj`Fesoroud)k@A@ME)QYquw}h-hqHBv@iDq*C?lRW?Gd!1e%a61P{w%V(AH^S z&fxhnPvl$DdY?(Xq zz}MoXlkn0hWSS2fq`$c^WK_50w|Kq{KF4*2red$)oA5ebHuw4VS-O^0EyQcVM}m8a zcCOl)e>koB>T1rKt|D$nHaP10eb=g8`G+6#au(Ita`-WG%c)xYPKZra3NAMevEv^` z=WxcZP&}O&ZlS*s?yHR`em;H}hlpS01-}u_Pq!d5S~Jg;F%>QB#Q~@6UdLpg2F^O@ zS9DrO{lanekm{>7Khz=H%kWWgW6H_5OLdk)M>R2W>t^bVjU`~k8+2j_2xhk~!Bz`@ z3bw#mVr2oF$!LAd`Zce~hSnCRGt~I7;O8Q~Itstv zkzy#8b9Ti~`#HNkr~mscVrj_W46bh^{UO$0l(T}^kAhDSXWHe(6nN1(cflC3cd$M> z+4kRyPQEVGUQ2u!#f#@|qlouEi6;rKGxpV^d7j{oXy~erIJB#a@KJNdZc;jPBO`PM|rLSqr{Zpy97SB%G2=q7|bP&sUk&(HhI^q|&eod0=#&0n(Y^FQTfx$gaS zR-PTxgR*-ZhW1WpavuO^sUvG2&Tn1&ZR#Z+rs5aUKaEW?v}$0xvuF%i>C#0vbg`2- zuD_?A3fjhw{Jf90weDme?q;xDS4i?6cnAzC74KdC5NO z{YRJMPi4zK>;2BlgZp@w?6cmdUmon>U3MGm{p@8{e)biTD)8-Eg3r=C{Dc$8v)o+0 z!OHW!%Yqi3|8!Y!HEGlMwgwuk4`aUu2ig0l1si_Md2QgThyKJDOVQV#q)rPLPXDd{ z^go;O>c90)|NXqH|JFPGZ=)Xd-+HJ2dRPCgcly7_>A&?(|LZBQ{#)<#Kg7Fazx7W4 z_wcU%TkrJ0jd%6mdZ+)&ul|?OfB9?`(|!+wcEBriFISSO0Hl;YoZU>ceKJf$vna}UYS>uZ~09uV=Y81V^`*llguMc^OEY;d0-zt3&aErwJ+nYtjsyD zbR-(vj($C`f|!RZ6w~5;NOPvecN4Q6`L?`=zO1~+81aSR%!aPY;Yo`h|1>SA`+dqtbNRCj z{w#xU%4q+ql(EV?yl}hw?(pI*yx;q0BUE+R46PvlH{I_JZ{6g+_rur4?l*@|uXW!Y zz7Fs%copOO2(i?fJ^DYUqZqw6nONWLJ|hP^-2wT|=^lu|p7^N^k{Swf6$ zt$~ZZX2UpqvR7e`EugJAJgvKMsJoSU-e)E^NEQjtoCEJl;+~i!>HwFV%e3W`+Opmq zxg-0R_3p^2DZo)ddE~+4^BAWGkf9Yy+l2fC*X}v`Q@0dDv)8j;)gHIKR`rojbN@ZG z{d;_nG*_9%SAJL;bJw5fehmEeH}sDC77{O5dMWeny^gM<^6&8tU&6=Tc<-zWA6E=` zof)yxop|q7I(I$%@lM;H(B!+lCuO&*wraEECB2W;hF{O!!3 ziyO(I#^F2in~4V|p4Ylc`+hTpn>EC`mAwSqT+X}FE#FV*_abcI=!HExa0Izz$y@x^ zW999-U&+T!@+&C}z4qvmCVkG5Oc-qtLd;02;_3E5d>0{(6aL6n%qY>&*_FLM>)o}k z--Y)3&y}lgzk20rZ9eo2qSBgCHxsabd-U4iC7mmI00rhb% z<077w-mX~x(oYT}M;1}0<9cG6K>yjuUD*+lw~w#+Cs*F~>XTL;RW+x$nr|Fz>R> zTlFJj_VUj9z{lWwvc zJXvY}OM>^XhUfsE<;)!w$R^=!7d+9}$KLbFFSW+9W0y#7x$;WqI8WZB`U8SI2QEg&q=f&4_m>YBhPpjtEEyAJjqk_KFB@?P86z8?_HJAm zBl}(y-B32VD(vi%F~k_m8_K(TzoBGIbolvpJjocvxlnzsjKPm0sJ%X=xiTio{WGpj zPwA2|1>k#-d8;L3e2$Fy#TNsi*uG6w->{Kv#(q?0Bz7Eu-V@;=#p4SxR(mQ=jEelR3;$jMc8sHdfld(^$=7th~S@xpsy)xBs=YF!VP1-{~VpsLL5Q@>$~+ zksVETHefHPW^KXyA8reTV)L?>X5nF1A3Pj#@DLgh4=ENNLVfWN7;Nc#_FaYe`Z#z9 zId~|BFY5jgF1(8QG6ekeAGay8o;$U;1KdJ&i z;GLg4{YxKt%L5l~|2Y5i zIESb*ijnP>NynD{7y71gjIal@9hkHaFl#*b<@E#qJ(N{mY%v!6*kUaBzfO98`OBUB zCGea2o58aY80DvP7&s%G%g|WL=lfk^pXzK})QS6C4X@ov-g|}`vv<({D&p(!Og9$) z4|1e#`N~|$y;5jTdVdtXKaZH3`oFugduv-n;-B zeTp%F-=>S3t7CA(Jr#>v(H~ASZzqX2y-61D)-AVfzvA8ZfNuwPWUb_zV41;K#gTUV zM4d?)Z=Feb>fgENnK6oR2TqMQi91hpU+ehrz0j`W$$m`x8qd5l-Lv|`;TT|Y$3Kzr zA4s35rk(EJnW66hbIXuG=+zvP|d}oJF|fb|d-fV)9+pCr=ALt+Fjd=IqK>UFkcpZO?fv zKYa&wChjXpufeuW{aMuE)=PYpt*zjfm;^oR%Nyy(!_*_0=*GVH;m_#vx8&*m)8|Nk z4L$kc#=*g+<#FqpSW`4Jrub8=P`>>tn zf4Ke?>7ws+cuDjs7?l5I(p_FkV?0)J{;a?9oF(qJ{7+)ak8sNW4|@*%)$x6&4(&a> z&sdZh!>svZ7&O@J8D`O7{qpzEn?IIW^GB+6S3v#p-n#-UTp2^qYlnpk=zk6PI(@J( z)CT>xz)SB?&gC!J+~dnW&Rr5a_mm6?deCc+K(p6@Z|%PnQpbJh8|~VJ8M~voq}Cp(heZ-4MKX=*n@d}VjvAQ2d}u6oUD zuRC2{H7J`-3|V_UrFh3lVd>n`!%cox`Xhy*>@ItKbrJQPdtToc-p;zI5xUvVoR|qd zwtr$)Ml3qg9c+Wck1@WkKCij9D#ghDSJr{C=k;ZW{^aZIX$^4JROe^3ep6fU=Hl(& z;65^*XYc{mT%|K`v)FUE5IemIZVQY-9UxFHf^4BpIu-{j#%Pm81A`SA{27 z@#n?^=Y;SzuX0Y3zL(7A9ve?8vQ~E*j}MP$oSyue5qg^as?<4}cT&UHD3}LLdvEjS zW+iJe>z;w{Q~w^$J7ov6&)eTT<1=PUPZCW?=gCMHj#9%vqb>uRx(`_vyH*U5Uhtq% z`J8km(S@GO)vZpsCcYmR4d4S~BBQh5cOU1xWJ}fBNcN0pz~gN06RC4zRX16*lob9Q zcX!sXHWhxe;GvtT=hX4@^Zhy|Umf}8lkXSD&d>MnvH3X5R7k#iKRiF*&tvixv!9ql zzAMKVIg;yTUo)~ABexD5`_L2Wpq&Exb?EPAWnBjRgU^)qtG&?g?jh`Be-FPu#x)ywvNCpW zNJ}=32Y8S6xm%6<|JGaQLFj8rpF7b+OA})HmyR7n?fLL~>aV@xiRZT0f-cgxz3cu# zdqzxqjrhV^{lm|xzxH;s=WHt}=q9#GCwnSsy!bTp)Dvl&!yf#J7az zK&Xmy;4Sn^HWvAO`Ue?Z&v7Q96`xNZdc;&SVc&AjE3+ThRWOrz3_GvR|5|65;2HOS z9X6SA`CL(6=Ledw#mLunE;ua5UTdXe2bN#>C7hG8{K6UMa`{|Q<__$^HGFHrFVmEd zHoR41&3ATNCia>B;AztOl0Gz2m+imalKWlkM$ch4I?8#8jmYT|VAfhkXA$Hl`gz(p zB>zn25c!GT#QS5;S%h6m0~X~u3M|jbPgS;Qr30(#i-0frv<$;fv=!aDKe)8+{RQJc z1)Mww>?$XF6LB>ZucpDDWrPZuXI%WrCs$_&uE$9nPG2dmoJ9P`|{}}t7+9ggN zXR7VHU0LH*O1~<%^aW=P%$jo-cR!ahmzAL}Br)%lIrEzKe7o@j-RMcLoJ6_$Zw*Zk<-%&keQm_LL*PRgQCu>nKO4BAKMGGC0$;3&z16jmD=OC1Rr$iD5dDW)%@-S z?lc41!B!;uv1}Nv@J4KY>G5v<3i2awX01x0K7Oh%16-6@dojkb4EDY4eHr7J?vVKx z^0U^MX@Ea>A1!uWQRnQXM`^#D{{^N|*%r5P9C4E7Nnii8I6}q3(^%l8e>eLAT`#e= z5PpQSFAgFu6Y*+a`RlbS{BdI%@;INI%3U3AW0x6MitiCRozKtxJH!)NN*o)lD`o(z z@4>)Y;iJr3w;|2s{v2TOH*LI)c#`{16Bk5x)oRb61v^s~{9H!taOwVv!|@B|=H}t4 z4arv*b`e8le+2mH_W_MVb4qH1Q8Y~9TY9Z=Ea6^ti#)|;VAf9Lwtat7a1Y;rn-h+x!j&%jQqtTfku{`~1k*9{bDR zeu2)t$pCkSz`C=!0DN{X`6YJcbLEceNCJKz_4rvYq&(z*TI-^%+;!AQdG0*g{|@u) z7wOAKjCVEskWS2}CfaL_*&97Tdy2tR27eTjw*>j5`b_HcAp2tZyK~8F&A<7Dd=2cq z2=Tnqglp~BouVJ>XS4E0MUuwWWn=%Idh;4HV zZK%$H`YpL3UZ{f?E%{J*#d-3fKNwE}!}q=$=+v4b7H1y;bHu^fcY!fwi0-K(j7^M6ve+^)_2$LYE4q1rca_;f{z?4$ z#xha6K76vX6eEK%n2C(jy-7VW@)%3^j;DcQz^{ca8O1@(#p%P1vwC-}s2} zHrwz$oi)g8NQH(Hq3Qpok7HI|5tRMCn!X&w4{{xJaTmYSJBfwHJY44aQm**chpf!* z?j9Mxyev1{AK#E}roC0N>Pwx~^t06SFP()k{SCil`)ycv<$m`|olW%hZRn$neB2kg zwXsj1e@Onr!rvxi{~>Ff&X-l{gJ_l5mR4*iy;pgNafPmX5AbTd*U*OU|FmUSQaB!b zRekwfnH7ucY6oxq(ke3AqE%r1e-qEKoIY8!3Qc4=GTLgJ`N`(r-dH>T0vvs5vp+ei zc>^74Ya(NR?>OR@5dS0DH1}%`dC6n$KLM>M?w5hSp?HaXc};Pyk>^S4HZi`Nr2h;Y zk224NpRwzY*QWFRZjTuhzhxmuh5tFwkK%mxC&$JAA3?WIQbw?fu1}L+bFn+u{E)Fq z0$Jtvny>yz)=?!Oj>-U7$tG7a`|jV?9-xRa4MjGp8U z1KIEnxaO|it=jJ%3;tJlwTCy>vO_jgzwDDG#FazIOu7=C&fdG!zQ)*aEjW$x)SXCb z--rAz1BNQv7aS)&TBi)Gi*7nQWSwZ)ZST*^>^1xMNq77BHfhpvWDnB5#M6!(MOHIc zVZ#T8`xw{%FY&(g|1#d^{R6yT^nZx=Yy056+QIuZF?e6u2k%!qc>ghcCA>ca&d2g= z%ly@yCvPIw`bvCjYK>r0dLUGP8~%0Ivd((nIOZP|Ip7J-Jrj5;@BnnQ*nmzhV$3B= zHr{3&JL=du{>h7s50qT+dynWZDXeob%4^NxO;-f7hb1*+n>TmH!!zC9_zn}=^&v-8 zzxc(+`cd|T>z#U9uzeQu-|&}QVAELAzH9Y9w&a4cqH|+nrbE}ROliy9b%({r(6nh7 zR%}b{OZAN-gRuZyyMZM z$ETSId#8T>y9b^n?b)NRAD{Zz`^Sfoh7Ve326AUA^TBZVCX2Lk>Z`x>XUFHRdHr~3 z&EJl*H?+4Nd&#snUf&x}yuKTV(|6O3-FvfY_N@I7yHva}O&V7|)i;-_}$JD~m(VRJjB~h?wtaBbKlsrw+?uQ znf?YJF$L$<>|F~k8s^id;w`&@anIf`FwUD8IIx^Nchu}#TTU6}naZ!2K9!Rvp8ieK zJ7p@!(?HC_dMBTiPQH38UxHnZe5=XRx2`hMedIH0_U(<`w{!REx@*t9A3*Y-SW;bk zk$>44oYy9PXXz;8&5V{**%jY>xWyklk}3Vf7hVN^CXPS%jsPp~o2fnDH6PGM@RhNB ze++EMG>|0G5%dJlGb$#Utrw$8XLD-L;>7~VO+_gd@wxn=I={N#Y^>>C0hca2>R z+%M9{d;a#Iy}q7g1fMKAe|=q_=&Y}cde_&FlGfk)T4yc_8fv$BE z>~o&hx50tXour?utM}sK;Q{*k4F?xh1AKqHA6)ziT&Vrac=m;@q7O`8;az#(bn^~U z3|?QjgmlFl`?T1x+HcmpgpA_+iyc2+@p=_Memw7zZ?aADeRL}C{|zs0zisf(8<11m z4-7iSnU%%buRcSb35hL#G&BDP`w)I^==c|T;w)b!wShnQ&r8YMeAw8Zc7yqI5C2bM zA3DLjE1Qqj`O(Ha)6F07#IBt`%F+t;FC-1h}^wM6jcfx$1;Y;wJ z9WhF_Cw#dUS0xz7R%6e4=8Ab|8u#9MW=dS(iNLnPGws-cI@l+gnz?U775?%ayia?l z>WL+0LdEJ)Pi>fQ2A-&ZkA3FIQS;BUr*}{X_UGtw%`iaE) z4LUFQCh|5!oOoy&t6~_aQdl}Zw-l*O&d1<_(^PL*f~;TZ8#6TV6UMh zzx(Q+*4p*|a6Rzl7e4!X;5J}!=af^o?6Pb%;?d3}CN`yW?P2myD&d@etpBKwv8`j> zqPb)7dK&yQl8 zf3i<~n=BtdTMs`B|9$zIxOMC4o6a-D%1PbP@M(VcS`%pRvx+#cWger;uJcBfCc#c#7RCDT_C{bcSR5u8FT`zeHv07%Lz9CC$4g z=4u@47{}&=6LS~SmooM+*ym-;k~$_q4;nM=pJ@E*7%LxR)l-gfRJooyj!ewGyH6b+ z=w~!_)GzXJnW96#;_AyrafkKR)M!P&i@4PG1Xk4`67ie)Y?oqHp~=< z7E{BQGiGn$yK^sPwxf47_QT_+9UkxQhsPB=r!SAU_u+BH(Ygg5Pld;=I9i-P5Ra?A zSRPM>$CcKX#}&&<>EiKjhlYIk2^?a7qsgHm?cx5FJ5uj;=qR;(wzcP$g8bS8uEqD= z4h=;e8j8ZV8n-AkB)-3eaZ|lMllvyj)Q(Mzn`o%pp`oZlLp|jfdzI^{1D@5{``9{G z5#LNS6m@8*rz|woQ&#m*wx=HWetn;MitydA=UVw#rG~!>4XLl#tp?L1D%nhKk02MDJuQFq zjp8?=7#(2TYCk%S|E&M%dau8MJ!gDUQ#xvxqsGGvr#WYrrM)0v*15w&p7GZGB3&eJ)2 zD7rvBbAB=V{62VHu?@AS@5WzBV4q*U2a0o8%s#*JlpznYkOzvv6JX9KHhtwPXhCz5 zhxqhr$3y;A%t07F+}#dbe*;&F zJtjYrZpXjm3*c&GiZS|m#F-T+tI8QVt2b{;+)vGr;`zK(k5 z;ivHieUJS%2^v&9m3jDPya_(u_l`UVrX$!aw}aaw)G-`Bd;E6pH{&Ora5y%`59z}P zlo{z6-ce7UHwS;AVfwI<4bwe=>@;K8@{(B%w@sRK!vn|GR*x$fV*7|*dI7#EXT6n% zqrYw;w$XO{L24Oi#jR>$9*{4_Pf0&S`YxyK%SUmBpI?7%&!sN49sFOkoeqs?oDJt$ z3hhtg|CfJeuP>y>yYcgzp*vq;La=uflG4qd&vG1|K$m7<4ln3wAuXH zQjKle7g~~ruLd#x#DCj8V>?bv4s7F|T;{Qq@F(b>Cng))wEvKg9ZG4+6Od0OYm8IK zVfp-pQd)ASK%*gORC>TW9^bwV*wL2UWXB#=j9uAizrk7cGns{XE4|4L4-PVBT}r)k zq1y!L_C9D*JYLSYB|}#U4xe{8@jf}Xu{g|GeCaax!RI-So>Fol`Jvs|HmjKr)VE}4 zHwW5{{nm(nQU*`g6&V&Bza*wxaiTF=ccK+T*TN0Hs^k3e_~#gn-^6}cfsSp-JaqkS z+a)XJ+jkeKPh;s*`suiweEQ?o6D9vX#oTy`yEs4U9$B%X?0$Dot+lo&q%}c3^Sy6^ z-EK4S=+tgD?Z(sYYTCtjt0KagD8cy&-)8V@q;1Kr)5xFLJ{kC^?&Dh>=b5Z_cgzgd z6YHabI3sSmbLnG2p;4JN((Vf~=J_?FW(Vhe*gdjgMfv^n{0R+hjO7tv3z%tdZA`$I zn{k#*M9a3p?48Pxhoz3K#!?;*@N;WF1k0Spw zxO<2(mkhJ&|%IhI`wxuZC%QLA8FHg3Xjr%1*2ez^1PVz;+Xd{;8!?hU+e#2?#<(? zs;>V3b8iB<0R@$t1e|~%n&7M;psj=;8o*i9s#OzgZP2Is*n)L7i9-We>#ad5SWU14 ziJi1T@lk7t9jG|P0j<`WL~Dbn6$eOA%kTZ!XYYH@J-Ii~=lTBe`{TUMz5DE8?X}lh zd#$zC-n&R`ir&;_<=fjex5i7zJBn`?9z!e@zJO}}7x14m{#xEfM`7Q}qslKm4IJ!2 zob?qkeor7@1vIsoIf(mOE*T5lvM<~?EB4RP<3G?n3_XtbuGmm`*K+L*JId%Bg`55Y zJVxJ}zs27x!T*Jntp%31qUaimr$rweg3VIFe4kC<(0R9EePae`ne>e@+W*WP(vEyr z|8uBYab~qo6|Ev?e;y~KdxGArA*OhVOSBfohAL-(`rFzr%J9#tjnDZdI(1&-V zlcI~OUX&PQKz zbI~^DqI~WuoP>V0g}Lm)8?jH}XT^7ZM!cMCaivv4V-rZzT(l0K*q(MS`U`ch!zVVB z|8wkl!#U(#hh6+Mez9{&zlOQ!Xy&2|XZUfs&oV~q@P!@Cyc2GFEIc_nr)bmG!ez^Q znLjlbA5DMMk6LKzIhDm{CR*Euj1QL|gTA76YS4AmXWdU8?DKqleSP$KYM?KpTwmz7 z>RwNOq(2|%&QFH_*k3bM`L3ofQ|Zez+Gs;QZlIrwfUz69t^^;F?9Gbr`{xsimoLnT zn*Cf__Z@v8>t|8#D9vNaKMlN2r_KF=r6MnK+D7yWoj0hsReh@hkMctbS5v{&F8o$K ztEfkLRY%*u^Nv#9M({R^dXFKGaMLH;VE=1OGr?94E(M3mvW_xWKI>ZGEddU}P!3$| zh1zrxXFp9wj%W|8dB1Ra_%Svh6v*k z#M$^XoQ-VBqn@TToQ-VZ4BDd47%LWEIX9sHc`xJ7QJ45_5};LjH8ow!aTgd$Y^>{`7S}Cc)%u+9jcQps4!BBU#o% z`yT6CTg}-s@s_`npZ%Ew?zQhPM{|8SdcSw|{M)S@J=B+@2O>vBE1P~n%&lZ8vQqQg z$Fx_oKXMdb4(I;sY@y~jXU-~KOY@VHquVDt8buc3-*GZkJQI|U9%D6`KD~wS(F@7h ze02Uya`ykFOx67OzmcihFTb-gwamy=`ltO{fqBHq)G_qm%@0YLid@PhQ!gStlT01M z-Yq9nb{)Vu;%T(?u#!GyxyDG%TkC(Eqi+x_lSQ*%ekLJca z&gYTLu<|2^H1RSr&hYYVc$qSjRmSl9WMB4t4vmccS4!^814buzByW^gc~sZiANX?N z9@=;5Wgl#xIE#KrZhfvgkzMnU&)Sdd@(A`EYyrVuVr7cztlYGH;y)OBr5BT~@-=<_ zoZ!)y^D@A?b|YtQP)5ABF5*pg>ln@loq+#^L${W(k+|yoz}}B)eC%d!K({?xGK~GJ znj4G`jNTEOpPC;op$}uReH5Ffe3~EH!KcoVjm>9{z(*&2w32-6y))@rV^W+tWgBGo zOAp{aGT@!wEO;w!F5{dA=QEGCd=q%PfpJn1#2NejW|1N{a}#0IV?! zYYbSk$!-?g{N z<;dpN{%Pbky8qYC^X0bkrO9jBl)PTT8Bdb;-yxsY`Ug7GM{-{GDosL<)4AST&$;9D zG5jCH|IuE-rDgQ#Fxqi4SH8(g*-K~OZ-Y-v`~|=Fh~+hOjZ+-Sh?XVb@l)m>&9SN@ z0$(fcvk`vl1+G|8+Z3H0UyZ)k$-0mBT$P}^E=G4PLyyy1&m#C^v0cv{g0EETxid)n zv2;3gSNTiJtiLp$@;^oolaEt=vLD-ZTls5+AGJC9wqaLvVYeurb2NVaGUi#GedpGh z7XwQ#`dA7Wsz^_1BjtpnD1)>C*8L>~kCL-$QZ^@QgzLRD04v zyO7D^U+&skkKMF6A6!=B%PN{b_No%j@er?qXJRZ0F6~0rKSH}BhkA)o^kbEN5BJxf zr4wt*QJHhb7e?VHMm=1yy!H{h?^=}h+?d|<&b z(OxFupd~OSg8vb4>(<%bxZKaUY{a(}923z=C*%GIFN_TN~YgY|&XptXFWJf$uLkh~GDB4`$o0(6{dO z)_E_oFGsX2JU6dlENd2xthHA~3)gFnI#b<}k--=tw+6<1)LM;vDWTmee4)VBT8ZqD zPxfu`uES2h>RA|}6kpM&Rp41`ufx>qsmH_j7=va3osy(xghtK!zi~KY5{zUw0 z5BH!lA7s2I@r{oMr`?09*q%pinQZqY4m$^${}LY+G##dA!CeB*r015zunUIbr%)pa5Z$@`n$5%?WQse`+D0jGn7y2= z>zeoj#&5BW6=|VdGjRus83@N4Ttq&>AB?G}fQDDuy_f38)q#FUW@q8Ix36AHWKtKLpjpq*;zlF>}ZakOR@icLXHr82!gEYcJe?j(7V=Ya5x(FTeebyDV57CjG)Kf=nEPMLc58FvRoziLh z#RqQE9qQV{T(ie-`EAxMnK~Bt?OxhZxegZwU%?rpgBu6jo)>}rH7Z5-UmD# zlWsqE9`J0wGm%`|n}E;yLc6xNn7TKPAF`s9wuc_>mF9B>lGC{&QGAv_>TG}sXXTzY~;?^`TO|mk?&ED?$k7G zbnRyEvJI5y-tz+}=fkjDLjD!=yK1+D)>_T)vAZQky5C*H69w*f({R%-KmYKA>^(pK zaNRTG|Lz)Q`eo9ah8bM>`G=V^7ybOhQgG?4(6wLn`*ve)bJtCpqhc-diD8q@;O3b~ zy&tRV(#{{27uVQgmzWsdbND}wHB+6rTMOOBzn%vX*TuRHiGpZK>c2xH))&BrsVET z<@@5iRQsd#9UH%axNa1pj;-ZhN70wtSL?hX(QiHQa3-y}tEC5@l4-MPL}C`-b)Rex zFqyUwL{A`1V`|Dwhu(+Uau2Z1@<7BdJ2r0aa1EEOP<{BY9A5f%b^Ca9kL5(GW@0fw%I`cw#NQ{=!6j82jA)V$I9H{J8VAzkXa(|KZ1y9g4M({UCW4L(h?Y zijQ|wC$Y);j@)}u@9j@1_TS&D;@MbB*{)`dB8NTu(xU_W17iCTKYxJNoI{>k;22w0 zV00#}r|buu5BzR$gX&dGe;4qM^>Px$!1?H|isQFwWjP7$7ijMTZNXN7$;yVt;$Kr53%vaXft~+ZY@?8)^TY zaS_f_D8NRGw_Hn_*5X))nZ%j|F~ICAWQ|bgKz_=;DfyH=)*Q~t)%kNrwTv?7&*^O5 zQ7!kUbboBrHMe)(UQk^a4NvAu?Peeyx*jx2ZY z@RqYr0Efrp1Cq@5D<$V1kbR>wm9y58jn_m$?ZtK;BP-NP42Xl%anf9cadBM;3w^3IP-j|}u_ zi0u=5_S5>r*$FYyGWCh|L^D>|`t;I=>0?#l@@MH&p8Av{*^~oc zAJ|Iyo?me8YhnJ9WyPGY%K7}u`nIqBNc9t2oWF>e-dwLEpM8n% z{CUOj5qmV=V;eg`YO`Hiw@X z4nO+_@xxwd@beYHx~JDSA3p2kY|cvVDCl9`LNa##Jod8S%Q1Jw{jSX16(@b5n!MF~ z8^Ui-@zIpY&oAqnPnrD0^fmLjTQ0T_<+xk!67mK2RJyZJp)JEZqOpO`aP{TxB{{8%%va8#$9@Gq`Bhkq7_Svqs^~CcZ())o;5b62cC7G^w3+T_tryuLwEC5 z&r&?7r8#|@g>5XFE4}`;6{TMu_fjG8$~rX4SP8T-FMwbr<$J zoPPMzZOgV=np+3WxN{yf{=)0Kd>7qG7sg)R+?ms`oVA(O2>YESYZ{SvB{dQ5yu%*I z@e)@;f1g3q%*m~No64H+f<_AaIC~RbDz*IKVBO2Yy0?Y(+KarzJr>p~>JY4zH>F^G zDgbNsmhAyp3k|G~@m=vqqF1$FzyEQDf7SP)RowRrZ4QaRH??i%UY`k^Q>$2M!PN*3 z-(yTJVN6P|e>x49?(7NSa_c;Ab6FN#uCVZFJ{Nt}L#LT=njoM24Wide$g6!#x*IYR zeFe|j9Ru9TcPV8)qo30KRln!Swn?3#boEbtoh;~6)|{k#;G(r*U+#%zJR_9R7(4&( zrId5OH6O@dseI=jp)+;jE&rICu1f~%>~wXOrq_8^mO5wJI$xm9U_Uh9MW6@4b;1t% zF@3b{$4TjJPR-Kh5ZmVO)Mh2J2DvmHUQ%B#Eb-#ozV#S$ME`w?>Zf$Dk>F1@Q~oew z7TJ4Jm@{gLbm6V-oae#WAn}}{CFdQ^8NjSrj)9&E_}|Jm@zVPJyas)*Z?`fIUsbK{ z+CpE7k?tYS9Z%*%AJUDgk%1atje**9XJkeAUVZ!Y-k8z9w1?WC$930@_T6p!)*n}0 zeSjCwl&-!iZbv$EC-i)JoUsM=gMnLXFWqPO_Nvz8+Q7{+1An~b*b=SVxpS6Av~0#+ ztfc(6n19v33&811lzovW)A=usR;rN)`4jx}!!S-;3%KK9L;0YNGU``7I-e@7-{f`u ze(HX|-#wI*ej7fkWuEDC=JR*9Q09?xzb&=1AMK^ijT+JNN82Ci6QcDA^yfbMaxYJq zk0S6LGT4lZ8?$?WP55y9)4o4(jvf1@MM-{y22|DRpWL>QDD$AG(lX^>)7Xpw(JvZ7q3fpf%U0Z_y{|`C%Pi z?Hn<|Yp7}W5`*@zJP3XIvLvPNpAD>{GtEPKD}Ueae*VLtH;uy!z&kSoj-9Mp=Xm@C zSHEwUmSw<$a5m1=8*lj^>f9k6GA265&d^~e=g4(OIxZ^BLWhCz8>_KKM{5ILu~U6~ zM!=zwDd=~k&lQc-@?HIK_#8nwt;L1uR^vElZ}38$kt80|={T4E8hK2fuEV?r%`f_I z=(^j7UHCi__=9wPA@nS|yw=k70`RgCd%lM!jXneNW#dYpKGVJj_^``<-w}ReyK)X4 z=R6twdijYB(fp2Uv*1^GBjgng{bl9Ae7-xfIuj0)_=x_F}R@Nu@~^KV#u90opq z1}=UY#>dGi-uu~q(qHTv^*3G?MXp6V9yk4sC*@iNG$A@Q{Uxu@GwEZ!i1sq|PdudY zURLhcEk67y^#|oL^M&E7ZS?1Io}lcKk4Umpav&c)Xd}Npbg*;S>m`3hP_8JQeS8gq zHL_ni?^OYxp+&wO1T6}VzlZP_9M3Z?{=#xeaA-b_q4UnCu8FmrtH;@e1=cobsN-C# zy2xe^+o8Vh!YQ&1I+>Gd>n`Y({H@_kHpg3Efo3Gb{PYyh9YuN#Jk!Y8ZJKXcCvJ6R z4&|F-KsDc#xN)I<*<_T zM!6sj8yY3wFX)$ObW$c7wLJJs+vW~sn$FgQJ`9gz_iU((bezassQR7mlH~C;T1w~f zI}EJpX~Id8$Dw`It$HU?e~`zCi84GMp+8rG=WKYo2%0c>8k>%%E3)8;J$9xan?hq} zY(mQu^9I0^VAnWRat>)DJg^En)fty=4v2f`U(rDwLx-mDwF-SOi7)cHIUp?mj@uEw zqJG`N*C#{L@il3jkFVAAYeEKmWzy$Lnzk*gLS7g>kA66rQLJ?AI+Ko_>C*Qmy|Orx z)cZo%{&n^~1)@b4`-}$3_#oqqA{d$oj&y zoCk(1cm$X>v`3-Mf|jC#)AfxhhBo6Z=Yr?wPtC4_85}?(nqTtKtt2N4yZrMYrH84{ zZ*@l=l)R6ln>l-J48F5Z!G(MlX?+anXW>4s&eF#uuO;;-&VnVrJjiRq&A#=5mi_6^ z3i^{KvjTX%hc?8&+2luowH*yVz)NO*pe~wdoX1(Vb_3NP=dS|zs?g#)f0WN#veRqe&(*~_iI<}VOG=^X?a_iwo$#6dJKdq}l7&f~ z;s9_ionbBgT}PgvjXs8NrW~?hy3WE4$bwOPQ*3u|tOQ3k9^5s{SZN=!p;7i6i|>{J z`-b8iGiJ}5J!L6-9C|Wy!gY+-=2JLpH|C$=7sP82hL7&^=`}oeNJp%uEzRw#mST@~ z+c8D=x`=VBtmCXh_^-OX+#hSw>qrmIyOr~zNjaF$_-h`PY%}vQ<*zh0Ni?y*>I|m< z^B;gYlRgz6Go5vhc+zj2(hXVXuk-!J&W@E|UE?U;sR{7T>ibf>6SI0=CLQkqa1yq4 zD~yjk($7a;MxXDqILrt)G~bGhueN^AO6V-?Uo1d3ldrbW`ae0>owLk+Uu_fc%m3LJ z@YUW#KaAY7`d`Xd%azXX(Y1VE03F8Br>pUO%CGtVqTO%0cA@nW@E2}3h_iDu;4l+@ zJm{>Fy2K*`twjjWGu1Ejgt_2zVR1S1P>`et>0+WSXaRZV)5EI3IzlE{dN}nNSqdIk zLF@iHi;u$z7Ka+Ug{*h{U)w5lZGk({Ua+ko-ge1=w;*rIhtt4(Dg8>c-3HvE^;+Ie z4u5{HFRzp)n@4NtTS%)Ue}sL~zD?u%Pd>Ugq${8Dd)DhY&vb@=M=)~WQJtOL!(IvE z;65r{o10in+}MHayVrjDvdHKS3ur$ZEU#sNfTN=Pc+^Uh7{aEBXDTt#_(zi#z>H zn-O&TNA0&G_-4*6=Ui*))mjsfURku8?6(N#W=A^4$=^#1f@~GRIX+xwgkR=tm8p!f z-VyCsW8`$I%t-a&D1Scg)SLk9m*9WYJ2K86hp(v*QR&0!dP(0dJ|6OHKaLLcL-aXY z<-o~ArSn$*7(0X0ZLBe*_0Pe&OA6K>gkb$Z>k@UGp|OkCu&~_s#ovgXQ+WAXFB7I~}G|WszwfbIoD2RTyq3koOgvw-Na@p1eZ`$osU-TZXLMQ+=Qf*Z(lS zp8QE>+vQW)px~|HK(7IRUtDo35gwCHefN_tz4!2wv7MC{{<_zu9c0sfWAn?#nax^3 z<;qB+@Bpvj0n+b2iC8>WAGCD~zT2Pi|4!0Pec*ect#71j19)yBEvN^5Pd?w3oOj53 zsjV;g{SZqhGlzQ(KM1sU`gpHl5&yqu+Y6Q%Ys+*4b4{SkOv+rx|4RZePPQ=q%cTM1 z5g{1=+roGmZ}$5ob-0&AXYltR+Pj$axvmcIF@d(KNINBv_UEBq!`Dfh?b2wg$hQBy zOQY;u+BuzkWq~w;_e@*Yv3G3_-=?~6)Nz=t6B`Df-Aw44h3;)|)g52c=cD7SZ(vV%fpr`xi^!5GR8quj1p z%5K>!z1<^h*}Zs+pSPcw*YIziB+SsDWVm3SJ0`vC^}X;4Fkgj#PQ1LIk@NAEt7!WJ z>Uf`L6HnH;t_0c8<#oi~^g5<7=fw`cZ#nl>ZLVO?FmvAvrK1M*oBu13C!B@1tn${f zUMKfozlWH;3~O_&iNuv2yKQDKwqfhffVcX1Ki+P^Y~($%p@#a}_!ib{{z#p&! zdQBT?m6UUO&Ex!Eh)pYgeee+E`&j{*cTh@hJ!IjF-8RR-F>N2o0^r)^MDxFj|CP6& z+*>xxYh6v>bQYNUsdzA*(V+Fqdg7wxyD>gq{0^F9WzQGjr}%4u*MR@R_;AYD(^$ja zujCpL_K8~~>codr&$q}R`XwI@x<+#T2S)jD{5wcyrqAWfOKvVdjJ3DqTn>zi2h&-P zg7;Q_4;Q@Bh2=A1o~{~fbq&6|wk{JMZ!hn?hWuLpRoUd}VYyp%&o*<9O@;Mg zWx~U<03JMSpZ^UWPOx~8jiC8UFv(Zs=AdbO*E%?TYt2M+Q^saqC(4xfO6*kTNpmJe zr*sZ^;3Tuin~Auea(t897o3?cdG(6tn5G?OXh?N^N#W6HSsY z(VWC6$?laoiK~Zsgv)#Je^9^X5RHG@TnP@I0v4UQV%mbwpR}+&gTLWO(l=1{6&`&z zK0CmSM%|KEk6VtLAx$vv?O%#~&&GhaJ@M<=FH(N^Ko8c}rHdQvP?g z4kO=JretM4x@J(mAF-A88H_&L&y3!mi0s=49}l9BcB<=D+rs z2;Y)9dW-hr+kBipt9DmL6Q6TuxyHO^PhZ#BLVqsh$twTpoA_BeB=TZ&6Kih6j2~Th zn9VSEm=WLAD*e&;YMUY*iX+jQQzK>mn|3!aH)-wpt(B1nYvB2wTaWK0#%8mJ+!Gyk z!B4Wi)JB;8KgsvvALoOQ?*8A-`2t^BvCmgEk^up}Iu=}351W})20XA&W*H#An%XJ{ zZrP&yfg6|h4t%s5X`@M#-st>rUK2EptSQ2lQePwRk>WFDOG%%+hkI5v_r@r%{@zXb zVLZF?WW&4KTy^_#y|L+D$6uh0(M_6r7cC!sx3{_E2s`(lX6IgehMR0}jrqgyy+21x zH**6W%jEAS2cO|p%*qrLZ+LzB$08%SSo=jwZH z-i}b-E}NILOSJ#k$i6#6u;dd5rg?GeRA3o1D6zG8P{%WjZxEJSZT;HcODwsmr`D#m zhT8mtZS&Wpv!^^RJYPxP>Zn~4(foF_o!^d1&2JA=&d1R#e;##k6{X<%c?hmb3j=48 zE&HKu>%5(4YlUD$C#jk4wcafF_1pGqj;-^CP`_?>@L8MPjo~9xQe$`pWrBE{V(Ypz zRM)i@N8e}7ViR;L934zvzyHVk{kJxA(c#o@?fW)!CPa!x#;C9DzTQxB40weux{gLR zKrhlMM0-URhS?z)&IN{Q`8Tu%FqN{{LJ?>{wB>Y;CoN6}2ih_E33-|{&(n^}dpz}t zmzDuzH3N9V*eGp6WUiIn7`U5?#4D|JYT0De-L#8 zxAee9%>jXUq$lXVXfn2ouhScwmASHPyw|!?_~iG!mTu?U_Ue0Il8)oyrPABG+*p$OKzs=u= zzppKKS_t+kM{my0xTi1cnMj#;a+r5=IvzCZrq*Xz9!U&UUGUYhsw==>CktoA$Z#9m zQ+2GB0myPE17?!PAKzKVMk_{tGvhVvM8lI#W@7v#=e_-C$BmcDZW=}V;J*#}*(cPW zgY8(fji5Z=q{pkw-)))QL;1(r{6m$_*hvRc{ugcjn%%wD+(4N+`~7LY2kFd>VUSNb z>nO=*qO;gAZ}nA_mn{Du%I`=PZ2K{Eb#htXJK$e$M{l2!?&EBBnjBlkc`uHB-pLEJ z4gMXC=LdXw-PGfcMTHrQKNW#j?0DgIqhuJro!$7Vg=MXUMQ24+2kQ;!anC4kG@7W8 zjRMby^}~62ZO6>XebFg^S!ede`oT|>aC7?tH&u{A?sQA zFO57A4J+*|bVsu_5LEtUg^hQn7RWng!A71q{gZD~1L>utJKIBYdJ#0MG5e-yp)Q*E7&;neVU>LOkpDyY zKgYJAv|I3B4I=G$mj-+zs5j}$B+qH4J}+?!?`^Jq(yyef?C=G=KXvKIl$>CB;F_-T z?UBUYg0DQ9SS{ZU_V2;ilJB~5wEGz}7i{-P+iq8(*YG!&k9H?xQ@zIjQ4VI(&H#p& zNaGN=1~XQqJw$(>BW*Zo9d3+B--mkFk)BWboi3gBUkSB8!nW`6ew_TS-tDxthW~vh zGO6_;xO7D;#{6AtNZSePgOG$qVHD6Xk{fO~yZw zlV~*ULvy6ha_s}>*MjX+?kzR|VE_uty|T#FBl!>RZ+K6h|3SEx?m z>~mL+c8(3TbDeExKJW1XcqWGOap0T5+dODuFPD!tZwC(X(o)(kApI=b8tGsF&TmkT z^{M!&4hG89stn`&J~Y4@czhP$#=A1WSP*La4BPf;yuS$K8*2NPq!Ze!AkQb{ndsUh z?M2%8khDWd(_C)GoOV8k&XaURzNxmI$-KK=KJd7ie8OY1tCOO|45IUYQI~La0WiO0%e*=~9j503Fg+cpHwe>VA(*}?nA*L>=lEFg zlf@sW++)GA(3M*Y*&W?7*q@_6M)pOciAl&l(OnnoN0(5?1C(#!X}0yS2`>%5KMlay z7;Gyr1}jXS)LPNcW#7OLqmj3#(Z-J`mvHsxrPqI3p#J(`{lMtfqOQPi9_-7n%sN{% zahKl3(Znv;n(EVH@=c<>E2(E8&w^lmfw6ua`V7`LTzKvF5P*vIj8t?(%D@WUrP- z5;MW8(XpL9lEJ4m_AYc)bh3jr4+Zqyy_AklH3%NLAKa>~X9s9&!cMd`m^yu%p~BbO z*_R@}+T_E~+qs{0YkPjj_T7XxYirTwZwF{|*PUo{<5KkLmA+rC`eb}KClgb5GJYBQ z=4>)_=(u#>rD|(J23*eb5+9p2$by!)qZY$0Jwda{_co&ek7R1$IOF*Vden!t=x(FZcu&D;9}_;0b0CD>5SJrtqbs$9Vi`I zZEDWSM*p|$M4MF(&$owYa&!uB=Z5e$bbvOiccRVXvb1^j*i@Te4Ym29Xgv#`&)JDK z56IHy_r|5#9207@V}Ldfp-t&+VH7W~232Z!K3AO!cNA-LC}=VpTY zYXP_$IVa|S19xl(aN`k4j`4Qj3XXB#otAFx7=JZ1#`%Z(I>gzM8J*Y{-Ge#`pkpU9 zvW@ZE)T?&HE8U?s{}yU<4BxB2L;Ngj$z|wPCA)a56>|`lMGvw*o2|V+2ip5nsJ*sO zd%5~fd+W3Y%UgV?*d6)dk~|WK9rt8YK0cO5>(OnyNO*< z?ty{y0@9ryQntWq<_QymrqOmQ~HS_K2IZ+o$ z{GM-nlJ}>!e9)J7Ds8F!Z?JJ?znn*$kow_Zsj#p_EG)0Ho~?HFqMbVe@EmLNZ559) zj!yw!(r?GSbf%?~T^)Sj=bIt?$bTqWc-Pi(wZ%_8@Atst0^0j7&v$IQoGG)uh*&J+ z`{~A4((T8MK7gDH`U7755Il6}BtGH&8uiSheAN!>SRSh5PqvP3-pi=tG|Hc9>+sw6 z=NQc|=cD5V+n*%A2JLs?!&yVwa>`8)mW}#4h{|5gSOv>=+p>xyX{PLvlsh6=w%xan zRaSn9VA)&#rSXp@Hh#c+CH@!uPnC5!iE-fbF6tUXJ)?Q{<=H1oohOCr{BK+5%eKyL zTjv|_UoCYGrJf-?`8=^;os6sVWnF-N9E9`xstcN_Q(u8su?&|{SMT(^hOInXctno| z&w>8#AA)U`h3!`sw#O`NFXJoKdhk2c^EOX6Pgj;YcMsJ$(boB6Tj$ShohzY(nbi3_ z^*qP(EYCAp>imK-!Tyf6b>3v_OxQYqAR1$S{w+Ls2z9TazDIZ-=2@Mk?tg^pj;U^N z{a>oPJ(9Rabu;$!H!D3S@l)pf%J!VZXV5?aZQMt__wxLN=bkKWJQHf;UxJfyI>W+W zW#NB{IC05_IOD#Ey6Snp&vPqJHXoPb4b6E;*agXRYHaM;;Z`=eGY6#OREA>XzL!9! zn8$uDt$VfiU*}&z42Eb&I)>gRZWH_{woP*HG59Tbmdrcv(>LmS%htC9Ii^0nMIYw! zoWXPY0R7QE;Cf;RwLjOy4BLJUqW!Of^VPKd7JG6li5*q~d~J3L@wGj_?WJB?3d z*PT>utMyxoP9heUo%Dr0!|Mx(lYE7-Q5+5Z>$up=MX6Y;A6lF)2B*U1ZK{LE;|a%~ zvL8+NvQCsvEgXTH&3-JUzo+k?pZT$szXg|C^O`L`_yr~gt+i9@f&6yy04~<_!#mg~ zS1j7_>-Z_LAMUsIZ=1P}a=)~F{D$CyR&s4W)y`pRr#+gu0RB=R&LhtYW&Pn7Ju80p zdF-R$xCG;8pS}YfI^<96l5Z9~Yd@74C+@bF&ithE76<$#`&xg=o+%o6m^||9Cj0aW zcdY=w>RCab+*6aaxQkRgu1Eqiaa=6)x~ z3D^rh^5gzZA1QZ+9k(rl+xGh+(vssxnKNbg*0FZSTm9Tb-b$Vw$|d3&oLq_%fHn)E_*b;dm3fUC{D-;5~8x znBg6B&arr>mNV{spL&_^Q^%$u2bPq2nwu z_wDR6%O*3P_@OV$hlTj<5v9WePf0!n_|5UnZ)nr;$s%y%;_Ah-%lRLa4PVi`4zDbh zp8@>HhowG_p^r;l|Lk0qsecW&e*^K9WMlmR{k)0(n7CZ$AEi%Ck`KV^@OX{#AO}U~ z#B$8780@X~{d>n{rS-drRdc?dOnJ`^@Wqlq-s=4`)A~8U;PcGP-ZIMGKpEjSTmF** z`P=BvcgWuup!u2V6LZk$F8`i`un$ReBYiHMKJL@)g!lTojq3Y1I@o^pzvS(orK2&X z3GrCBm)K0Z+4$tp5UuBl*5^eM#CjP%i9-V;crx+Hm{8eX#X?fH!RVin#8-HWmVQ9_ zC{KjPJ2=ZSkN#Nkc$$~&JoX{q{%R1BP3d(*rf9;at-&n&~-eDxsX7Uacq?6_6S?rvwl zr^b(Y`aIG_XAd5m8i$uS7fNu6zP}A@!Ptf0FfPLTq2T(bl*xu~>0MeUX3cYMv(7@u z&+E4rvbrv%tBQ{eU!t=*zH9)0+GodkbIT4jG&rKAhI6v&$(zqToo25Dx^ZD8w&1)- z$D8DHJn8Bl!&wZfy9@uK&Nk2<75A+Z9Vt`0S88md{@9LTPfr!PQ5WN<{o@X{VXB9E zHE-3xCxXZM7%vvw%v+j^bPhnJ_;N^QJ^8#W<0u|9duu2=g|U>qq5oz+fe+MQ^|daI zPvR{fi%*cX;xXAHe`Jh~=9xOcSZPiX9*!D-Hx5tIvcGRe@vXwYp<}xz;##B2`tyG< z-a8lzJ6gB_pTf=M(jEEjbiFW*$FtzZ&^YD(jXV)8-bUY)Ci!%qwGB4l6VMoa{?!y+ z2lp?(!<-SE!?}ys@I}7$HGYpe->2**o&jjQPkXguoaYUVv){Krjr(>&x}Np}ttA%s zw=J*C_0xaAJn7FV>1R^B3eMc#f*astN9(F@jd48n2vgj}g)@8HF>)U{TXLbMDAN1G#MK2>Py~L4&qNTnpuz2A92J8gG%l5nu zrxRV0p>E}yZt3$K>dZz%@!+{zjE#6owtXYGZUC>ZaF1Xww$*m-+O9!2(f?J>#%Dit zlWcr!`L;_IB+uYF9=zzzf*{_4cKoq?U&vhc3bHd<7qZaQg*eKB=0J8rXKol z>;UpLuH?)C##OPL`n>>NYecVUqwFMbq~Fd?8%KFFZ(2XWX#H>RPx~`1t*PuM(2Dj4 zh~^rLBZ+&Ep*j4IX>3SSeg7nnbnPC-Ole!}d0&r!Gv|x>8nhVn#nkpNe)GJC^^d#hB2Dv;i@SM~|2xu4UnY;_ zz$)VOn>FV#UPD;3F1>!pipgv9I||q4C*~5zrFp)9z9_C~1OCkI?fDNjLMv_jUsrc} zZ|omlhx{I~!yA^bgH|+-Rg5EdmooveetHj7@019Bp;HvW)cpMcD!@3CjlVW@AG z;>S##iop5@cvKeVTU-x20y=}vVPkB!6Tm^ry>9{Y&# z2}?hAaxqxfm8$D9e~zlv9K~-(&tVyP>1_k(VX6ZhOdJ4~E zo@9M>K7NJUnfRB2^*sxm^7B56?@fNHb7aHK%Sk+HY?*k=Z>VQKo^d?IJOlAe+8kNB zb8}>#;(Lnw%ZY6{e)=DnzcbB|MbZcH8)|KU{jq6t=!w)CR@O$P3L`Tsx1usuIf9hC49m{#{=E-E^ub{88 zMPp^y0=xU?BFc8C@Vtq~4jUBD8vp$i;_NT-+y}zFsO{1&-cNftN(l1I$ZkA?`QDy!mGzIpQyj@S$wJ8tI;boKc45( zz>D_eXl_5trID}D`hDIY?NpxFZs~EM)9K&0IV&TK2lb>OmyleZ(UnVIv_H$o z&C(yRr=Pmos9SZ^q6f%caQcDER|*beCzh?LXWU%cbGr^oJ0IPbfg@V($7d^i-AjK* z@MM!6YDYGfVsD(!w1C)~4c&t}j$&*iPo2+n9dnR$F6DK6l`Ebc=F9O38cTj>^9lAX z&dzfx_qZLWD}Y!1FzY_uJ}iRcQ*5W8uJMfQiFw>f&)Ti}dJ*MbJ36o7Ri149m3_C0 z`0RY*v$-#*LwBEZYB>D@ z8(Vp)>dX=gx=!<_jXN|p_R-eHJ}O8X>2^;eI97XS8eDO2H)l|+()e1v7spdlb|23= zf|I%GpYi=3l3DgHUd%Wnp9ae}6zw1P_iN%0!hJOS1isxm-UxU><2u&9CCC1W?_)Io zFJa8|O=%+~LujkR&|kde1HR33-@)~6d>5`S$6us*_dNT}%-@uAGW5aFeEa%8{CZyz z-Ova4%+Sp%l%LHri>HDo8|@^|NMg*Z&@-DXKR7;}4vu7#6aUhxdDG~C@N^^o6*C6x z4cEL^qPj?jP9x~(KtYLplU2ew|V>?;9AG=(tWU-+Zjb zXxMSRjmV&t)Ei;`6V9sx`OW2C zljRJ=*OYk;nkjK(P8%=tKWXpsox20gID8k}iw4X%*7^MweXfKLf^*@%@Vm}2yAJtv`G1?&0nUCL9>70`v`#~HN0jN1(QMMB{*5GB8CF%imEw#39O_0>+J-eEt@lyfB6H z|9PI{d6p;a6O%5-8h5Md>uuB5RG@1u96AVoOX+L5=!)Mh_I0@z{+_PO6)*Aosr==@ zCtdV+Y6l!B?K7h%#9O8S%daxDFZm*R{UtViHhTR<{f_+__mbyR+N;5@QA>S?!;{YU zP=m}3o>zA#d9}|ej?8iQa8)sH)mtB!^wL`9JL#n=>*l*#C?_9MJ!#d@r)21v;J$`2 z95241PIqtAHG=sp*2+djHrK*iPJfk-pfxA=|AtN5i=4m7Tk9o8P>=jl^DGWk=Lyh{ z=)&dGUD)e2=FrSPdFS)(tN_kGu`=Wd?M3S5t{ce`+N`v3La&f__5fosYk;vhPW=k$ zgidz6qnPi2?3k*&JCGfRkw^Xb3N%}}a!?X4g&(B&Y6Sg{(MQpg>>o#4kJ^6f-URVc zt@=w{rM9j?*8h4peI3TLBbhmLfPN2FU)lp}OBvRDzx@8r`__(y*LOw^27PNWD+f0_ zIar)o4!!{#qMMzOgP))iN)GCbU&+DOsoT)8ouk)LmoFRq^Fsdty*b}n(~z>hv*G!m z|18L7k5YCaJWv3it+MysiO-yWSbWxG`K&R(XAe+Le6}jdX9X?SzKsumu-o&(=yelRq_I;!-3r_aBNj4ZVJ{BijHk~$oD*6~g41oiWSX-DxPZG4*| zUm?Gpe!joH75e(!;rhmJ_bm+1Uf&-;zoXnoCiXAhawmAw_^O>vq&Z)y@G(v}uJaN< z@Al{9e;?)N4eRQUpl1bj>?4_XRPJWY=_|cN9dFGOSJBo7)bT#gCe@W?ZR$Prl5F$f zKW^Qz4Eh^+L~A|xZmXa3V>SBCKiCLv{&}4FM>ufuRpWb+nJ>J=!Io}cF@E4diS;Jd zHQq9lzWfh;$V6l2elX~ayW(0!Pr5HPWjC;n(jMv9fQ%82`}tYO>-;P&>IZX)XyIwe zB+V<>^s>k9=bJBsIBQ64SXLqfa8O=vyi1pOGeL1+gjOW`LcW`ZJXl2T7e=20}z28N7 z;QFVDsf)L4q}&BO=kpAN^D1z0?f~?2CjHGecYpRNZ3@R$@1HH)(1+8Z--X@m$GR7t z=jY(s`mznKi8a)Dl2hns64xtt&L4fmtpo5Va1?@fN0aU?+I(DmInPV1m+uYuCWy~~ z?-5{-?i~-{IOvle&i9~CdQYnh{fPW|DwBmD2M>VHi14`souKy?pC5C@k1uB7$9XA! ze9g{F!9L$;`#ei?UpMhlT91K;cSGNoY^ehN4U@9>;T80TY%=8q;M-9j{;WPkQ#xy| zNI1V%GLa95RN-UpGg3pEj2<5J%uL}q0ujXE@ zDb)M1OLvsc>hE)PF+^>gS1w+zhSvb$F~z7f8zjqd{^-;(|PG%r7i98)jEg#9(spi9s_;v2<8Jd zwk!LWJ+gi4^LQrWLnd%u?9EFP4oWIn0-by?r>@K<$9V2%!q>nh4DcnBXVeC}-Z2>5fhdL_SQtB(b@ zq6x<<%PFV%Ak&!Fldsy)NxbEooxc4(NqYfk$JrI(a<|^REzM3ZCBJNjt2Fk|kjkEK z@%*JrqwoJsS|RzAM>O*$?N!zdO7!uTzFBSaD()mHd)iYvMmzIVP{&v(8f0uYy~P_` zUM61>xIDnnB=`SP-x)lo^PHx-v&?I!V)td66Xt-sYHp2rTgoGeBIaqy;(O`y z2%ax4|DWb<--Ep{uht;$)rus#kb%-uwf`x``42~Vu@!nxzAm<6 z&2HWuBhSlA^hqvge01L+_rt9w{$uKlA&J%HL%36-U{f11@*2KXX94b=HVbeK(~&!yh$sO$5by;~}OSk_xL6go!d zt>?W?@|-q;{@b^2+P3Uk@>kyECBCompie`9?=|ZB^4gj7^*H)GgT9x8gXzs*T>ht3 zPS%x?cRTG41CGBO>7TXUnX^~R#o)D!`leBzZ0~ly$xd}=u2)B6OXAaqB<_nAZi2Vx z-U%Lr@8^&)nqSzcKD}iH(Y+#WuNl zU^@F>s;$qlQ}Z`+%*@{bIaaOyuIxV--oKka54f18BP9=tqlruKIV`9foTz>sJ)9U6 z(fC#9oti7P7N@u_o#~OlK3d(a`%wxuA@k>YIR#nI^oa2-(|kW2*figZFHbbSj{av$ z9se$K_6DDhC7*+H_TiMT{=1>|*2?a|{d9#1?28PKsiR}{^-$Urt!fUhoR^z8kpJSZ z5sZgP0}ox`MY_l^(i|=K5Z9M!PxkR?c38aSJHjb&-EPLapym72@x>8&4WILD`_^Od zR|Gzb!f!dq7UWA#Bq2JA5eqUInNk2<-WM%0cbnc>7fGo9(!oYvU$BBb-ez5TE31{wDN3!D$?=Av*kVr8x37B(VlpS~m|Yd_5yW#ag2 z!SCJMw=XNPvQu~r%FYIGIR-g*5B-?3tgNs1i|wr?_va?4v#;bne=U1&ct&>ao>loP zKIcBFIDDhIpde@OC5^@CRm9<3J8n?o9-jN6dvEgKV|`l{CC13^3vFcGDxb7c=8j9~ zkK!7~L>4cvWDe9^@Gx_>>N~?i=JD+q1~0-)^7i#lZbG<%Aop zCF^}6bnpmi!M>k6K;O@_ecwhr?HJ~P>lxo)P`+dZXYYdByVz5qaj5uod+WwL;LyGH zfta$HlwU#qFRwkG@tn!H9>@63V4TaDW2QGV?g{bd=ZvlD|0eYx0j!5Y6H1fp(Oa_f zX=JI!;b_KT4ESFI9^`Lz-`nl?6~H={^nIygA6t*`@*XrQJSe~X*LpXC!^^>8Bfim} zP+oe2(uHfuiCt}Z`E!&W1Mh`n2eH?APebD`lTUn+%l@@3j>f^maMrDbAJL=X1!z&c z@LC!#?A3B3^?!PJUc)Cm1L+@Qp?}E<-CY$csX2WLJWvvgEE&bR_j1PI+-vg^f=@7O zJ{$oaugxJYC^{%HEvInP7;ed);(+rwV$xxXX-BJK*E9neYcpye6e=f~Dl+-jaT>$o9PiGxyvuAF15S z#1YHCcy{s|F=P5R&r9S`r}EBYJVZw)lgHQR3R_fnJ^I{;$e_fH(UCq)Lo1@`%P5zU z?}aT-Q*Ij14)rP9wZuz#fMR%(8=_jx*B_^z~V>=3?vVSQ_hsV7q% zyUFjRIzsz4zNksnvBB1Hb(T8bl%HL7jCK3Ce0yk9ppM_#I;yE7+Ze?0E!9wubc;;B z@OncFek_&r3-P=12Yuns)%ZHbY^^Z~Cd=31@%aO=X)Gi|^$z>8cSBYNeI`@?=Iay_ zZM~eshMiW>GLil?AC}j!iYJI)`N`H{%S%6q6C1j~+VyR~Y}Vv?I~%_Vn8Rn0-b0%F zUy;x~%Xa~{8)wZ?*>I_N1lcFXFG<|k2HGoN4QoSPZpWRPpMl-cv+yWf1=p~yQ~U6` z;QhY*gp!e#Mi%PZ9=`2Tqi_6n-@w#rO{l5HGv}o`}Wdk zE}%~wE_{gAavlAr_qWv2nxQe~X00`7e%_n9gEV%4{J+%WS=#yuu>ArKFeNqBV zEg=8@<_`N@U^aJ_Lt`;3&obR%zwJiRTRD2tbo8XBj7~0FQ0vswna4zf+mTP%@ayPM z>#$C)77#o@vzC_DK)@*6q?_nG1upEt0k<6iI?T7$M8hj&FE zCxFu=eU?azXEhnQ&;CE!sefmCQKoShy{Zp$CShyJ7FrF>HO%9_N5$9hy>|Qd*2cOElY2Q|x?!8S|55!cu`~Ft-iQB z<8|vH=`<0G`)3K&GEPCg!O5&U%vw-z{`Te4b--ifCO9~Ybq)2okGiwrOk>^%&ZKk5 z)^@Vqo#RtwW7wR|;rJ(Lmxpn3-i~m>T)M%`rSXp`ZK^heE_%_ufF{8 zUdL?4WLkl@x%BYG%cl{q+s1kf`-C<}I3r>7Sa0*&;7{_sNxBmB=49*<(4dLeB(6w$ ztL}9wg#NZbj|F3*z!&W}!|Yc`>04SqolgB#(y2selymjT#!+mz@KYn6puR|wp3~`L zL>ByLY>n=OZ&B?F51e@!(4FEfkNj1#WJJr&;HK|j_&mV7!Lv2CU2pfG1-=Kz>|^^q zn;iNmG#>`*cJ$aq9qxBHSB;AYj1G^_Sh%Jj ztM)}ch2guFIn1nC+WAv=Qkt<1%%6{4&pgRIC_lO0ZvJ$z{*E>bkMM0JYpjCxFkm%l z$gWqRNyRzHN3CzAe7hH1hhh2JPQdbG!NMHp+Fse2S|5Ev?eI;$BDFJ|c5cqlj&z55 zXsQ~TQ`}r5H0@}yrkI#rXix9`@C$05*SbN?1Z)6k@m=O3{f^lEfeU~qX7i6EzhtAz z7TB^ifA@6+m*2sCF*tMazg}rs-&ep}oU+L@d@WZ{R=(ad=tD9czlHqTiV;33m`?s( zh+ong<_YREv@f~6za5WfNXsIsHyZ-_!#H(lBE8bnqLm1Uy{{9z2t1h zMdb=?xxEcc1uee-roDNP$*p5Q^5?2CmR?2Y8j~u<#$(^%A%EXq^oy?k^t&FocSOHK zMKiSTaQ}(w5q{=z#-63k5AAwu9q?>DC|wQ&b=ThOd^r%N-5u?%dhfbz%LY1kuA6!t zeB%9}9CBx5Yc7B7f7$-iv@hGRMm%eExcwKOaB&8u2JAiE-85qy4cF z;mIb+C4Q%DZ$Ix3GQmf_Z@?$gs|>uwk;JaXwq^Yfc&}pY2jY`M9iOn@wG-Gf*&CPB z2kGIzmR$}Hrq(l4d~z|ch56)UI=%dL8j|TG{MLy{nE)J=JHTY3l zXJK7(GkNCvVOuv)=wN>FaD9IeRnau5)Xr__|fb ztx>koFE^i!q+P91t|P62brty!dS2bWjPsw0I*Yx;Fxu058*@P6PV^&}`Z}Sf-Jl`) zc6+kKBW=5ue2mSFuUUDXlzsiz>;84EKek%W&=|M1GxyPV$>z=j{k6=tZep{%k((O9 zuhwt(GPFKE~YQim+!K1e2U{AY5Aw<9G`ziS^ilU9clQ-gN8=JKhttX zZfZjxe}#0n4@3O3D!@M~1ky%%1_Y#j1k1PI)G3F-C@K=%HuLAgMM!@zE ze_c+WMK4QuONQJ`xxNY5bvy&njL{tfdtd4;&OPFXW?PZ)qIiSLz?IgSo}jNvlb=~{#S`?cbnyg5ExMn1E9>wsHsI(D z%ulp8$+oxD@LFNZByiV4UCpZR>?iP%Mu-iF5*xr7+0<)rHUS$h6gShu+$|j>0{=NY zc4|%qkK&gg9+#`H(A8gQI|jTp^CF3M)@!A23#X0vgldQxxtF)WMKX3cHRmn@2a?Ci z*FZke%XPr4G?lr;^rxUDA{q+yLw%S?{EhnKd^P#weV<4{Q*MXmxtd}xaRc=>tjy(1 z>fDYeSLQz0Mt?N+_(WRueJ=Bi^POo-)voGsKB-FjS&i+bZ~0oU2SSW_WN4*_-%E)D z7rn&6Sr2u1Rk?}X`Q61g`On;#1Y^@bznU?*eR^+<_T?+cB#X)^pDA53O5>KqH|>3f zKV5YDW~pzd366qDe&R_Ri}#3uv7qJF&^pfzl39$!68KPkIGZtehC0^sWQtF&hla#o zRnXuEoX=f=Z*s%O+1DuC9Z+k*Z?&6CkZV=qN1crsz-`z^_0ZMKd3>*?P2uQM@a_A9 zX831uBI6XV_A1}q*-K{`z1yA%VP%}gFDT>g0r#2q^u#%TBn*RaZFsreOH5)=E2 z!Hv?w>zc2lZv@wza$W(q$hLnI!!13_1Gft)yMQNX!;FBo)z27st&Vzq!qtLu?YWD$ zC);BKzpOQ7Icf>VR~T>6Z^ zIXgNxQN}mH`VjCP5Q0&9mf#Vrzr&^p@>wtzbgbnw;ZNp}l%5D`GYN+7P@uH-;ZUI+5m!;kQP#4*( zIMVvM3#T|7)Ye_lE8NvYFG#LEw9-bc+(@-=vGWGG1~C)0%EA#o{3uMIjJ)-|5fwN>H9U&6r3jlrytYH{Yl%QQ}W3c|A5$9 zKi)Lmmo7Mk7qzXo^u=!S)&R$7kN8c-B91Zj_`+K5>f z;ap(1E>gg`z#Ha8I~E#0d}?iAo$yURg69H{63(HiGH^bh{6^OCScogI~XV zy}zGQeHX19Be>~T*oWTzy^wt@ILW6wzJ=$n(`L}#58~w|%BpWB9wD$sDOlD>Mu+?W z4weTc&jm{;Ug^m!u+&;urtZWTXNtFZ#Z@BQ-{zU0}FtTOAEA6)0hjg>(^<+&Yin>d&ZbgVT>^2$&D;gu;mewF-& zj+1EmhDt;hFjy-YX~9K+E!9G+x*2v0#@M9|i_($GaZ54--=tfX)BF^(@+ZJyNY z%VMW1_q^cGL;s{dU*}1a%YixMeA+N_IS_MV)_Lq4bEf^C4JRe=zvyOSlb6WPt2w;@ zyl5V8=w|m;qM<(R)4qLhW@M+qA@^d7HVe3eenWI{#}QfNrI8Qz4(-S2r<0fa zJ9(L$E8C3c?CW#0MH=bydk=NydK5Ew%HrP=AJ@ zlS!_YMh@GSAFiYG94G+z5^&ll?WO5iKuSJM0;Qqr#SZDK~;=51yc$49@2xpgE&2XR&jy z)?9@wiP)GeXHyL_wAx=U{i|660XD&$VI3%}S8ZmkE}IVd{&#n*L%vNO#Ya7hugbug zj4epbFRy=BvLp51>5M_WYW|D9uJ}27QB>cfw!SvgpMsV-^rvlHe|z==#-Q5TZ^-hw zRkQ6n{_!b#aX4FJ;0WOi8TEIwmnPnF1Z`xK?M@CUHpKaVsGx_P=8Q%{_A;P77Pa7YeP8ETHjpjuTJ{dr2oS!W`2a0 z93L&v_`+X;SL>5*Ubz8XTYT#9Cb(YJ{+tYScoF?@Hqp_R_Bw$nNbf;;d^Y)2U+{bI zZn0A`eGl;V3HE!KwzKI{x@%YaXPquJ2mNd{dd;WU+E1?Zb*XhBUFvc8-sw{7kc;Yf zP?y>tyh+aLn=fZmv`xTxKU$A~%N}45p1daRJffV|kp#zQ$UE8nPQSY2IbY6xVfE}E zfXgUPgeMzqCgrT%pOcic@R9cDyi0$Qa<<%;v%h4FcO+-u|4s%uOB+tkzQgx{=9@bW zF8b5Bld~Rt*9eTi2R_N!b;Th$YhYzv1{?+D>|4;k<|5_?gS+Fv&7+iEqw*n{=jfus z>e!;i0_IDjOSYp+wsT){z#m*8@CC)tWh*c6nsvtElfxptwNbSd`PIe)XEe`> z_$!*}ui3kQ{$qn1#&~017TV^mFxAhTB(C?Fc zzt92yA8~I2A60e!|KFJj$pjFDtOP3wvC7g`E2yM~G9m1^0t$+j0Dfx_zqQt_ib_Ik z382=|xK!F2p#7SR#uXH_t$}C@qSd&dwXIB`wi9So_5`H)y+7yPo4Fa1VEg_4U;kHL z_jM=ttj}|v^K9oi=jgX1i%-#S$G@AW-<%C2|Jlj9$l$=0jh)2zO4D^y z^`pyDthyz=%0@RYqVEH(*4n_#mfFAo?tIurU5^yj1}<5D&4_X9uX#RceQia?dePuA zf6j_%N^xCo4_{q0zkYOXzp~N0rn3JpWh~#Ux?xxLs8wHb2b7JD(3fEaR_ll+UqOWa zETk{P@31xu3#Y6f;`0~88bTYc84+4P>_^sy%driI^b4-vKajh_{R4J~GOQV~L9FNa za&|}4tr-W2ebRR;i+B{~Pevf8J?5l|xmq(gR8Z{?9gWVnj>hr>1(U#uWWGhd82Ie{ z+vKVm;wb)@3@+yfz{Ldc(4#I$daxhzko`8=Yok3k+HZ3$XGPpyYsVn2Sg>H!l+<1; zLcT%UO#W4&0<|#&+KtV(IDR$Mp z6mx#WH4EbBth^G)Y$>46m5Jqp*1G#BueLKXLand#fu`ZbT00c&y#JfzDtF9k7{eMf zh94F-r|F!LveBZ6A*mL65&fOnyVmXREj_Gtw^45;Fz3*&aF)%xly@fY7;o)^Ffh|@ zO+{wQ5WXpHsfM>~$IZN1i!*twRrDv|Z+zDDhxW}mC-L@!v|j^^%Ax1;dmD1f z<`WsY$f->0nX%C<_+2`@BR#T)Z;}~**pO^uXL{3?kH_{&2g28($4VEhBcHwr4!x^^ z<c@r7gh$WZ_ThcUmVL>Lek}yCBqll%bE?(y40L=EqJpd zOTW)vN%|6H9YAaDx4;8i#25SeS}G|sfHHqX|Ii-PT>MPji)C!;XCF_hA|@idjkz36 zDXNPm!;9cQ(PZ(qP+dU3h2WZ;?vd=nX;37oUz zH)C^%{{8TXJ2u&orv@E6HigdET26XF7P*xi`Y=o0J)A@Y?-3PA+cQ1hO{v z_rP@MznH$d#|Nq%ntp1-}nLYjK(I<|0 z>nqlXPXj$8_gr@YIShV$L#;_0XcZ)&=-|KH({MJ`O_itxze|p+a9)0>q+lk*__`Ok|rJlGV zD&EUJ)=KU^yLx+)IiH~?eM)L*!<%=UIQ=|+zf0eBKF$f` zi{v36oIFZ@fV9_1vv>zd?^A1+S6c9d&<2(7#goea_2g^E8TmE8_xnXZ-JjK@xP^1} zyEK#)`AR1=^aS5DzqhTo=eL)J_Q5}0I(p66$Z3%l{2QX9bD^PUDBImxNG3M+1bc2N z4pe6tWDxVIw_==c(|JhybRJTcIgfE4{;ZP0R`_0Q%0Rwi6}G?Ff+s7F@~@Iz z;mKP@-UsMME9v$*Tw~4sBmM9n3_(wj-BKo779WOd!`(m`^|dM=eXX^v{an+zil0LM zOIFnLTQ*U7LVWmDl+_$4$+yCiZNi5eW3PT{@4!adOoZuD$|j1=NyJhx$@9@Lh4PN6msQfdX z`5Fuy$ewg~qvTZTK-(8)Z0UIc&Mr$g=QqCSPuF=_?eT|Aj_)aI`j!{*b3fzzw7ZWo z(Ir;+3wV7EWm2yUwT|&wd-9w(M9%A)Va>H;=eCeva3uQC)K~d7G)~dgoH>dAgf)<@ z8FK@T2f*9Sw6Shp0R1T~qI223<8?M;^~A}Y`&9(%X6Rk8W(rnpxD58TX#BDmzjx`c z>b#sd;L=UN%6dx>n%~TKANsMGnA!!ymdNaI9Z`aPdpESmw^`Z3LMZnw{ zjDk;PZY5q*Yp42OK9HwB#uoxDEzn+2>Tu)S(n7xQTEqL&9N!Y>Bm(PoJm2dAX6Y2- zdxBlDt>Sr#RTrIZ+r*tceqUH~{Bd+1@j3Yz_VfP(q-pMEfeXU}gb(;e34CoX{>41} z_l5^}@No$+>%7^{V3n>V`05?_>S=d5ZE8M`q3=p-pNppLw8%4_7Hk=9w9&>-N_+C*n?xqL@4 zKt+t3q0^0in@(wmwhf(5BqqrV%iX}?<4NQzviHqc;UCrd=tJ~LV^s#e*0H|Qvr&Gt zw8;DT03KK(zh8RfsZZm3rM14IxDc(clzG-yKK*YOhK@Wz`cWBU(x1MojlJk<8k3K{ zV(Ze2(I4xvEpIe!rA5wx{^IAivHuSk-Xia@aM=9Bz%sxd3&Ekdr>en$@bk=@O|&Wg z5{2gU|6GTsRD14)uczOlH_06F6U#$y8%Q(dh*M#Xtu0}%q{{=JBkhw;c%VC8?{h}0 z;U)BC-C&!S-1tVvG0F$FM>>Vg86)Wu-Z5g%uERIG7#Y|;MnAYIwacx=HmE^F5Vk98XUk?6Q;;9_+G|Aoch*G{0-La$a%mAYaCA zjZGR?^rx2M)bPIf*p)o~!DZ7nQvOE9`kKFi&*Gv2`6w2k zGyL=Ev9;IIZ{2}i4J_!z*Wa6Qch0B9zJj6?tr@TQdhNEr*;7rv@TXb$_~s%*$XkL= zRA2sK;hW``wcG<-W&X0!_5J=-xUt_yh4?n=>ihkf-+w9G)bHcM2H*C=;yrg27A^DD zg;L8#$Ef?Cfj$w{Q%)>|^auSGk6Ng{(1(Q?D{^*|FONO4vHW7wW;HyfWXYC73tHPX zpYvTu_*zT)zgal9{~ro1d|)O0-zv1AiCtF{)3%4-`|d6*>A#iqH%L#ayT++|O2+b> zUHH8=Vh_lUe&t_QExKLnGVmdMT{6$A5{}G0*T~BTU={5|>0cB2s&t4bGT-G>mDh5% zXoDT^Ve*V{@|+&evzRghFcKfg<-_wUVPX5{P{8uag z8t~-y^ExNb!g!wVsIA4$_eJsVv-Euh@+KF!md3wN<9i$Pu*_dSS~y>Z-OvoqLp_S> zgzr#4zJu@3o>vX7Lp?%#PpU&6weI7*UMo;Px@1W?xF65h{D^V*G2_Fx{!7XKMq!D+ zlC*K8RTMUlC~9qf!fK7p?@=(f|6PSvA+``>a|V5=KS_57qgO3?t#Iy=-xXR({<@MS zzb~}1p`|~;$46PMB}+Dvwuv;0v<80DrzGb8!&d8N&MmNhqrQ|C?&FNyD3AQ>niofy zQ#Ug&Ze?C9nCB1Q_B%hm$Ux&j`Ks3d?;3m!Ph*4a9A9ud^m7hRDmXd7xzIuEwdke6 zm8;0_=l5>vI>bCb^cZm9Pn!fiH9vtLxW7HO9_wRWUzzo@oY>AD1>7$%V~j6tw`_|c z%&i!(k7RBsZ-{Reb1Rj(wS~D=&)l+@TR!Gi9_vXKbIZrv@-w#r%&q)=cNONX@YUtw z1K&^G&CGw*dHc4lElz6j@Rm=+_d0_gV1JP#WLU80UQ& z=er6+_@*p;?wY5|fTy`3r689ztSWHh+Hv)w8S2^s&8V(ir>joajH^4xI?VGIoq6(nd_LT}kU2JgLVS+> z-pSJt&+{YlG=1QFN6xtOd9l9lbiQwof4^0AG7g>gVV{%#vv~ghR{r8i@je8KY<|=h z&vTX9N^`#VEo$$>cl3Rb^L=3a`z+P@xD~eGnI+I#>@lqoTCHsrCv+>L+&TKw9NYI} zWEOUJ^Xteg=;`mgGngx*26EoD{V0>l`M*Ho(vZ8W%sCIIa)yTT;id_N!)}XKF@}Mtu zh0oV>SG2FK6C|#m9=>`aesg@Yfk61kH9D(F_E~1+;TMyu)P58ik7^xjIDCh7tX&U` zU%zXhwPDws(1u;l`_@OH|K{NqJknPX8^~FB5A;~SYmT+y(P6fKE#$x>yy*AlWb4`B zHy`_G8S?@8x@TbdvPT!R-S)0*`B>ItISYDQ>u%od__H~K!uGjlN8Y{0@n>_llJD9J)t*f~2Yb;z{T6>biM3SuW)5jy`A=HW6c}5_+C-iF*~<5`3i-LyBEoZv_&2^5 zH@>n7SsKj8Hyh}PXW17vUa}(>gBRsb#LG1S@Bv=5=GGZrN(0u0SfJ;yYerb>W6~N-xB(+x|V~dC^D{Ea|XUr!<^}E z%;gg?{`do~FEu;z`T*icfVuK{dre((&RzS^TKxOO50^u0YHzdV6?*2U%s1sz`kSPy zy#9Cd{nq5;j)q-!{vG6>$@9f^o!>{%7U`n*7aUtbfNh5B`wW=vRbQCe#rM;b=4`i*F~46lKxR)bY|J;Re?oyO%*}O z3v(`m=Fwtwu2OU^jZf;bP%W~ukyr#XmxeNzG_TBDN)xU_t*3+Qp8;nyW(% zSDSxU?T+E~qjv_z)m5)3ByVwD^-s>NTg4i53_JvV&^9p``}0G!8ACPCI2Xb{W}ExA zX4!g5GW{#*YwIb3-%3g{@LNO5MpviY#{YimTvX??0<`->{>0OuWc=~Qtv(rBhjFX#Pd^y9jfyF8#;qRt{{JQJ>z4x~xUaw0s@tgfG*Ij3!QI@~ zJR=5N?l>ICA6J`g#)19x@D{ zVv{ZZ208LC(DRsmV_#hNnmMQ09rus2pn78;giQlkeKIms{8}TYT^2O&Bvy>h=?<&O&b+l{gyIG68@Hxe@h;MNo zvw<%?@-ncU!PA*vyRA5A_>yHokJumnV5oHma;2tNz8-kfPOC928i)Ugw}>~@l2*O+ z*1GDYqv~?YUn|Tj|6SqW^4}LW^-8UaRLpMKwZ>}AE8oPo2EL`#<(0o$*c5;_aUO_l zc`tAJzUJFf@ih32{0mDRzrs>Kv9Pb}f|5APvOH#gs z-xYsY$d)t7yL2r7TL!Ni{l2KrG={#S(4}GN+s2k-JVGS9^`G z=hoef|NcOzb+L52K;@%TNSB`199aJ7*~rov=(v)#S&j^gBExJQB0Zwt_&*|*%=Z@p z#9Zb38pXqEiv5k5KGE#VmSB&Lx?~o*Wb?n`y5yE#$jDubO#I?n>5cFL=~E$STkVAS zCfcrMOb=}DQ7hTD{~XbTWDfI6y6@@8>p-Y33%ycvOLuauXRg!~`x>*=59Y7>Vf3~6 z+|frHPalNWOYVujD{eRXr;&-&eF(e08W@@yeBo;ho@W_6BYUCIMakQ*GQ9bNA7?o#S>CxIJ)~b(Aro)&Y)OlD?~0TJc2v-VAOxvxY0Y{y}s~ zfBr}Oui`bEUeB@V_2{BYpr0Ag(RAo(8g|UZwa}O0od>{W=0WL=HeL&%U5(M1mzv zT3|7}_F~R16R#!qv;(gt-Oso0g2#4VyToVnTGFBoHjZANAIFg;UP~XuQxoyC1)s8b zDE^cU&A=x=Um3i%D||Eqvus7dOt}vD5DsG4n9wD*TM(f4!dhCH}g# z6aJbQ7v{!;xww5G)5BkZ`32Tb+W9O0Kga*#uV+AGhF<3r^ZKeyf9v=*Ote?*hxU3f zCz6>PDe%@Hcj(zMTTSQ!gDl_fGHA=ygI)l~2cV;Bbc3b_&bv9?LT|Co(frXmm11bU zGX5L1e~?%r3!WocoDMxiu~S74_%2%Av6ufa8dy?zaC@ls5c>9Zf7b32@UO9d!Ht`y z%{toKOdrsl&N+xqHprJ{+SJ^P(JvRz8)ZWRuPeuP?zi#$&~0b6xb$+6d(+g8kG1DS z*>-f%B=9j2yi9;sjIRYxhEKR~j0E?>sm9LLN1KqL;vYKKP;>kW@Y|(LSe(+i?iFx! zFL>GAn%@+;Br-UiejPu9Ujm@N0$9iDjd6 z(aY-h-d&g*-bmUe(vs`629P-Ce+b^H1Md_{Hbj@Qrh^QOPGl@jW4&ST8`N7Jg-S%TF3Lb{lI{vfIFI6j+7ZsPr=juOZ1i2amPD z-VE$t7N4~aj-pFh8&ixTIF0rf{uxt)fAm7+x=Y)62|C*5eKu`3biza0ic`9_v79x4 z@(d3j0WV){^zae>Z{dIOk&_*o*StF4(bLxOEt^O2pI={K9tlRR%3xLh~KaNqhLRtqs8y0vacd| zG<7BShjI>})fn4J>>zfJV!)#T@P&Ubh`f0;nKbxFv=_Jx+*Qa~t;hK4+G9~8(Y=cU zc8vZG)~pt!3~b*kvQB3$8`~>0^2vYcycKjUeXD3FER!9L{acA&YX4_et^DFK=#;kC zs$ZFTHeC*+&%JE`R@WFkW zYlj5lcnBUH*Z~LMad1%2x`1$i?`Q4hwCCcW-tnOs9Uotv@L}}4e49sZ6%C=kegF-5 z`M3Oq(TaLokAl}p@9!)g_KWM_kqtJF)P9Q0L(-+}eKyVMwl4MfQ*m7?3V!x-hJ=UCaF~_HCEn;F(t9)!)=Zr3$ z#@y{w7kvzTEymAP%=%cs$DF;0@4b00<~f091`q4iOE0P0@nZex<{QY@V6`^&Vr?5A zj_hI|^?7j?1CQPL+{&_OA6sG?^t3_vU3vla!(SHD7x+svYYxp1h=0fzC!gE-JlM$c zy@?Mmol>`B4t;4r2br$Epx+NFbNF|En}0t>Jr6J^@WVxyp2#B}-mk8?*w-4H$bOl(2;Oj<@=)8n?k)%6K=>6^ROmg$3lqrRWb&xI!|i9UlX^pw#t z@D(f-EYtapYyqG0-3h;juQLwv-3jj=UGP5Rt8?t`X2#LzfOp6^qALnKnKcDlSAJ>^m9J!+SQ}NgC zXu3rD7B<4quaciH!B5c8t7{qL&`>ljE`y?s=kncNUSRwAqK@vG%s3mKLB2BbNjBXA zk1^l!i;bV}edPs~UG+8(X(j!8JYD(uq)1bBbbS+(;7@Vv31%v=*EH9VOSxo%B>ayd=JNNs!{rCwuw0#a)##i_iY#;H@ zi=Fc#)&u|7g@Zs3bp8|3ZTq3)_DAPWWB*!G_x_Y(+nGwcsmqnut`B6}JbWN)z)b^ZTmM$RrpsDN zp@r&-KcYjfEX4Q3KBkjeTtCPvY>ikk{uF~J#~*UX2R44-$+ZSQQw@HG@?Ch*x~Cs_ z$O!tlfLvc4v0p?vF`7)~7Qa8lDC%UyPl05o^D; zKgTPN_d%D>8yt=8vajh5j91A9n{qv` zhSwQ=2|ejL^r$iDLvHLM`jYX1E_K&1iCHvyl=LZlzHiyFi{*^9mu}iBWIJ`_xreVV zBF5l%W{s+OxAZINRp^VXdq%G#e#VV+#NQrWN_?Zyzt9!2i=#_}Jm^~Jld-pmbKH&Y zf0eC6{b3$!6pl?SeNQ@6jQWEm(w(OAe*n3D9%~cQohI|Y zWO#DE)q42q;#%#kswQSM*1)|^;7#!c15K=GP9*1;Skat_^1HF3hw-hLSW$2-z5XfI zF#fmr)|mfa;81q)cCB5s`+PFZI^~<6*>-U~_Er=9R;=jd(5Z=^U~NY5DONO5Us=NZ zamVGQeqOyKDLm4#g=aIL%-lhK=i&QqpG&keoIIKvewBlP zyuLTkvV&OQ9n7QZz=MTmoep1*S*OECv}A5c1eD)#fThjuVNqs@D{L!%;xzLghh z?BY6U7cl^iFS&>22>t` zj=32aw}Ag9b8du<|9ayidbcn-LNOgPTACNicIz6KwGPg-b|=3OF*lK2;9EFu^5YLe zzC5Pb8+^*rFI+ro4d1&~;;xfu-P>KmfA@2H4S%ELy!;T|#E2N(9^2u6=1Tr1uHhf+ zUpjoXvxe`CTl0zWIaCcUi;0_QmnqH~ezP-Y`a1JU`3lG<-M)-DXzTX&8ve)13oIX^ zi)xX@O9yX%EAYgjV>?%ogfF@fU_AEorF(2#pt)urL3>#OD7N3%D0`1UN7JF zLHxVy_YY@4BUxqq=Kqf>tt#1k^~vz!h0sA@K+8tPbE7}0PI;pNe^_)Ant@%}Kx{DU zFnP!j?bp_xrj6)&`|*8yWy%8JImEYU#hZmu;y0Ub!InJNYF&ljrinScYHxjE6Y-bz zgGD3uoYB0izkgX_l-SJrCCdw~lWdt$#CTLY>)Q3n~nm7xJrvkB7b_ zKE9Y9$Hyx1WbNe*4BRc<_p9O~39#p3=L`0{eVxNDdr7cc`^pTzF!pRaueaB!FLHQ& z&9t1A8<&i$s|Ef|gX>494nS^|!&_Y+8~j0VN3Sb3u>0goO|VywF1iA`nGOA14jo+v zJ?_ zQ)#Cs?e(JF-q7m_tZxSly>=CIQo#CiHS1YJtE=9rUAuN~?b`Qv_Q&H+;7#tD&Cs*~ z?dOfS@h8ufz)M+&k__bji&p#&zD_)N3c3vJ(;IoZ^c6aK zs2e9>$Ku7;Tt1oYthpd>JFK}N3nXK;<|4VC6=R z!MgDx&ip`5*uFH@3W$l3FGs#JFZ~}~G@1O9nClan zJt5r2oQ*9`HfJL(Kf!ut%Co(~vEhMQlYdoCIL3KOvWwb!k?%Brt!XEBpjki20pD)F zUg#s-C!uGY0H5ju41Iy+L}2d+?6Qp%10ReC|99P&RCR#0fLAz=ChG72oypULuh@;x zoeaJYg720&W7}b$3he0KW_?uf2WJOYW&(c}@XtBTszUEv`_PkjPrLLRbwBvvsk_bj zMIZLE&e8bJRJ!88oqKTd@CU^L{&2sKld7Wlieghk+l+~&L){bZEmjlwUX9Dv&XlO<%fK$*V%ZCW6YuBOvcgB-P|+7QS{KZ zsq6)r4c)Cl#xPdJob4HVd_wImVxD?t^jr};Em#{Ho=S{5dMR}OEqK8O*{IH3=?6`^ z{6sR=@C^B;9lRda`INx2te-6_&xW3#piGCeDA}j$o{jM&unV@X?hIgD%sF@Nxoqxv znZKZ%``eU9wTf0a#4Bpx>yw$YLyJC(6mG-oQi}w@p4}G}!KhME`hw&k{ z!A&36#rRxIJY^~P2twy-E0r}dw~X7DvpN|g&4qKEGfbbRU&roKC-#v#%{V#tXf|Qz zRI;Z=aZ(n%q?~p)lBbMz-SNl)FOqACd!t1Qzd4cn**9^wBKNNuoH=I*dh_N5o;L|E;8OS6nY9+qvOOIiC+FFkJDUVc zHU570UOk`UncO?YSf9~afH_ZuvjZdpU0AnY*~yuqo-zA?^cy*AU@bUu?}PHumW#t` z^dRAIF1+1~L&Z;d&mwG@Q-p48+t(30+lX)!P8-G0;4<6t^}q;-YIz* zqb<=Qa&!Vsr?mW#m>ksksgUN5sonLLnDm`)sc-h-KrD_jPhq3bT#JyK^awfCq zUe{etx>sfiw-&l8`o`KD)h6@CN6f!y-W{huQ_lU}E(ghXwlijz(zmYaya@c6I`cZ# z`TH*F?CsQ9M4k2?FW)hHyh6yi7adrl&|dHq>)C3)NmpfGfmyG5x(isL-3{n{*T?WR zAeY}BdhxMx`9@$XgU;%yTRg0sx62oQdIfh;=&TjKl`*zD!=Z|A21f4B%wUYWE5EFh z@^|SQ=a`r}x#v%HE_Ulgzw?g8t-z(W)VI0tMsMG=#_1iW&i2Tdxy1Y(RDf;*zcx6y z-oe4Gr9X6a6P*)WeQ&5`6>VHj9Fxuf*1BLdcrojzoE@TmU7~)156)fD{vY^Vyxe(; zfAV$wHnE$!#!^@54o4?qJUhGdut4pd8fuN6%pP3vGk#YjwEK;2+8FBeH-avte*2)y zj}ywD+)eoblvg~1;CzvL%4!_>q%)QzpA;Wag?u{5xixD!Pi{~keRpmS=l}8lW{-T@ z$QVjKMLp-<_^Dg+$&14y#M^g;`-8K=1??s7S^2C_N1X5KrjAdjgL^Jbe0UU`3n$m1 zI~m;M+qCy*wd2>FXdU;)4CvXhowvJbXRGR~*(B(sl2c6>)XP43+ho*#G9cDd7bVjX`^7}J}&spI=j9naE#oh6o7*A)rlHm{qy zu2fy%^`HNW<5%N0Q{Ne{ze;9k+@KZN7A1qZdo}^rQ=IxIA!8ExM`GWKW=qy|#Gho2 zdtaZ*dv&(6)DO;rs)slIgnNDU+tt~=p|nom-v|6g?*Ojbu_5QvU-Lg@Z{q(N_kVcH z9md8?kNmus>!;0#Oh891S?vp3eXXj;$lIH=Tir6?;%cYNeNGwSZz12L8>t=9)7#Sf zp|KyJ7wQbfa^814>E3+5bMk%L8Owk2UgD|ew@&&TY}niR-rUpfr?-xEPM)tjbxfh( z*L&)ybJ8!Mj)i>xkUHeYar^o!Cw(G)6t3QO+R(V;*D-qAB_3D@CcyfjQ~ojs)|tF7 z_SAomlb)})-xm(hPqqJo(~j_Umy>7x30Bou(w_FD-QlD?!QJxbl2+sP54^W9R?;iK z?is)9o&0CfkJHKjGf!RDIBCm-EBdmIvnEd^&jX%3bIFs(H;U4%*M1019a=5jJu~ty=YGZSkIaY+<-98h zy@Kly^<2xdkmnknE@l1@=1r5;82k(8eIxrh=i$*oXQ2Zin~V<7e5@W+!d&}@`09^C zEt=n&_m^F+*uZ0X+&1LA?(04R+@%xnl}cBiLVP^$vMzL~3DlLSOBM00gmOOTF7na* zf725Cj?Xj2gD;Kq;MA|h?UWHtzk+v9ZJ7iv2Q#)thV(hFB?RA@dkyRU*u|yajhFZ8 zG5Kou-V0iCv#hmG1M}02nc#nt-%s*eG8kLk*xbej@z~rM*xb|J_1N6KtQlq9*xZ#} z*xY{lpfd;C^^1GQcdK9gj5Fb+U(|Ev)tAvPc3o!c7lP|%;JVp?@dke1AQ+{eaQ-E> zU8i@ne?<9`d&jn1P5!H$vRCo@Di=SFPogvY^z`Bfz4Jf8&r7s_%zaTFpTu*d>mHM! z+2e35jaKxs$5dnK-VJ;+zU7QE`%d0xer?;u=Kh~dk4^->h5@JW=FWqMg$ww1qO5u^ zg|#r|hiv`QGvl=8m06W4`z>2$?SNu(i zxs}k*#QrU~taJHlcv;Zr;dvf>e%Ac@d@w2)R98@WTy`KWnT2$`}_*}koRuyze!fmelf76QMM(> zxnMlq$%m=jo9&ektJMA`U%01m4*p)EF3E@M=)+&BYbVbRo-XABHlciq(%*Du@ha9S z@}L2oY5Cy2#hjTg-yrJ^_{-e8Ee|pF@{Lqe=IkIO$CMG7^&9&> zCbf}Bm&weV9<(PJmzdV~3+~DrY}0-jwBnsh>t;dw!>|XzF}A(&x#!`_wYYbjyAr#+ zJM_1jCzNyNU1FP$&2sJzCC}&JRP=ljxRk$5ecZ)4wxacWz^VJ~ZD>{VzLIaEZP(AI zyP~$yzbx*G(p{X_{7HN!tNlFRGc|U|^ph#CcKoz+3w7Mw&3LKJntR8!1dFW3Ey(3T zt0dExJv!*8?B}0mWco8h^LpBA4j#K+ykjn7`CsoN3%&e=`;>f+ODGBsH+4?cIN>khtR&lyik&BYV!Xbir~Quad;K&8GaT3-{%RcdZNEDf_HAmn3)*Q^e;Ma#^!J{G{%-E3 zzYSlazb~ooDa`eG*4l3gPyD{ggWqSm>DLoZzrL1$-(T_F#;NVgacMp4vN)|*8oi(+ ztv}dJTlYC_^-E}LxxPc|S=bayUB6f#do0Vl!OiV%AMr8NFgH@uY#M#>0{U3Oo%8ej zjlWxe>^NQ9O&_nOPWQa?(pl(x^eb-`^ugFk-n(;pb~klg>cIJdd;^q|??!X_BGoNF z9=c@ZCAJ^0=o0Ft4cCvl$}?_byJ=&zr=LbIr4B>KwCC0}l04#@uZoX;kG&D<4{x_W zUnAWf;|n^_`OFLBbbeANbbeAd{mPcwE5u2NU|fUG;U*_m5O= zHD{v;&v%AeFH^m|5q2Hm|3f!*Y@v?h@uhn5bjFuHfPc9>`56x`N~dAl60CGeXk zyXnW{v=O(noOy+A)0rQ4>|3^-6+P?A*;)5dxBR&799rJZ82yO6qN8MRS(Jds+q>!i zEtD(0)3#AcNE1(|G;MQ}_Gb)cv;8pKA1oi|Eq|Pr2WBQ*M*W&Fe(}Z;j8T7rQC{ zoYU@z1l&I9!s@Qq=e^qqQT z@4NL)>88H%PJN+tYwc^EIv??r|5i8U&!T*1bnKNCU-i(jnah2xbw8$l*|ufqU*+IC zPi;8kTn4}L%IuS9<9ISFO>kU*EEEj9-Fbb2+rK_jI>_~N@KL$*>}W%LTuY%5m)A(o zbK@|M%y8*tlA)KYi2W*=V2^Eun3qqKcdT8{7_HUw z+qH>5RvP>~(KcR#Jn^o_czI$YWlHfE)C8<`UkAsf(0)5S*cUE5zc=|Nx8NsUm#=)8 z$Z+D{swFElKlSZW<40aMP`|$$ugBZoI#bX2EtBvwYd$6RwXg?eZ^pObtUZa(xqV2? zyLv{~zOgsxgYi{?pMT(s%0<^O|AY74{C~0Y|M|{)mYW}0_JQN8@7=@pOVyHg6TDq| zlc}RmsPzxz(b@%Tul6@=n=MYce<>eQU-)EF`0c7&| zT32NZ4>Pv9ds#lUL&U9I;q+5D`?~VNclYr9Qohe}+Ed!8PTF(G=nF}^*zF5_UPYVn zb*8k)Kqv2Z(a{ns{1@J1J?*49>5oa?lm2tw-*VE$Kkw;KAHF5!2ZpVxZ<8;4ieMS* z58t5g_ynal40FrVpF28~Pm3JV909JEo&H?I`(#glK6BD&x{^(F?g4niCVzM}{=i<8Veh0#i;r7I zq)z3*^H&wm1g$KP?{x=flhEEf)c3llt<_Fj-=(dsq`m2BivS2y&o}iROpG@5Z6eRB zcAwHBT$pBXdkJ;CMEb8ibu4%4SWgVX^Q5iwq*XX+k2w7t&pSe%C!IX9MZTc# zqW^C?0(2B-YD81IrDf$&+h|0w03bNVLv_z%j*%cMoV>-2RPc}27EsH%G?W9BV1 z8|{#vyOEqWPF8+s_9XiF4f4C|!y2!PojNnfa~o;5yZ!$j{xRy)I=bo)dT=(*DRUY1 zXbRNB&ORSG40eEi%l>H^xcd z-k!$Ys7ixQUSU$#V#O_QSEZA6oTfV{duaLVCit zG&g$C_to_Mmy}!MDf{kNTjy8Vf4vazgYhAO2hp~KSCy&9QXDqHTd9s~5Ff$?_h%Pj*kROWGm`=HAZv818>p$O9 z|736d%qjUMh37N5!_EuKLz=(9vRLoI{xG_XnS*Zw(^<544)vVPbC$P0&zQ?D^VWBd z@VkRM;;B!2a!;e&sZQA}bVDyb@;v?hil=^Wo@`GZ(ZvG}U92SkiJmgvF~2#XPo>V7 z&!^4f{sHMGBy?%Ijp);Pc~TpQpoN`r2X(Um>?ZV0-C>^+y3 z4|30*S@VRqYQ0PN8w4$T*F109C;4TCKX!0*FYO9P#o%VWFQw{5o)>ujH+Y)yZ{lh7 zaq#r0gD0)C?^oQL2TzIk`N_py+Y&1GC+4u=O#$BS@YaYg*^9T+9K78J-c>Zj=D28LGkqS-(^b5Gka@d+evDl8@9mL0gK<(Uv|t(H!s6_c)B1!r zmj9~;j(FU@aA@|&IB_sOV&k>mApE($n{3Lo=W~2Ko#pG}qZcLk zH=MN}WOe)6&&20E{sZKHyS?r4AMBcFp7>^8i7C*X|XG{MTZ~2$QTgO2Q8z{S8?IU!y1ouK-u-#g=OXq#ZZc;Xsc*`c~mBw#3Es>91 z*&QuV?n(GijzbG-qlW+Ew2={6$$h(m^9A0DjVSWc1~D;$NBY6x1lq_GZBS0@-nu{b zcHU8V$;*^KgXeUfZ}4a%awM@=E7^1y%>>r8!t8L^)>N()>m{RIdow`%nci_%< zm#}{$5s$sV;|+sF7ip37|6%Vk@5DS;P18Q3j&o78>CUq|nP>gzxNYGfGx!FCyj|9;!pKx6N< zHhq}bJ@|gR3?pw>{=WaYuya1wF2k@BRCg4*+s~Zy%CMJ^|C-}j^!e^C@R%!E4PC_f ztc{CG+I9KUCl2gAsHd~B=&kvwI-K}hm*3susbi~C$Nnz*@tMmro%MOQj_-Qvc*?0` zXF?s&yUzVLd;QXpg*WoMjQ-R!-sRxAoVPpX(-`x_c;53x2jp|(dEK@r8r;YEb!R$2 zI&G`1a_F%DdaR@#@lt*B`sYW|My2S{k=g2l=&{U0kHg7Rc5^66=~<6h z;^5TVw%bM-x{vtsEn98A9CY+r?>un(_I-ng_}p^&F0rkq54(WxcyxIs?Q}KYW_<~| zyijz>ym;H?U%;8DdrzRB8XGTN_H^iSkTb99o$?PF{AEO5rtfDY(4`j#-*j;3#j%%W zhC1n8ona_^i|@F5+KI_%-_wro#_VZdMa;N(kjwXmz!x;OzozfnlYfBU>xm1{Io>RWT|aWZZNs~J*Q;sYYs2p&z3fz* zFP|^m@!RL@UH=DZ;!WM{UEg{B;Vhj6t#Tv5wRAZ1|0d#rSx1!a_Rdkx-$7T?_s;gN zpNfwszIQz%ay#cYXz%(bvJYtgG&6>oktvMdE7bK{o!g2-JtKdJkH@v`6Zd;R z{$5;%moE6g=hTfnIhD6)$p?;Z20u6Pe0(8eG4nUrHrPXp{Iy3bY?~-Ox2QJgV}B_& zhwk^vz)nznJsZTr>y~g%k%x9m&|S-+t2~|i>!IEM0uTEgJ=WzZZXB>z7S0Af@BcTDMLr!zzYHS~J{xarEzPz@f-!C862naP>J zB0qzz%g22Pr*UqR^wc5Z(bVgn(UZvkk~_iaadls8dRO<&Aog?HJb&ZFrv!UOyZ>f0 zx{v0YH-2FEc{bid^yxOy8gRQhP@>F?p4Yh?b?JK)lA?18nx<+JT$(a|Oz zbsSh1CBn+Of%+l(ya#>TOP`A!`n=77bqz3P^JMXOY02wb$#!Tdkta)b&2VIwc&zM} zUfjpnl^&H0%*V4^j!w1hmU|>iJ$B0>zMDDHiQV$~)MI(IYsX9mH(q_~Dd`G~bptU( z($_9f%n*G)&Cqv7WDa!V*Ynx z%WUWZHZM%KIxyWUn5geur@kY`_mL492276uQ-|?|ZhcN%XEkkf#w%if?kLxcUg?y1 zfWB+*VGVR|%LAKFO=0hntCyQP!I#pB2Qhr{I*0Ch(5KtzQzB2i=`S7IO!e$}y}64v z=XcR&wbSN3PMa~>yRwru|{LuWZFJf_6~K%_7dvtFrPf4~%<-Xa@7dgYDuN%oHR9%iiKtSexYo?bTC3U7X*?P1OYYt%hmudMbx3+>L>++puw zdZgfKd+%W>`dGVuM18JraLp83Kl0K&FT8UdWcq@p#M+)8w7d+vII8M}AXoj8#xYxzcSR z?8J<%gRm7F1P}eTd>Jd6MsR;B^XPYsZ4Ge*r9G`yD`D*d{Fr+}1-H)7R{jS+z%B*m zPqBTDr3pW0+xbjPOYlRrn@PL=-D`vo({APpyB=bUXm_(eZAE2!yB)_yd`xFz@1X4; z(&j_7sr~=1ul9w>hqK%`>*w{`vCE&)Z%22i({E>fM)ce9(LJu;j$HVqemm#-t@k-{y?o+F)a(6U zG%0>A*e4@*v{(MdR_-=%^oIHD6Oim_>rsaNC`wl?X zx@yn6ciQAn>wdslx>Hh53>8cPPeXk@+t1eBud{VI6S#>x9ux3Eg0@LxJZkhDt##mysuS9M;$dHv+K$4zHam1t&ffaXgF^-N{?O6r zbn9qrjlW zU$}@kht?;OjIJ+uRoAiynQ!zVw$on_P2nCzoqrD=ttKnnyk=Z2@sWFm^;q`k9PR(- zOj`ZFEAZGy!@0L~v9IUuBKTh^hQ&U45wgjxRtRme-;SaC8 zg>$)g7MV4|CemYTiVC75I>PJrqk8GNbu|udHj=jn+*Bvv<`fqG{vXf(R$WtILfu@yukOYla38mWYjlknP23N^ig^dV z+vVcIN!mZcIu&;0(M6XtM=oQo%;Jn_?ty4XHuG;2^KEQ&Ko}W7*mv1GV_TA|@W-cj zIWKqG^YUi$x$`neextWJZ{c7yvC6tTex%;T{>C$TNAvyRpYfKip#1JT%2*6jI(@x_ zzDn-=mikBVv=#S&-*LC!qIB**>0!=ghbOfLvpH899`E~V&y}$X@we2-w>Xo;zKaJu zaJPf#wPZn0k&bngKqibDxHNSDSsF`mtxJi~mG*f66J$ov+z_=8T4w zHIJWb?r^E$Uhr74FI=7PYviK7s@QOQ9b5NNMEf%L8CUw!>hdP_QM~DF;5a~<$(O>N zfZVyHGuoTQgW$ntetdBvcfhbt2p`pcf@qe*PoNR;6SuDY@PEY^=>3YHbKV10kE-1K zx%7v()nlxoMQeafi?R8X{}#ND`@lq#x(}>`yM5B2pCCAW;m+X7?f$gg_0VM*vi=5a zlm~eq#^^EgGfLrCCE`~rt)sD>NrsopPL4I`{QR`Y z@Tz2^6U6d+6qq}2xf|uHaaED3#SYKG}GmoeJ z`b^@=`5pVcE$=q6juj<;^c-kv4K#HF{1LbYg^pEHujUa&QP-xJkC!FKdyUA ziUZ+Q{D0=pd{x#7)>$U4ArNjN{RCov>X&Ra_fqQK$QnmZ)qLBc4gBH64L2_gwVvg~ z^T{UGykED2c$FR2o?LkHD)1sdd$s3o!a``l_}O(I9=tO4Cum)F;32=7DyG5*len*I za@~#;e;xOq)b035D(~^UPv9x8`|H5^(VuWX$zNCW;+`Y=vYY#5D|**`qWkRnau*SI z5Jh`&m&OwAKf|JFF_pLO@jZ{X?)ja}Tl77JH+RI`LjGakZy)-?v|hE(&$C)Z zi?Qo$dX55Tswd{K7cjgBU6!9}JzECNh%Q9uJ@^i-b%?M1;<{H&44dJ*(SBjWmqR(> zx#$9K9fa3PPpal-H0ep!a9dA`4h^q{A8$l1_J^jw4BrltPkdXtrPlXcy|anF4dbq= zboU#yv*UdGY@0^fH~ARvuMt-gW$b^;nwjY0UcHUZo)*cWy!6xyY2#J5Ou!01Z}MbB zCiA_mLie`zXYQrJKjG<%GKlx<(SGko@a`!slhB`{horSCScF&ZuZmRRSzEyn3MI z<&Qq#o(1@Q&0)@!MVI%Um%k8vyaoT$ne*yf@&n0LYL7b_;7Mcas#6N@9MRtpL;IcnhCl1OD zy#IQJ_4btVf!x0mtksz9%I_(@eP1vy+quJ~7xox7$Z5T6qZR(}`(uz@X*OS;dlL1c ziv-cHo3lc#BOE@N?(oSQ;FDGGN%-!JxelK!@$kvL<83~9kg_e?i`(bIZoZccvhNwx zy&c~BSK2spDwjRr8|M2Py?3w(_vYS{nH_DoKT_AMBvVC|vPQfq_A=L4ttYMaS( zHg`rX?`ee>^t2kAhg-ErkiR*sy=z^`$N=tHl1>w49K14MIsHK|nszO?E$nTbwFnxz zyaFAo4?0A}oKeu$^|}0BP+>K)ejm<7mRAQJE*zT5J<5UXmTMlEvp!Ohx&E4lIqQdw zu-5B-t!CY`f<0GTaq0Rkerp4F%MN?}Ol!SjGc_JAT;my&^%b+Yr}DCvLB6!zKJ2V$ zARGTmy78}!Wo`_ztn0tPo?iuTnalod?V~GAvPN=;&7L*TK6Ly{@RL)+L0{#$(579gW8du;`&9@ zpCWJ++v%L0z#Z>R&<1dWegqm4U-i;bt}{;JDI<;FT(P>B!6#y`F3orVm9W2FU4$> zfJe9gE#qu|X$JQZt=hGSd)u>&F0q&I?|OLYnElCSPq^AOz7%u`S3ZxWk2~Ru#qe9{ z0OG6iHR-MV;!T@bht(ZDbFs%ugWSi4OkI)9YQJ*x8XSsY!ou_o6V)c*b6gzqX-cE-=%DVY`78(sG5-s(P|?A5nWZuvW9dw#Vy zckGtExkLVHzLnhn(|4kO*|0a-(y%vLwbOiSEB2%71mIOk@T?y2u4H%^zT!pPZO6QB zB98G8bFl?|Cl&o`=#kCnNFUA5RBRNMGziacUoXD?>53^?o-=@!6=YC72jPAo5 zbkwR%^;xa=!IRGB|AFv_gYWuk(I#7mh+p=yTE7LqeaxS;dxvbU`J4$#o*jXl$W@KW zRY#D|2jSE8{(&o+$fxfWjA>~gXT_uV5w`h*E86;Vo+jrx8y&9SfbcTz@annXmQh1f zd#=d!4cay+1)hyQHewC>AUF&z#?}DldCbwv1ODCl$n&}WIV~Uf{VU{yT}b^m%p*1p zp1p1!x)FC3&8GjVCzp06rCEC_kezcWKaY7*>&LH(T+cy(VtVDy2{WGa@ZT?!ZRtwY6K?LQK0^CrofDP?o?HO zPVv+sm?W1CexbX|16jKp&>?;ZUTy_1!lk{AloiRO+~wST-ax*3f7XgjYXECZ+2}O` zB7Hq|Hlc@B`g6AGj>u-@YA$!^4oQ{&ZW8liBJ*Pc^JF~pWgN1-7=K>-y2O3fs{?Gh zwN47pO)8uA&%L(XJoRqdUWqO(s(l)nC7ygg^yyTv>iEBvXa4U@j%C0HYaIEZ`KdEr%8(!M#&-EplOR82qyBxY z$eYgkuu6}rR^EJoxCB7E`i^-@GAFDAJQM6gR`6Xee=gX(r@DFh;v`$@LzgV z4aPq%e~ydW5b`E5-{)QAYisbcHXdYda1ZLDo~)<&k6BOC`q7j%NmWg}H78GvT2({f z#cgf)(eXort7r18A>r6g+lT(pFO#cw=r?pC{rx4@Awxc`J)-+n;G3YYf2;CU9bGhq zb|*6@C$TzTXihlE$JvDYDHICIk0Pp$9=?ETbQCmDCa#TjZ}U!zJWkq4JYN>pz8+Y&E>7we*4YWLF75=@C;mfN2PDAyTVhcJYxABs ztg9VZA9rBAmNHGGw>2o{Aqo6)&+a1Dk1Mox>@#=LX+1lZ&s}b-8B^XGr!a8F*626u z@b@O0yEmKoU%KTY`ahSsl!wfhUh2;6ql+d`|9Hl49OK6sPDRp#JATugke@+uGSdC; zpr5ic*3(D#TP1MGE_vSlMjx&<@NmYJ#w`#4mQ>n;J{R?39Xw8>T5rJ~z-Q&J6HL0V zxi4$RhCUYuYGddL?es}n6qr6;1AXeZL!bTKF{8W7lC?WILNxCa`f9h+aIM?QMMra|8^G-%)Vth=6v8~Tg?FWQqWYv_!+KBj-7vjOzU z{+1SD5tMe)Bfn5T8@}9_qZ`n!cSI|0_hPGBwl4`JO# zpS`eNINyf#e>||-Hm?=F%7Jw#u>PV;SUbjy2-dI%)>Cfmey;sxb;r5p>jc)X|A(-y zOn`Os7#r4w9#~It#&xIz>!+m67p#E*>n%ZeR_FXuc9wXi;JpNRKY*WazPzYbahKUw zrmk%BXYbC%Ct~xQtjJP)<5B!GhgSQ-`gXzR{wnEM2hp!wzH}#fv?uNm`nb+S?oK!O zNdn%UXT7l`K{wcbzve@n_qNPIKR6!$-D&Fw=Xr5gVTC_3ahX>_ z4*NrrksZH@Pr3Z)DbwHd$Ze)C;zu3rdD-Uf{1gvW?3eJ(c*f=2e8~X(n!>gDZQD_^ zz;y^*YuqH)1^522a2>aeTzlwva>u9p_`2>33R0_?J(@>w^%k)z>Cs72Dc;c7L(k z+vV~a`df@`O@E_fY#AJVl={_IzPo+h;_2&g`#ImHht1x8QrD$UKL^uK#gtB~@}+xY zmd$<@d>pb>9v)-caNcw`hC%5+=`7uISL@PF(#;+dC+2l=XX&2%9d2>bJL>XQflee?9iB4K~vGe#2 zSR3ege#g#@|2OA%G*ZvMbAHD_`s<$Gams`6J^JPKL$}O%wdTg6?$7Ud4g4y$#sa_Y zoMzqKoZoTeQ~R5E=Zo$8)H5PiJ>PM^5_gfAF}jsHKBY`o_>+Ho5-uQyu!v<&TcRcV6$eW{gQC7Ex=odDfnt`1=&2y~?rmUAv_A+pL{1c4eFeUP-#y zug07{2z(j2>|-44Z+xAz-=zP$do#4=E8qNF#rg}UlymEoo~yHqg&+AH1g@|r?SUsi)eUCSDhW*aj99K zuDJ&Bw9WtohRLIEfTvrJxOwM1@`^Wp5g?|WHqCe89jUR=M?|6s1?DCl;mb3KQf^yu;%seX#l-g{XhHiJ7(o4%Po*)WKkAg)ic zir<`=fP|14pS|7)-ord}6d!g4vD}&Fych9yiaW$lt++$=>lI$3eK-E=sOFi8pHn>5 z2i{CG)~?)}S-Yy$6TFrCP|iL#W9`zJGl5T?eo8t_ebq;2?l;%B$S-P^0X&sq#Wq?o z+IufM2RqC1!-(HZ+-L*Y5-V)~Um5Ma@l$Jj@wPW}^B(>`0uJB-PiKU`gr~Je$Be_f z#t44P=IL|E_gnJyNGr_^&SkuwCmI>;<~Z;}Blr)+rD)C>|8i_xW+#29bCmgbY@n65 z!vE$PmCkkY;Ktmd;UnH=4)gE!enwSut~TeTE4^2D?!T}E8dceHB{_HGe-Ym+(F^ro zcC4&o-x=1lcg|-os_Ryp_vcd21E0jm3^=SRRzHvt&I6B5nSp+{ z+Vq=6zJHPLo65{#TP+&pV_Wsq?z?T7@xvR^73P||7RhjWSaGe6JipxP`E>*xtu>8i z|D*U7=J|Zcxpbz(H?jI=L!qs2z9HX7ksKU7Ev3jQR(e5xIhH;i!`Ve{eH^P7 zDjoX7)yD^q$71#IIGeXVqpsK4H0spH;DF9Ec`FkI=+sJ{%eWZly8pdXSfJ9j-tn6JoYzQSO>BEo!y)#rWlHFbLy{oh(sw-fq(lQnfs8~;0N>b6ks zp{}W0L7C2)x{mb;_=fu98#)YIWdQz-!p4|ZbawI8$-GrzCZ*va_=abxCZ zl3zO5iwqZka`fmBU%Lc}+Au78uA zH&pFMA67%$NCaKzZoi8uPjmh?>nz)yF#|RgG0gplVIE?zF2d+s7oj!vqS425i9sfP zG*2Ia`-FK4YSk#24!O>36ot- z`ibxjar)CzS-*FsFLYb3=JzMV(-*Qzx_?^y_R%dzDY-G4b(g6 zSnb2ovE9xGUA0$~^M3*9B`YD_(Z#bJ_@uj+Z^Gd-Cokz9;hWl1`6YX@rBv?kZCyT- z{2!4%o}ZwjI+-;t)>>W3d3Jy`Bk-n&vBgQmu19}_Y-#MvxGOSDJpNFj)=W0|(z~yZ zgyv=7@ccEN=6&LA;=JpVPj8HjQJzN%x80)n)vPwff!8OGr47$xPR?lDR?E1DIpX@{ zJNf2qT<+Ui*h(CE$ak3;L%t$?R^x{cdrVl%ffLFb6Izi@e%7ieUR`n1CXXm?9^0dy zF}iGc@m@nKYX}uTKM~%$##&z~+ogUTya$fw!g~$mv+A{^P;DJTcDFrLv^rEhc=fhl z5qCoztrg>*%(}cQ+bld28<+X+V%!+FKtu zuW?#GAL~y_xU)W`|GAAHoy0m6=y+|ar!iE0@?3N?`T$rwqccy^Ytww-s}| zV{g5bnB?l@Zfip1Uvli|`f6XZVYlx-+V%!6)|7>Y77#;}GJb!A7+$4i9+SQG6hnyL zA|=qic6kz^w}JL4$M`bj%XWO&v_*TiY4;e7*?wzGivRV&oWSs)?5)=E?Bn-D624&O za>rZtd^~;<4+?%fzulgf{yToV4}tSd{B|dt-sQI&{a}2*-F=0<`|aRu({Fb;bawo9 z`0-4?U0?f~>A&gpZ)JvWXHTv!|4n+Bvz<(zNG<6NF11fjH2iP)?jCc|sRVs4KcL(H z66>4#aO|P`?#59!x9^Vrh`MEl%c$4JZ9V&ZHc^J^Jsf(A|JtT_(8=BBQ;PiBQ^*_6 z_j}B}BnCDa!F@w3C#%ofT8!;l?Ae)3+}T^+@3wso-?qS?(v$LI3}L=&DY5F6=&O}q zb*x%D=eup|7|ZK_2LJZu8DpLFx#+n5eA|Iucc)8@lP-~OYl-1o2Mq;_dFF#)9e@UJ z;U8G)C0;Oj>0re)I%NsB)H3!|WL?fW?FRx3&A}(~Efyz(Z=8kQZ62s?N>QiWVUs^= zBplPLO)eT&5@%FNoKb){BZD|2eQPSc=gmODv%4anzOl==ai{q$9uJN)d^>1|GOdGg z+Cx5E&Eq-kz=YY(a@wKc`rF&4bFmg+$1=qYVjG}?ceW6}_kwp|?HydL)Y*@pYKr#I zz(4E3hKN9`V8 zeH*ma-UJ)G#+U%{@Ht#2ykqez0ME}|<*tP%Qh<}azhk8OP%}+myG-sX6Q5#PP9kM; zeFYykwRMbStTS2tcQ*G}nGsFn#kh-Z>FB|p_78dSq5oTBo#&xd!#CJJAGZjCGFgzUYJ{-TR`0eZJQGy%}5oZtr`L%mw#D9WPx5-p+W*TtDFP*82TM zdrCI8gZz8QIlQ=8{5J9An#X5jJB6@GhO_o*0sM2nC-9q>J!v~u@a+hA%8xvi8ve}_ zQUVW^?!5b-I-Pl>FQ8s2*+#qgJMGEh5c_>>>a(&abc3f)ZS8BDH#K@vYM=3>)rQt?+_a$T z)rUv$eLiXCHE!Ir`FEQ)r9J5lZLIq9!>LbtLb3JBZSN@S`)qNj-_u2*lPW6OKJoO~ z^k+}s+SgutZBs2UZ{&H#+E+KdN`95M(9?g@g2v68`u_g4O=)x9c-YUHJCjc6m%h(> zf#V5@UJa}jO0((W(5scY+~D!oj(|2lp#BSTUV9uo!!w}GZ0LCn|5Kmzg;dW9(&blF zoHm1We&~`an%MswJ4!LEIzwP)eNsm3x0+>1G4YqI^{4G}xYADBzqkqhs2OqpEXWK3-{W(3R_kTHlOK9VwH&b4Da@V%hb-SkD{IQ*9 z{K0uBb11T@@sQd~G(t{8<2?Qy_0Z10%+u^oFwFKe=?CxVF1hYCUrXYDmd}$EH(yV7 zkophW5!=QSes(Eq5}0$Wz^`&EHb@HRh-6)qvSbx{an;w-5rbKwn5bA zx%bP;2G^bUdg>zhl%09VDs-IYYlc0K%}swVpNqM#5dAuOe$Dh}7EBI_|LuK+u8-MQ zXt(wiVtn7i+CNiQdW}(L+c4+5O!I)0nc@koxgI!S;Fx<74G4@C96$RL!H2_#df2l8 zI4S5%t;5q?t?q(bMco}=%Q0iDwNy_3?yMtcJu|-=ZSR@s%uB^N*I*B6w8!O;3~P^VXTK_U{Qf7SW!rb3my|t+?&)0f zf5~Cic>vSBgld5K+Pvtab}wEc6eebbk$yC71*hg6OEsoc?{X}i}`;m zcI`^(^~pAD%Bq=W`M)aVk0ftVA1f}vf%{!>jFqeX-~WR-wy&X#8sN#_l^U}LW(qWP z`0oz2IX<)s=F2oUti2H5VZZqe=m_ztd%t=16=c8p%-R9aWSlS4-fup$hyCVn>-0ZP zp$x_AIs45wss1h*xQzdcjtjJ3g1z5h*Exb-T}GX;qs?=iojOkTtvsE4*cD?Zy(aqS!IPb9T#khgGOaz_B`5ONb^gmC-jTh9 zBs=|(hkfW;rBPiDXx;_c8AH3M{I`I?{?{1^q*EI4r<ZjJKXN$oMm=AqT*3MWa6aZznNjb+%>$Xklb>QS zvVnXwi_eaJsry(SU!=J&ZJIe3%l^OM{uVH{aCOs%E`EG#R2+SXOgjAfs{P-sC!|NB z;3A(9dc1ub&jz+#GG_#cPL8fH`)0nsLX3PlJm|6a_;dcR0=5}tc`T~b%L1$zV;r8PCHyoKIhr&6QH-!(dV0O z@)~8j+usdyKJ+nR=5${Nc2*BC_s}<~omT_X2(Ulzk;L)G#zSFau=m7G(M0TI*5MX} zjtS0Z?dI{*D^4p-NvjQbhHkwT{3_ua+WDZfjE2&disz7>Pzn9zFB;4@6HnIjX3`G5 zr9x$j0t9<1C#j&^(zhyJ4Wu$Qdz=nDtcXc9DS;J9VeY=9nXhj@;fp% zbSz^d^sPyQjW!KtRovmwU=Ms!zcA3Yj4~p>CN_+_`n!7Q;>=46ulGh$cj)mkyi`x! z-TB@mpV!m<+iShR+5oHy{PRw{%~WWyj4}n^spHEk?>KNentc-~Q_s~g<*w|dj9=OK z?v{K3*8^|;JtqH?z2sj?{tWt7)$;{n1sm+Xbr5!j<`J6au%?2(buWI8(;GV$5A|^l z$6)pb<9&nEA7Wpur45&1TSQ#vvDN@veXE;>RlVTyW7UQ79Q$e_f!l2{p@#H z4*s#QDr4F$+6$}?1&en36kEcfuiEW>eW$%XlHOOl!7GZrDW^Y-rS%&&e9bq+>W^65 z{&Z^m`3A+(I{L?LZ~j(z;QwtxPxMIz7x{v1`);NF#i{?zsn+@~)#ui9qYi&hhG{F1 z_XoT;IPd6|+jv)>lJ}7_$CDYp40}`O!@tisW+`bO`jGW`P9E@_V&@rX=TSM=@J;rM zHBXco?qED69-E1MSH9c`{)GDi`@cKg9y{G!yDbO6lXF~fKDGaQz~#q$p9wB1!wusj zJI(DjjFZ6sCKrsq+5fd~(+s{}4U7q{|8Lp<&jv@)>QcK5wfi8uuJ1YDsB3ymU0<>D zUuxGChg{u7F8D7w@OAfkf|I~g-zVY{jX890+&~a5j&1FN4U~FNSYkJnLI;%Ke5Yr+?8go z4QC%bIgqp|{PS}qb0u*layj-|yffafc)t6YxF0f~U*1Ygt#}WfUJD{%`%J~D z>c`YaV;4Am^wv|5yM@JV@1v9Nq3-(kF3;F1=JQ{qtM6ma8M}YkMEZDTG3RF56AcT` zX|u+^nc-669xG09=>peyW3|d%=Lt4ItBP}NzgQ{z(O}zG_F&Kbl032Y+*5)>J`eVs zblq~^Z=0jNk~71LRsN-}@<(*p$d8gv_3$s4*j55fzM}2TzP#V0wg9?s>h*#4`x$Rn ze6K6N+m@qO7{_|I5T`)OOY2sG-=7Rll)1lb}+(xKTR z*MW;{5tTKAva}~II(Us^o9X*?YDex)J6Sug*!jg@?3+?o-s%ljk*?h93m$FiOdoqJ8rp{~V_%Dn7xME58|MIh@F4zu#y^h@ zOYQPI{;S=#^Sw7+bJnWvx@H40U&6gcxPbdp&{Mi*8aV$2SX;T?=87}6vi5JvWiCeh zR(XuFzp}nqddnG?Jcu158^L*RPBJpyh)MG>I>w|u`5uIhva8pqJdGXs#=deUK4*c? zbA0bf=gGg(u<-0Qf05C=5jh^ZOnPtL<3k@~o_MlR#@_6o70j~ro@?wQ+G%XHoOlMe zpU*9;KmAts^VhY$CyO}nznq8vk@KzgajsP5BVFTe2j=~~z^nnL#{92JPPoe!mj0Qe z@ANaw|1aL7-PsGQ+iX~CVqnd*VLiw94_vUm-wUj1xwR3{{wN_j*rRV^*4Jd>ovP9t?h90`k(Y2UjH+8*IdVU(9dei-wR$3ZMnw5k#U&G zqnw8*9)024;K+H1`=)uDeZ*J9;uz`$$0vbVvCgt}DlTWu8+hehj;#ZYvd~FRJs<4_ z#=~|!|Dy2|`5c+PU$EutfcI)H0XDXD(Iwq|9m`zpHoKQH?sVZ9WehJoO+KbP$0oap zH0odOQh)TrK>KsThr5H%bpBgy{OxXhe%S?Ge165!gXwogFL;#!Q+0lnvbMyu zF}@viuJR#+^MxaK2gg7sj^}m5G3(qe98ZpeY+p#azm;Fh2FqY65UvlN{ zYuAxhe3S$&u_?OIaZNAyuOwf^Pb{0YT)r*Z}cfY8TbHo;qv(-to8JOL}uG(Z?D~tddQ8HG9*IG*)U% zs^<=u4*F3qINxmJ{5<(~y7FA#OP=e_rg%0Ab|cfRULyLZaJzEjS5vaPvm+;N!;=ICBve#?e=8!(@B z(V(E0Jjam7O#{d7$ztzlN5(Q-GN$(W$_4xIUSRjN@u|m-xDcFbUHKAv$=7irG?;eq z80(Mi)>uul^f_a_o@D9Y$`4IXjiK!}zPtPQl)+a2`J*G%-ahPEU-Q_9yV~1IYxT?T zsJtF@`4*Lj4%b>cw=RE;?-jZBe$MK%&a(R~jkoNzF0YWrl7R{4czOW)xLf5;GWEa1 zlb5kixx2~uQMOhU2U|a7nqOOFyD=V z_n-~$Et`LtQ|*+8xxK)fW5Ww%7%Ttag88T`|Brgfe>3^x@v*zFnD*1IwylsX_cvDE z2YhQ!gmc=e;H#@uhTYDUF*^DR%J{lI>q6Dz+w_I119wNROC9|Bm3Hgb$E0-0+39Zl z;1NgHxX*Gv4LBCRl$iW7NaITUKx*65)gSZh_$p4YakhjL-$Jg^7F%#` zL4WJnWBZtg=pXt#)@Sio`V+U$+N~4&k*8wec-FretK`F}fcHD=!`RB{0}{-16WS_> zb;?sZY{YzGsp{2NNIv!LQq#}1YKWfQekIqrwYyGGdFQv4;0F_ZVsZT}k-WECdsUdQ zT{y(1{osW7{&|hfUj+wqj1GO4;J?Vm)-d0p`{TS{WWS$p-!FI4)0f@HfB6_D{M{Po zhxm6Jx?OgY2?M#jn>6z8GCyT~V{CJWo$m}gpZMw)``c)~-Q%R?`w#e@LVhRK;%M0d z^vU^}XQmCG;rtNolPW*WUgo2|W8*2Br7JCZ_cOj<%J)U@TX^bUANyY#ee?zVTWJ52 zF1e60yZl0|5wO!fOj+`kaR7QlE9>z1SN(S^4oF-2_gGtQwh>v<97dHG+&|5Xk@fTuSG&*$v)=h%3j z!u@j>ykFY?M^WE@@%;qgeQd*1c`Ka%jb(ox2Q@+j{T#QdWjXX!&|GL^O zGyJgfL+4{fUwFmz=e2r+3#mK%0cLD+l~rSxHJGwC^Dos^R+SAWMfY595W3Z^BaMeN zYg{mXWWz`S#*6%K|C_^anc*947^|75eU5*-T>qxq|8BAIJezx%G~4Vn8jJjrxe3YI z598GH3OoN!_Ejuz^#!+~@7ND8<2N>L;^`&i@1hO+ciFi9UAhsT{TuiD$z#ebJo`Ym z^qJv+T?UIrOr9MAjwh1dnL|^1jj>^FB+Z@tTjSvW!$A98z|&l#;QL)P8*b;p-%tJU zrK%3oe8JTwUcR7*@85Uuq8`(`;l{*tlKB-EZTjx~JOoc&)Rn^ze&zo=K$r64-^Vf6v+f z9;AF?)iOr$udl28z4*!9JoyVd{aCwv4*#i(I_YVT?W9+GG}>hdr;lS`JYvJ3&o%k_ zIPTa?opf7h{~rY1oB4hiu=;cL6K-66xYD>%xl*|NT*+KXT!~x>Ts|%@mxoKV{7a^> zatra<@~N7!gT$8YrH!;NMB95-nisGG-D!5a()`;_vk#l+onp%mEjX7jrr66~i-IHG z_!&4$Hm-&zmV`68~oTZ%24UwO}XunPy}eF8d&cH)yQcAl)my5sa`7fzd8aNRha z9D~y=;k3>Ojs>T?!RaOP{g$h@xr_eHr@8C(*yqT+*BiV-<7N2uN64t+K|;W3;Q9rZ z=)9O%4L1#!yYT&)oyMf0t1TWg({#}gpMfb?7t()dKKnuPJ>bCSOglIH`7ZePx#5GO ze3PQ{%y9R*{9F7*UEa|>*BhK-%iulOE1Da;6*#wW-Ry?vYIBXt+_cFNeOp-z0K8+# ze=Yg0vGZnO8@lnm+J*0xF8J;=m$=f1FJ{<$@eb+Fcja-n`ExNi9gr@i&0hj1@zh50 zoyBz~S5Nag@<|OOhD~vsiUpCMS93)5bFA2_w~4iSkF&TtycuR(v)&tAu~*BI7;6%H z)#Qr3DmdQqN4dw%?l_Yi{!2$_EP)@xip{jg0E6|9I>g$_@3{2cUzq>Xc+cVGy__R~ z9$WbW`g!Ye#oT6wzk~1Jy*BtCyVZXg!KZAwc!hFBqe^JA=Uw=iYd6>bgidVI^^NHC z!SLSc^cVh%PMYt|kD*g6eO?{j^H@SKI7`c{@7dJ1H@fwUq1&T2-I#Ya^N%Ed2s$N?)`~E48sa#{QUdBm_dZ?Sm9%}c+=oP^h z+-l&v*G)f$e2X8F!22$6HrFNCb5!y6%)FDb6c^CBegS_3ZT9(LnyAYk$$R z|7Z&B+s&6?&$G}kcFwbeYGZr}{4>Xuq;7nlW@nPw6L%0Sje@q;) zXr;L4V`O8(3yxpGnb*!VaXxr0%R6@5&I7=V*G9=-(?;$#ju(5gufW>Ja*@4{C1cx_ zS?EixQIX$XHqt=W!i+%f_qDPw4(F#BUaf`6>SZlVR@}8Pf1@mOEzCg6e^Du!aK-n( z#ec=)Nf%^E7x3J*)}nhGZ!Czf3nVYf_n=9)%y1EO(>K2_YjYOs7R)xK9@NF`LqF?g z4`hT}qzhWvgJqX^GBf-w@;~+0q`IGT^&|&hN8_JSFZsyw>EjjWFctdUwp{C0*w>jg z7!~kjr$5K#(|=I;ShrHa+8Ej0vHCF4XU}aAJEb{H?L(KvUSXzeu~u{6oP_547r120 zRgSqwFliMpaJ%T9YxPw>*4UP3hd*cP-*Hx(+@^m#JO5(wxweNkG3AbY$I>QF42;Ui z;k`=^Gs9;=bH&ij;;z`85@_BjhjXm@$nN1}rfzo1Y{?<{@-#P`%Ul|F>B)8EAHy}8 zYZO;c?I+n}Otdm~kKlJXXI-)?J+Jj1^ElH+d)N)U$Y_@RuywLw_QM}cHh!H=>`LZ^ z>(WNzR6xAheJnakKiGknGvt;XB;0t)=TtKdU(TJyR+{d zi-!7!-@qIP@3Oy{_JnJ%k*n~Ty6uS-_IUM1X!o)5#OO3Xbfd02@e?XG=GlT@A9qkp zV8tBh!Ma0(^_uD{)}mju9>MY1JNobKeAX%CcE$O;`W5pNyqi96*Y^SY@VnYDBbo;Q zra5=*g1Igqo<+VK*niq{i0d5ewS9_1GGi9OyNPx5(wkMtu6V)0`&8P$f_E#_os;4YidJwK{-c6-@tb<8r&k6P>O^uEDmkFEtD zYb`+6I=g!*L-V5*=sxKZQ@6T&(sv7o<19J;v*wt2c6`#Ya(pvw5&KQ{f~i}{cQRuo z>8|bYgubbd&|N$>PclqhFQ%^Q8?R#?X8`{%A#E9#vmPy83~NI-Tc7n;f`L5mGW*xe z@Sn*)o~xLvH(56AGW^}0b{X?gTZ?_oi%eY@$1WqSV`s$H`=nlIVcKPkdj(ti=5FA- z?K0Mhm~^TK-%PGp`H|kqQ-1>=b=fkO4KRRmO})v#h;5fH>;Xo9*+YV1$HzK+Z@6Im z(S~t%4=~PWqciqaf_^$~*tb$joxI1$5 z-mrt?XSecAI>BSd&pKtlLD|l;_%GgCybS4X%Bn(^);-zt8tC6qhW3baVz(5-E4@+4 zxWU0~C21;=pWnm7x;t(1jPMg}Qk=C_U2E%p0gmE*rI$a=-zf_j;lt6lmB_-8$UtSQ z5v)}I1e`LHj+x=X(D8x4#9w3RuGfNI>NWQe>h%-V%j*f=Yx+8<$MFZ(<2Jh_Ag@(-uw}T+DaPbxE&I zg(uL(-Sn=*4->#weWcQ`7JHTR-5l4zgVKSLFU@;7vRz0X{qIS4$Ui_|W|kMfug?fO zeSJm`ef?{puD;$G_w}}4Ru(wL>KsScn);=)f6fTsvZT9y`K_&AYG{Kmw{~v_e})yu zg6x&KX=ARJgf3o(7h-hA?&G@TeGR@A>9rey-)+sVYaIJe(hJ{M9x!bxwIOo(H^vU~ zllbknbjRvAxV;S==h=j3_a{YW9W%lgfWz0yKjqX=j?@3S%lX}Lhamr?k({#<;bgaX%6yR z2`wF5egJJ`t5+g(8YAoe4E2!?+SbLREFR(lA(i8k3)HeU%Z!EtoTFzQx8A0nR9`g8WZG1s4eAKLV^R@?0J$>WK$ zRy*CPKmXsr$0_=HxEz0$5wli%7;%9b6FF??TxQD^*59mjBuK7_iOd-&rI*$NM4;yc-j@8qnS_;q#rPKLSadV0}YJj9=`#MHIe=FflZx8!^-bv*DEXHj!~UAro_Naq!pbtN`)D{D_$ z(1Y=0(H)2M$uV8Bc#`-|b?xN4?saWBCca%`>UQ!y5?fd1p@fHU82$6^vN+qW>o~hz zCsEh6)U%1JTfd;Q6>Oi@TFRH)#OoKz?0%sV8B~9@lCgGAcEhiz^Vf|Vo+6Fx|7ZW* zecVtldPyI|88999-QtWTru9%acbztCOhldDCPq{6uD0O~wCl8m z`jo`BuPa7vg5AE|+TYc871{q|b@e>fuDSbi(>Awbk4I8B?Pu124zPS~mj0f``ZA|4 zbovwhZ?W~w_ies>3Verf#g;kH?qfUqH`f}_tRBj|tA{dQv1Q?2yUcl%_tlp8GOsz$ zOX(xj{u^kk8lE*KtH-}3d$0(5uqoFFDpoMw7)1Z}5Xbc`{_A-c&pPK}k;Z4pO;k1& zJ|@{zS?q(?hV07bsaL*xm@iC9m_qxuB1%=+;iJhu7PhqEWyibcRX69c2jXzX{M1F`Ou@shE;BgKDM(%~dH(?~DUHXTZ~Z-a zOkTC$W9#~So@LW3&n*0=ij9;k3ZEYXGmH11Lu2RL4B9~JB64cnS?;vOyY$jbXyYFLIC{!0%i4=xvfN4=3SNT^Z-ia12=%#yD^@NXyD5wg z=-xh-++ApvZ9O}3r*wyza5KW2fa#Y16qj5Tkym+Q>FA6HD&XB)f#vXTCj6`Y&pO8i z@GrjDX7T&W%RRr2z+)TkbMtRT_<8JC@vmE-xOp{Od`DkL-cDZiAP3^re|&1~w;xN} zF`}LN)lOdRYKuP9$>~2|$2Z@_cNv_0$v6_edz-Qb!gs>Gm44JcHu(DvVAD=}=uc#~ z-wFNx{U+!CaK*OG+@7+-Az`sclN^w$WHO6WyGE ztktbEf~(fCS2Xmiv3=p?=n?rBneQ?Ejm}tg9r%47(=O(?+1B$f@?SL0rW|MP&H%3F zSJy&6@udUnS9aPi-(**NG~^yE8~$GQBz5*L-R4{R?zqg79nSvxP9FDur`^)#9GteN zJxsgh>)VxY8Fk&p9-toPcGL3N%a}1Sv3ol|VPDI9#?j*YQuY>2O)%PX5{%#ozK!#E z%yW7dbR>_S&7Q*e*~*6cjf3|(1!jvcCG7rpNaZ1O|EuM(=jwl}yejCKN?SX0++ovE zym~yegN8e$Gkyu}rm#nFJJ z-=zPB+A@*?Jl0%vwwozmE}at>2k7}<#Q}KV7zgP5U&R4V;X8+$s3;qp8GZ=J(X*8I)RVaR)? z>l}tye%y^taL$JEztj5}3Zp6aP|r|EqDDeCtoT6uYkKdE@Z2NOZ=$Y}Z=7b7(J}~n|_Wbp*hoYDBXMCIumcV&; zoSVwoMjgI1#t!~)yDuT=r@S1)za*OH4Q^k}*=HAEdvUhOhm61Ls}kzOTQ$g~f9mPM z3Ge&Nv*Q|ujS89Ha!$9;jXNyVu-@C;!MRY;VTXsJ)mjst5Pbc5;_#1eIy3t!&M~`6 z=U5G7@8yJGJ!zNTK)eO%T6mYg;_#bwM%*QB%h18~zDqjyXx=-Nb&$ZQ^ja`9zY~?; z;JiS4Ib$Tj%ep9`Zf|v<{eymtw~6=3=1f$x%m=J8mAB?6o{;utQ9t>OKQwXE9RcuxDEWru)l3| z3VlNL{KCB#8|@!(W=s+DRJ*r$Li^tHh9cE}E^MiOtuV*uYt-2p9kY)JMgPQ^#?P^~ zdCFxWM;HEZJX&r=%I}iuL)?aQ3zy?`!s}9%s;g&@+81do`~$g4gJ3OhmrpBOk>P7#O{l>Yk%OWYoiYJ>@gyr&z;nX^NQDe;X5+C8z1rhU1xXl zV-|UhVq>N1EPgDx0DjCiLPx@ncfyZ%!jJpCM*9?>e+O&e%1Tynt{(4-J&UFW)>IU5 zmQgYO7V6l1zPC_b-0wf}28rJKb2dKQ|Ck9X$Ix$_^k8`%~GA z0-Sb3lL~lMK0ME{#N1J*hGUIU<#wH(piZH@+d|J#r)?{eL*j$yXw$*??@Ks0GMZtm z3gj8VYoWPhx(Qky@C^xzM|8Gel(Rt{-WBc+?%gTq<0QT7?es27Lb z5)$7;hb4u?kIuaMGt@=rjh1+fRsCsam7)CZG(We~MB!yqZpMROnul}Mk)bhx_7}lD zda88g;cZ`s-v^bBYz+#3M*pz?q(J-bJYob!8lz(QlC$1}#?IFZ%cZ-KzY6G@J+bM` zZJckF?GgV@Zo3S6t=9mlv??d7yfiD*8|Yt}#ecyJUx?-}jV*@@?ICfa+&q1{`GLV=UI_d^}C=|6`Z z7GlqW&(sff-l1%w^2eM1DtSTK&f1 zZQG_4ha@}scXO`b5S{5}WSIHtPc-vI(0kK31NYbDmG7V&`aTc`c8LEkU2t3IMfBG> zq!T|LfEUi=S^O{>8i_aR*)!#{%7ghKx*&!hiq7nnA0~Ybt)_vG<~FVc*I3@GnHN*m z)ZTgTTVGSwd1l>jq3&gEZ((mneIvu(FK2IwphtDK&=p5%?~N`UdkOENkIrH}@_ZvS z7}`tkx#fKlX(Z!*)0 zj-zbfO3r+A`tLEotl~^Y^E+oeI^Vy=_j#u6%N`S7c9^kQq*?V(`ITvJGgj*WXT4zK zIC+jC&j+lTLhU>LE{IFiM|b<{301 zIF&fv)->W|Df29+%wAv_z#4f7>GlF|IO&`^L6V5;(<41P+f^#xBF%HYPnQ!vlDX+@8-Y(~T@^qF%e{(J0 zMGFVV2=e$bY1IG!5FEtI`S5Z&{YDf$DLK>pR)llVzt21td-#pk_|s@Hf=821WowM| z6VA8pET29$6}(i=B!^aWOG2wu4r82VzMad}G2Up_S$R&pq|PC3p>0a=b!l8xg3UZ3 zoAY0=4O5Y!63$N?nq%xt`_}x&hyOV6&}?kX(yFD8f4X?-;HQZlJQ19q@%-eu4>;S9 zGbhSEMISeM`h*)jfm!j+KWxSB*+H5aq?zFfjP2d&a_3`%E^l#2j{FJj47kc{DHuL-{XDR-x>h*{9{<`O| zO|Le-y6FVYQao`^bGNe;&*v<~3s&1_DRM?*8g)+Pa?Vl|t#y{7=>7Ec_~$8#);dS= z6VlXh&WigiMbULaHs@N8M+djE?{7>zqq9cR@>}GXea`QPFyA+=Ydw(W^F6U=>vj1OyT~bC*u~!aUH(rl|SG>J9 zAJTWmio!$dT%G=90pHF2wb-M$hB1_I7zhq#9GAiRU~gjcnfF?9qj=DY;np5amGon7 zd}HGuZU_I^Z>q2SQhUMS1+N8L@^~!pyW%7>!klN1oTi8WxjCusJ6yf{#8Qa|@rL&z z$NTYBq?ZRm8OU$8!Fcro>@A+7D~$F)LXmlndmy2hyRR`|o+<8WJmUMMv&Nld+*FKA z`QeRuN%)np;TGqnE*a-JVn?Vi@ho0oF&5eYeWHwo>XVAhv*PQMip}%i>yvcm`)Q3j zGo&rcU_7RnvyAY8YdI^9KJLY9ZVavQUDRg4AM&4{2+b=QS89G8{o1|*-Bxj3>8x$O z)58YmmsWl+byf;EOgJfJNp@9JVZHCs!r`0)9QGa2c2`kCFcsfl>CDt6fkf3Qtuc_O zI`!cm;GWtzbOd`$2aK}PWNaBv>SlZ}J92n`3A}RT2g26KN-%0$cWG?l4}S`c{lF}l z>0jch@&qf1n`_;E*A~%#8@Qc*UFxiQ-#g&(U}1yr3Va{~+9Go&Hda7KgB zOQ3rJxQgzPw6w;S%PP+tlb5>WDz%Mg$c_oGtIvwUb}jrx3M-cI1PHJjel;_sy=yEqw;|FfK;WqHw7NJv(dOW zmHQps{f#N#Pn|V|{-pE*qx}br--K6wo`qM1?}*Jug4dkg7G4kZfLH#E-tn5V!@_H} z3$Ft5RDf5ujZ?ObQ#LqlQ~w5DYNyr*CUPagGl^W28e3;Jof-WQ9)Fng!PESW5ythA zx##iE*BChu85qWR7++~*?m2w(aGlHLZES-_{61{XA@q~z zq3#Ee39Z{xStd-%GhwPs6K<&uccKY*JHD>nT*}v32KyjpTvIwrvL3+)AQ_M5Su!3$ zE+ccP4{{lqo6KGEkk~le%lX;4M%ktC(+4LSH;o@;lntWI52Sa=>HuVQ)m1l!UP4Z< zAf18!maL8+ynk_hPM55f@Nb)MRHvMVt{-xcjP6GVTsb}=7`}c`uQG~Xr;LS;oibWA z)F}G`z30eiIx;H0m5e6Pz74>0u83hgtmi!Yzi{><4Ws+}e^8i`)+rHzk& zuXI)bSu+xi#wjPU&UT1Vmha0nb%f_AqwEg;N#+asX4d9-GJ}g+GlE{z2ay^6kn&`2 zgzl_p8|g9H^QWfH8tNImBjwnd$LG+$MwyQtr+3Chk_G9cdSpK`Q@#XC7f3dwqa;7< z{k~K9r=tTj{&}3TrO(7Gi}HpnxgA`m_y+C>$^N6Q>*bH4tsBt6YU}#sv1VJ>C!cP% zwd6CCc4h5MMh*ET{~NqVZaxAz%QfXJGrWpA#KKaZnhP?Q#DnR`f37WOKPSH_`=pO2 z^KYjb!CBA@e-~##XYP>Qk>CHwT2Br%FS76vJs$?nh9qM^0spo$J{_KDv{#__r?5WP z`_GOt{spJ^JF>Q5S#kS(=yEFb9uB<^Fek1vrZo?KBK@)CEi!j}1F% zIjZu^Z5K1nom$F`WxyL?mb{1=d4 zW21QaTS>2Rr|h!G_(XGUb-mBqeDRmE!7{=VxoaG?pLAv#^!a!Arg7jNzInN8ET?~J zHwTXL3r-Pt`BApp`RnN$^7$s%V{~8d4VIYqgy3lNdwO^}`2L;r?{jrjdzyQi4^>&3 zpYj`l&~4ae1JT)8*jS2}iujITTsJ8E7-P4TYfERn?Bz^#c;N`62;7A9Ian+*QF(i`z?iUJJj7Ceq#8z@f%# zgchNbW-||YJ@d-3)5Ka++PsQ-cD4cX=(FiC3_3i)KffQHCw%;Y zP{FbOB@>L4+JZ!*nb?@k%ze%0oa$Q7vBs|}(KY@)S~rxk`H?}^_@bw?inW$49k|$_ zD=V<&8E5~x691Ow{RT2#+2@pR<0mMGG+R0r;YP? zZ;~#W4vcWF(JXw9m_F(>;dDffF;?jePgZTEcidL3X~WOfT+xqsCygb@lR_Bop>-M`|eH`w$!f_i6xXB*!{ zpDTPv%zqnS>|ddelV%X~QM$*VPkuN0WG(SSpVOfUyxi>ZOlkAzTlRt3AQO4oUw@J|L63(ulL7Evwqc+b#)@r|+wPjL{(LB#Ad$=jb zX_8}0c7u}L05TgJ>m{Dc!T)u|FO%w~GdDZjlkq>R(-$3a>-0A5^ZyrG{_3g!eOkI> ztN!2S%?0q??KW@b*u3d{dzyX8AMqI@rB}sQtv+9PXeg;}p2=I8|0CYoY{ZwBT2l^2 zZ>~iSe%XT@)Yx)RgB;YT4@4hL_>wU_{arbJBBSzWg%!Z@R}O89l@Ui5PPW%dob;!I z<0AjRqJMS_{TD$0+im){K>MS9@qdH%UYquB{4uHS9IkG5g4P1s^JV7_>}9Rb2rIs% zNOlly-9R5C`)A}b#!;M=oypoYbA3rG>q}a#wQ*JauhN>5Ia50415X&p{3QBJy3@@o z^|XchY}ugdvjx-H8^E3JC~$PYoAza#zDE6wY)Jpt;AznJ#KY5P<9R4JwPhZRld~Qs zf_)m#X4^rYp6t1g?0+Q*MsteCQ|s8g#CX+uJgM6Qz+tkGPG9vPQu z>?~mZW*l~W6YWRr{Z0?(uxnoDLtss%J(tNx4*eY;`T9)TM{e(DXs&gJPxjJ2nc1xO z&-FHc^r&pWu6+j-eo|DLv*{RX8@tS=jVte%8lnem%C%lfH&`G`2AHxz@MS z=9(ADu-p9mW}6?p_g8Q2d2$c!sd-bi=i<)xWPcjqyZ8Qj+tgi|;bqi)AlH8qSHA9t z|F`1Ge-9lR*jriSL<9MD%MbK1$K2AdEyzbJd~^Tu|4v+aJ>?#1T=|WZ>BN=yHa_ea zpTb<0!MK1JZ~P)D`Sbytmt4Sk$wN6Wc{t}KPvN{|c)n~O;|F|J_&O`!+`m3CNNnzd zGj^UCTtIB@53u_er1Y(=^bFnFpmmMx9l6)H=yB<}Tgh_icdQ_?1)f=^1j`V^_?@2Tb^&aEupT3 zyX10ho3~E?|9yUf;-a3-$xaF?O)pQU2tmg>ItW&tVUPeln?wtnKh5E zLNAAgchOz*d66vg`>G4KpUR&7dBk7mdB%o)m#*IaaKh@+Qzxw6eu1$@?UPUYG%$XZ zj*ZYpI@@|}s!{g&P-9KQ~HqMrQBDQ<-~cfadisnu`w*s*JtJj>gw11%dW)Um81el8mx8 z<~3EX1K^S|AkaSKyIr{KO(!OPg0WID%fhANVhb0=#HWIbVv`le?BKG4^kYhh=dy88 zTyq<-Kt;LG2%I9qsTMxCCSj~_I*hqA(QeDF4&P;l^K80Zi&9{$^qrH=@{Q{Pz8aGwLyZgXzX_9eM z!&ydI3o)}(&mtC!SQe+h{1x@p`7om4zW&AOpNU(66q>R&e5#R*04X zyIom(;-BJQl0~}`_|e|@9&6({he5Q+s3QIqe1~w~%e+-eFG0PR1Z8& z{3Dzis)^G^$L^Q{PNZ+B&N?kH_iW($8jm@n>CC*ea~r2UY&2d&>~eGqZ9c?k&+UIU zcqKRH64#qc9DnpV;taqwI{QddXGYg2k8Mbv)fv-V|DmTj^9LP^msK-oUVV96%798U zra7CrR3o#JH3i&{;C=yj&Dnf`omxa4$MCLLXYep%oyT$S%R4c{iglLGGZafo%yUEa z5p5CbEkCg7ZUF6e7vl{}hh~PKrtXseXkOCT<+Mq5^0}_| zVBZP$;!=AsUud>Raeq(aF|^0oqB-rMxnIrOewd!n*g6!v;Ayvx*>gB^r`7KiW}m_Q zA2gT%?a|Hc+kQ(71S$FaZ6GP6+rG6e?XK=|rcJ ze~&Qx>=67F${QW3pzroi_1XP&7J7s=UF!|jbg^bhvIp!dzsnrMkft*On!|sXF{>}D zO=Z@TcDU#w8RT8%{PbF_zqr(1e{pH&c(sbQ+H>(mp}opadzNrEUI@M(V~=~a=dkq7 zzE&eR=tI`*`q6*rGmU#Au5s^7;Aq^d@~7S6=@~f|Ka9_69g7LZo!)1S535=fX4>#YQXY%dk$m|tuvgI?e z``@6=Rs&CL5vK zUG|VdE$z#TcT z^<`uUc2}p2))YFj{rLdkrCG9_&z}5}?fjC3lS@u~+LY~jc-xU}@woWbk?ngXB%pi7 zTXKyInsSZKkzA`>=^pW_(&uu$OIe!dR)5m^zL64t9+|ssTd`G^w?K9e^_472Avo0e5yyBrvXHHG^HD2rWHs0m+ zj>Sgrbxzp8zVgtYC$CMa%cU)t?|Trhhvs8=%&@(3&zzM zRn9l`%FHi17AuzO$M!eHWGlUN$N_O~+~7{C<$ z9NgQtb}Uxh>$$GHpYu&)#LavQIN!;4gK)w|xRCn^E*RhAT`?w#jdtKZ$2YC*JlW2_ z2c7T;V|nQdjf=ihXYF&Pv#&&_R@V9m#xbt)Mgt?wfl2w3c$Yj|Wq5-p@~(D5_N;H| z^zpVme;WS;_s{M;D~#X^ysK_?l#{~M>-f``%KBn!ZMDkm=a_$vciZCBOcKezDElIm_K>mx1X`-aB^UE>52DG-t_6yH#_M!3}ucix#>*FK*iyP&P;yL^BR4Y z*JykJ`gG*d_T$aAZ!fKx|7PhkPwxspy>Zv@KL6UKII@;vqbxfIennPgk6(_y5dSt* z` z?_BaWr9ZrkUXYI~gZ5URqi-$nvTOr`7|-Yo>72pDBkMg8ys%NKlfX;&ghr=dZ0?UO zQf$R>nt5g4kXQDNnHT%U%!_@ayjmwJ8)p<{)+bqIH56NA)f3OAvX*(RvX*(Vhg@Yn zPgxQC0-EnL^HP@bsw^`vWtn*?OL?8L_8gB5aw-?|0&A9Ab4f#Nn|kbrM)0l=+2;^> z&hc3`b#`^vT+-u|Y1-7Rr`dp>a_mg$XZd>`;=f5xVtn?@q>LYRFK4i;oGW`Nr_w3s zmiXn|!GGzSBIMcsgN2jx`-E=Zh~6nkX}VIfp9B8>6BkTwNNK!zBl^erK9%CG&1&elr`{v>ojlZ4tyIGUgEC%v-jK)_>0m4?XOT@KW+Cr?z3}^ zu`h8iA^jS?+xm7j&(iBD==JHQUZ*dCuBktmKRLYMnNB^?K%B=0@=meSZ%bJ?d7iD) z>3e2vf9?KG9aMr2svvEdm9~8XdSe25BXq;2U7-ci8!0;~XpQ)3iqde##>8R*>#^Km4Gldhe#6~qZK_B!;ALJ<>eIBvt(@;IRt>V)Tmp({0 z^}#~^Uq>HvsPq$l*>nA!`t)w{H^HZeN+YL!<pUG|M= zB|4h)v}K|So#yyYr%?9S#pasht)`@4Hn9A_H0VS4_H1!^Qcz`ez8n7FNxx63`x)Qr zwa)dWvx3)qK!xBT=+518LYjjvL{uobiTOZcL|2i$moXfMNYrTB;$-aIzr=0l} z_%zIZ4pS*7nn!%;>lXZmVW)%`w+5$g+3(EPkT)UNFznP&1$Eq>ml(o!`^;aI5;Xm6 zlqp_QnY$@7!qt+DpNDw+l$;{=Mq|Drao*z%)q~soeZl*pQ-dMuvn|iAM^&N?C(*>c z<5Z(v`^@B1R&*TC)WJ_3rh|6@b=aNf3x$NY>R}`WPj>L%7=!<7|2h7@{wDb6B>(65 z*K5v&`E2M{Kz&mV5I28}H+0MIlFYN^96iyGcXMoR>y1?2H8ywtC-H9bp54cIc{h2_ zPXE#G6%lK^4^y#O~Na<5s&iE`pJ22Lf{lS#cfId_m zMiQs6RQp6>Cu9e(SCNeaSD?%Bla?pp*P-8(&MYDQt@Mo=M~|#Df{eZ1D0uAPabO4Q zptRn(MmifE}q%KkN7pV{fnl>+{2u4PGx|;j{Q|w`9HThCLp-IB5p5-@@Ch zVN!grcxvk$Vx{IV=EvUOfRCOz(wh|Tx|Vno;>%Yu7u-3I@d5C(7w=YJ)YxfT;ES5v zz}QOW3hRACnCltRHPgV3w7)efO)E+#o)qgCkrwx`v{|0D( z=@%WVqS(<5^f}u5U+pCudM)L)&^|@3x{2?Kh!s(S5xUEHq z_F=!N37cYSoLHR)sY6ApMPKFE;j9GUA7q^YNkI z3Xf#cUgD=Zo1e;|hr=V{rz)GD;FC`LCsHqGZ)akK%$Pgp%m;UTU6EP8?t5JJgpVJ5 zrc=g91&C6YMNmP3iXRu7|O&puk-W_RtkF%D%o$p__mOOl$)i-^Uwd5bBNtSwv zfpe`Te+c;Q7`T`07`QUzX5(+;#oNL^#}tJMJpLW!_|3NO_Wb7hOBU@axO>x*f-leB zl0p0BC#INlK!?(PtD(W6wqK)JukQS0(6_DLeQ=C>C!eEdO}<(dKh`wc^!-gaP5M*v zUFE&n-iM}Zf0_rtQM@;m^$+fN)OmdWR}Al^^bmXclQ_8lC-G=UU-y429&Ipu_D$l^ zwmtgaiAOsCZy#zr+N+fL2r(u)H~YZMm*}@V^j}_V318?-`kM}4GI3}gbN_$;VfeQD z5T`n4E$jam71q#SXg|*p3W8dZPf`Apf6?jWnQMQr|*(-59L)=7S2cswEwa%b}4@B zG*6njF1(y|tlGPwoOP@L_HHO=9V=@M2jp|+P#@LOqgR+s$?-9Ny*x#QW89WOZ(z8zeRskd1nZIOA zbDnt2kFh^JBt8-#({pDvN0s((0_hBJwKs`aD;j5P8I(C_Zxx zvx$G>xU?^jANxdc(prE2!YxS*odWIa%RN2r$6}DSf_@SkV)M2SJ-;a!5ZvXzd*c%S zm*;Mgo#UKUmw``VYpbVup;?E6cgk(>5yQ(kGvPL1CeDlTL%{q*8i3$|?5+kx+n zA6{;jml+OHza*}X@rjHj`m+bvVeADq06lOxdLSJ=kP-UQml!nr9L5a|$H-QzeDe>d z7n4_K&*9AQfmEZe z=BbIH)C04&qWW@9tZTGY9>ocAsYG3o5F#l!N%B{uj>x;d#AhFN*3R(w=PUg}(!Wmne|b)v-v}Nbkfxq95Gt`7Yi#?tioR6(L;zJ{#*N$PSp-+xa3q`Ln+O-F@_Tajbvr<1lkF}fV z_T{v3@f+#PD_JdiLx8sKfTF zCCRV$pg*Tia60*;lq(+U0C$yLqHo{l`9sFlz|AhB-i+yFvql()I<%S$twv!xJ)Fzj zR#IlCJ$K7A%N`HV)>G+EWRI7-VwKJ&pX|Ba{pqs~hxh4YK2Nvid$ndaMSRl_K7r2K z|403o#x{=4?u;Ez0ZxQi6vZJ&6>GxSTl-LFt1Z+HJfHrvq&oRL9D0ZrpXb^2pNg-o zxBBN^)}D{oH{wOT4JEmg8;34+U&C@O6YSZi`Mt{_m` z8bDhFt>S{#wt53?y%CoJ3b`ug_x{W?Px9oF1lwQ#`F&r%Kc3ff?=v%J&YW}R%$YN1 zW~QTq&qEhaLnlu~H=m17VM;B!+U#X8bq{qO^a-Y|MF4)cC9;J zlJ7~K*;qtupw4VOjknHhRKE3`+4v;+Bm*(}+Tp~RwfF%^pTvLpvNT2qcuYR}+<-Ru zxMz?524`UXn5Q`u!uQvW@gp5O5}z>RCb7AZy7lz=9mH{`yFRH#wqA=h)hO`lo1k^g0Ue}Q*7?-zMj z;KOp^H3Dyr;Ng?nKYtQ*omdNw?l}zjA(|^fTbpKdgVyP!bqDVr_|ifKZwH%1aa=|4 zMs}r%Pt_RrmyF0ud=DRP$Goxuk+h)x2WsCWMn-3a-isblzpv-agYYf+y8Can_h0^= zjl-R)8pfG4?o1kiZcWE_YhDnnZ5-j$uAz>7g`6KeBT#!5bXa}VskN(z=GDGr^uBwB z%=Qqr3~AqefU{`i$I@9$8`0x@pGXX~hkGWt*JB&D;NB-QvdEA7`c~XM{My5JS-bdl z0pCz<^NbXO=jW_9d_J_Rizm1^1>D`nTX>!bp0e|0Q&;1QYv4QcRK8*J%J+$_Uz|$Z z9&7irh_l;2{~Y*nHhh^xAAn~SF3-GnovAXPta?O*i^*I_>CAdwS5Wp2%4*`bP+#Exrfl0~1oh%Nrg_sck+UIndh5P;}MM zKx8iC>7MuVx!V9c0X@_IoV4Y8-cPCB^Ff!|N_?OFkflu8rZcuqWlVl{12RQE-JKYo z>1<{0W$gNXvpLI>XAtMvv4}IE%X`j9oF1K1Clb#&0YhDJJ%> zr#YOL=A4WHc+x29lK&Im?rNQr;O5DSzD^#+Iw)-g=hw#Q-`==8uPfsod4;FWX&)BK z*tvpzNZ*EbU(sGuMq{jf0tPp-%PS!?fGEl&V1vy z&Rk6X#eqKfYSGtDk5+un1@`CQ^S1g^YL40OE4h$w?JUxSr`83&;`|ulHw-+A!6Uiu zdxpAxJ?#n9dAQda6y#$va&ivxayD`^ z3EeN9m11<3bg}4M0{`G|Bo2O(&s91%9CKy$^+4 zo2;R`9dlXV+=1WVRAd)>&WyQd^1DJ~ZXoj9RMs7jN4H~RG-CUlgsh5pIhJh(oEqH#n_4p`OAY=8k$LkAEQTKZMC(J`Rb0>4LgM4~vQPOlK&WR-{RVx?+1`q3J z+PISQx*q!@I3=~y!%6grGtSB8^n7)mJl_M%{qxU;|C5k|iOAGh*b%NSHM)^@pNs6Y zj{WFt$r5x3BSSYmiyT#O2WvZb(F}69#|-;S=N0HI6X~*hkGXx?He%Cqi0@gpS8Gm>F61r^?05C+kb6e!`Lut`S6xps?K$14dJp=BnWG!n zUvl4_oqr7ne)z=vwPE0E&QHB1_0Y9mXOuFx*o3c0HoxhE$o3%33$f{B=V_1C_ez)_=|6n9dJgnXaYmc6 zi~**s#sFg8i&aOFYmW)Xnoq~nKJ)3=+Qgo4ZSxc-@x>nOYD+gyYs1ERx;AWS&&W#XB3qXm9n9D-o%lI8 zO5OrI=6_KjvWGT{_l~)rJ}dgQxd%EkI#qIA6y#j76#7IL`bH{!q$@fyjE)RO0uJk_ zA*U`rTX7Qoc4{qc4>F!pz%)BSd?=L}`}NlSnqWBd!W zoJBPOT+amOGr;|H#)#AC)4|9CUE~*PKTT_H9)1n0+%wxAob1w0^pY;vhdmw(aV~7C z_Se(@P2ZRO(w#bbP}hNL&W28`HxGLa8-=y)y|W8z-^Xv0i(bHA@w(>er_jd+UWT0S z;9NfGea;mNm$|mdSZH%T^1T|l*BZL!$C?{Y0GIrQWqDOPa}1f^6wFyHniOkonBN&? z*f}%v$Bx%JC$jJ0OX!w{KNq=IA833iFg7hxur_=s_t}he*3Jnz>*#=q2h|rO6W}6# zJa9SV2RJtH?NRh@X)5;(J>;HOP>p_QK>yGD64_-e@nkn2{%%8d#T$5UbQSi!iP!Vi z3{NJHf9 zPA96*KqH5@aE^hq?pmOK@ZE{*v3=`jz-r!@io9ge)@*w!Fix%oL@cOyFC0rGKvEj0Az z`A_22j}$_O!s1@WzkUOKSN-H*d|gLA&56WUjqU2=;;Z~0zlU%7X8zO9#mlSB-Pc*s zbn!6M1-;k{oO**>A8_mo|L_TKRE&vxHi2`I_?T__qxOr$cLX9i^zpTfJ(3}vy*Qq8 zTZt=~-oG>uSx0-n`fc;Fe8&6$x@<^({yLR8kf_!YhSjC_6V%TMkXW}1V z?24H+C1~0g{;`KGw)=&=*dF`=W^Ku-(;mxe`o&=CtVCwCN9P{wtt@nNrN%*Y=d&x( z71(S!Hoke=c67>i*G^yGj;%Q%#kDmnvESO-RBjw~KIy`cNXKKJY0NZp zS$q&P<+ot(o$*`j!9P*{^E}Cf{1uJZs`5+B#Ao69CeDM-)1dcM=zcD;fWHU-yY%)~ z*F48J?u@xGNFLVb=5rrl2>&O2O|+MfC5toUa+u?2OpoDnK##B5J3AD4CrE4|?`wVs zogc;SA+A0jp46K)x-NC~1EA|j==})vzLGmB3|&KY^@i>#$gkGi9NqhnH zXjlwSuos~Jt}=A8S1-I+Ek2ys4jGjw=h7ULR z_@FzcQt5vqq5S~b2F`P?aA+U&q0bf@f5U0U-(dKW>h|63v~T8ZUFwRDE*&@L6nKh% zNququ{I=)$eRa)?X8o(V$Q>J-X7qqJJ>d;=`uW6Tg%0c|_0Zh(lM4FD)PPyz(D?_0 z=p!-Yz8`&LEq&zqLZ?c7L~|Pldw~7r>olKm)Hl#G#?K>N#u(QSDl)NNjnJ-3k&cPQ=)&K3D} zGufBYhz^)j*rf^o+`2iJI_pZNIqUY%KNlKKftHhzcRN-Vxnredy`wQjXaCFIQ$NU| zAM`W*ASddC#&65zj7`R=XdK81#=L;O;O?iDE*i`pSlNi2uL)f2Z2Cfj=?iY%s@Llex|d}Qe9EC;)>ysN zWcx#ZtC!d>9bu1$+20`@sdWg)x4&bEdMU^FE(VAPTH6*6X0v7oPMg53ML#W+ z?86K8!HO5|`OvIAxA@=a2hvx_e*=JVLe$ozWx#k0^=v4n=M(DyHvt_SRAfyeO7(AB?h z=H;N(GsvrS@i2I$`H%XT=0A;>BQqn>jdyRzTYvY)ybX81kk^nNsB7F4YFdBy`aH>i zi32@=FWH7KtAH>yUMdPka#pZs z-|C?_|8KzOYt}p2lWE3gv*()rVaASNT_bUTI!h;J$Kr+{cdTMhX^e5l1XsUl-Bo%> zYc~IH$L5(HuMVKKJ2qb|S|i`3>I3Kb^^mLg8$!^zoOJ~5fz^0Ct9&89;Q{*)W|ddu zHA3?_XF%)nTk;f3ynp@$(C>WcI30SP2c4%uXLnqdousw%Z(=8vdUW35+DR>R=Kmqs zMaBlgmMQ&jY@jS>uAkn6p?3}R{$JQaT@FI;{Q>BmWD8YF@Ba^NA+z>nZ6VFsljrKv z`%a4N6vq5eAacz~Dfo~Atc5eLE^;C#^b1sRUmt!GC$c3H;;a|!cl3^YeDX{8lHY?b0dCvrY(7bVhT`cAC*3bTfl5e=|rBp>4% z(Pd~st>Q0rb_8dGuga`uoq46Rb*+izbz?q0J1XCvErq;V99L(7FF0<}ydNBkiESSa zP3H`8YDZ}<%Gy?d^BvaXQ}O1cn%h4>om-jn3I7$q_>wjZN@0BsnIZ=MuHgkkm}AKw z62Rt9iw0ST>OT#tZOUz}Xe5cichf*7YEC zo0CMhx0qLZbi2YwH{<)Vb8ZvkYGY$Bro7(=BEN`iX!!@-wIH`WqStl6)B2|Q4zC%b zTmRD**7D6f$)p!Kk-zgli~M7rO0CkjEY`vAWvmfT1+S3w&#)`BzyElf=W}rM=NaqE z!#tt(7Blb4h}MyR2+wwSL;NoH#D=5GuSm`0x0!=DjGO+mMFs`zd6^F567BQHgO|c9 z;TKjJmzEFVefm2tt(vI>f82Wg@ujG+m3cXT?F7deb!$aRrtq(Z-eo)pvNWuLzk~7yr6>)L7tX4a~>_ za0JuzBkr&(N7p3BoK=8-@erN)-5Lj|ShUlrGx?kN;Q1DaTQd8hu6)wHuW&EC;c$=n3$#rF~XUB;!1Z z_9cJw+F@{}p9{A7`2^s5F?GeM`L#>6jt$Pg1K$%nz*)Ti_5~?bOT|0U+Kwmm1MIJi zXlc)aCiyF}*}I^&WR+51xwG{x=p)#sEyNYpkXA~0&(Cvx^Ci+-Axw6|?Mysd|?_-7A# zu5ev*!rd>?$+^ORF89d*yp}#K0RBwmA)vmC+<5x#KRH+Ujt=M}SulJb(t56N9XR;; z{v8v8OKdQ-na88CMrU5`K>mz=M{fMO`daFe9BK@Z3`@Ux>ls(sG`}8}o|50A0v(n? z8GoPg^f3E%+Q@$CHyF#NQdgTX75x#g@-wkL9O;khGetJ7J^5DKy>WKE>Cf^-pzG<= z($mR(I(BU&!x?A~}5q;6> z%G=>#kf*)9OqsdZv4PB;xwI|3|MWNhoBdULzDCZy@y6<7uf6{LOpRZw&$itU6Fxk@ zHu^aG4|_h&xh1dc{_uyN?CwVF?xP>y{`%sV>voS|PvXwoKiWMakiPktv+sEQF}^+a z(aXD!x%1=Q;XwDzS5bD!aZl_%d&$eYALHzT;e5M-nAS6}+y+RV8!Zrb`yo9F!gCGvJ(e2mR| z1$h>ee-Zfv!+a;-B9kw@4NSpmsmH<^Mtx4%md)xXT65n&zYDQw#9v?&Iu8B_)-Rgz zjRaD{lh4AQA2NKyxWR`Exw?V77M+xSlLzI7-Wq)DhH=gzgRhQpPGWO&s21M@_I@~e z#&+hIM{ytPh=SUWPA;l_v>`ou6?8ZnJkL_QphG2X>p=`-m^)d8+a%~I8q|V+wCoi_ zhbu|0`v&BLytfbJ%-U&hcFh!pi2XE`2am1 z=YFG_J%h&R+Y0W6(OGinn5zHJ(<>BUuH1HCk9X(Hcqcfw9Nk*-^Zb^xN;Qr@cj5o7 zy;y4=|IhYf{e1ENW-r$L)cZ~MV$GpWZ!gvg#>QdcK+7Ez5AS!!O*1dlm}z7;9L>DE z{X2m($m1U?4`yGE`*G`7qpAVh?2vdA!OI2YGZ!+dHuz;+xJM>`u9EJRZCa zjKRm2Ty-IKJKf&h-Hkh@2L*yVnafQdPP@`_-MM?Zy??v=e{lbH zy1jq98~1M~w{HmR%RRVzyXRvCwa1r~G<}4g|1-pnvytwf`hoOi6!?R$om$_YhO~ygeJEbOW(k)G?Ymt3!V?XFt@0*!w$_H93`K9a&}XVNcQw zm1S*Z5p@o~?$86yN_;+aNYf(&Tg^GZiXSatOsUj;ANKqK+3@n; zloJ0ZoO**(FTt~Us_Cc7V`#XtU~K8PbaulboZWCp%h?TH*??$BIkl-e^gv!MZK@3o zYb9yRLDzv##-(GuAeaOkF!f^+PZD zRBMT=*FJ*@{QghQ_RwBJwMTvBuM^N!(4q!f)l}%53C>-)jXi~3Z#L_N!bj_cHQ*Cx z?Oe29y|;Pwq9EszC&j-TUo2~LAL5I>;({)U7>SSip$w+(hHw=&(d*$0BcI+i}Pld-BBl!U)H%YSnp!*=X}--i@Fdit~(0D(f;sA@mX3sxD>ja1iwbphSl(E zwdGg87Jl`MUJt+afdlq}3kXx$ZlXq``S6doTN*nc8E#wS@mUFh;jcUQZ7s?6Iz|9ogP9a^0S&8D&bI+Zz! zyC!%rKAi`jg3urzKIPgy&0)(g@2z%SYWNk5Tw?eXjNH@1<=X@1oe^CDoNOMyFC*<} z_AB8FmcJtBOV@5pp3i5($2VCcmwd?1E5kq0?MCAI@i%O;wx5ZWw|)wG3^SgU4LM*ut1P!|A&=U= z0v~%RZTH&p5^c!^CvWY;^t~ZYMCUz~^8OdGjyj8~1rB4sfg{@a;H(i%RosN`;L)W5{Mh^sU0Qi6_@X&$HjD+C(Jo8c%266;+Isk0tMI-%jst+ew~eSt$W`$%OQmCmVC1i^`vE%b!Mhtv{ZRJWS_NKGEg{WJaoFy-Xq zZEvmO0(6C723ly^*3aM9lOgi_6gtV?(f(G+)h6z=&2GS7fE=%(?K+!4bo_Rye~!j@ zA^C(4S6IK{0`iZe2qnduh{Wz{Xx&7uXV0-;$gpmzwad1xV7oJ=ULzm1Gua0on)v{KkY!$uL z_g}jNxmcOPdT+|s=U1jYRWG}rysWFOQu=Q$B~~e!=fLrJ{&a%5G_)5D)TT7?7TmX@ zBV3-g?ORIgt#*m0E$wQ}^DD1yq<@y-7`r;)2_@2}O&VnPF6yK5GRE<2(D zY}7V9{24H%TXn8z;0Pyjc)$EF3g{!Et<#-*Nw7>KRpVQx0X>2Ux?Tw4SZ%QnaO{8zKiR3$8%Qr(m{9#%2$Ii;vwNt)E z-#8=0z+|2(m=Ad{iDUQot6$PK)g|0!B13-MwAa*6vyS?gbgk~Lt6}^xGz4`lD!F4PE?w?I*$$di)ceQcc_a<$grDAm`Ehzg^i0tRDcYWP7Xa z+1@#Y-&1`@GB-WUS+$8e^}8ae-f5lGagN3JN7A$49YE&aODbR3N%?Vc5elzs;|UqLudQ(8OiACvCx7gc*6XAU|Wyp4TA*RB0xe4p|4LGqqJ+E2VP;Ca6-v&xoHJrD6scB}`ZhB>cfj6ImZ!p>!W zv&5$R^Zm-^OR>D%&AZ$O=U$t>k-31*jOtmd z{j1-kR-NTbzsaV*46cS&q#JtC)+x5FKk>D7Vp3awXv?Q-4oF+mc*~#c(c&_j{;|@7 zfyhhXsruiw^{D?{V)GmVj)kPX;Y&N;rp=|C?zw&0!wcv?Iy0#+PR-c?R>%(11FQv2~2`)p3G_vw%9X$@>W9f5Y=I&#!qN z;_>EUIic{DeaP=S$ke`-nulda_x+@qJ;nV@Y^iV#;l)mybD-& z^4!7G;g~;+ajL=D8s=W%@r?ap?yc2bwQ4&657AN;Y zlqa|wTsBH^uWx3f?El=gQPeK(l32Fbws97}E7eB%mAG3ujx8}$HV$-DUeA91nDWJU z6gFKze(5WvoyTwKPtm7@Gif@a&!Im0AFrZC4$ z+4}lLzBTe}pKU}L=Kk11?szBJTBr7)$CLZYeO+0TM3zRWUC?2ZrGwuO5>;8|5cU7y zTny`Pis1)}p?h>zPDkZ_Vaqu?TFVViZS^I^nA@26XZA?>eMxsvZkXWu`=4(t{kha4!Emk+V{D zLJ#?~G?xj0tI@H1+id2tnbG$jwqs9fVbk;GTSjzTSEq{j&CJQ9sePslxIabuHT)lH zzp4LkrcdYC|5^uBUjJA*3Ed+dbR1`*sJ++7ra*UmjXsypX0)weu-H3MRlJ?EBBkqt zp~&}vUA!_Bxqxv9zi#HyF@;BX8ed_#+eg&? zwz0t((SD)>^=H$5(e^{iHS%;e&W&R&!avSU5Z$5wXMzR&UjdfJxtX+M8?fHud6TE3 zaZbLNnmbNw3KuwAb!OY36&mXnJuv8g#=2={tb20!Ogq;3=DU(j&8IicMZf#{t6#tW z;j;wsE1DM<7@ey989B@W-aZqZ#ksrt3RAYOxVY8l=D~ct6PUHYl+3>@y&~Bk?2cIv z={vT?ANjtU`|&(j%R7N}uZ6WP3D#W})-!zP?B5nxm7TzQyFCft zBRj!&@HfD>pI}eKCo;=fb&BZ3@9TW@?b!)lX%??zlIR=ayGv8o$KlC(&c&^={x365 zy8dNPKKJ1B=&1jEvd5M6K1p@O^&MHCimkoS^B47WdHKHJb->GaDd+O(43|$Cu8gjk z435P?&KC=AJ^cIwWpr~VIKBwXk`1m6Q*seD40sK`2pfjJsd2+==ekZ{tg`KVTVtND zPd_f$@^4`uRh|!Q=1&FZ1DiTL`)GxaZ`GaDvD}BJv9*9<QEuzS5mL#72L!xx**BTjvfMYvb7S9qEc4~+;yFQW9+Mi$S1ebb?%MSF@VM(~G=>(UjRgU`aVSVMgS?>I^ z=dIulUo;=6#^&(HaQue+X8zgToqslB`xIZApU55Mta^dE^}E@pgYN4D=cN|sXDPSK zS7vc1WqwW>SH6<$8_AcoZ{`p$?yV`7&{w>6n7yjjA36^>B|VFpCLH6e{xS6Obmmo^ z)P1?d_cpZ?zPI#$eW#wyvP*f(=WwA9=7pWWoMvHO2h1mZG?>^)nbRrbr-5hp`>XBi(%-zLp*u(|QU$dBRKAs6;*mB|-;IC`?SRrqya z$G8yIu2lGB(`TII4zm)Rr$+3T|s3>mbt?A3XoYg-EzPms5^rkZCy+CzXU0aI2 z^3R8UN*xCqv*xNDlNk%u2Hsx3zS6_5=fpPS`pNiVys_-Ne*BOTPuHYj=e79%f#b@{ z1S2m)Im@v4441dR*Lcit&rdno;xgCb@)$mb52cx6W#v(@}!#x3q`(h1Z@VOun<4@O`e9-$L+)5wljU zu|oY*-!3q|(bc*arj0L>`KY%hm0{qV(=-9!spyl8>#$VHUhl>r7}!1>lJh#d+Fz5A zPvB*6Fg^_Eb3Xo$Tx<>VAG%-2|Ec!>Ire>#m!GjLpLEUbuUO&w7ivi(9yn8WlYv3M zJefT5>9Z#3ew&z|_?9hqi7h9&I@W%>kZ-qmdHH@6-_s~BzkuqRC|iIrdAQaa;i2OD zKEp*=iS0rH!#^=Q2i5A?*p9CSB5vI$M288PQ{H z-YwK6U*Su<3w`w*VbjNHyeIus-ly1f>Ce6RpjzQ&Mf)p1ZCE3C8v+qWZ7B>!X6rkC zsQHvX+A9w}|7ug7^95{uk63($^FGXnPr#->#T}ph_`WY>_W<`(t9Nn-X7&!u;V>)HV+cZC&+23I3d<5;0tjv>t za(giH2K0Fyc*MlF;IhirHI2HqkT$|sSDl43TJIsj2z0C3K%ODwS?7cCkcCkIjNg(z zzz5?O7RFlE=AR)g!2GM80klm zzL2&Y=A&EK!ubtwh~LUw(9+hdXu!f?EyBqCQ@pdub3J)9c6qw_wItkhF06C|haDQ3 zxRZC-;wBk-f&8M!CoOelM5TXKM(y4Y?C<%~-uK{9KfdS83rN#mFR%V5lj?uN=AUcp zzlL|*%MU+(ZR`KDtwT6Hm;_^kg;8u_T*@1p$DN zf1XTVp58XkKJ3|d3SB?6;9Sp~!0%hH0cZ6M>6w+_9;95rSN4rU*XCE*OU`S>L2|VT zI*4~hPPj`*c<1zPi_@pyYb~?W=1InBY7$Nr!fAsOxfz^p0;j)I?r%Jutr?uaK2m?X zPW_BN9}Gr5Fzw^~C;F&jfHni?C7w+@!gm?*Ier>$^x^xw&13NO@#428PwP7T4#@@m zs*dqPF$_;p?nw_mcNO^IKk9@3h#&qe*EcCT-}S?`Z5gG$M_UfndkE*O+dlX^#`w|H zcMou?c$WI%`FO5*nV&WzM3e1KM0(~3%HK-4TWr}JY(qc33w-#__rdq)x!#vYa`B** ziv;>5u$MX*aW-}7X7FERIK4GsOgZKWG;e-pm>);-Y~(aJpFNKFPR>E-)bz1SC&fr`hE^LoCDZ5Qk2{`Ah`y&mGs(nd zw6Qa~9iK$EQ!L&7Wo7Do%5Uawua|ffKh}|4X?57j1DL2CZlB2n^Bh8treZVRA7yh&XT*Obs zd6<5~+4G8*_@VL+anIWqzU|#9{eAMdzKhdMJU#KLCZ0Zr7`y#*9 zI+r!)nspFQe@+Md@%rpD^gF-3^#?OgbRxf2oFo1HVYR0)5cwK;lRbJOd{SAB8*dPc zFTAAJKgK8Jjp5?yIfl2H(I?1%IM2c8J-8EkAJRe}*H0^dh*_HzZS1<&4<;x1c1Sbx ze4p>68*qvTFb}8SUZ*jX->v&N+Qwiuf7D68rQDU!Efac(7P6B}d^LLPmy8eEOZUMq zTIuwTZ~S|WH3a{7HBaL!bpD!I)9|paHX`D4meNTSm`ltdSw-5OD)YTdsTle^=Ug?U`-7}gDtVQ{?eGI-CQOCTq zqKAREpBCKL+@|lbUNYV6?|?qnYb{E&vHj1Z&EgJdqdB~2)1?y`_3NAVV!Y~D;!5`v|=g(^X&u>p=&Q#iwZeMspY5exml68EZpH?pF=c8Mo}$VA@Slb7r78^qVBJ<=h6N$MN<>Kl~%wsg>tK!gLI%=q*G z<$Lk;(MXnUXkls_KGa04($~wIn3=#rO?`M zyDk+DR-SuGUL?=ff1OOvO8Aic&C^3Fr+K*gt^<9fn>0SU{?v@<0?9IMokd%vx4*N$ zd71ceC3L)kCr&x#Z7;_84{hcJnbDU71G(mm6I0(mD1R}}MLZqxq{V*2H{N2uv39ks zFtqhiqZ8V(-^kmM{dRgMv@rG?b7aAmj$8_Szx~GAtik(P@EyV9*U_FnUcQ?)!mHMC z)*YXYqF!%&y3f#?^C&uivCzzS{rbs;k?n(VqlK~b8_=%3y^6n|-oEYInQgWA!;a<1 z&<^`Z`yfTThk@^>T^IVSWbAVA{Tp|Ownw{=H_qD_Id3d`hk8BQaknaPGNb1w(N2AL z6FNzJ$YkFjzS0h3%3t{Kz?kyq`KEn$UQD@H_d3(&RvRPPW-#?pxB6!p{r}O++wPh7 zuc!TnI?UM%*5+^T?1f*Fr<6XQh8*eb$Tx#3l z$A24rPWZ1D{*}r}Om7iIkNt?MQ!_vkB~2+5Wgo%=1CccHY2U@7}npJyxP$XX9>n z)1CvzRLO+tr!8Y;X0!x9qrab)TOD^3ZQgx<+kP6(bmMNYeW!c0Q`2{aYw3pID~&YZa7Q(&W?yYSYyd=0eu$9<_)J9y6C*_@M1CqtjZ3u=c4!sZU<5BCI~ zzT*6Qb`QU4^YY=`|D4Gg8N<4ynL9SLx1vhAf0lcPQW-L(JCsU&cZzL|b1s$aWcuJR zPdBO$www#!I`{r#T>NkS-`;vEm+{&ZiC7R3k zk}bPe^lv#sqpfbPHh8uD=IJAq)81)sUChWS{uSXN`M;6z%|F*U1ifJRVRcwK{3wMN z3wYYom-4TCA|8T&D}JuM^HYOYtL@|2U~xO2`V5$DbhOX+bR}g?8#?gm7(ck`OtSU9 z*Fl|iw$8Vyvm@Qp8P6U#>)<^5wvT7EqDdz_8+j0(ac6ahJWEgF*%PwKkn{VDj>(Mv ziZ*8O^!)~HRSZ%#ahcdjtFnmU+{PZ2CUi`TZuH5gKVB*1YwHmjx7F4bUbL0PrVrZJ zo1We{Be|`tR|yZ{a85~E`CMS-^QX40vuWcy%kcm4_+`oO*LjEfB}>V=L^^l6)w$CB zvcI=5&+ceE{^JJ+ACG@e9@*W);lJPhUc-0ON7}K!pEUGot5-B$tNfwR#y@Tk!CxnP zHbCr}#_emcYXx_=ogWQ?9#znyy|%uYbk5sdowRlFH)w0Q+KNrRQ~F7Lu^pTICmpoS z-=>f838+mkCwK$zZ42*@woM<>o*Bvf^~JIkTmB~NryBN-Nw3Sc5`M-;v@yu%fqRMe zX_4mom0Ue_-&bwVNRf;x{fAcWuCa3WBKVxblU(O$_GSC)O!Ms@KB_ebg{;k%N3(3*=q4kxqRC3uLEsw<;yd0Go#-FZX12zJCEZ{%1R&j)BSvU*`_D+ z_NZju`h3&R|Eqm@a`v|`PxtPmUC6x0+Y`a}H_#!Ox1K#X0ef(sWEk5d3mG=H%?50n z4bHA&{P~sEAIM!d?sct)m3hH*X)bQTUzek5#9W)RL%j;AFEjG63#{{ndOW<-q@h>9cM=ODINN>2d9C% z@hVqRXW#t&oP&Bmoz)BT>hAe*{yOQUnxeqge*mj=7Qc5mTO0Tt;||Rj=QdX_{Fy!5 z_pkPB-%HHdzBLt`vwSk=m{xG^as~Gcau>9@i&ppHagJ}yp7*P>NM{BEb=Up4?Y*ba z&YbsZ24m#8j z>rv9pNjS)cfBpu23~fa(-Tl5DS-I`n|IK;-qW?EN@BfF?c`vqy&K>albC3Qrk>lA@ zHTrGmUJvWH9cNeSx7CXe>bG4#{Dpp7AIkmuZFTp(`fbmGT&mx8&F?OL7tqJ=;I01Z z+3~k259<-~CoJT5@|^?wCUYO1=Boeynf#lVaL>yzoSn~E_nQ~hy|j4?_r|3EUptdO zq%-+bIjgTLcfSWB)guE{^_(FgoivQT)!gjVawc>lz!~A@OzqjyzfR=zGgGS?%~Y8I zi;kw9Va+xt$}Hynf|XkL})B_vhVPZvSNWMDC_Z=N#6nknbzG z-+((IqGtutqk8N7!96(-4ru7g`I4MJt$6?Qz*qi`4Bq-)hWvZu+spq*EL+fxGfKKX zIKT;HblX4wOwM;cgZtOryCXRZ2r9ipAHIeR;Ww>f)zHe&*P>b!!1?O8jBmbPiDV->!Ox>cf@a%S%eLvb_HqISJ(WObFTxOe;p)m z+x9hA^xwM2wy}ve#y6%#-g~`E)!tJJ5}%JRNL+9ScXAgMB=%m|y|&>>wWVjR^2kqg z`HnzU>_P52x~6p8zB3CFaq@9zLL#ReyM5tw?mrLL#lOq9<=o+L4f)1%Z|V-thus*8 z44>&l8jo@k@fp2qUHKeX8~-c+4eU&GenvF$uP#+h8lRDa!8~Wfdk1{>&gfG6Id>U< zxFaP}gN_aNcE*;ReaEz6OCJ9*bC-2BhvS{Z zPuBCEogJB||KD{I(NN0PiDmpA>LiZVdl2uLyt_Jy;p>6PdH8eq-`EQ{6+I%Skf$-! zH*)j}Co;T%-y_m$8$;QV;e+{|<0LMD25HFt@WGjp#&jp~<*800aiNpYc_zZQ@`v~^ zyEt1L-v-{Rw3RbB(~ju2Jh$wxd4tQahZgp!%PsqRUTj(ExZHyG@~Su7mX}-hHfisW z){C^i@SD357WU@%8~lEg-#z&K7QeUgyJy|7f*ETS!8;B!v%dKHP@a{`+TSmYwo@I{Vnbn?h&bm#XC0%aL_`uSbsd(jUF=hkekcs{Y5$s(*goh5KeXr22U|%xy>`0_J#UK z7x`X-Et3tr>xY0N z<79g{UgX2E$l^F*@WF9ZxsGuBO%jePJHYW5!f~UE3m*>Sz|8@24_J4FScg@6+@%VUb z-J2ZlEWxi$Kf^|TO*Zn)r=?b{&^Ki7&eKz>s?WqWrf)S)!54$vtA7nka}s+NqigOg zOngNjYI?OW;mRE2z|gXB>U)jcPh#@Z|CB#Abp5!7qt@eJIIJ!KXoDd<&w^RMA{r`_=pr>*niwM(!UHO68)PmlE~Of=%}*V~&vI?6wEYRkU; zhCyz>i46o#?(`0F56r%X#ImKMvGYPR>Iy;ud?lCG<>NQm^GqO-SQAKm^;{s)^gQG4 z+Xacn_X}F=qMD;lFym?s<3ntAYDBcEnn(R_(DpMK7awIjT^dZpx?WOO-E}N*zsLI& z-rwatrcPsXY<4Kp0L@oY7Nfr^!5uELqh!CtX*=zM2E8NS#dp$xJ*u%L#(3@Fz6snL zCfV<@L2a8h==+6yU&}eo=e2(S9pCHm`)O`5nkO6CN#m_Ca1T0V-~3==&ke!E-fM%2 z;XRy_@3ixf^GQ#)c_*}!_oZ~_qrkX->Ranc=s9(%P*)tB_m=ZIzANB?Y~e}2ihypQp?VWG#Dfzi>i zK$YReh`F`hIK!avp`u!+OMYE$7pE@VhqdQE*v{yQuNViL;OB>og&$@(iMKfK@~siA zw%y^>zZbhJH|(sQ&fdvJX!apAOB|ay7B; zHLSOIvF`DtSodo9^Lb3NmDMuN?&7~EqvxeNtGN#*=WX`k#X~0>y&;*^IR63pRM*IE z&T3-Na!!I*#s;vuczp!l`7?f9%)IPWblz-q#C-J7mSAESW#ZTo(w!~37=7*O;(Vy8Z0y<{Z73#+rdK(&8W)&WPSc-mgg?1$_*^nS&mUji|Y(b8A6eXiq z!8aUoYR8dh9rL@jj60gIjJ0W>A9V(PDW|sK5&RWXPOoi4cVuy#@MvcYIa%M^8ADFg zca0&?%0GsT;JfH@9&`~+HYq)c9z&D|9@P=|+7Vs)3%;dGrbicGCDWyssV@}y8s6!S z7~Qw0aoe@Cv!Y!|$B)B)##Vn&(~LrVJ_WU3UGqnK*I!oj7#|I_-o#w_web3kNSrwW zezUu{%{DTVbCX8dUnxp&!hyUX31?#*vUQ%?IQ_6$ok zcW-&~(&PEAeH5NAX9WMXf8t>9cau*s>mK|=`LDH=zXCtk-pLkYzm3sn?6(=snxyg` z&U+I1j6dus&VGguf3^Sr?0tua@BOQJ8T>Q(SV(j8qtpJ)TBy!0si8jYfiiHq5<4J% zGIwhrz07{kLM|1!R#Ypqkw4^gufSdG(+M%?gIzOpa<_I@_s?TkZkIkY!kixbdQ0@FI65pgR{by z#fD}??&tp?;Ao9g`DIh;ExYxXmJSur!SoBhdv(U}Nj*%umtVB(M_JjKraX0=NjcTY zJ}M(aMfy)0zQBHK;Rp4sk<38vIZ9`Yyu#$~5jmOvUOw?&y7Y%iJ1;+Rg7Px%D2@Og zU`u62l_vR+ehVNk^Yk4(HXl4yUObO=ol-kf?V?}ZPrdgz&ZzjtP{dj9MBW51%ABk* zrx)d8p-?1S^`PTtK-V|#NUeH<2mg2??HJd`Iv5|T?jkko(HnIKX-|CBz3^4{#=qSM zUwq%%{S_(PZ|VBsoAHU}OwUjBduLLuL!Xe}>&5pH%kmjhK4%>ud;i?S9w>=3kYpbC(Wat$HA9)jL}66)wdW9H*|l5v+BSpL+o$?)%_hoa)r=pFa)SO@)T%Ldz+P1Cwi;H@fT99?dr2 zZu?e|6Y2iX=4H~elDq0qaBGWOA+p>1mRx&wgeg~zS!&!=57LFQSh~9MqhcMdD%Yt+rEIaTKav?%KX|zv_JgI!o+Z7d_D0z zu@Gx<(i1laYQ1vL+j18YL(|0EBRnH(d4Rb|!9lt6BtMamyBn)!|ajLX-1w> z)rRcoNt~OZvp0xY-L)dP^nn8Ald`pcO5GaY@^x473&%!+=*hy|Y-9hOgk zgMN$fl_<_Wd#bZlXNGK>=HQPz_}dguF{?`Iu~{hGW%Jx?KkO>H7$E|vZ4#7wvC~E!03_8XchU> zcskM}qRl+$)Vh9*uciE(#hZQkx7K*GFtR3kd;QI?2X_7KKs}JG|0M@A;nhDbKKP!T zzZ-aMW6njR1aY(KZx_P+y)QL z-U#&*wFMX|@9kal^Kn5td~BnyeS3iBkymX@mOJwQSLY`bgQs}xt=;(Xy0{&@Ol-C9 z{Df~4W3BRI%{wdlXK2}>jCgnbGH%YaGLpsrCClGIL_O`SB zW@v#7=q??zKfD~D_2Sc}*PY|fBd)c{QgGk(N;G>!k&>JsQs0!%|IJAO+S zx_iBB9oo-;ZMThfW#wW^4GC@y0$;crdILlK(!fv*xwQk6X}IOD?b~Ux1&n?j;=&f( z4=?rWSN0|n^DKGFgH}&Lr~9=Ug-9)v$BYj6m8> z<}K6Xq4ek{p>EMFS@mOnbg0w!N~h`MPeZ+?ta=u2(hp$e-(wrg}Y^+_|sU$u9@OiE4n5`H=)reGTmFlt zgPgRTx!s)UJ)!lVp>;24EkD8F-cH{Wvw6l07&*T1w7Dy=tNIrcV`pS$kv%^l`!c3>{tnh%5 znpYQgclr({eK6k&atDm`*H_xbnLhYPXr1ZIEvMaT%V21JB;`blQtZd^!Qk8wcn!W8 z`u)tM-->`UYWzjc+ydx2KG^HZd~oWeGNsPkeDE1x@6455IKF58++t#+!=#;fSpMBx z=gb|m>#MFOi=N*9xnK1t3#G}1&r(Q+qpE55!jy!JLvKgV%KhxzU} z;l*Wv@D|DPe-o#C=famo?;{C^UsTwL@^F!gCg(E8;P|VNi;2Qo}{!;YS+?rtJ z1B&ZZjAq)32ftG_%h@`=tM&tANAV5JW&L&fFmxQY=P31|FNuHpim_u@uYrsEGq?Ih zS8RO7-v<29ns0jJx9U0jUB(-5-;TdjzOpsowC|xn?HA3#+Qg@!+88l~`6>8T*pHB( zLLAporQ^!7OULD>5WBT7SQle%*FgE>UTt2sAm}6p0z>d(>G`#B>RYqFnX|b|Ur&Sv zM8nJ-OD+$ad82dd1XJF*^{l$!?Gx)NfZ33qQWqPUj{LhUP%Pi887I2V3QfiIKc&pG&I&L(!#^~-oRQpUS(%y%E&rVnlmGWYFDxiIC^ z;A1!DzCq~en7iETIlD3qeq_Lx<|%>N7=EedDbQjlv3(<)#3It;MNT9maMRP=VfdtD z=f|1MkF&sg81vvb`P6>dl9~q>gq`U%LuGelMAO$dFMBq0Nz-2D!8+Hx@u7lt=fTD& zMy#t>ZhyU7ZW}yWQ^B5#?_`>Ju<;@I=D~0Og>~ESWEncY@JjQt#u4~2zieI|pHe_u z+6;((Eh3w0 zFFq2@kC6rD$5k!!b)9*r$`?8+9*nX7okYDB?p4$HoTXufVt0h##^M-=5ClD_~5B5qBfs zLVTp=!?d4v^@aYj*W%FPUTc@ihCLs@$Lb9OB72GR)Ls+qnFum>zHljfyBHI;xpw5P z0Ao%GaOBTCT)ZT2Ze)F4Y-w3uZe#=Ra^4$xSL8LaW~LZj;URxYBY21p_&LV9ZEzy= z_bRnPI0qP$)E0v?ZSincT^f(wzTud@q4;IRah42_KhTM!V`J@~KLwgihIZ$`Px?j3 z?H97qlqYEIuvegSp=e#9nD;O=rcV?FTWIX`W_^=02hx!3Kp<^-yn;2+UqEYQX##YM zRcy$s4*fDOK1e>-!w&HC%1^H}^?>WNkS z$?T(wpGlq(tQ}fEx#&>R*X3sedtXlw9m!+zr$a|#nDG@O`!3AGSvzQ-t^=X#z*f2z zNe^X4uWF&|A!CGF^}?Hso@echH@cX3zu57}DQjqrvz2k^z z=D|B+kc;ZJ-+7wxmx~{ApktkctNRbW9+Gtk=as*6TFY8U`8&io4Q7tQ{-F2; z;pJJZgJ}JuA(Ooy)yHVuh)mbn#mM9~#{JJj=zVy%ZzF3X&8(5YC*m&d8eE!5ygPG2 zzCU*g`$Y5`-o1QkN>%P4XLREb#&l?%8-VVNgC&gNo-SLFoxND+`^G0B4;72@wEnT3 z@`t`oKcq~IxJQl6n%a;V(=YKThxX! z=45I^F7FR1|8X#Fabu`Q^cd!Yi)q8lw88vmKKNiDaAFi&RsWA;KKMTWH6MJ5e2+61 zd^OGKdmQzAk~UzZ@<`79+{5X+g!CnRe|hkLk$ybz|5GPtm^uA+mH|iWy$!*Bi`A#J zzwriiM8kOesoWov4J_rI9_Y8Tp84OX)TTA@(5Ps(iTlw0nCxif+d6BPvj~t;Kb*@f z9NAe~-}UV0o5&viCx&hUaG|l-58F893 zlcDoR@$=g~qkcc^zHJBk`6XAf6Z96p?(XfLN%ej1_7%J`3okFzUH2@3wtt78{`CR1 zXBD=;+EYp0*oeDo=!<6|SHlA*9B^lSWw|}`ojhv$3f6~8@i}^Jd1YH-SuQyF*N#gW zgXF`~`wQZuG$(9~AZCQ-XuXWwQ){pA7`%dcDnCIu2Yy;8M*kjb! zhqG8JDJyv_<-7k((*?qRmJ|6teqzNU{HVKahuv@NhdYn9i0A5y9`EPSZk3;I%NJ8# zW8X~pUCg6=YWp*$?OD-(@~uPPGxpB}+Q)eO`VGRfmwN`2>dT4+B086|YI`8^K6e2) z_`hQ85BKg@*W4xS`S{U^anb@^=qHT({`JTr+N=HAC6*q-P4#$dBd3zC^As3wTJCNS zP?rZ=2yDfac7RE8v4dWZ{y&iekaqBpP(UsA*=X{7yOT;J1 zXbYcO^IY%oiu9-Z9{jAh+mKCfolJ8a>NK)>wUy0(Ad?sKT$C)E(880=i`$Vs$%2C{ zJM_KTf=M6t&OGqsZj#|a+jV5+yBECGFJ7chzdZY4n)`(WbFg<7qYLMx4q#qoVLsUo zO!~>XLH*f_-o=b*PY&;M;Fva#x=P_I{9Ps8UdG$g>-{CGjM@4o*&KpBn8`QOX5w&V z6LnTTt)22I`iAerz|3}GHos|MvOcUiheyZ6n~5CNCER8*PWo}voW;v08ShY^qbmlD zWn4#pGOj;4{6tHGpOoA_G2I3ChFAhilllU z@1%}ei|^mCBLr76^Uv*Oce#&bcRGZd#_qZmVF3T#bFmnYHx@K^9+;xSn?`saRgWkQYrVnVn+{Vjg zlD`E1#{|}orB{>b^sDY|>rU;Y?tra38OE(iJpKIKj{D@l-*EBY!Ch;*J0%&`6-j*C z-U+O~3l?2tAuF=Wix~%#X}#IPpTPK#tUr=*TmMG;aROdk zhsyisZL5U`=la#7Cw>XP^gDnLSvWqfw07DbNO$i|G3{cG#F$0Q1NJaw|Hc0r??1Zb z6aH&_I`kGVJ}fKRuNU>K3`Bm_)2Vupyh|!ltA65@ffn!BGQDjX)$=#L$qrLJ@*Rwj z?TL)lb9ZU+N+8FL{^y;PkiY`*|y-e-5~)4nK_EHqQ(TqLNowoAHFu${kJz?8%zLU2 ze%z+tXy!P9$Y}6X{U=$NqSyO2&jsL8NZRqfw0CUU-?__5`x%D$aG7KAtMlc5+2*eR zkK@UIh%fC$o3>1}3I-y7Wc}hu@?`k({Ej?>`DSE>_FiV|sPg4`#=@CE9r6o>NDJ}= zcpRSQa`uBESAx;rT@B}5;Ex;1ioUM<*th>b?EQCqRaN%Kjh}l%NdQ451q7v8Xkr0W zR5XAfprRs*qoW2KC4glt*hd3c0@$tuu#E(4$wjQ7U=2YX#2P`sG8)j)P;>+o6Gq{A zf6mz_ci)p+nEC!*zdxSW^T&Rjd(YW>?X_3iYp>mybCK*J(`T5wF0TjH7GP~AZ6YP@ z^Sh!q>z%61e>zns()VW`G56sPeVOm2Z*qNr@`ip;P&egM6rg|j-E#`=-%rR zTpA6m)jeghSNf(q5M)0^pF;NMCZo@d7JWK4{om-*&Co~nsy=rg0&}rD*oTr+#5uX# z1=Opr#z|&% zcYREwnm9%|w&#Qt_#SP)eTG{$= zM&t+Oou3i82-=-R-aE*vG`V^JM=$Ow1xh&fhE4b0h}XAN01ID zCGF=J+bUKmKU8aC=4G%>5BboV)>*9mEk@^S_%3_s?opT*s?u6n@wSvQeUHQj&kt3p zUEjJ&jV}!pyk0S%%;sT#$`yuLtK|C>*!6kpOOJ~A6n)6!wSAc9>zKCBIVjfl0~56U zz!dH1VA{bUoOA98;G3HQ-+lG~-%PMlRNXL$Ls;3eVZ zN*_mJC1vQYe~;=bBf!zzqndq0LmXdCf#YIe7FK#bXW_ZT48g0@xyT2!Q9tjuvpfZi zCrmrn%15zi`j}uV9*OJ~pY6pX2b>LT>hS&9c^2R9Pf^DV3(p$I!_$>x>hobuA&>0l z1L^~>z_tk=p1zH_iSHhdN5skb=+k3zKH-Fh^qY_ZuS9C`XUo>`CM$#FR54T<46AOVg8Qs8*J!SPDf1+IQwN9jGh7|;7z0o)HwfqPe# zn;(iCBRb!jU-u`$$(nb7Vi_V zH#-^kB;&)cA6fBeU$2sk_3l5}8|zi~-LtXY*TDA2dg^P}2@h*5W83Lft%2EF; z=Hn)f_2LD)xVuz*(fF-YKAUw%!EExo@q!j!yui_z=|a}l^>G%xP2Kvv+pt0pHlpYGr-A@bx0R-Qk2_U<;EuP|5<a%S5*Ss(6 zjPGUEDvde8_+I#6exLOjc|08$=ElsrbLO8{@2Rf+_kHfsZDKOH$imU5$1>rU#J0RH z{E)E<l<=b1pFWPrg5ha^O+PdpEfYR2*8_X;H}ns;I^{hJ(vRCOam`J z+gbFE1@l3xd~u5MQz@TFj_tnUn&V@<)qUS9S~-jF1irUFcCfpz^-9&z%hU5B?3Hb! zCs0SaK5LBHF@nBOZQ$wmwdeczwHzMTuOCg^%Y;SkLG^9PCN&=hO>036(y6ZGjp zys9IMvmJ?-PgiGgxv}OufDU(08Asm@U zJ3a*-YlK~yR9)|zx~5Rq`+RF>)%CW4GfL0S;RtjqsU*+7=wG=P$EyMcujQMu0!E-RrD0z0??8&RfBF8~n$^UJpoZZexP5DgtU9ce|awhdZ zO!*fLZj$L90p8qaa2-Nk$?Qoy@1cyVx5zAgyrly<(W$16W0fD7Z4ZvU$nVc{i-tED zm`9N3Ccdro@xLO!t~v0u9zgIjEt*|!%Jc=E#=2`ckF8*AMx>*QS4IRmD;ekGMLXE| zWZ~61dVwjQ?dEqPU0gWX(Z0|rYU&qmXPJEM%=ber`k$(A=%e(qwO<$g=_cwD%{!aC zqT}a*`uiKWw9BOzs_OnmM#bvA3+zbpyq(g`B z{d(GRfJHZA5Uy^m0S^0gv#+dgD=~8egSjJD?qA@^*$>&5l1F`)Z=0VA;Kp4iF3e>H zx3_p^8r;>+&9UJt+iI|KD^GWm(o zyR@0hv&PR4KW;MhziH|aPLl#KJ~uG#H!$wyiO=NLDLJSz-+!j9RlM&6td67(qytF% zliHKok@h3CCAA^tk#b2nq-;`a(!M0MWo?eLXjNw~rYc{1uVXcb(K@Pg2(wI{SMUSv zJdLb8j>+>I{_HyL=KRgQn=?0hDPsbAF627b{$@n30{8jgzU`(aC0j|tL1kAB^n8Bd zaOz<(93)piKnKaP7D;4*dkaF&vmkkrOGtf#VR_>zV1b0&{VLyH$tH%}Xv z7ox*X$pv~fp8i8?PUcar)Q8U=Ya9L}7W_Fj{IU2NV|C6*ZnTJdYwfm#r9-r3v*fIE zI8tDAa0_kfOMQ0$=XTOm8=l2;jmvC!I_p<+N525?Aj(go+_k1`9=@TC@0Aw56D|05 zo=dGfqQ}cdE;f??LaU6;^S1*ytrkx3{9|yEOnpJQ(@7&p$>w#m{velmEUgjOJeS6) zT6<7B#anyu8S5dp3}kOBdj^V_=hFW&YklOrCf@qUiV3mxk;ks|;!*ZE(Vjy)lJBw+ z73ju(;sd|^F+dM}qYXh{`Bux`jl(a|c+Z#R9jx(p=RD~vG$$zfT~6%Zp7Y$YP5qY> zImqb61nL!yBG9G@sWGY1|B+7f|4Tak{9bB0)$m=k$!AT=CtAN}(J4ruf4-M|ETMAy zK{K`YY}%NLZXE)2d(6;nEwZKZgDL;&jp#oq)!JpPXVAJ0#d-XDz_Xd(TEqO-0@mjX zmU}J{@}u>J1saE?7%M%QqPv9)!ASBrE%QvT_-Fzx6w|wm*J8dSnt>y8S=pSm;!ejehCB`sPj0PrCCFHc9)z zj)jJP-?q-Oxm||F+sG$n)6r%1_2SFRlCbHni7W{Sc2e~*0_9c*S z9JmVhTwo^RQC=Dz**s3P4yq}1RSc(wdk(Ztp%d#2Ce7FR7CF&je}b>jt3KXf#hf{W znRYZ>)5|&4c^<#b{2%9e#?DE@$6(DyZ4Zmz7JPfn&U(S`?Ag#CHRj^CPqQ!d?O;z9 zzSlQ?``?0g;~mpL0_HO;K~MdG>?;woakd)#jjB0bDmm@@X`&IY_JAJ?NNVx zSwJ>kkZe#+^UMXELy=o}ijRlF$N9jRM=B+y(ygKdXIu_Gr4evF+tZbPIPrOg>Cd?A z4V?exjLW}4NB@k=I}d1tOg4-Sty!7+jLWOhvwfi9SVKd>V2tIC&n__U+x#H=%=+S-dfMr(a$Bv*kQ@BXlJkWJXx}Y?)QYh+Dq@AYsVaf z*5{~Cx7R8zp0E8BIWwyBHGh@k`V0EM!txiEQIEHuVp9EnieA*A`K!VMJRFLIgB3G8 z*pla#k{8Ldi5Ujvxm^-@cGuBRj`$qB$%)Q{HhQP=x);N09c^Ozx~-hc?D`pIR864`iWp5*IBMFmJ_|6`nCXLGbxo!yL~3{$of8$`GPeAGpbJL znWWDouOH(K(qi2|66hTEFYt z>Q|}PwHNR))A$WX11AxTH`P~>FJ_-S8((h0_{sRQ2Pc8C%I`DG8Xq5z2Q3&HU#gus z0T|MQ71#;wW6Nf59I>9HYnX5UN5eJDxAD&3Q)biPMwj-n{z`j9%Z#7l???G7dE{p# z+T)lFUebff=-FRRir;^1&lOxm{q8<>Anz z4g)vIiSo~ZcA52hk{$gX*(ky$Jd1u5ZEzyoVdTP@WMutyr;)ckD$%VuZ!2y%xrJYe= zuUC>;ci$&6`jHzWXsEwS!N<1&yNv&LRFI~YzrT?Df}6-jFz$5sP|hFZ^;5*YT-w@t z;N$j)ONW@=2?zC~{oFR9|KN~LE{mzB*z||eLA#!*@21zco5&-*SSa61`b9fE+Yr;Q ztH4wGWy>Z0ldD(jm`782-EX1t@|9$ZzlS&HlS;88@MDobw|k+Xoh`36&gYo#LmN3& zS)mZ;jfUUv7HT$~d!}b_merbB=?!feO7`!*@L>J z-jm%HpI7%V$N3@Fe&&OqX`(&Zqo9$u<~BxK$&tgJ>_a4*8Z#%@lf4h^apjZmr$JxE z6G9|^Z0yWy6!{Dq=azc=$PZ#%EI(FbR>{+R_3zlgES~CDZj;_j;ye}7pI7Y83(E0Y z_6ezN^|EX2OY~)T%RAEHhO&F9iB()m9m#A?{dk)(q3=87uvTx)*l<<1LxiK*Ct>7T za%Io=e)tZ30klx8;VZRGbgS>z)){qv!;aXvJhM+(wVZFInIk?@mV)#K;U?9l}DQ@$UJPn-*ETSx5n-$U7C z_D6NT>i01LALF(pbuKn_*3pjtg=eoHoStU|7SFCs!?Ux~@a!@0O~$iB13Y_9{XIN; z(2UtCXk%YepFL=+=F)Rn+r0+e%3I@!um##R;~m-6j? z9FV-Psd+nnU-J!lP=ALiUn{{I9 zlXNbh;O=y7QciRL^mrLsBsSO&cTTBIADK3_piPs5{MDK1W*_+!!{0dmTlV}W^F3(4D$kA|XS@EK zfq6M?D`XE=8G7Nx4m_Jy_j~+V5xzgO-ss>sBbVQR?iMbY&WNT5xluA0e`*?=&`-l_-5LcNRPiwqQ@gly~9ntKT_XV zQZoK%Tq*v@zt6#TXy0Nqp&BlY;Par_^5{$m+B zE!p(P9r-42$n4*?dDhRB(HM^;bN|bE_n)`_f7f~UpTXNQ=1>cpIdu+a64^03=;NM& zEBmiArgd)R6KDMY=Dhn?sCQ4#yT6M%XXBe_f4UzVdZ)53&-b?~_1lc8-qLT=55KP8 zMn9M8x7mCBvVI#I`jUQ|bKIWSZ{x!+)NgEr#>r8B>rS%YujK6cabeD@Zg@8taf!OF z%*p)19U-z^$Gz>vr?0zkK>1AcqXhgjf4_0n#^uh7vST&eYgjkdscM%|G_t*uJALPb zTWV{XY7c7W%8g$(eR1PAbGK!MvSxG*b)DX3S!mk;WPWJV{ib)|_j=}h7GwL0GIC~Y zg(jJtq2DIdW_laW6U)q~_#$(kiZ6;=4V{r0%AKD1N4rP5W@OID%F?}HS(}MZLv;V>xc>v9ZQF9smTjkoTC62^2sNK^*@qvjoH+UYnZuB` zdq~}uty~#>(lcl`HR_{K3qL&^ zm)FlH80qrW*8{BSz#2|{SuF0}I$6_C8-H2t72y6c z@uHtXy{3PIEG$DmTB5598}Bv!E&fmD|J~eWb9czg{~UDsnf$H7hfV*8Sj=wnl%fmb zqxRX4jC%a=&wouPUGqk^ynow@d)1-wPt@m+8MIeIa=-d2&o}blpUv1# z??2-GAd-KM@BgO@|Nqg2ouHp=M(>gj3pZWdUXyb_${e@G_ROTTqylw=q zt(_W`NC#co9oU!q0vbmKU~@0;(x^md?YCL4zHK;nEHq#E%g3jc|3aLScxtv^$8Rl~ zlnA$)E{(Vo`DF4nTbQKWV)hg-c5ytFdR!daL2Q#S&eS$(v#i2I15wYo>=HfQPX!${nTu=`~Ev*k@A zWrH%Rn#pbsY8J`*n-kf%ph?h*99<6?Nf`+m@jc)}nIe zGT)BNU)r_5)3+!i6cNl%ehQV8Wt>x6n(^83)pOz5pite=i`jS1zPnDy#n3MK{qi&N z|0vDK;f{@*W5j#uOCit0c?w1~cOOOIi^`Qv&E*c0n--Sdb<9HHSC-MbR`-B(_?zRl zp%hy9`h8?)V&bO!AoyQ>5_&ziqW`8thLm><36}wNU9+6J(u}I(tFJHWUzRblwr0Ci zS2lIzF~dUnOE=C8FCBJ7{*rFJn=L8N7*)H8GwO%A`BxpEPxv}$ck_BUqe?T*tepofwtc&M&b*_Dt-bH9nOgsGy#2c8EyYV|<2dfxP+z*r zshc|`!+Ph}PQdr;zSpzcrt^N&hw}ZJ zt>jy@>=0-1Yu8*=?((7sG&vc#*v$2V0zNM9FQ@+Bugol0o%1ZaDtWn-Z#9n(cje64 zw0qS0(+AWo+sIv!rwphci(f#VVXkk{K6>@GjFR8>^5nQ0o8Zgn`Xn-{xc_+MZzFsW zkMcQ}suAmLCAZ?0_RIOQyP^4iFS}Da#bmdnGqQWQ(|6v~8y3#bSatlyE}Wx_{FNb- zlHc`HTP>`)n0B=e)%mixv&+za7q#MEKKNe@AB5xNcKmM6+%)ppiQf+oQlGb9v>Q5l zac}PFM2F9>ZhDm7b>`ie-9uNY4a2c#Wf^DJE}44vl1+!81Ne0tPYIz5=*T1Cr7OPP zz34#N{^Ng$r%kPJ?=jMtLh{%S|L-;A@pWYCwsy|eAMrmsc{nW{-|L={8$a;+(`n7~ zZ;YOL??}HdEo|ZRQGVUoc3U2}Q)U{nx@p9{BfFbEcY5pmehU~o4-YjTPPy*G_Hz0V zi|ebkcbV{EJig|M^xv8I&^_r(?rwWzg!?o0o-uy>G5%S=(57F94?|Z~XQC(n3|-Z+ zIdL1>(v`ajt25e1UHe{oY-B@5yXg9+Mg5<<5?`SyGN0w)w~RYrfU$JrUiXfi)+^SQ zO&{J<-_|uF_4jequ$FmftLL?K^LEv_~?Cvd#pW2x$U`yw&XX`J=dn4 zZ+q{rGi@x`xx3Gs(9*@7yK02{fStP+ul4Y#+c@IhPrKdo?6z*Fez0xY!Y$j}drZ(5 zaIAwKpF)pq8$bMTTerJ^biY;qwtH06hesbKc*}m)S6)(9ESTC_hV*S)p7S^odF064C z{WmTc+^t*4*>^Z;^U?WBC-Phtb{1A*t5`KxcM@cf;O0dfA0=p?%*d+m??yV5S%!vV}A`R`nP=6w!z)e! z&lrk7-YFX94w;>A@V(0r*IpBk9<}~0&)!$RM!hD_R`TdBq$R|E@nPBTFc`n~B>dY! z__+h|cLxyLc-OrfWg~X}y-KHc<0Au?zL)DPT@iNb)-`jMekz%=>3w^Q-c#UD7wG*2 zc@*a=%gCuMhYy`57ajj9en;1t1D14+gqGB_8o0DWbT>X+`Fa%H+F5Q1oj*ua%da%T+Z{7tnfb29t98#|GU zLYbQjvRDsKd}AYbg)QLTmD^Z{sJlcKoRh!w#8C5zrSw;u58>{wnNDPU3(l~Qbj2@k zR8F7xeCC|J+>kgna4NLwGTS4HOkekEBdRAvT1fZSI~xR+926jJS7yF8_wBWir;vh zy+#>*b=N4vlY$AcHOh^V?Pa<7b<22PNPcIZm@e;nojD)9+n@C_+<6)5L>!Z+uNyn~ z{+)D{I|^OAntOOLUgn;{Q{dxp^nMs)Dob zF7{RJ$-PLEfKxQziLl^&kM2bpZ}MNpoUY4@`Z;KC4tNZ7Q7lN`zV6}C|7&C*(OM&y zCfEU&CLb{u@GqxIdZux&&TuT`n_?U583QYBGyz_m>9#q3U5(m4i~2N9lWev@mtNtH zwOZ)?GWsMP>{T5uDXnxOZKj5*3f>K~#y&Tyb$yA-9YZ|JFW1p3H_|FsY}Tt4QLnEL zlF3fc$6fcF;(o3+qTvQ7(heFHpMxy44Q(yJ_bwV6iVTGhF5i;C&)Ng{j)C77SjEt_ z!+Pdmu^&YP8%J(HE?mBy=Ic;AEw{ert^X7bij^D|c*@TD`wg6BPGm1=@=Z8za|Q6% zxwOuW9=j}D65ErS9bI>zw|?|o?hRABwRcCj6nAk-+5+!`iA_r0C#@u@&R`wCywk9b zPJue!GIen8x?9KF%(si4KXmfiJHVC2oak}L;`7w=9O+q7oLxZ2{XGlMK?liIsEbFZ z1^f@reM^27+j8YM!QEaCayuD5E+dcR#J9T-zE;Qa@Y3D*d1%S_x`V(QIeldx!>9VY zrDA!D4Ug1cxa*_Hzrf_*(p@@-4^BI;qkV~RUhUhV?#OQ2P`u9ZO*$9S_|e}V18>z1 z`N4KOE~Oo^9s5wH_E-hmBltKR=%Q z%|>XANwY_Cmt|G;S(X(!8=Iv4I5@Z^Ybvv5Ji9gP zVfo#nVG%yY=zoMuwqs}RK!!C(TWIuJcx6$KFK?}(rPg`a^X|15y-u6sp^RpX=h zZ68Y8b#D43;bomGpUt`Qm(d3QTzScKX^L~@%aWWc|K+Qx?`K=Z_iI^4vj|-&Ho6p| zE?)*6Vn41fVVi9klu!J}%_q^OL9}fkZ5+TDtQsNBQ)=?!M0b59+t4!zaC~rT)749&W;`2>gD_XlwYK8(pP!f}Ob= zvn%|DX8-Qy?a#Z3@;4e7_L<*vHu(3;Wk*{CWM+ROGw&Ih*-rUF(l}D6lc$fDfqR^t zq@BLpUcxumPB!xLjtSm>9pEPEO=q^j$h> z`#*Yr1AAqpTcP^3^`2jH9I$=A+YJb6A$X25L1$WYZ)e*G0qQTLk0df(e zLCl`kEsd>7`zv%vx4+<>kE9#1{RPzN+L$@JWn;3Vl9R8-H!1m&6vtO+;mgQZ)F~OU z`6}8u=FYd(f{9)9*WCC#{fKh@Z?`;Ul~qOB}-5V&LR07|7j^Md1?lV|riMgmF9XeH;Z#W51BG z2mbr>sn>3=e5VrQhZI5c3hYpFjOEV`#EtiaYW2t0i+w2!B`+-$#VZRT4k&E zpzOI;*|}EPsy!&%#wvTiRkm^u%C2h{Ywu*M>`Qx4c8OK*)mGUj_MmJV{6C-07h7d# z?LpaNuoZsUQC8VIt+Iv4ll-bu*;f-klK!5(1Ra{v(C$%@NI$G!&B|ixFi|RCm1+Cuouh4+4v`aF>r{})!)JC_092q(s{4c_Xm*z=_oVqIx=i8S2rJJ$CeNc* zp6ht`XOrhDo*K*exLs}X-*4rgVBXCz@4Oh9cmJQ_a6O2J1>%uMH3Zn>26KS-NM!XXGd+lSrJ8MVsw0dk`QT-e^3gFAy`2R1PZbT@+%5onse#?Xz;4HrF+lcnz{*jvDU5SVjFvy;HCNC5lC*W!6K!@!=#m_hUTQ-L*wG&u>( z1qooT3&6b2z`Pcivw(R8ur4QEmIUVP1TdEeV2&{`7qufM0?a=F>s-?4Brqo@fcb0y z=BWnepaYPHa42#u_d$&Z_CR0`Amt~4Js|jH{6N9Yy+%3Qf?BM`3YcN9)Q{0hY4M~12Y3yVNxgw%pM6~o*RI}0{%P~>O$vZr^8J_fAd-J%ciPWLtW6_dWgHIkEmOt7j~RGQ;5I z-z_Rz>H2@%Eqd*~%>7P?AFtJNR;%v=Uio><2b}j-Y|N$hb0+?rJCQH-%bCorC%Zdy zGj`mM0avh&>wmdh^gP<2eJ-M7kiN~iQ(5>FgOAn{>9_XtUL@Q!4`I#`8p9aa^)vbI z`nX=dM`wY`AKep}0=&abb?o3^5wM((>|D|0Ans&v-_N};Pd%kP$ zWik8068S3g@KqAMAKa0)2ksBer(L3r?|U{@+tKMDJr9ANiC})%7MPdDWXv9mZCfNd za{nyjxq}1s1mXX%NU^yj{uOs?o`G+n`Ws^t&w&rC{?f#aam&6aR-&iu#s&CRI%8e2 zF~uU^BcJAVG>47Fa{eK zTiMf<4U7oo?>8`le%7mRHuPtHSQ_sa+(8?4N9f1qKGUYy#9M%OGwCK$GW)3bWU_k_ z3;P-yd8VcP&U&!#9Alp8&FUAUy8k~4XygsP^4 z{|}Zu6nWmgw z-@aD4ldN){&Gzn8w&QEH;Og7!49aQ_Sn;*Kl=b6liD+6fG=}T1%hS6g+iv+8VS)tLy_?BOw7S6bzMe?(oWqn*9vZ?5^$f|Rp zRp&QWor!R@%gwdQRaxcKpZL0=H7AObE;%KJXT-vDc^W)Njfl}^s#V`&tG;BkS#nye z&TFkYpR($-am{sc&7HA>I%m0hoE^Q?lv{%yKj@b8^f*|j&V+q1oHrwnI|F@wj5cL| zqwF-R&SYiRQmnRJ5brv3p z${l5ud(bMk(khos_D5UtJI$1p-n{0P_2y9$)_GP;CT_OsTxivqsNBm|xy!9`bJLW| z9TltZBCA})DwnK{YpK)M?=!46PD#_o+1!ol%l$yB&TIFe&e7+@>g;XRd5Kl0?VsCz zZ=V>`hEo zeqU4mzCigFru;PCACsbdn0(?%sm^O+JXe30A^n4Y$6Cvm(zoO17rb^{PJLZd)c3u~ zcX0sUYQ3ku7x2D?%G)tqYwl+a`O@7d_aS+_HpSn~oYyhdrq5qY-=^0LuE&7WcE<9_ zaC%`6a4Hil#_&bR`GIOXznK$A%GXCt-E9MOn$3H+Z7t*PT>foXOzw)GO5e8I4Sd#i z$I0ETdJi97Vjq1@iZ);Cx48vq{WUgcZnr^jO~a0)BEv3l8X?~dXz_+Qe6 zY{ovx$@_B-V5Ay`>-Og_80DS!N zeaWM7Xm7@6x-0p4;lR^h`*bMZJst(_Odc4MzkYilf9-&ywmk^^vr_P4ALTnLzwTb) z!PCd1c|9KS_ad+D7sDfO5Adja-oxX%0Ij#{J#_sm?>nTxZ=>?fXI-uC4!e~zpaq9# zsxn_uCY_$IB2OYcU(5WCZ@a#E!IHs|_})jck2M9ZZyH>Kaf-h-NiK^os0@7SMY}XV zl*~>%tu_Vj9d4A%*qpdTu)eob)Hlo2w=ea5m_kQpn0%S!Tb?4{Wb%1*jK9 z0lfXb>uBp9-ivJhC#i3Msju{4XVDwfc|(dik5XRZJ3)SJ-4VY|*QQH11OKT2UAp-A z8(Z$*t((WX8UJqG51+8;-YanoZXdyy{tLdX|GY0ubC+(IJo1|}TX=WruI3D4&vwP% zr8|f9IKC|WY~z%Krdyu#bfN+|DGapxU;2g|bY$Ji7`|y8crqS;Vc?7oz*ucyoT>M~ z(i-n%Fy1pTN|B4f7Mzz$W?mb3T*;d*RLhV3(p z3&`iu&%2{{A$u}(FR$e1eqyQm?Z>arHaLH3aK1-$g&v9OA8zVj!Jgto~Si~eY`6;H=&nsKOvUSzTfExH{Y<@V(#NTQ2Bs2lr`s~g>+hLTD3Q3PwwPBz=f6k zPTp^`fpeX=?$m|PUMhdhY|th(e=d2v{c(ICH%1O!uV(J-;SBHpZ1a@7USQ_uZobHi zfsesvtIQibFQz@0kz5!p^Xo>E_fg)9$L>4)+tW<>iKe{dYp8j5Den|tmR=pK^DryJ zk&VnxX)J#-a8_T)8L&Pq${kBNtve9x{^qGZrVsDy@9xC*9nOF5f~?1@C;!X%e>AYV z`0yxqFz+?a(7KGnNr(C0ZpAO*oAByy@P6Lp^V^DjE~)hCN1d(t{~7=NyEEkrw&WfA zVO%`^@bgk{Chzz0X^hOOtm^9Q(}+B~iPxX%=i&c<_p1{wynfKrM`Ka>;ldrK==LX(wHF-ueH)!AIcQ5PB{ktZwfG>i3^gi)cnk;m-p%ow)K~6?H@IDoJXz%B55)ZSt1+%rEM|7kQ^6!J}#QNFTUb&p;CiOMpaO6#%PXW6z*# zITPH!@AJw)duOS=8=S}wl)a1g?zjNGB#FntyB}LvxNR|c#ABN#8CD+gsi)!71n~LB zDr56tcmSur8Xi=F(^zn-qTDB@tmOJPaMQfQe_m1SFE9E{xQ)A)aIKkNI)r$|j`}&d zoaj69vFXdp8}WpW547evB^)_~|HFa56xd5huUK_xf4l0~;MT$Uz-GVV%WfSxQN={G zA5{0Rs$Y3Vb&Pc)`vS8sFrNU{J0Os5zFy9Zr9B*JArQ z9L4izwWnfWIMOzcXE-Br5H{gW>N=D2Xc+mhhB zAb{^MgRgk?DKG~BE1z_t1=GiOLK1vu2k`A<@coH(&+>nJ0;>n9djgneCxJOR0JDRE znPKevRA}%NuycT!O=_J0_6bQ~PYA%yG_adt0}3`|L_TA$_kFvh*)pj3i!eG#>cyO$NZx&1Y3Qz zU}J+%(E4y}@Ib~07g5JY!2Xc*fvLl`WxugEFR0H425_%5xJQ703h-V9&Qj7615fm@ zaozyTAkMAgaBdxS$EwgH0p4t|47*;05XOXac&t z2Ta>99cOrXiTWdS{JADP$A%+Eg8vrid_J(xBmK$LVbkOG1USDC!1;88^8tn)FR&+i z4R8ko?GqT1T?ulK$FgfCQYET z<5`}Cz+DTxHKflHz;zP9 zJv0FKeFOJl;3;;n95|JvWeMPIVV`Z#RXQ+OInx!-nsbX5ox$GuJ01EvTf1_`#m1JLQ8exN2J5Gt zY9~_J*vUSIy~FxV49I=vwsf*(kM-{Q7T$AQBky?tb0KtM7)?{lO9rhG!J(kXG@b8+-=8T6m^FvjKF)mfR{kz>2Uo22e&pPAb$f$P) z#i+)dL7_Fr{uw^R#WinOM1FtX@DTDA6MrdW-=uq93TuaF&DU9<+`s)*xTM&+AKQ*C zw^g~8C)EmPg`HY1!`Tx_OVs{5ub57gQKT>Bn6dB1=bzNf0e@8x* z-2n~eU_(St;r@lY_cyj)_E7G~ku7k?bKrJfk+v|VjH4BTZG)%I8F+ny7B1bpnZ!as>- zwEcJb7niS;n@wA1?MZuy`_{{AN6rr*-t{|$N27_#fY?N<9 za^Y91{rb7&)wx8PfArU0_ks5QTDQ6nVr$)cxN$OXty{8rshwrafpm{QUvE9@A|&ta zwBBF(V$Rn4H+f}WzQ$HedMv-L6x(O7DRTLStSUBIS00_n$5wtXS+<)M@*tjpg3~|6t0B4+Eh8%jY)qY1T7t5Bdr% zpN;Q>pAoFFPGp9BTxjrj#f~;Kiag1_sg1-4OMyF=^cX3bEz7oer!}*)Su=Yyyz|$$ zO^0_yz}DKo*TKnO_n3@#Gekf5GmX3ITt1omiSE#Q`k_}fPT}eI7eQUP*{3ggHX0jM zYv?0*pYl$7e?{}4e_7(vEZ2?8zA{DY{&S+sIM>Fue-{~=y{NsVQ=G^$p5ntd)G>;5 z7HOpFv(DwfmMqN-Iel7pRKM9edf~1N%4jdIcV9{>gM|i1u4sI<=qjb{}A4N@NL3AWXb96%;%S@nSeO-Bp#n@NLzeUGhly0F1 zoa@LKDimpf4xNZK1E*P z9@Mq^JxK7rc?!LH6MWtZ$LrPRXX5p0nxRvnp%eDdmGdm7aWqOhL@o9fSQ=KP6wom&wc2PITJWJDqD_>v8@0I-J=`>`&u`PrAL= zaJ*1B#j1z?-K~fE{CY;Jp82tQo}nJ^EDlfKFU0rvVRYntLY;%dnFEV-E{?nIBn|vy z#oMr_e;pauj6v_{{}vVG#&Gc4c$ljzF*}n?{?gf#y^+5PWJLR;2D-7P)P3|m;25`d z#H_`1b>FPTZ2O?4``GjP{+7JHpS1faXi59z3;!M=bg&=p>B@f0MyzCyn{31iV96$& zikvS4Rt4!TQZk;%M|IEF^~SEBbo;!aEP8SkPY2FMHS!k!zDRphJ2%wxk&Iary?=zU z>M!(3vpGkp7#WrSru{){*&n3yUVQ&;+DcD0w9o4`=uzL-7~i)D9kkb;O&3q6G{ob0 z?(kGx-Rrk=xpRoK)riqPWzl$v>9FLw(`ZKNa*57FQ(kAq! zO{zLu{%hfRF@17rPhO3;dk9`Qqk*k2*w^bXh2Q;*-+h1eKwDqJUOl4k^?~uj9g6h< zcLe^6&ce-t=9#3RzVxCamixV((%%P#HfM_>M_IfzOpa*O;AXz;N5j``upEMg7P zqnm*L@3Whf{6zYZluVD(^{t=37wcP_gI~J7^@}H=A^2SfK7|i>=g$>r{81T-{738R zpnaz9i|6V4u^&>#7qMzE5nhU#6>js{}p?q#gAP0 zF#|qKCr$f5@MDt2kEg*e9Y3yvw#jsEj=#3j_&O7nH;vAX6@QVpU0R!Q4rd!_tisdh zWspDTz#q|Ay0Z*Dko>#+E>9N@z-h7Wm0FJ6`(2cD~i zCwej4jZ{Y74 z2lK{#@%?U3`rTl={V|^#j~naNrFuHE=g`)@qfNYfr12g4)1DV;%L}BS@2Yk<(0ile zm)Mk;yn6oMGf&8l#C$za5`P?2!DKC9_hx3QtNUj(Y%szj(=VWI_!>fppUQ1ZA9A*4gI*4b-VKt>2DwE z4eIY0=wj>dZq7)O{(i3~uwP-Fwe;dP+WyN~O-ir1u$mwe3O(Uo8lSh0WCmW8<{-DO}ZMgST*Dq)zzhHvp7n~lmGeMbM@_2H;Kz-2x z$f)i&lgx^S&qGt+Kk(ltli~M>a|C602e#0bVGgl(d3BBEVv%9({ZZQvH*K3m+X^~o zM7kRPpd~z<3h$4a{)sHFWk^4e~~#b-zF`TYyM7hC zUM%~C9KV7L$OoJS{AQ#qQYI;xo@#7cNX$cL4fo+$1kWnyKPU5lGEd*e?4IB7?5Ul+ z^Uo{Rm}Uq6U0Y@5ImaZhRX?f>_GFq_<8U1DDDiGl%TsC>QNMg~e|)R+FYNP7tGF9P zHbdjv3~1$_(@}U~V2s7sSonOZx~}kI7EKhh;J4o&1$Foz^Hbm(B=i5IIiyrPwBi%b zciXsU@rm=8Yflt!I5$b$VkU8jMEO5ro_CWj!z5|je(iL{#=cp--oXGq!URekb=IP9Rp1i%j_qa zm#>Y?yD>m~Z8ruO=WBbuUN2Y1Vt!wunCd~~3C2`Y-C;FA`;4KRZ#R9vvUQ*?*M5=j zX5+u!LtB%{Q@XzU-`qVSJ=A!l6EsifWBxoZdEdQ{@VD&#zmzvk-~APN)V~FFm^-Ij z-4nb4v@_XQ`xoLI!9KN%(|yr3S9XBA1v{s;L;9c0 zU-^3i+OFix0oz|GG_*b0(Dr-v{m_=XcwHQR)xChw_&ezOC(^m3(J5$LKW=1R-(UBT zL%+X<^#b$Va|RNO8?7|}Lq!949c=p|)(okw?%0t2UGU_;?Z;YGyFJI6xN;eNv+#Zy zTzinZr@&e3qq0~Z#hnLLCvw+w<`Hurwru$Q-Rc_J@I+(UIjoCH^!^9g_6-f&bVri+ z<5?Hw+3-OrW6VFZ?#Z{|o#A!84ey-ThHouRtgDZ+CpuA#c`sLfJRiun;m5l2%F`X@c7hJVhw1$0GT949+xu;3WtT?T>I0MVaS!g++JJxf-`=fNL|>-6wY0`4)!kahi{{viZ=i#8rkFkYnfR`1 z)9;cKd;ra%x&91151G4PdZ}Cjom_yN1bLi#c&M%6GQ=CX2H?ENrodGO|wEOfXCA&z;Xr9g|*u?rZ-zRAA z#sX8%&upHX+$U&(UfcaxweqI%3D%NFHsKoeDGB^&BQ~3K0+JL zxv=g2%UTl%O=l_oTM13&%Yeg3gTuy+o}3>EeV>N5Pm!J^*>)(A5BS8~hCZO?#K+#_ zlw5-EpUrso7kIsSPkUhq2|IIx*)2Pes-+`O`y@ziT@EuKm@W0B!I7=2D za^p&=WuY*IEKK9f30oE}5TBuSP+x{JXX&;BKc$j!b~4{@QUbotCpKX7HQ(^HgW>BD z?p!8!zQMb`q&}qHr2myZ9W45sxd-&=n1Vh70`$pI-ZZ+>LNr892OysX^BXsyo zu7sB9bfsegnw}P*>1N#%imt3wYzqF3m#+#A9Sshb(s#+$jf1XVjo|!$(ify;G)@<1 zeV4mQN~uRG2e8OJ{5Eqisc|ZOgzT-I(Ei+LkUZbC=q`fxYeS94~wB=qC#AWZeUI$u46~ zHAolrPnvTKzJI31(?fs0)0drKJY*(#2kmPGYrt+_ET$13!h>Pz?xRAadv$|v;MW;T+1h%Z^fXk^{+v?=RKCfx5Fm>jd_la zX6)ua<+s`U^V?Ccy(aG@)~kxXQ=sW@r^Uy;M5oR!598yNr@K6i#Vdbw_jNgu4>bQv znXfgDrv0ZwAFX{|58P_fH>6~`o=zX$=gjpYU`yBkU>u)LA3pfIw=bhlig@R8@&wP? zf0K7EPt9F%ukzpb@3ofTPSz}FjG(pkrIHohFO%fnzXg9!&M(=De=^6POn2U1Z7cb~Pep7#vz~4J}L(Cs|lkta7%VhrEl?iD2Xn>~28k)8>vb;onFF33*I2^aZ z>%(4#u02TIN!|VrG|sVTeDWU9I9GJjTw#j%`(C2k1}8G`2kiT&*mv&oPHNxBHuMc{ zG4|c3XV9+ipMZ|T19Ys>`jxRxq)_w&mk!`kFtBmtAJ}`z=%vu?%Tww9NuQIF*@bjI zz&qRxQd;TRh2Pv5LTVr2-AB{Y?+x-K8teaswFQahT0f`Wpr6nLdf0x#6NVl;B}d^< zeOwGa>Fnd}qC=8??MdwmuyplC8uwjfOKY@mW zNhgs8{U7Lgm_^SqdqB^_Q_%Cw06h<~=vj^5m1s?Wd*!KQ-7#wd-1R+28k+Y?PV-i2 zXg(r>}zE-=D(zAJTWEWICPBNBe~P zW-5R$A1w@C>3p=RN6=UBs?gZ{0b*$M`ICrM6+WEU_xj>d%lDcc>&xvk-GcJG*5(%F^E;e~Hk=7M87yK)7*NM={=+X~*6 zUAb6!)A#`AiMQSJ>+Vx*i)XU9=NYuqj}5#=+$+!c!7B5r8wbmdzGvtj?9ax#w2$9Y zG25kmEVkCi(7v^i{TJoWAp0d|Z^etiK7@2I=^#=v+1ETq5oZI|5L3*$XTXwa#6q=? zcIEz!h@X0Uk-H+l)56}p;JIfyRl;}8NXMO*_-3T@g61G|&Tt}``S=0spXj=K_bA0x zYj*AKvjjN5;&UrTMBK<5&&Wsp_10BW*ry$o>o9b?rn9$~s`*xbFID`Sx>qg>CtXvg zd5NR3#ruHc55qmV*1HAFp=tl{2J_CHUm58{{C3Qo5pT~gfxeRE0%-RcWm3`4-LK8L zivB!Mc78@=&A^PRDfdaQWBaw`ql>2g8H`#l5Nv3a-jc=|=N4qfdY3w@_?Oq4IO}obo?Y@IgosW550V&SwDM#`#8r^DE%nGYP*J%1((_o#J`b)#BA%CZ_RZ00uf- zw*sA295|c3zt{4+2v`-^^Wa*Y?1vkUU0d!keJX$ZHyw3ySDt(u2e8`of?C3$XY3I1t%4;tQmG2lGF8}59jPgHjZdCq9 zMkwOS0Cg3I+4G=1a*dr)?`e-*R{sWPY7|e2jRz-#+dSG`1b=+rd>ZX5neRjn!yfy2 zD}blGlR39Sc{SJPf2)SJiQrrhoZ_&z7p{W6bnZR$oMlnOT$o?i735Lh`ztzMYVL&3 zV*Pd-;$Q2)E049_Z7vQ~ZE=0DJojt{$(v$trIICUt@rt=k9oI3zR89x)|`uEtC_D` zCqc78&~6|!98kV<+&g6>pt$(r$`PFuBVFXuDHaRyeIZ-cg1*pgv^Drn zb}NyLC~g*vdA#@c`2Lb}neoSRqMK<`0qG)AGJCo>XiwwTVte*mr+0~=_kGZzQGnK&+1}o{$?iN)jE3rGM3VFD4dt>I<{;)@Z-$4KA({0+1Gqm3f z-3v$;k&?-ce71Cb>2T9Ntu4OAZC~ns;FLM(`+9$V zKEStmZMOz&p5>c1@ypnHVBN2^Yjy%Xux#-T^F5W{ng=gy@CCHiu`BEAT)(w#L%+4g z_ggcaQR}f6^D^=CEWh>3*>!XB@lopYK?gUV{6Q;U75OB0vsi;CUu-BoZ5yZP)2voS zBirJ4>fHR?>QLll{F*l3h9W0swAtK|bEr!3)iTfUXctlp#Xr+x*X~hedt*WFebm*Roru3KMO)SOc~JfEg)^?WDt6@Ht}Z>uqD0gIrOaP{{%{$2U- z6SjU~e3N>aZ0PSk06!#`I)h5jt{H9KZ?m5D5YXuJ4fws^>fE*5Xgl|;C*SYQj`sWt zn?oJzOdXDqK?k{;G=%fNNwzI??U{)oP1*w)kUkfWG;&G2%0C+~AG&KS8zKg#cKdYI z9zfZ^C()4|JS(^}WQF<=&f2RVJ8-UBo5w>{!{C}B<1%bwI%Hs{RU&15aYja`5#lAi0DVm zF=q4WQ?m~8VuCsI8dWu={vu>=%CvAv$^1r<#q%3gy*0nl3l-={F?A3VT%_-fiL+_E zp}t9UQvHJC%UT#(6f(BZx2zD~7|%MLoXE|@tyIS!HxC4_0gSPhm#Kf$x1Pwa8^=A+ zr(Z13PqSii*h^@qFyuR0OpS!Ns%*n5u1+RhU_rb%y&^pY9eek`e-U0AR^`1bz zFHz?Wb>9}@%3gQPd;6rQN7SrdxYQf_dg(?cKq&fXcfdoWqP{uksaM1 z9DE<)P=nvM>pc8&`8EUmlJ%$Z!(1PX^Id!&EQhmT){G5T&AwAKPq1FzIt%6&gMU8w z--xYn`Ms}?fBd-eDz_c+?<6b2UFB9F_ZpAuzZ(Z0>)|0Bu7Lmcnuep%fAOoi>pNse zzoLz2lFlGy_Kc7HIGh1C?VE=2AGKX{KSg*;&+GB__&zuh-O2Zui9x?bT{h2sA6YOj z|Hi-!_{oPSf%%Am85RCkpKITJ)QPgL@2S`pbM<~duJ%1toxFVyNDtM%K&)}EB)G8t zAHHWt?*fppDB_&$^Mo_dDNe&2D*tNA{&&wVm|_dIA`WUV8(kUT{LLy?)Hr)0ZV zVw*E62|e9DnmS)KbFKO>-%QWo7-k~v3;OI2J{0e>AH{maBIGKEIehi~?erh~CK~*n zbLU`lqAx=GLr4dc4k9J89~HDUbExMNEu){lm2)$MlidgW?4Kt=9MtYB+R$ECFQCca z%)IX`>Paix+{Kpr<1Lp0FmBir9Vz2J5?@EYAm)`$N6Mk48`Cvwwi3m3OUa`#;bG`Z@r7PL zP=JgSRpM8Q{?diRe3^)+e?a$yM!`R*18a$)*yGkotXYx{{EEB^NA_9F zDViUOjDknPYp0nP+X{~^C0#=L3n`Hfs1Mx*9Jf97aeS{|zQ}Dyyll0a-O2cN zd;-3W5Adz2;oD}`--~bO$`6H}{ygR#&~xX&CM9*GTBVC#$IlPp?=uFunYpOt-Z(^O zo9~HUY+z5AuNT>SK-+I0NFSg1f;@_uxB91%nIv)gPaa5YgQNq=Xtf*zSB>+ecpSf-nrD5ouJMOmdDqb)iXBU+&f8~ zojD&UQJr_2Ix~z9IfeRu8xYSs``nb;NOIn(@7z-x@i}Mi_%@dxvw})K38}^IMjLx3c|-MUOJcFIF3>I*U)!A#stWeOzhs1>YTJoU_^K(?!=A13 z6P?V>lkpE_Kc<}Pl#HQoDWnbA<2xPW^)tk!Y4`3{&eFNzj#qV7yKilBR%YYA&)4S$qr{5^n1uFhJcVNB?zxdV`XJux!tIwB3-f6v>^xjBbx6E-)ziTO@ z7-;4Jz!|x3Zy%Cq_b-GdThAzw>g-YHSPZio;8$-FlQQuqO!G_>r`(p z^@cY;E_%52=FafoV27!9MY#2h;`(}Hyz=VIrp{dIY#sg2LCn=tr{)5JvLB)kSa3f! z30d%U*vDDlcAVIxBy_Up6VAWCF3D)iOTmQ%m$JzVT@#Bw~nAKuN zL8!wThx>gTr=q_TD(aubSdMcv>I%aAcZ&ME@}23_{c&@{xV`A?&iz2=4u3f1#Ix%r z!Dmk=GH0|U&htvR?F`KU6(IvJGtaXcKSwd>Be@ePcWNl2xgVW@xhR}FV=U{^YWe2d zgF?nHt}OtLdR)sEz`B|)A^0I)IM^L@dOxRbD(%!a zH(x9Ab#dxu?U%oF_SodOtiP{rPH9d6mx%#1|NQZb7{ClxQGYoa5;*0 z6HCtC?Bmk`d?w~E-PmJrdChCi(#?ltmT$T(3wuyBvgWpC<;uVNe5bCuOE~iQ+EB^P z<$Fa+9p`Ahucq#HnHeSdt(>Fu->1)O2A@psop$lLX0k_{&EW>Lam$V7J{0+cXVJ%- zzGOb_ubCRVU!@S6uDM+K_P-pLUnf2+V@;`^zOK)rjBpzLH>YHK@BfFnH;<3Hy8i#) zGXq(O3KAedv@B^0NLy`@O_GmEh8-0}+@O`MtwB_(s3^3OWYh#vaUhy1Z4J=YOz5<> zf-usSK-6MwD@fH^+cHCJoe8ySWyt_Gzvt_{Ox_6z(9frjU%!9MW9I#yyPk9Ixo5lQ zlEVXdh=*p_xdP@{leiZ0opm7%U+dd?UmW)+Q?otg7!9> zwAs7vR{VyN*Os8CJdJHkaecA}#s^qFqbT*A^`NzI8*Se0C8phvEkonW?tFY7U3=>B z&898r8hL&qv_1iv9}n&OSp&tP6N`&NiM(IkqV?|3T#fIs{950+&2Ahukk3do157_! z?_>U=;Zxx0N@&K!IdpLKUp!UK4H-c_8(GFE6Ys$Nxl*gmq1ohr-BsAUaF@}XST#P< zR6Ra&a~~sue<-=In-M7kPELOb=r93YL}#<+=Iktp=9Cr0a?1)54ZI)6`)RzN&ii!U zXO$I1ujBb@p0j!G&ht2)FXg%7Q{m_&e*5_Z285%-`Myx^&kILK^LvEepC67c*;!B+ zD9ukCr2SuclJV`Hq~=kYRv038!iU8_?;p(L`S1&#s)1>3>3Xg`zuKHr&(B%+CcIcL zQS3UkzN@xzC)`zvS#@Z6P`qX4X5W>~qTzGe(ei;ulhtDdC*ZyF_ns;f)?IB_Q+@$w zn&asctoVj3@CVN_dC;`theZ@{LXfv1M=S=?Qb;#nJgkpwtw+TlrRt}PAV z6uh>)#^+T}GRpjZ{HCWWdRFULF6X>geAD>IfPV0k?6!0INb`WUW5B{Yv~jjy6Gti3Weq^zJ1@Q9oA(GxiJs{7`fLjgA7So!JMu0L z?N~9=-1lmr<2&E*RFz)b7G|^0r;S`|?Ufa@r5|VQ39lK@sl$5=(E;>x0A3~f@rr(! z*8$hO8tr-cn3o6Ii3f_4Ugow^b6e_3US`88@V2L_(BTE}-4Va^R3+f$@kzzWVdop0 zo5TYK8=;$BGRQ3DN&_zW`z#t8*uQl>{FeNl@uRE<_SgD9x6C|=e%sSMV>aa@#wJ>B zPydryhr<65lWu0G=qCDJeL-|MYkpr*GCteOx)+b>8GHje75$j}>tJzm4|b^|>>G|e z@oJfkGw}uH7M)c5iT0AYX~rk)C#-ws=90nOIEcSmWXTr4DoV)~s~%A-e(4O+M)QcG zxJ}D?|jmdvl$s8T5(l4n%*NEt)|W@>cBHRF(a7t z`GO-Gt-NXCt26#5tty&+C1umX(N&ZkS6a}#oH1v$-VfUMiz}ZpdDk>x;`b(7CV7+G zqwrzItp!2O!S(32@SZWlGP|uBi2R>K{vA4`Fmyo{G7xwe=qoKa2uy}&8Obd48P!iv zf6Ab&b#dBDOlJ?pUM+qWTZTQgJ7ZuSOSaMfamE|couof?;?V9HGc_}7RUv)F>C5m? z9@#cCle^B?Q&eBNM}qp&J;W<>ISUydP-Mo+M01PU$UPSU>ll4VFBLyM2Y4JsevEe@ z^L>W0oymNMO_{HE-FWh!NC$9azP{9v%=gD-&lZUUiWhu|+-KV#-^$V(;Ay z-b8C3{?f}Gp~S%P5zL=sk2PV>+~T?H83ULj<^D!Ft*4A+%jPI+%Pq?te>hpa%if#! z!)Iz(izo3%;G%ZKALpFq$=@WZf)_%O7ZT0gGX**y@>Y353XXr)^F}!v3Mlo{eXM_;??Z= z#3>g3qGhINI|JHwWG`c6X+ad3>;STv5qK0HusS~qUyH#f40~T}L>AND=nFgyuX`jv z3U50A?>6lHvC-ZieegvO{LsBeil@Y%6YqNY(6X*mh}(^e(m)zbIuL9!4mv*2gsR~l0&vqXGyCZ^0qDK?e2SOIi!u8 z=g$q!pk48sk|&`Vo8LSlx~n)n53FMEck@6u54#xrSo>wKy59o_%|mT9x<>dtvgo{_Hr)2Z!vr_vrxoI-&VFw1 z`O)R@XYuail!15G(!S{X>x{d`x6jmnYkf1D*E2rRRXKZ<*|%$-xrKXRoqe;kj(r9i zk-Tm|Ba-tEKvM>^;)SN7SL-))1)Uriq2Jd2*=X;dKIqIN*{dDhyZ2D9DSrj>OPI6v zqkw40q2<~1J%_fh+gZ>^U*58`u&1E3z^6VLQ_QAck3BZ&AR3!TV`DsREd?eJ+Ynvs@_iBDV z&}+uw+wAn~thM;Z@Vj?eUmqa%*|vge;57igDw_Y1&Cdq*ZSA9azNLHA_BFORdZ*UD zctlim56zov2sv~fenb6s;4%tb-Q=-;V~hL!4U(C(FWe08mFz(~rY=icG5DNh)Y$T} zf&(kc3Yr!aC!2h}jB8Cj&w8%UY+dhp z=u3sj%lR-sJsbKk_vl`Azs&Mg9h9tU&)KvY*lRpmfz1FpOY&~CA~&44X+k7g{M-D2 ze)hED-|!9ZDt?u3cv11M`9`iUeuZ!LwBp@-!?%im#dihYFY}FlSn=g>6xxVE8_|ld zgrfm|SLiqU1ZzFE6#K_BX_0tdnkkdV&ShP=^sicUbVs)M-aEPjhBaQXJnYuJnt+qm zL*X9QTd%e>vTvTX9x{g8v@8B%uZQ;QP5dc7A3VUHF0=WOvpzfHM=!vSv`%X!i@DZm z_@QK*wKd45jreKoMH_`1aQ8Oy&)goZ^xyRX^v-s+$3t%VU+R)w{vY7?jjRjtPB-7Z z>zmg4IDxD=G}qE^O71X1(rd;^##{pJNw4m7AGT=We)wLE@2z~{uhw^cv+U1*fbLWK z-7~bak@YOu?P>VaI<0M6c3aJVtMm-*u4O;0)^C^Wwu17@^$yw%@PCDVS0LNjvYS0d z!`27mSNl!b&E$3BrO0p6hbM?8EACC{gEhW4&>hPd@3qZteNZxKXR?smlq|FcSUPJu z#+t6dzN2S{??}%1{kg4jjwk2jJ?$&UfRFS{kwIct^ZYc=8+k@HlFS{2cf?lld@0X%j{mS-2ANxV~(j0NB?@Rk_s zT{M_rPl~705Btr8H(ILQbom)uPAGZ3Ws95l^fO^>>FwH|?)ziMwx9hj9pm=5z>iB# zO=sV#`DcqIx3aD;$1W9RzjoswN!+hvqZ@cb$2JMsQ5@dv(4GTx?OXBX+Ls>8A0~Ng zu_yVN<1INq_w{VnJZ)L&S;yXc?-s@gFLA@*UFnq4uST4i9-z840pH#?h*iD9*{58* zwY{t{k=$?YIp^9i-z}Ouh5g*2LGk9v`&zdAg!lkw-v6)dT|0ZU-@7cmLA3M1+s@tv zPq6KV-+|YkSn6}zR+jsc zEh}het7!YN{P+^l_PNb%Xd9kr$&|h7-dSo?)%vb$p4{KqJgi~7>B9>JuG?1UzkZwB zhnJ#l_}!D}FsGyKFNn5f|5u)MY%q_I^I;2g;OI`0KVv+b^qf8+bbeo7)m&S)i}^j~ zx*L9%VcHa&JzjCZ4!sWC365O*t#tJ02jFNC`)(uquJ&B^UK2;Vki#30Wp*K#Hz1eq zLQZd}%uftJw%_#9x^dVl)R5cwiDha{ul+zzJT?`8Tw-CCM0m;%dD@)?827uZ`4Fz@6d*1Nq&ZL#;Lp`0B* zlRYZRe0qXU?NvWGgE3rUE+3K?PH?%CF?|QPB%p2izNJIS_pN;8F~^fkF2LW{ka;5By)Y7g)f+kf zme-6iI`WP;lGyK!ya>(LLJMZ!j3Ytc;>qSX;K_;q!#JiugVL`wj$@4DIQ=IWN8&Ya zM7HB2`@E4j;}M<4n_9Nq3QQC?sk8R_RvebT1?SHKXYsK@&en*=zH7sB5U?zC%7K>( z8!!F&)*0{)+oN1hyS>k;J@~*%+Ecq{)82Nwp7Ic=zWN<(_q)RG*GD%wKjk}p=XB^_mn)gc`wBOAh$4&M)4np%!c2Lf+$MF?=95KqN-LE@+GKP2P z^IZE`|IKm!V?4j-Kh5VKf3fB}&2Hy4+EF~F=Hs6CyDA5KitKT{M7bq)dur!$_@;Q& zBlf#noW2-G#O`aK-Nr?B8=GlkzSG9W+~7|rr`S~WEtqZMS@ErUzTPQEUthBOlK)oc z)6DXI-`?%C&-vqCQ=GEcc4F9h>hOCwG&IrvPw)^=Ih(QQ-cP5EI@&lwo-y6Eq<69p zsf{OT<6`^WNasInh@Wx&?#H;C=bDN;Ll09YH5U9WG3dL3cjN6k<{01ue`im=G}TV; zx_ilcAinLqbH*px{to`@?Ucoz_~>t1s;|v5M$UHLVKY1mO{%`nekWRs;^QpmT<=?5 zj8TG{IX8Pu^Ub+g{$|~MYyJnH{v-J@y!Nx!#4g5}>YK4lXDpdcdB(DcvF!I6w;xV_ zy1!FSb5#G%T993E`b=-tNY^`aeCbm|g^VNGKpdxJ6u&1p1X;{!?@r}gZ7_mEpqV#( z#^?b~zr?9sPQUWsUJ6gw*!wvD(bvWFrT@m*|0yQ!9rA$+HldMLc_*&(aXYS4xfhf# z_n7Qk^tlmuA_JJdTCaHzPj=m>Y41tuf16K>FMaQ^n{tS8>r1R#KVshc6W^K3Ijppx z6We*%?9Z=|&`)?g_{JMr0>3 zy@M+Ind4L+gBizwpL)#k4kflQYNwQi5_-Wgx-`-#EZSUh$>wsCt| z*VB(L8Zd%)L7$2N{@901Mf`w#+RB%7w>M{1i`R<#y^9!MC&uw&&NlT9c!DK%-0z*< z-mAU}ZkxfK;(p`lR;;7r8#jIY?1>{DNLGKcd^UKR1-@cwGoQS~2P_ScdRv zCDx{GOZ)^_Ee2LO;DOlI=8c}Q&RlQ*jZt-UZDFJZKd*2he4Prf=K(7sc_U7_#Kx(i z5crQ0>zc^R2(_f)_e4G>24IHDI{lQ~4bGvRTFx(=3KtIjXf6E)f6;(+m zk|*&Ha^P^_YwPqM-k+>qFIa)QVe}XEp-&7cEocJ%O;-~?QBfSOK^9qGUY;LKFACRG zj0+#gt}kd@>kn^OogeidzB;+=S_lOs4V%?{np_L}i zY^I)lMsN`Ou5w{+zSvsR4!_rW-~VW9&MRk)pY@PyjZ?pl_C+6GU_Ec7jSYNS8q)Wk zSlkcV=nswLLM!J%Gv~9mKSk_zdTMPyzreS**5}(Be;)Z6AM<3^O1*a%@*KAA0RD+- zih;Lcu6Ju~UtmPE7wbQ>oV~WyhSuHM+1@j5XN0?*ENC;=NbY7GXJqychUhC!ytLYl z`7FM1^l{0!Gn=)ZUx5!O1~wF!iT->|8~s`9c`NUoF|7+4RoepBj2VC*)I*$Qjqmr? z{CpkHk64#T`*>0hYvU07T60`x=WB7|WUhb?|DClzlKXAiul=uq=hLnIi|OZ+L z@-;ta5T~AD#_6@>WrmW#yoDI`DBo{k-zp?t*MX=1#~u?8wQ0tdErDyd)u$C%F<9xB znfQ7o;;X7jU&g!iF!+2nW9Q&tJnyVfP5LF_+6BJ7>%pl3euICb9M3un^De*ZIcrhl ztIDrMx32Z|CI>4%{6Oz9QO2q|_r1#A%ldf||M*k4;UCw2AwSsk*4Xxgfn@cu#jW$$ zai0-NGB?Q(#gY@5&!}JH>+-hF=S%i{GB|TAnl}AB(6{_N4$Yf=!Mogj?V&HN+h{s_ z6LX6W*Z7~vkI&XVmeWl9ZLo%MAHug59amqVcH_%+E~K?x&20^5_y)-5@pta#lC z_?%+MY(Doq{mh2HZ0-Qox19m32Li`YDOmTaTX_bs&I8th*;|+hce`&#n)yu*Q;G1*18R4aO7!koR zqlvlM_?pI?964QdkjEY>*~Y`il;i0C4f>bv;V##&gL1D@F2k;;Z}Ct^hIHyiE2f0r z#4jM2>#otL&lCJJZKeKaZNEa!jnp%=b}>1r+`RgETE}pKo#LI@vf?v~KCAl84oxN_BCyvr=lUU03y#HfAbUDqEZ~B_@P2W`md^raP z_T)}mWF1GoIq^fzZ6K4D@J{ENB;R}v_#Cz6oA&)gM=-8MHvjkZ3cjMXKV)pk8ldmJI{Y!&A#WGY3_TmG|6_mknNtd`D_1F{Lh)f>*sbJFlXO; z>@@JwSvNPlmUaNIXI$`#PbxIyT-(dMchisL+s@A3x#tz?IeuGcjb~fPKXY4RfF~05 zLszS`=XDvIg5S1tgMQ$5;zyn;!^b{g)7J=O)LP#S&9&VmqfW8qiyM$HW_3tk;@NYL zz_Tkj&wB*E7HH+!QyBA);BVF*)@zK@#}AiSePobl?@aor4S+v84@gHg=L_jaAzxRVsAK_%f1G$UwDb$74ptt-!C%d<-2d}KCGnNhy>{` zLVtpP*9$q@8^PKJ?_R|jc#%=0M>y~s3QgArW{pvN zWtsF9-`l3XQtO+A%+MOs=FqgcuO?b%Rx<{tY>2XTYo>0iTayOwn8l|L@qUlzhkSjS zYXg18)Kn}B*A%bJUtj!Ceoe(U!!^6g^VjbRaJFamwn(7owp!u?AErHPkMah;2ux=% zMm=jEJMNbE;oIYp7gKu*{N^I=q;X_?;btB7FyUqZ?KpNo@uknUD;KoO^`_h?yFb-m zWxwyv`-@WVy}>M=KgaX;zIgIp^$KJ>riJk~+I?RLFVZ)?4{ zt6qRQVW_y6S2E_sE9A-gtugxAXZ1pA(BazN?_c-?}$$!M;=L_wL>L zoOBrcYv>0x<-fA_#=!M$_QuK3RLO%zUYSXnh zI&F5gH}U3TidaW46E-Msz;chJzU!N(eKL1nJYe8Q^q_xp9_I_* zVP`tGZtdpwm(o+ut^GdsQU`N8j85*%t+RdXMf!nmPuj;$EPlz%bGpOVW1IMbY#AYb z*A^S_v@6jgkk=JfO> zo9iG`zVZbZ(683_d&u7P=H7#^23^VAd(f54y$AgWUvPc`{YZOHO}gS%yo?E59oy1+ z-#yq}JnSv@zLV}}kMZ%`ZqH%ANn{m8n%IkPF3xCPxZ&Jk8&kZReEp{V-Qv}59(;*C z#$PhVD}j;8%bCN6rp)6Deu@8E^#E^hGvy}Q%4_`%ngHOwad;+pX^~YwBi|yh(Y*5&tSO<=7lR@r)%%SM>)4<&( zk7a|{=q0_TFBDy11WRA@R2>O;gN4N0=y@;kH&MmB^Sj&2cKkcPvv!*?tfOiJmTnX4 zE?wzrQ&w2depTP6zM$TW;Uw-^`cipme#tqkE$sR+#!xUC6Wt8|ej+t!*;9sz8v?fKl6O^g})gY1*_X=&jU zzq7|Jem9abwZ0k6_2n<+V`tf1!dd#cY3x1rSWOuS`}y2sEi>h7Q6F32n_FHumwYC@ z>m=WfuLB;)w^l!0!{P;7^2UbZ4cJo}ES+jFwz2p)^tnu85td^cZI0hS@e;7+jH(IaL;ZtJpYjjn*f7o@4&#+w6Pgz??@(X{@;>^cYwnCM z=P}y*YA3W zxiP;BN(<_{jSts97x?wkKx< zdz4~>DGXyLfhQJ+qr}0-h=Gp<;EBL_1++Ym_Tt#}1@F0ikj=5*%`{Q6G;8*E&%9mQGG@|Av$^<9tcPkqXE=3bM7=pUVbn`9pL`C&O4 zzYXIAFm75qdE2kooV~4Sbz!8gq5rn}FO?RAeEpH*`;Rf{k@ddooQdIv;>!G8#T6!P z)%sE77TZmzl_f03w!?1(qq6t-y52*`~$H9{Ak$1cFWd| zzeQtC5R0R6Kg77WxVr>@+|1b^>hDH|PT25o zVqAruNAnXK!9g`2=pnkXOYonEWPgX&p$qL*i#T&__Dx+AZ_HQx!NG-MO`P|_ZM*|G z^l{3}0ai9FFS*UacZu%C5X}jWoz#yubPc{Ed6+SNtoS&_88dbEF2RH3AC#|i7~d-# zdld52dfB6pryO5K;9HzS&$9dg#B(KgCt5b+zYiLoZ~bf&HuiQ{SH3eBW#qtmS09&@vW2{u5#ywqjPw^scX>qh_kEd zm)Z8M%fkn{Ut#(=_kriyKcP__J%fwKz=eDrsdyIfvK+jm z%FuRzww>og%v-p6Zzs7U%Z=b9V5<7P*dwg{!3b7!X2mJ5yh2U9ADMS@r7@1DD};JWB5W0JN7mH&17{can{lF z3CK<48XIRsjxO+qqPftMkNF3T;OEI@8DC|`p`afe&eOP{P1eHJ4Ms3C-MR-x`rFY1 z+^5)Re1yz2Ge+L4GV(V@%jcwI&fn7CQOPFgrDi?~*;cU?$yXvqh}g+ zNqL-HbUU!oIl1VZakbj#dzrcD9@V(A1Uu%5oOyutH6J-v_?>LyR`8yDGr76o1^Yg1 zX_Gsw=))E>cUZUaZF6&#eL&nfa)bw*-UwXWbFB5{rfeJz{U{b|80BL0rTz5og+>+o z_v?qX_K_;1>CAr=^RERyPAAIs3x}Msi+H@BwV*o`Zdy@pZLf(ODj~U-{d@0zR68 zg<_z;NS{@IYq|K}i95()e(h~?lT7@!#vH{PTU_%auLynhp|5_>wzIYt47X%SCni+< zecdkjGPru=b2bm*-4nd~eWo#bIyezu5q@OLcVy0QPW4tfHWd9=X#c02g@YKEc+v;- zrSk3L+@_Va+Bvj#68QFo1Ho86(G)KDZ`+$K)uM|(*=;GVCev>JtyKHgUF?o+dW5@u zA2tWtKc6;UwaaUa&DcIP#+U7PJM0{bjt_J&Z76r08H)$csW;;f7@y)WQtQPN?6=Pz zJ9N>HT;FEAAbsYVK5F9sfN7XMe#EE6pN1`^7yPj|e6kPxG6&wUZJK!mcR!AnJcG|ESMv+G)@k_H3!^ zZOZuz==b9vn6V-ki^m)$E=Kc-`K@>)&B=jNi22m`W}PT;>G-AV!fKN zt%B1Se%I1p#>zhAB2v6l+xEBH?bGHN;X(aO*8VgO`xQDwbToX=jv@KXa?VW9KYp@p zi3^c`*+XS7h$;>rAD(Qlu>f&$oUb`R9-?{O6z}$8eoX#B_Qi#R;bFwQ-E(c`u#y?t ztFMRlu7d`zg%+6Q$|l){ z({0;uhLt1`J$u`NRMGo;sa6T<+_w-$#((m&(be?hFew} z=oZSK)w`~K5%^ieJg|c<^iQ<#^A7gV_X^wK$DyMrcwJRbY}Cdnt>;cJEVA^S;o!zz zcawlcw80k~jLfbx2GIs@@CU>ceFZ$5G4zaiO+9fO_{1HYKl*+2OwnP6u~~E~8Wyd& z>G*Q$M+3iN&F)4o=@p(!Tvl`w<&aV0vpvj9bk{9-4Y6*~N$5aoV=elUYb~VW2H*## zo;IAi_PG0*<2HhakVz%~-@}+!!HeU-BzhrzZG2uGjh|LLU#M>o>${^_9>Z^pqvCy=3` zzZiE!zICZl^(W?Gt`G2M>dQ9%#N*@OFX6&p^it&2hLz+>M22nX)@;%dw$r)(U*}tR zyaqg?|2_v^k#A$Zncx$>9No5(J>seR&KYLXJacNq7r0V=i+@$qxA+(5s@n5sjrDzO zlWQm||B%j)=v(W}^ID6!huu6Z&Acx}I_&#SPB0%KvJ!Sai(V zdzm;G$*t!9ynkJOH^#S}@#$O#d4y+lcmAi(H9PcwW^kX~&P8@Rn`x)FU0yPv+S9!f z(ex>yU!ZH>ZNP^Z-%Hfn!MT!;b*{u?jFcQ>_6-mHF>#;T7xg^Co2)qaGdME|X_x*9GqL!V~SdL)sW*?y=l;O8NeL zPHC47oMrB@%In>XuPe@H?k4uwk6D}S3x@VsWT$uwG~;izx8Zk4O3v1Mvy82)voAiI zVaN2vhopzpUaSEfobi=E#QLS(5_ImSXKoCY)ES`*@a-?Wz&A|o9rn>jmbJeqSM>Ab z${)cP92xrn_jw2&$`#!Un51$=r`vlI_1$|@<2~$6fwNAzHzf}iMQZSQOon$F*q$|B zjrAhz#~SPIV=Y?_9W6{shC%0e{SfxkPvkQT zev57RHMWHx7pI!{LV(N7vWJ)P?eOHyjJ=Gzp!BYkyC7s2{0Z-*>w4_F9yal;yo<+} zL%e%&1Q{q|H0;dxG}NE*|?JWBN5?vheeq3u9&?F_IGP3D>~DM&C9X+!xoE}N$hh#F zrEU49pSGeEm-9a`S<3%I;G0*|?wpCOd=vbMZ?60w+C`Q&c_;eiT!N1I!Z-B{G{_XPybPx*UN_XYU9 zt@gXst@gX-rQCP2n7x`@u%`Wv^_99Sz|Ji;uFh9=gx~R8OJ+CigNh>_!rro|RfpWo zI?-JL4>Mo=XO`Q?#=*bIm0{*3%l4&oZ3j-O$Nkb5ca%qVE%4|pkF0Zd zz|Vdw+GvfdevmpE*W|CA`tE>km$v02?QLFn(vIwT(q)|c16t#=EqmTw*zTOYVK(99%KIG8-W57+h@OIW?lW&)IxGylYavEBBhp#>Cm2G*3 z-lJ1kcLA&z72>>7vvO#dXDAO^c{Zc|zNxzaelUbRjCHFq=9OsAWeh#gIh|Zb2PZ_D zj!tNEKGhkY+W9`VLY-xQl>4b_-~m06Uwg4vIC+fbK_3q8zeH@*K=K$l&jDgS&@)rd z+kejg?q_nH*C2a3<$t#m-4VT1&kh{Fs@$C0tvp8ah-+0ohbVkoIYnPlxjZW$-Gjj7 zw0TFEkIq#8h;f>F0{ArB0-x@-#?r3FaMYJscWFQ4qndM!nb+8Kx4s;m(9ZXm8Yl1_ z6_QP;Sb5^NIP~f8JK;vL;wmp#?nGX9*Zs$0i&iqapBb-=(%&ZbVzr@s`{Te-eBXqV z>@Y=dw9GuzSd1N}SKUJM+;=OFEVw&ay@7a*L*PG3ER2~?BXF%nOPpcVof>A&aq?*h z7xGUy_e=DErc(DR3_SN(VlQFH&+*J@k`u6Hz)!^&Ay^IVieDN$ zw$A~7k=6w{I+T~Up0lz$%dLFD%3oDqzLIBh8`^n2>dON>x8|*{FDD+1v$d6sLHeFE z9*xZzQ_*?Q(Q4)#(4NfRozvVK+4`;)ou6#p%H3yq!<(GfrW#WIJS><<>uejEpqsoaUJ_}8l zzoCieU$=kL|I_sUl;l9ycy(5Lp`Cv?(b5$el6f5WCXLKNQ@J6fDnd|wnE<>(-5?@Ctxn6V!x zx1riCwPLs*bMhkJ2cK=vGtOrZ)tDy}$9SqS>z)(o2s=9Bql?FclqWm3!osm~GCKKq z_M)FCr&2BSd#Zdq&irZ`J$oBu588NrtL?74-?D*a`BQVfp1F!Yj1bR-*KWl(6CwYX z8=g;nmA-FcZzi|1r-x00`z?M*oLGmlRWz?}a3lRI4pRAZ-0MBY-m#wb-ej+L<A29J}kW_NMsi4zT8^uWSMoP0Gy z`7g208*$cPGy1)=290;o**dv*;gHW4eEfiXs+P^^5cklvzjxuN>|x!Ey@@nq?|^fS zkA{Bn>8Dnr_YXVl+E>`hUhjjul5XVr8J?As z)XqVxMXK4pzxW#!LSS;;Kt z&~9q})H}j+FXw;i1?+mMcOwdu-+O^`>ptW5L)bRuTeRBB2tHWst&%@qzAU{8wOObm{o`FS*xc(`Yb)e}H$~W9P~l&6w2Q4Yc<=>i?Ecr)SXu zt!L2=2Ry_F`+~iGi2RA&e=>V)P5CSMSm8&U&x~UulrOf0@d)poG5v}=JdWm#A1mLz;`QYxFy|NOcz&nLr}4vA1nX8=c-a#BJeH64 zY};?Ep5NDu+i{;Yo5$VA?c-X4*sD_Kv20tgV+R&qWtW^wKRV0N{#>zh9?Lzi5a&ge zOC!;p7*SU)jia*l+PK=60G{JqajC$?)B}Nw`)sO%_W{5)S}~ctH2LAgI>mqIHaD)C z6y8WKg}PmrH`nbVCUp}1VV8`icL_IUk&|Yt5s@#{>GK}x@~aEY`(*IFn7BAqpHXnn z9RSrWDUmH#!GKGB?O%Zl2C~$&aR-o|ic7bjnM1X4|nUZFxzL`~P>mWHWchoe3{- z#&tSgvUYb{UUJhN{~j;7;)#=a$$jAXbiCwp`uR`tlKS|W@e&6vSNsQfNtfx+$6EFS z^faw8<;&9g*E&w*7DYCc|0aL_7q}DcY4YXG7f(tHYpq7@^{u>HQFufRJmMfcq6r>x z5FTO0zGkxCt@YouL~Z6aALy<;T;sydIu}1U(7hY$d#V*jJ%{zq+82*B&hpY1oS7kl{k#Jf7-y$-y@2k%4v5FecTzQqRzz2BA({^9myweA#i_{be?WF$}U zieJ0<27Kfad?Ic>@&o+UZay*u8B=`Zg+V9tk-siKnUC~b+Ln(z3m+06xfuQtqK#TU z{|+DdVB>#=k32Q`|HeluIj5M>udkUCrM*n@FWt%czmQ2baNo&)l8==Asx2S623kOG zIph3(`P{GFUM9H(9G{MljH93bBp>`J6Ha#Mi3RywKp?t9&f`Hz>ab z_hO(g6e3s^jU041@9dEJiuo-aD#0D6>W{cE^3`3lP4;l{W%(S`7KwX5JesC6 zhdFft-W_?$v|(Oc$?v1>+IrJ&%hZ{C*EZJ#u4xnVE14cXVaE7wr7!8(&b$}Tv&Nyi zj-4_@nL7WqZSo6A--__wskexG(zXY#9iuaKR{lcn_7Uvqza!Xp76W>SJz4Od`f^*| z_9Zh*>js>$AyL(uHEL& zUwWJ~^$u+A{+k(ty$#>!?L}VY13EQqR$!YljEI2>D*7H;&VBLht^`C*60I692%t;^-F_ZwzBiFnMK0VngAUtlX~&tsbIbnzJKSIVx#_|Ag2 zl+i{hpHuRfz~GbPK^FL0<3ZkPjR(0C+|2cBKbd94gXAh6g!m-l*yDcd?wGCXeN{*K z&G}2y?h;j;!-d#Ew&GI)U(OlYTGnIMZM6gjpEB+)g$p}Rsd)1f@a8vXWy72M)HMR<)lYhe@iXf1 zYhN7a`AA+?NH~iT+o^SNo9>qt-r%u`=fLexic)8^i3m??i^RCy5afycLck}oh;*-te`V-UU(>UoEi&REOZ z()sQ=ImCo`s3#hI&8GE@_?_D31W0PmX8d!evE@q9W4rQd--G?+IB=XBFoND`r8Ab% zNAxw~yM3G^+{hZb$w(fX4c{Y&a+G_Uj>0>Se(X&)AM6@A@(V}}^@#uID&^5A0S@Bl9_DojKbYY3-51;L zS+|1=#q;jPmXl-8Z8!V7;)SEY`%PjSh!e2j4BWTR2hRBRN_s&Txf3HzOM3;Uel*?6 zbuwgP>TJ84MmmZYzgqp$UT>`jVgNf^4{wb;^?E3xouz+CA4MLBli~!{b5Hys_72T^ zPP=)Jpx$5cUC+rjK01(V%seuuFnRbUc+dXgwth5l==jn0`tYN{o9@gb<{UoNkuR;~ zQ?@S+n{f+xR^KO{h6l1wiJwI2$FZM^|C}p0pzD{)&qmv(pUqr@*jA^P&N!&{rdxc= z9dGZm;rG&P@B#cPX`6W2pixAwdg8ytYksN!;5C(h;cPh1`tLjZ_aXBZZr|qa-9nw0 zFxL<^Kl7e4_5hwmW8dfO{4sdISa_Stf8!U>f^rA(dlz&;UGw+x=R8$WtxMjY;Qljn zjq4 zIhf<)_xNp$J2ijK7ZUdxe+M4&SK}k|9D$oxT*0{~aM2&#wPlmyFIXS6afR-C6CC(` zgx@9{`28I4ar(JW?}>wQc-21L31#!Do#HtzUL`&yeszpKbdUAqcaW{{|2cV-9=J7G z{f6Q<++%}}&0}ohWB(McIL|U@m3Rg|OZ=7x@MW6kS@Q5(GB)9NJ#bLWRCFou6u;|) z*O_@@C?nsw(_U1u18UO;Z>3H1Y$9zwEcyt%oiDztbBT(>F>HTi?RjZcin(>3zt6My zajEiDzR0?J3frwa_2Ky1#0z`bedalJf!$TlT6|LeFtzWD zOFXm`JC^F?IOXZ9f-w$uo*BzV#_|^Nbec=b2M8`#jq_GXmr|ShPwhJXNatB_(7A}E z^7k#k{*JtmHR<>a)t>WSam?4^mm@*V=#)NYkY8ZTyH%U#6}}JQ}_-b5C*Wn$fe{=8?Slv6FSpr+}@a zYaXVbR1W)(z363}L1TQ1BWhX1IJuj&WhtK}9`>}X;QQNc{>JZrBAXR*x2@))b$QJR zaGH13*!}o5J?N6r?(hrl5hTACzOmLgX=fhsCBz&h;d6_NQhaXOEy?QL@Umop^P8^v zsr#I#bFbkJZ^S&S$2q+tjorqY?P!m6wKJA>%5*lHJQ2?Lbl#(>8vX~YOE?>NCa~Ub z-&YsA&OV!XHE_4j_zk3wQ{kc%9`E+Ergwmg(JoxXM;Eork6`&()99zgcit&wf1MGG zc8Bk0mlf!oU^EA~FK4VH*b5ur{orUYdy{y$XjeR3KJ-Pvx)~a9U^ECA2~NozD~5AG zKhH-++N*?%n`*uXO62=avuEaUD(a(NCcLyjot?!+=;Eqxjf{io-Iqgi}6=&aqGFfmZ! z_$toOp(m9?D^3jFccGCaFsql0AlO0M`I4#FXC{*`MCXrncShnkvBv4hzAj(C@)z}o zCmi$JaHnn(S=X$~*`QO^bznKCk#mdiJ>kSaXX(0C{5dPQeM?LAaN0jaztMHzSg{W9 z0OfOureDK39qSDG5oEr4bXD;eZ(iw)>*0O%#a+?ydIY_LOJ~gFS!b5S*S(h!i^KC> z^SzOKzV40Od9ye2HE7~EeK>Rf=`5q_*Z_Z0o~tRRoGN`w4?{DJ=R{K5XR{Np3KLb51WwNWABE?wYyj85 zVSj54zssJNDi54TQD60z+x2dwUTSaW{ayC^>v?~n-Hy&sn*HePF8 z=SQDo?d(VIV~-O*oC41)`K%}OJoD3gvy9f4>|@lI+;jfl6_-w|2a(6Ior9fAu9Cy-?L(Po?Z^Gc zXin=VdG;QFhBUVi?uAD&H`(9JaWAmp^Qz^WaNu(l^HRHIo6Wo)qs%?_=lx9>s~znf z=RU#SL0j@)y;3~c;+31ofw#47T-0R2oZN5uf>j!NOZwU2`fki|34Q+r+#F<%8Xsd_ z@&bDo^EdY{=I@NhjI*H3QQA+u#;4I6sV{zoJe8c&gufd_oZT$q?4~b^^P1q199!aj z&;7`nuk2i!uW9eWhSGzv5a0W{^u1=!FFOEFu%;{tL zQD5&|M?c#+pNo8=vz{*?Psg9J_4ryytT<5KNn|WuTrw&??k;=pMI^#hPd)>@ixQO;&rG45l+nC3` zW%p4>A0->e!!VnitseGl;ZJ+kr%PvSU-B z8@j~h3wWp17jQf9pId^woId+xUqHa}1#DjDt2)f@_;Z#opvJM`bMJCTz5vC~#QD!G zXZr%4aB|FbGLGqtqvorv<2W)~XG6P$n$c&Y!$l7o3vnXY*)@(hxkaRBpKdJDc~$Sk zwb&Sk7bcgm#!ImMXLL0_lATm`Vy(qrUewmcSa_~6^G;%Bwf-G{glu+wiI>0ImGjJf zMzSYsab%$F8OdVsn>r(z)3I;hT;{&i_6@wQak9obvxQc*8|Qk)FWT^6V-fH8SBcj5 z=u_$k2OZqxvfgIvoa}frC(J?e2{f&+?)!?b$P686^aM?t!PTsHeuvQUYS6JAm|lt< z*dV4_XCTJ$G2c_Jfqmu}-;^EglpPoIR?Q{nv7X}%=YvaP1!b?_XW8rLNw3(?SwHMX z@do6*9Ugdzb>>QSp6-JjOqnZ1ThM}J;TY|BKgarKJ;*MiaX4jnX5haRo$h0fqSH+$ z+wrBRqmMtEaYJ@6LEZR}EYqLi(3<=ppO-yU^p>r-USxgca9!lb=IxItX4(z=r-A+N zKT03H1YTp#8yKWxU)AqI_FQY;=sM^C&5S+1-JcvvUd2r55Ndb%q)1c6q?7FD%4eZA zZdHG@dCSkh!@0IkU_WwcV_89t#;-L(yRzH<9J{UFjpcKQ@tg3&SKA&Ys?)|-fsJ!I z@Qm)OFDR6+0^6^A6^HOuJlzvJIdDBZr!aX)cJg;*C-1{~lU~+&6L_D_k{qD_^nZ1& zI)W{GSzfE1yq+^Bm1(`~Gbg?4M$*r2@*^p>x-;AORA4IGc%kGk+MArknssdBGfHQC znl?JJjptKOHsOrS4*Vb^*xMN6Y|ioP+mmLkoeR~M&lCLU8gLG;&^~SWjo_ZK-l}{5 znm$^*xJm!9KI8AU+S7OQe;zn@kLzE3)2f8Gj>guTent>qafI>hw*53i;Wx60M>+Q- zzP1m$sc3pH-*1;2!6VSzQP%3QC9KsBd;tb+=2HIH$E|*|OIH{n;r}T9H02yrfBWTE z%6Ynfi7%rYeVgl1G_?#m#Sdt$SDs(hTF0g>y3_wY?)4k!erAoQ);It6!Tw*E(RO|R zNb7skB-7SEFov!F1N5SgwZ`w~4kUE+qdXti^MgF2qqF{FjTR5kxvl7XJRj6^dH$V@ zV?DNh_Zl~7^D^djly#HhW5cokW9x6i#$?*9I9nIb@+Dh1!`RZD^E!>#|C#G?zR|1k zSL6i!tS6o6j``SYpoi@<8Mn=&HXgT2<*=-P75%fX|DcTJkIB64dj zQ@GsiZZP`s$&diC>ieTuBFO!&$h1tZ}ubxEy=d_4vug6w@EU({KXMRoS^WsC3 zu{WNM4@v)|oQc8?!Tv{1Wcs)5aQ_1=)R(#TIER?QI*sD1bbKeH_&*n#N%;E(9r}u{ zD@W%qFA#l3H}VY)#stS|-h=BV#%tQBsN=R#83AlmWsl?=0n0{Z1S}hs5wL7jM!>RB z83D^iWdtl6l|haZ*{FDSu_^#%?=tXDN zs)75}(31_zIC6vVXb?+QiERme#JuA|uyANI%J@J3)0S$%&y3pverDW`3x5CjI=qQG zabP$3NXwQz;4Ihp`uA3Fcd$q2Q-t&7&_BF5e!NT4%6G`~IG(e*CR6^oRlsgFu!P=Y z^efv_BnMvI_$70V4Pd;-_#F>SG|zj+h~p?!?DK#CIie@xqe?qzZKk&m^I$8W}5NS@kgcYbH{TW5H30tHPYD9>Hn z(H3CgQ<(|qwUo)yZ}R4S!26HO`Rxx!kMjFC@EX!U+YQhl&+nBNBxX-cM)P<#fOq?O z_YUv&bxp?K;$y?|UFnr`CMGANV^48piH6G}O|M;ck}MGod_H&x8W1e&&H$D-+pwHq z!}1k;D_;_ibMb*3!PVw#l0EXa8m8W$r$cmf$6#CDD{*zo}Ijx z=YjUwN$38CRNNQixei!H14Dz~F=dLO!K7(x8xs5$@N#ndI=(#NV6BaVDb!2piqwDD zuAi{$-%5Swf5`=o-A?$s#O`y2UFT1B9r*+g17}k&W$j($?xUe^a0%rlTcrG^lo>)9 zC!S3((f@tHv)Kl9zD}L)_Ot%iI4*Ji2j^E{i&UMIzYrO%H~HT3>@xaK^~8%~z>$3P!CKb-A6Q|2nlII!(yx8DlmvxB2AMjzvS z>K*+JQ@;UEFbJ$vNAg~G^mX|~Z6E4r>G0iw;T!HVlgNA{=}+?hkUo|kpE@&%41FGb z>A!*Yf3nFmEVj-}2B96zp}lSM{hM8SK7Fo&PdPr!rkAX~&Z50C>X-64rOw}wmD2f- zG^F9@N(;VRjh*uy>)d3$bRorpy~p}OpKfELBA?Tfz*Ya54BNTG z-HxsM%cnw&@nc)e*t6bd?AeE_kr9*+4jdfL>%v(|-OpgjUwiI`pV8k?#ho?68}=7| zBH3zgn(@g({8Z=ChZAphbbFB*Z>IVh>(;-qKTub8*&^9xHE-FiG;i!y?dLs~wwy8v z$|NWgt&nXtGn|->ZFQrbWt&YW|E6rS%3TlqOc;?@MdR1JG)MXIOuHjE6>T5f2|Px0q6cLITVU32yJ)Rd4|@Nr3J*kmJ|P5JGfNE{l;$Y8#U*+UFsxv85m*BBe6%us&oK7)GM6|mbyf%Ee} zB5n{nq?fi7{}}U43-82NQ;$z3x~QJ}qssH8HxbtmQC>Tvur%LO$baOvGYZS|JQ^Hl#lM>II;ND zcX1pJSa)$OegfWlHFSrpT?2fg;&s?XWXouSgG)}ni{r%Nws&!u^&Or|`&x^0Ho*fM z3QgTve9XM#F^@iG)5o-v`}j1lP(1vG;$8U%{P*W?C~n~U0lr`4`@#GJ$fO69vof7r zm3|`O_uX_{c+P8A2oy*s4@*L(W zTs{ZM1!u5FAoH)po;|Y26I3i}26vqF zEA#9n*88zHpXwjvJkDcBAL-Nx2`F(c1v$D;4>!~-bgL=bV^>$IO6q!tYH`Vy6Dt8r`_YC3-o%#5DPq2K3 z-6r>$Yb-^yIjVy;`?%T+)295KYV!@+H0Q!zUhee4Jmckz%H zwZR(l*3-@tRP)8IL926$f937(IH+Tyv9vmfR2ZP@Palfv_UottQf=N%2Lc)k|c zR({>4HTYlo&2}5Lz0Ee}0pH(s(8iBlZA@_C{8sQ&{xeU|#1U~|Zv0GQE~OU~lG`Y| z?x@DQ%Pu#jf17dzD)$Ae+=%yyePc}-!uRW*Hsw0Q_vimh`2P0er(W0TXMpd2aR#@e zb-k<|zHf5lyS8U)eJWes1vs^n| zy{>XLu6F;O_yn~jTtNeF+;@hnU5~RieLi?_I%_tAwVTNrhW{?l3Vp)bb$DFkNWO-Gr-wr9Gv;u z;%t3wTb}x;aP~7BzJJOw*H{^_eMmTK$5U?>&H@(BJT9CK181eh%E^sAgZvnhIWx|h z)GVKu-d%Uls49P*^Gm`(yR~(^inVpE#RoSr76(t|2hMEYJ6QF9-}nAEIJ)*UIC_bB zoo-$IoH8Bp!7=S{^cmskk2a3_S~%JXjs|srBaaJ5-=-ah57rZN?%?Q`mf=;KN8z6#`D7vH^iXDi?B0ew_9 zx!U-L-9{JoTE7t#AE@l0jS^QIEsU%DpLV?}Xp?&Dskf|ydb3>hKBAsOoBdq0nIqb~ z(e#&Zshp494*jC?h{M}$8e<<9Z{JUQDc;Vz_PqVwwagDXUs*RTl+~R(2u(Xh*HF_4 z{Qf3 zXH>S;%VKL7zv@xWqjEFsa+~{^`njKR$S&~~CDYvPx9Rg?e@Y(8hCa(3e%+40O!@9<_zQNH&hBkb=@GvFpdNuv63sJ${T&+B za|e3FO5k=n9#cvglgH4WTaP&L1B*tL%eZou3rBa@vV1!n-R8p4w}*kF!5!oLtCXwU zRcP8~h|ihn(9pNOgU#kq;-&BzK@T6ru-lYF8zxfIwP1vNB7CM1U&yW{iHg0 zYW*aQF`teWJ_&Zb-`s1{Lizk+3m-1M|7+Us+wCzEcC_v>f1<8~<1XO1d`+fg(mn0< z{=d+7DYPctl%W=~Vu*b9mY{+bbvrc8x z;D1C{*<;%P_SiOnJ)PPBOnJZ)9DW*nJ;l6Ehp%8K_&VFc*Xu>X*B-;ALnh&g?eX>Y zFI(~T4Hv$?O18O!hBE;RMu zZv8A^+@0bBU7_;LBFkz@VmXo0?TL&@e=YX%Rt><#ut(=N%dBIedY}r;ed1?=3 z>~YWKPOfrvtjE!7JEEZ|r%Da<-kLl<}5(yLE`mmsM_qe9hT)KY!1~Cwg`}BR=u` zWAKT9?1h=wqq9qjX~ncL}b{vc&c zoYS6rpZB)I`3Ic8sGL>Qit`(79%9O+*pt9{TZBKv5JyMN)UTCd;0ca95p zFOqMg@`vyV*)-r2kAIKzP+n{A-ifSO`zijLVth1@-$QA8N6RIlT3`QW54j=+l@d2W z+cmU%_KvPqTLwdO=J6lb*}4dpL1~o4%Z^<_zG)&KlnUon=Tqm|@SkogDc1dhxBx!TV+4e;RZ!6}#k= z5OiVg`|yy*jEjk-X6y@Ua)Vv?zP~Wn)PZBfp#Su&))+I*X`Y>AEf6V=Pd{jmDzzyH-CXlc%Nmx`M0fpeM;EEc8B8v`+Ac_kiI2dr;0To=D#3g_t ztzmHwVMa+DW*7wlH!$c3>L@|QT|;mQ;<%tdq9E`0)UE2SzVuDP_

x`Qv_isj5?F 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

c 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%0ADtF4xjR{W|So$6?Puwi@%x-9>gC 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 z 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%0A%1`_Q+W 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

(D$uGKah7mqJ72hVHS8LOa=^@caJd&`LU3-?RB{ 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�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

QXF8Po{iqwr2Y1@4fu6 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 e1%P6Z%O@map(c zXT2d-W5cT>vqHg4OLEN5JJiQ~b$+!=xlEiQFP)t9b8&kz=h~WqWhl%Dv}PQdy0az* zq&^!Qjq^jysVuBTl+=K8+w}%y18)S!L-aIURFvKp&a?T9!xR0RLdmv>54;b7RYF2M zLR7KOIg;F7aCYAPui<>*KFEO}a)4ZBQP_GARuvmS6tK`5&>xXEFs7=+TC4MzSkU*@*wUob0noYd;V z5B%=8G>;*#BmY~L;P!Pb>7UEl61ZN%pYV&nyN*V74Z$uVyMx2+^G18B(-Bt8U0^@I z;cIph5?>{utvpt4H|pc>zh-jD$9h_;@<4m;p3#h2lOjlVPTjN42))I`S7L_=(f)m)hhMMyK5a&TmnozNC6N3h4? z+JN4QE2l%9gAhXb@T25s!rg=5W4-dGDodxf6A<$`bBX zWQRM1z6r9?m;Eu!aYH*+-_)Gal>i~G!`^?YmeI%Lc$W_$7%*{!IlvVdfk*TiK%u=SL2eXY zqU_!YW`3=jcSM*B?gkRSR`K<4{MTyh-ZGtS-FM1wRQEnxWa>en&$~bH_uizfz5jK=W7B7d6#iQB8E7OH&WId+p&`{x>R$(ldCYqK~;v@o^x>CwT17 zzEPdWd}CGpc_8sdwSOLnzfpsq%Sw*@BPYuE{-cd7ul$b#d2acwGx()S{DtZKLZ$wq z$yNRTFqr$5s{fPa7-v2;y(^X2P3~w$^R(Seyt+^!W3Ss z{=W$Kf1#TH(wF~*>i)|>_7|%1Le6iz5HXwoS5ED%D*vl6FP;5Q%+}wj*vs%H_jwuU z{+-%->F@lVO8s?s$njqX8h@vve-o(xoyz@qF zl#-By5E8DTgnKC|<`t|4$b@dEZ%k?Y-B&t?T>lZQ5$W?D2R_ec&*6 z+olxmu+y7TS*;AZ9!t{ z?+Wg^%j~{O`tiHMtaa+{QKV_UC%Eq(({c}`kN50;4yOnvI6^0}Qoy*DSL+4ZsO;KP zLdOQu#11wOqU9FcHOQRoA?t}lJ;R51m<_q<6FzqadcKU$|+oY3mo}-F%7u z#k`wu_ka+3v)*ubWI!4(FsUtrc^_bq4W16C^7g%kfvNik zndX71ysfWwU<&Iu4hrrW#LH~Mjf44kLGa*U<`eufYl%0f9XZOo4g--xyc#hO;nj#V z%4onJ!$5%;%!6par=+3pPNA)={=pu-ku{yQc-JLu@|J!yPY(B++|@i+dB#UZxaFA% z;?P{DO#?X%a@n)zEvuEzbt5)kNr#EspOVVEznXib?x(ria|}~zCwq@N%!H>LA&mj6{hl2VEmXU`rvj7r_t-Uzrg0jzR8!A#^c~*YI~#&2=(~bx)Jdm< zV;ZSGdk;?x)3?@@zIPfmTzj7}^$ghe9o{jN$(d2aH-*wqQ!VxzLw$Cv-|+UKRF1=m zKiprn*UkW z9M$or?qTM)XFV1^2Y4&(P@2C%K1XvRl!AUbl%`M9@M=7~5NKAS4@f~L|LBLpY5<%F z@8mu_HDv24jztp}T*ncH+jMKF6(^Oz9I}2au$oI{T`9)+`TC!zi~pteX&0%lUrl}7 z-BvC4o)CtGr&ETvFmc%8nui2WWbq2kUG&fo4iC2St&ZW9+&ovN9p#%ISH_9GDi!tURaBr% zJf7l}!y~*rM}kZ)?u#%$%*$d!`}vH=^}!=q=FIgB#+pN8QjTPswlS$Ev(1SyseDi+ zk&()$J{mJp50kx&5K9kaG?1CYnPIkhJTutA*2ZR?;GN53gUw_K`=~5)Fe})WWsYVA zk7tCub|4b2**EneooetmPYa^;ct@9?kwFZuaB!@cT0YxFbOPfgTOX6pQ=& zgpM(;5h`W`Bhin>>4AR3iQeIjSM2Oh+30O6<7Cq0gR)eoO~i|;QQMPstf&0>lO8|QLjWvVlWZkYG^#QJ2m&NZBciw0+gt__ANm}~4| z⋘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�_-%}19t1LNeoiMY>WJLM?y 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%0D_o(eV}BKl+vBhTIu&r!;q! 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

eph9{r}} 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%0DL8 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%0AZqDDZV)7F|&l^J-cGl`T& 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 z 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

B-)>H=NR<=%5DTm<<6*#h4~%A?xHh}-o;~@X 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 v;{ZF&Gd0$-N+mLQFer9}3|7)I zx_yhh)DGKYd$swAg7w4jo@kfBcE(r-AA`2P-uKr18kL<}$=~C^0WN!D7*L$Sy8_|i zb+DgJtbXQP&Rky-y_PE<_rEWDjtV5W-Sh-$!vg|}t5Y*2AEs~Ar_(=YDZ$UEKUPW_ zuj$xRYAL`I6Z~}r+r>AYVk)dM$CI4a7uuvy09)kEUMr$WkY%#P3F`6H*eg~@s~>Bx zH>w#4vD9Uw_(-bIedA$cwlejS^ zzYH`-*xY)3D9v?`KD73)lGtP8sy`qnR`C(;Qt*kaARFdpkyLYMX9&?#YTh%SnTkBdKZ3h>&jeK1jQ!?5z5pnLP{4@)n-O@fip2>aU z$lfa0@ycG3JJK0509KR-Us3(&kIia>DPW%zxsNqK$I_*U4tH72klxfvpq0M z{LPbbn3JqfojG3t>7`|Kv;%0t9Wiq@53nCoXaqdX?j(3nn_C^vwcq4OE-_o(5PXy3}glMZAsKa5c)Xc|Y7==4Wl@X}JrSH6$4lHypSo1t6 zZBMZ7eOy@$ybU3YLfUbXXT%`R>)*5u`dzEgwXqAhwNkj^PLK-aAAiaF(W7UdM4TYY zG{@Qlw{=ftMU)kuG6@)0viLLyZyfZE*M&Iy*1ryc-GaF9%<5L(pxK8#vyf?80kg>4 zM%y3Ejjmd){5o7KV)eDMQ^I(pi^b>DbcHcCJC}If;Ig>K9?VevRIVi-haQoa-^s^di<7dTz5lyo z@V}1M$#`B?GGK?ovH}oP(>l01pjM)$k&rwkcg#U1mG+Zm_Ytv)mMo`vQ;ps{VqoG{ z`|r?gEsKv(lZ%n+>X};)%~P^-ui?0}Jw`v+DqQOm`rwPZhVo<(ykIq0sM!Vl2Ht3< zu@VV2eD~Z&pzENtlnF^FK8-A+qhLgd@1|5nUjn+ttA@2d7nRn5N{BBNCG^{Sv%1m2 z;+bNvrkG+?xkk>*Ov9S*w9s@ii3H5f-HV*e8EBEbI7i^dBjl^hEmXsC8mN;M-dfL-+Z+lKC6di)?_LkQfsC> zSPBEdR;S+Jhah8_ep%yX5Y@<+PMmQavWW!9h+f?pX<7oo1ixtSGUCSkLW(1UI9F4V zT7#@30Lo+MDXTT#AX0;{t|oWOYQ4I3^)+;`oqpz|GrpL$?wzDaUB zyO?g$JFN|SVN7A0`kKmn?Iz`t(uK7uFvS;cAiY3m?u+N(;0;#IjE7g!N}~z)krMxB z!`^H#Mj`arKZX^~5LgXBGFCI!zd=qy(9giJ+Ro}$GLN9JYAQwDamtF~S;~d~5o54`Ct??-X8$s( zDJ+Yy$oMGI$f`i88NcFzGey-F5h#)&b@okSj6zaEnenCz*Q zMOI_U=!#Qt&slaqKppn#?f%8VnDAv&xzKKtA+AL0`fEr%5%X4-0BA=_DWD!IXx7QGsa}V!M-}zE!NcK>~G#QBK4qf+NG1}c=Lpr){7bv8LsG9N$neXWW#OF4#IjLk{dfiZmAhT`0`*+rAOPT@0#r`hG%fO7PN zL)vq(q^<_Cx?TiJ08=Jsy=i(OXOop)jIu5Rt^*ozrCL41ahCu%q&7K8ErLu(RSVnO zvB7~5v{^K0$4t4&R5uS@CCQPtIfKixGNhPHBvlC{|ai<20f5TBn zK2BFI=^2m9`c1p*`&gv{e{isz+l32A4e4#XLk;k-(}mJju#-I4-c#+UK2bWFs7yGD zIcOFoc(3?};RWoe2L3B4)W>XgyjJ@r+qrr!C56SQE5N>uKI-*cpU#6t7@4@Gi6pUA z@YyVHBc+{Fb0*vpMq^tO8xtpQ>||owwlT47+qP}nwry)-ocx3D;#_y_%iUF7z4}?g z#yFG9S3+K|cz@2sM?}-z^O3Vt(T9^=g;Y(Hvv#*NAw-JQa))6d7?6R!e&P2_~vqOZVl2azOOMeGa?ZE(d@11Z< zWs7oYikF|iJMU1PK7LQQ!(D%*AGtelN&1|B@p4a!#6FKw(9nq!gQ;dGvk(o#zn5lD z-WTdDQIVft>Sgwyv2g@DGLUBOEk0LCY+>BMLdPo-MZrZtSZr$ilIs}0E$x9LL32!w z$?x6M2JHY6r{7HK1UV60AO-hq|qi>V9Oew7Y zzK3@beuszS?_EIABz{wD!5)V|nJ*=(43&=rlwkc}`B%hNw*;;#G2~u+TI!T?@yT8E zM7q7{5)Gmw(1!wbrxqT5vAl@hg3KeY#_7XBAO%vyTSPngcmcVX<--nZ3mFb0V+;4E z&A7Hff$O`y^7jnAq76-?JeFGTnCdgB3M&<;Y9D3!6DWA}kl54TmtFs9f|4%f+_>xw zkE!3ouy<>aW;)w&iW6Q3P5>}u43e-qC*4nEalEn87M1B>#0KKmmGf6v!>pnNoN)fJ z3Iph**oR_-ir_PT#bnn@%N&SToE7BA8{zyQNXwJHSv1?eTgM(t`zNp{#eBnaGYj8y zN9B$WBSDMc@|&*y1G;|W)R7Ko#V1QS%IL0IWn$J!uDCAE;z^)`V)UG8D#`GQfzt7S zGUakipoS%zYtY8Qu_~Pm!b)Rm3g!6CpwBZB(Z_nf%+q4(ZsR8={-X%4aECc5#kow+ z(7}Q=*cm*wjxmey?_t)D;o>^dM^I3y!62=gn=zzctL?~4u3UN;B4)`wF^{nDq?`|q zI94KP;-`85kVpo(5ZX7=F%D)No*0@Aqb_ul&th)T;J5aDXT{Bok}2HJ18}0Z)Cl>( zAWPnaTRas00is%6c{1;WLw7u$8$vOAuK#@NdsXPxqkpt_ZO(nv(yj7g7<2)|@e+UYUYP z_O7=XSk@_zRs7EM(ckIORgDrl|F8G|Z#`zd_?Y$>2=dVakXO^mc}ZBfjo=*d6hhbV zbA&q<452@Rz}o6pvezr0RX`nnnYgF?Fta52hTO~+nMht22lz)?YkBet%25r1Wo?`` z_;d9<59a0+8aQyoJ57#+?&Xgch6a8U*r1)32I*-FJFV5X`Rv^;wpR6({>1=#)f#xlqGxXWfRC$z(zjcm99+h$F z1F{$9f;I|#wl@|<0PAec2wwdw82qv+rQqc?s?o)xxfazCYmYtYmZ(k>JU@0iTB8tfurI`Jvv%xYu7WZqsE{s6 zs0}<@QD)k>Jf|3LyWK5WEnOz_B21f6Fkb3RcPeP(FXnrF;HMmzR%({fFkXnGI6iHs)iW(Sizg zc_Gd0x5OaA*sy_gObKK}ZD1C+TwamzK{hYJ?$YouJ$`uc4i$)PX!S7DukN56sF&bU zV-WeH^ERA?gYtP@a1>i(HGu^=z`b%% z!1?YAC4wbZ&M@uLCrV@7S_yD-HaPvZIamn}1dfUdr(P4O#BLZE0xOksNVGUT*d`*b z1BDb;@$n53`V1iKvHnMK8sJ)4RE1+5WX=b?Isyt=!7zP%(k z3RApO=J{ZEq)OU24uh9YPGWlT^_<&++-`b`TdBcYAkMMv-Y}yuG(LlfeRBKq&htwd z;lH8y^mT}nQUeLLo!ExDAB=BE~hk^FX6RsK0} z<|VEiSshzPmf;6Izw?$=Bgl4tBgok3+#B%;i>a1oY^t&&0NAJ{p+H}#8lLrd)+oE4 z$l$O(Dw?*)p00J{&tc?Zn5RThDdRrrFo?ynT7Bz}nn@b`#jnTQ*GwQ*U?WJB1RkUg zlIZsYl#i8E9eR!Ru#x*vTJKB1Pgqy6(UK)l#>f0?Hn)j;<~N>*nYSOF0-9g=9B+_& z1DAots?eyYpjPb@56Ec=A+c4J}FQ`99L` zGP0Ax>nPl2MK~bYd|Hy>oxfUNxz7dW#wT#VXj86)X~3OtQx+#? zS3a1dzYMj8I-GvE32u#abLAr^KA3Qw!GCyO({nPpF>W2-c|RP1{-o<84VWG7;RQ&n zF)Iz4azx>B60!L2Pz$r-|W4?VY%;(rPKEpfk!*FpV=DKTPdV0VZ zCp`2-ncJh1MkkR6UACZqKh?Ou+DRt`)mq5JIZ?X5-}<_*(gR`7o6+QcG;|K!;;m@$ zgb)Q$Rwqv~CGIO=#9v!G1wR(UfyUyDYZhJotZa4Ro<)~k zEdlv=olb@>%R~vI5P4v2Q)T{Rih=>a+1MN8d1(h-N9{`>V(?hMf395@+Mse;J-{Hw zT2r`U-`vcKX}7Ln%4_V_w%l^@NkKg_Cc-2F!02UjT8oouyZG z!u^q0$^iueA{shGy_cwxyn}g^m898rI7=xfD>la9;{*=I(4}r+QV1=rFI*U|yXJOm zc4od3#k<{Ri!|*My`3)LpARzqHNbt628NrF2+hK7fklb?vY2jD{5v*jG$U`jcK^7d zZ<1+KMf?PdPUZ?O!*9M_aWyG+6B+?Y8#B;<$0l^C$Vs=G)@Ui@;3oX;8^am_9X_=w zG4-*roc!*OI6=ut4g}jm%`k08_G2_Va=^$#RjO7=EpYWqG3wk!+JP?}jTUBu_#kmMzQ_(^LA_CYb=$9c}1~ zw26Qi*2x^xH_ z;j9bm{Q3)L`F?#MiiBH@0-F0LcwN^pfHF1 zuJY6+(fSL@z&PTfsg&@PoJc^9*UYa&lH{?zzx7=XIKU;dRiCA-$UDjrpHBjoK6)8(L#be zm6nsmM}8Ojf*YPC@mH1~LyTbDMp5$9qnEfY@-$(IGm=b&z{596@5Vx-v~!^zVMyfw zIBs1@cqRe~z2#6LomdQvTlmdLsJYsGUV4jkHCrO3hYPMmh9aZUm0_)H z-4p@~kNoBA0$<~WAO+SsMXICIG#19Y^%pz2lNn-GwH)t?K6*U4-aqUCR~YgCU}zKF(@KmxTG(gI!y6u*z4Q&dU& z^?Wf`ALfZ!+mSU7)i`wd(Xt-Yy5EQ+GNakxkbKgKYPuSBq`med@~P6!&N;OCqQAwQ zXaaFsybr`|4BP#LXwDX#{DsM7_r{Pon#wH>1q+=xPmvwFZmsIhCNGE#s`|Au;gcJ( z%0`9%B9?C5DJ%WOF2lNiR2dAc%uSF&ILM?n;JP#WE%Y3a4EB;%JzIBX{IOa zSSJLvuK%mAT|Hxc=&C^mVQiz}y{&X)!DC7E`Ad=|c_Tgt2ThAtT&BB$74n3cj_j&8 zyZ{ASAOMtsq6bl=Hy8O?iKQN$4ocy+pPm1ZYg{-Bp4H7ZGNFP<6uo;As9PrsFlg?5 zT6hEy8F!E$Qz}l@Eu);TFN_Q;&tp#Hl~YPMn0{VlWjGQbsPep(FbfqsRP4%))^~Qj z(qM_9Y2_6W}=pTE;`E{)3$LaW+Uutphe*M+HtZj1mfQ!qhLpQ{24@6 zp7S^3W|SrQ3ARU3c*SA=f)?gqqF-EN zMDNwqy~ks{?qK0Zzz&6L=b;IiyP~`JnGW?{P>_BF{qs!(Yx(K7yCe2@PKFkaM^YQF z{y@gX?7ru@{WGe)*tn8#6}AUL+7;Y4OE?+f8(gTH>#=0+KOaHPf73@7WE6va7jf75 zx&p3ehV#)dwcrcC&C7}g$Bd*XazkBp8GMS#TjpAAz0}rJc}sWFnJLpINz0B9U+cl7 zgn?GPbiVEM(_Ld|aYZA|a#f{ci}V<_x7zlZEW<8%^ntIOE%P^?V5W?CQuWfmNNK)P3Ul{`vlvmc_f0bqH80Kr>o3z1^LceG@zno`M@P`Q~tM9M{ z;V(S@tvsAMj7kc{Z;N+yh^k1)=Iw?SHN|`#DEBCq5>p$pvRM;$=tzVVH9k$^z6smB zp_v$d7MVj|y@Ah|Oj^g7$7Cyn(ZF%%);BHREWLpxS8|FAAF}aK7r-1vimN*B%4WPe zzz{|iprt<`{>|s*b;XY?NCSIrS>Q0k_S@-{M`dp^%+DYe?gH^BEc~eE3Y)g8u_31Dh+AkhRY>ID^8rz^s!lR_%Aq@(mcqrlmd)s(qu0Y z5d(IXe(=HuyIsoWI_{OU)1Fo=@o#7jtq}L!HApO9d+DG) zd38!7?bZ|%kseF%ailf2HKM=Udf(0{l%SFOxt25fjp$qec^_UPS&##aVsx@EU(hS# z^oe?Cv`V`Mi^Q~EL7QEDx@fS%j1m|wj9gmr5{OuT^8K3dqC8&(pjM`fB2+;ob(6x9 zdf){wm8Y6dm*Tyg!4URew_L{3zRbve{nG0*MZl-gC@v_)*?zER3!fkM8WaM=PCXfq z7KO1(45!h!vm9Zc;;6dGNUX01Re}3r3YOnjqQ{IlzqTpAnSJ%Ua;E#uR(kl=MgpP9 zW<{1;%u#B1+*JuWzSFTeuN;7kcGZUHLmL+%cDStt%YTi~udl(IyZcp5Fb!riB9Lyp zD!83PFYE;=ExuZ^(1I!k+>#FrvAxn3o>3CiqT)O6LY3>yoCQ`4QToNWPJ(bo84ng- z5(_?8vjwsDE-(}Ckx}vUFJZ(%*=WZo;b?x(1UsZ_AfD_#&7Fvz=B$}({^$>n{T4~b z^dpR|oetHGN0Q>qobT;~bA$#p(5q0GlXvp`Dq3VxbEsjXq1CF2{9 zGVznBaGw2!gzi;-iGTRO_No3*%Ad0%@+I9YYkJ3DlzON@eexIz^d8`Hp;m!U3!C~N zDO4sJ8mgc($YleqxybQwyS3x+QL~C)-r*DDFd@2OeXRN_?3e3G)!`jKFokDuiWd}e zykc<$e~;qRGIsM)&18KUAu|pu&wFGc+DpdZ%CaI{EUcZ92Xi{!5z1k9&TJ`Ayg`n+ zRqrN{TAzP1_eJ&MA$F!9e*8RQpr`RnM1!+!P9 z63EoJs#CaIg}7p!Sw_S|{SW;S==Eido=vpkvDWeVIoGfl(!xHG09xMxaRg*1#Qnlt zqK6p2qIHES1<+xR9IQC4n&W8ae12|UVSy8mO!C@iqogz8%QRUfOt_BtZn>N3Ra4_G zhlJymH`{%roZ>EjhNJmR_@3b~q6%`3lybJirl;!2OT>WSct0&{V-yR|djnnVoJk&2&4lC;goVRAvap;A(VFK#*m znCv>R$2jv^ajCYQ_!21IFcU>@_DliKe~m(a;4|Gp8lmBUeDtzgi|5n>6Xeu5(~iXO zZ#If13K&LCkwNc1(ff)|?-Eq!w*15Zed= zcX6mTlI6AEXXtIb5CzjFOGV2s)Ndi73K2^{aD$xt$1{#*1;h+WE9-yVpE3nwh-gj| zAz1G;ZV%3GQDH$I<^bH_OMf&P45*h5tjt0aH}XI6JzaR0tDy-p&*2*=12d!T5jkeaI^W%sNveN)Oer;=8eM)^86N`-=g zZiw2yIuqB8B9ydvxm>+`H0GMOSPadG51Q(d>(C{_cW+#6n{yDNuk+T~@zjuO6_w&k z%m@o6y+>P;TM{5u>01tcsZsDpvLAE1i7mfcdZ5^iE5bK0dGPsC5iVv;IHH*E8ETrJ zK$W7|11}L-ksb={DsymEcW{Gz6qrK}??!ZzQHgw(_zsjP?;$nHhP}?odE{W!R^%7Q zT^I=HOV6LcL&!C)5qA4f*K@q{{HIi{1!VTISdGYaJj&24rX5cDp`1x)pjYb_{%eZd^8+$RcdGFOnM*>F)VonD>~wWnKhHnB}zlD%#<_XC>? z)3`p&4jJUZ8n8rSZIX-K!U?9<Xtc50xgPXH^KW=kQiP#J|2UE2uz6uR|}qxqqZiohr9rBc3^Cuv8d-9b9rbbZwp4 zqsp2-p;1^%@Z?|F{wx}7t2Gpt9-DO5GI&EQlkgG+WJTMu;cMb+P6Y*UUXqTMDG8G$@FBR{$f~eL;>es_HmpM61H08}4AU zE-jd@!!>}nW4o0Y1l%YK#lCVh(F58GO(0c-+QLzM@(fDThUDy8H+y% z-l<}%o#~*jMlU3HK4eH+*2a+>;`zv-1mLw)RRSsrN|5WJ-7~KWiBnZBfu9ZwaO(dF zXl58P(q7igAOdIjn_e2?o2yc5U{%0?pZYWm=sxU>#c*R}Il~G3qU9!udSQ#g@%<{V zFMK*Y!{rqrNPcqIN{pvp<5^hN2vZ+2w=)`!8(Izk=_2-{-Z)uP+6Q_;@+m( z#Ll>xhc=3ol%sm+=){NJpTuTJEIWy?AE{$Lo2ZIkx*)KeSE_;&*hxDOTbyq{c2cBG z_C~Mzo@=MIc0V3Iuzh88@W-oKenD)yE4R3W11G`SN(X8%8;gHTxB`dZxYsV)QH&mk zAPbt?ksz$unQ$-MAsne>c=tYYsESap5$$0_^SYFlAgMtxZPQ&gDck}` z+<378Gv1<*Z^Tyn(wobnR;%GDk zLQ>0!pzeB z^5}K2*FV2G+wCCddhS!r$jQ#nasF^_=~uBSaHGAVJi^qOWi3xAv!Y(uok72 zv0I8UqE`{<>P^P9hdyIgd*6P;vO_qaK zK06s>q!6s{jBB&HwRtBgyPDoo)mHz(b%)OdTgmkHs;mEmg2c3G1uX4I=OyqvP-ayd zdK_BhYuQPkfp8UdDjaCSsn!)D1vtt>L)r6cxIXB{Bic@Uv`#s*k7?r*cF{v57YFOz+NLf1rYG8sEC*q6`uh zv?Kl-e5kFK=I?Y|xe?N61GxhAF&6td;J+Hf25g5Nm#G@?nmQ2 zM?vFYkEJI#_}}nQ%%|0%j{%W{&vz5XTxJZLwr1cl^F{E2kM2}RWS9gr+-#DfW{ zV?>>b5_MrdeilIhM$9oAeWCK7im-u0X4QgGskFD_j_dwo-NDWU@GI?_FxNj}C(Ygk zpBoq3$0FW;eQZ21ABKQnTme{FZi}5t0BoJ#W?b(9B zsEsi>KE+NNz0HM|N^EjzOl~WgUtDu;sl5u~N1OiI6wAkVyq~hh%r4NTG`QG}^$hs? z>oGip5D}*?%brN3uc&8G5Y(6Yn=-n#yJvX6wAet1I)W8QDSg8omQ9_AkdD$-v~>jP zsD<}vl-y_5;2zcz7>28|c<_twzK(xIs0f`S&OB{4-{Kk-_O+}BKTE~48$ ziMa0BfQTMReU=h(3|gw2Me|c?KrV`|0ZwEanf^ozM%fc{d(yO(GMSLoo%|2f+z3o3fh;WG z4NO4Yjw^=+nom%?<~1XhC>SVp^0M8egVta;vdZ%*pSYSt+DgS6yq*abW={+_p z^QY5k_XOI2_!9_V2g6?uez9Pju+9gK)+5b&!_+4C->c+W{K!m}o%zc)mq%ivQ-!|P zf~s@;C6XwyU(e{3Gm>Qi;gqpeU|S6!m+`=^Bx7*W+2bha)dAcJc$>={wg6w ziaov5{aU=6eO>F_Ia|-zr>alCvD3S_vFi&*Uqdj+rYi3?1KV;zmE$+jUc>beCg$Gv zX2T>s>TI@SmLaKmd5hoQK9{B0(gP~L7{r-oo}vD7gKJNOseqmjdc|QSwe@Wk`6^H+ zOsCa&4@e#A5U~216@Y3b|)x z#ZEk;89L#Bs#c)(&>0Sb#(LL>citaW_kM3Nnf*?bW~4fcrG7Cqch04 zt>ptg*swz%x2s#()-Zt+fZ_lfwO3TJhs1;k3?f5Dmr-^tie3OCe&Kk9&2q-iZC5g% zb(@|XVBU6s-&KTrJ*h9zrBhaFLj?()5S; zA1^I)S7nenj(X-~p0uEwu~UuwaZAng%(TsPyN_@cF>x5>rWNfCBZEBLUpN)=mbD}t z*9fV@2j;~_fxFLsU2PO>`uYa=N|YO{=2X@Y$OW6PF`0LWr>S0P5OvY>Gvhl>6~wo~ zOp!x0-uBXauq`9}{CFO|TaS`R(|;x^&i8Hib$M=;;-^qz7LgTI>TF7n(w_FS05v5O z~>{fRw1%sXVsfkwot2TJ*-S$xKu4 zx}z?=MBnZ|j)Ud5BG1Ez_MJ)SHcRZe{qCL))dWRzmz?yp^zrffZN@xh7s zgK64ErZ|dX_}m+gS{DOVVl)Rh&WqoLwo70p|MuVpa^~EEAcJ8SD-AJVd6T$Hk=tQV zNjS`I$_Zqx#*-N(ZG%D5K@g^&tm;Nzu%O!nYYP9;U_fPgBpaS>fCFDPxCC=`e+Ppn zFpAC_0b1i83ccIo+Rbmg@Rrj5R<62q`0-OfLou^&L3%BEWovXGTTl4=4@#Z4xLO8M zs2W?WWGKVi5|qdd(z&a#(K*pgu0|XIP{#`Wo-dLc3WO9o12EA|ARKBPTVU;ZKf|%D zx*C?KJkL}YeJc;LzoUo!nPc+}dADH$EWKeGQ$U=A+kD8e-Fer|xge;TfL_r}&C4&F z7tX^+vK0Z3V>$TmgIKb@YTMJ@6a=#t33XUUET(%nCbe&mG^4WXB!*7Q2>hk9LWCv1&`SN;@ z$6w`Mrxa*3r29lwhP~}RU8X*8bJH69*UzDfMU~J4SH_G-F-aP0j)aMC1OoIV5$AwD zah%Cq+DYmlweV>bqSJ}h4+SZVKOBD;6n++SmnTQ5YR$+qp$FMlSh<}ErO{q{jwZ`Ql-o?s4);DI~xEe0g`oYVtVM z4p_1^t82+03+06`assRA;URI6rW9-c&-z|dYl4%sas3_fS0|A%og5M3O!tmS9=_lg9@S4j0 zXBQ6iedt%CaEsmV>TCv$#Y*}qC&86{Tb3G>i8Y%|VKN7zUt-v)^-tviZP{bXOGSSf z;jK}pRT;#yuEc*COV~lvFj?u@c%g&94cnq7bvs=>_budryqWoUkEe^!d_wv$5B@Qv zIshhZna|#=?%xcjC3co%+ea&5l>q_$((i6|;QjAr1p}~ZSD5_?CD)9p4#AYM%cCvu zb%!w=>a?XeQs$*`n?kG?33xW0nLJyxI?xhh*FqM3a!`NTyGHaWYetDte!ZgZ$G*;U z^xNvbEnbK=5FPP>DMDavM6w8E4=eJ#r8VmyzsUOaTAUWYAF=z?+!KkRHwh&X+7nLC z%^E5iaZ7ToD7Ib_fus9^m#TXHg=&$XsF)CDsK~-IkgH;>ds}sGH8Fq0^A{gGq=Ow#f#)iISCcPV7)md=AuTBNp zRuK=htLNn Shank needs `declare_id!` in your program for the IDL generation to work: -> -> ```rust -> declare_id!("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"); -> ``` - -## Solita - -[Solita](https://github.com/metaplex-foundation/solita) is the JavaScript SDK generator. It turns your IDL into a TypeScript client. - -> Solita works with both Shank IDLs and Anchor IDLs. - -Install it: - -```bash -pnpm add -D @metaplex-foundation/solita -``` - -Then add a `.solitarc.js` at the example root: - -```javascript -const path = require("node:path"); -const programDir = path.join(__dirname, "program"); -const idlDir = path.join(programDir, "idl"); -const sdkDir = path.join(__dirname, "tests", "generated"); -const binaryInstallDir = path.join(__dirname, ".crates"); - -module.exports = { - idlGenerator: "shank", - programName: "car_rental_service", - idlDir, - sdkDir, - binaryInstallDir, - programDir, -}; -``` - -Generate the client: - -```bash -pnpm solita -``` - -The generated TypeScript lands in `tests/generated/`. diff --git a/tools/shank-and-solita/native/package.json b/tools/shank-and-solita/native/package.json deleted file mode 100644 index ec6f5867..00000000 --- a/tools/shank-and-solita/native/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "scripts": { - "test": "ts-mocha -p ./tests/tsconfig.test.json -t 1000000 ./tests/test.ts" - }, - "devDependencies": { - "@metaplex-foundation/solita": "^0.19.3", - "@types/chai": "^4.3.4", - "@types/mocha": "^10.0.1", - "chai": "^4.3.7", - "mocha": "^10.2.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.9.4" - } -} diff --git a/tools/shank-and-solita/native/program/Cargo.toml b/tools/shank-and-solita/native/program/Cargo.toml deleted file mode 100644 index f5aa22b3..00000000 --- a/tools/shank-and-solita/native/program/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "car-rental-service" -version = "0.1.0" -edition = "2021" - -[dependencies] -borsh = "0.9.3" -borsh-derive = "0.9.3" -shank = "0.0.12" -solana-program = "1.14.13" - -[lib] -crate-type = ["cdylib", "lib"] diff --git a/tools/shank-and-solita/native/program/src/instructions/mod.rs b/tools/shank-and-solita/native/program/src/instructions/mod.rs deleted file mode 100644 index c03dd8a5..00000000 --- a/tools/shank-and-solita/native/program/src/instructions/mod.rs +++ /dev/null @@ -1,55 +0,0 @@ -pub mod add_car; -pub mod book_rental; -pub mod pick_up_car; -pub mod return_car; - -pub use add_car::*; -pub use book_rental::*; -pub use pick_up_car::*; -pub use return_car::*; - -use { - borsh::{ - BorshDeserialize, - BorshSerialize, - }, - shank::ShankInstruction, -}; - -#[derive(BorshDeserialize, BorshSerialize, Clone, Debug, ShankInstruction)] -pub enum CarRentalServiceInstruction { - - #[account(0, writable, name="car_account", - desc="The account that will represent the Car being created")] - #[account(1, writable, name="payer", - desc = "Fee payer")] - #[account(2, name="system_program", - desc = "The System Program")] - AddCar(AddCarArgs), - - #[account(0, writable, name="rental_account", - desc="The account that will represent the actual order for the rental")] - #[account(1, name="car_account", - desc="The account representing the Car being rented in this order")] - #[account(2, writable, name="payer", - desc = "Fee payer")] - #[account(3, name="system_program", - desc = "The System Program")] - BookRental(BookRentalArgs), - - #[account(0, writable, name="rental_account", - desc="The account representing the active rental")] - #[account(1, name="car_account", - desc="The account representing the Car being rented in this order")] - #[account(2, writable, name="payer", - desc = "Fee payer")] - PickUpCar, - - #[account(0, writable, name="rental_account", - desc="The account representing the active rental")] - #[account(1, name="car_account", - desc="The account representing the Car being rented in this order")] - #[account(2, writable, name="payer", - desc = "Fee payer")] - ReturnCar, -} \ No newline at end of file diff --git a/tools/shank-and-solita/native/program/src/state/mod.rs b/tools/shank-and-solita/native/program/src/state/mod.rs deleted file mode 100644 index 109f2af4..00000000 --- a/tools/shank-and-solita/native/program/src/state/mod.rs +++ /dev/null @@ -1,48 +0,0 @@ -use { - borsh::{ - BorshDeserialize, - BorshSerialize - }, - shank::ShankAccount, - solana_program::pubkey::Pubkey, -}; - -#[derive(BorshDeserialize, BorshSerialize, Clone, Debug, ShankAccount)] -#[seeds( - "car", - program_id, - make("The car's make", String), - model("The car's model", String), -)] -pub struct Car { - pub year: u16, - pub make: String, - pub model: String, -} - -#[derive(BorshDeserialize, BorshSerialize, Clone, Debug)] -pub enum RentalOrderStatus { - Created, - PickedUp, - Returned, -} - -#[derive(BorshDeserialize, BorshSerialize, Clone, Debug, ShankAccount)] -#[seeds( - "rental_order", - program_id, - car_public_key("The car's public key", Pubkey), - payer_public_key("The payer's public key", Pubkey), -)] -pub struct RentalOrder { - pub car: Pubkey, - pub name: String, - pub pick_up_date: String, - pub return_date: String, - pub price: u64, - pub status: RentalOrderStatus, -} - -impl RentalOrder { - pub const SEED_PREFIX: &'static str = "rental_order"; -} diff --git a/tools/shank-and-solita/native/tests/generated/accounts/Car.ts b/tools/shank-and-solita/native/tests/generated/accounts/Car.ts deleted file mode 100644 index 9b046922..00000000 --- a/tools/shank-and-solita/native/tests/generated/accounts/Car.ts +++ /dev/null @@ -1,148 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as beet from "@metaplex-foundation/beet"; -import * as beetSolana from "@metaplex-foundation/beet-solana"; -import * as web3 from "@solana/web3.js"; - -/** - * Arguments used to create {@link Car} - * @category Accounts - * @category generated - */ -export type CarArgs = { - year: number; - make: string; - model: string; -}; -/** - * Holds the data for the {@link Car} Account and provides de/serialization - * functionality for that data - * - * @category Accounts - * @category generated - */ -export class Car implements CarArgs { - private constructor( - readonly year: number, - readonly make: string, - readonly model: string, - ) {} - - /** - * Creates a {@link Car} instance from the provided args. - */ - static fromArgs(args: CarArgs) { - return new Car(args.year, args.make, args.model); - } - - /** - * Deserializes the {@link Car} from the data of the provided {@link web3.AccountInfo}. - * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. - */ - static fromAccountInfo(accountInfo: web3.AccountInfo, offset = 0): [Car, number] { - return Car.deserialize(accountInfo.data, offset); - } - - /** - * Retrieves the account info from the provided address and deserializes - * the {@link Car} from its data. - * - * @throws Error if no account info is found at the address or if deserialization fails - */ - static async fromAccountAddress( - connection: web3.Connection, - address: web3.PublicKey, - commitmentOrConfig?: web3.Commitment | web3.GetAccountInfoConfig, - ): Promise { - const accountInfo = await connection.getAccountInfo(address, commitmentOrConfig); - if (accountInfo == null) { - throw new Error(`Unable to find Car account at ${address}`); - } - return Car.fromAccountInfo(accountInfo, 0)[0]; - } - - /** - * Provides a {@link web3.Connection.getProgramAccounts} config builder, - * to fetch accounts matching filters that can be specified via that builder. - * - * @param programId - the program that owns the accounts we are filtering - */ - static gpaBuilder(programId: web3.PublicKey = new web3.PublicKey("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ")) { - return beetSolana.GpaBuilder.fromStruct(programId, carBeet); - } - - /** - * Deserializes the {@link Car} from the provided data Buffer. - * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. - */ - static deserialize(buf: Buffer, offset = 0): [Car, number] { - return carBeet.deserialize(buf, offset); - } - - /** - * Serializes the {@link Car} into a Buffer. - * @returns a tuple of the created Buffer and the offset up to which the buffer was written to store it. - */ - serialize(): [Buffer, number] { - return carBeet.serialize(this); - } - - /** - * Returns the byteSize of a {@link Buffer} holding the serialized data of - * {@link Car} for the provided args. - * - * @param args need to be provided since the byte size for this account - * depends on them - */ - static byteSize(args: CarArgs) { - const instance = Car.fromArgs(args); - return carBeet.toFixedFromValue(instance).byteSize; - } - - /** - * Fetches the minimum balance needed to exempt an account holding - * {@link Car} data from rent - * - * @param args need to be provided since the byte size for this account - * depends on them - * @param connection used to retrieve the rent exemption information - */ - static async getMinimumBalanceForRentExemption( - args: CarArgs, - connection: web3.Connection, - commitment?: web3.Commitment, - ): Promise { - return connection.getMinimumBalanceForRentExemption(Car.byteSize(args), commitment); - } - - /** - * Returns a readable version of {@link Car} properties - * and can be used to convert to JSON and/or logging - */ - pretty() { - return { - year: this.year, - make: this.make, - model: this.model, - }; - } -} - -/** - * @category Accounts - * @category generated - */ -export const carBeet = new beet.FixableBeetStruct( - [ - ["year", beet.u16], - ["make", beet.utf8String], - ["model", beet.utf8String], - ], - Car.fromArgs, - "Car", -); diff --git a/tools/shank-and-solita/native/tests/generated/accounts/RentalOrder.ts b/tools/shank-and-solita/native/tests/generated/accounts/RentalOrder.ts deleted file mode 100644 index 45886160..00000000 --- a/tools/shank-and-solita/native/tests/generated/accounts/RentalOrder.ts +++ /dev/null @@ -1,171 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as beet from "@metaplex-foundation/beet"; -import * as beetSolana from "@metaplex-foundation/beet-solana"; -import * as web3 from "@solana/web3.js"; -import { RentalOrderStatus, rentalOrderStatusBeet } from "../types/RentalOrderStatus"; - -/** - * Arguments used to create {@link RentalOrder} - * @category Accounts - * @category generated - */ -export type RentalOrderArgs = { - car: web3.PublicKey; - name: string; - pickUpDate: string; - returnDate: string; - price: beet.bignum; - status: RentalOrderStatus; -}; -/** - * Holds the data for the {@link RentalOrder} Account and provides de/serialization - * functionality for that data - * - * @category Accounts - * @category generated - */ -export class RentalOrder implements RentalOrderArgs { - private constructor( - readonly car: web3.PublicKey, - readonly name: string, - readonly pickUpDate: string, - readonly returnDate: string, - readonly price: beet.bignum, - readonly status: RentalOrderStatus, - ) {} - - /** - * Creates a {@link RentalOrder} instance from the provided args. - */ - static fromArgs(args: RentalOrderArgs) { - return new RentalOrder(args.car, args.name, args.pickUpDate, args.returnDate, args.price, args.status); - } - - /** - * Deserializes the {@link RentalOrder} from the data of the provided {@link web3.AccountInfo}. - * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. - */ - static fromAccountInfo(accountInfo: web3.AccountInfo, offset = 0): [RentalOrder, number] { - return RentalOrder.deserialize(accountInfo.data, offset); - } - - /** - * Retrieves the account info from the provided address and deserializes - * the {@link RentalOrder} from its data. - * - * @throws Error if no account info is found at the address or if deserialization fails - */ - static async fromAccountAddress( - connection: web3.Connection, - address: web3.PublicKey, - commitmentOrConfig?: web3.Commitment | web3.GetAccountInfoConfig, - ): Promise { - const accountInfo = await connection.getAccountInfo(address, commitmentOrConfig); - if (accountInfo == null) { - throw new Error(`Unable to find RentalOrder account at ${address}`); - } - return RentalOrder.fromAccountInfo(accountInfo, 0)[0]; - } - - /** - * Provides a {@link web3.Connection.getProgramAccounts} config builder, - * to fetch accounts matching filters that can be specified via that builder. - * - * @param programId - the program that owns the accounts we are filtering - */ - static gpaBuilder(programId: web3.PublicKey = new web3.PublicKey("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ")) { - return beetSolana.GpaBuilder.fromStruct(programId, rentalOrderBeet); - } - - /** - * Deserializes the {@link RentalOrder} from the provided data Buffer. - * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. - */ - static deserialize(buf: Buffer, offset = 0): [RentalOrder, number] { - return rentalOrderBeet.deserialize(buf, offset); - } - - /** - * Serializes the {@link RentalOrder} into a Buffer. - * @returns a tuple of the created Buffer and the offset up to which the buffer was written to store it. - */ - serialize(): [Buffer, number] { - return rentalOrderBeet.serialize(this); - } - - /** - * Returns the byteSize of a {@link Buffer} holding the serialized data of - * {@link RentalOrder} for the provided args. - * - * @param args need to be provided since the byte size for this account - * depends on them - */ - static byteSize(args: RentalOrderArgs) { - const instance = RentalOrder.fromArgs(args); - return rentalOrderBeet.toFixedFromValue(instance).byteSize; - } - - /** - * Fetches the minimum balance needed to exempt an account holding - * {@link RentalOrder} data from rent - * - * @param args need to be provided since the byte size for this account - * depends on them - * @param connection used to retrieve the rent exemption information - */ - static async getMinimumBalanceForRentExemption( - args: RentalOrderArgs, - connection: web3.Connection, - commitment?: web3.Commitment, - ): Promise { - return connection.getMinimumBalanceForRentExemption(RentalOrder.byteSize(args), commitment); - } - - /** - * Returns a readable version of {@link RentalOrder} properties - * and can be used to convert to JSON and/or logging - */ - pretty() { - return { - car: this.car.toBase58(), - name: this.name, - pickUpDate: this.pickUpDate, - returnDate: this.returnDate, - price: (() => { - const x = <{ toNumber: () => number }>this.price; - if (typeof x.toNumber === "function") { - try { - return x.toNumber(); - } catch (_) { - return x; - } - } - return x; - })(), - status: `RentalOrderStatus.${RentalOrderStatus[this.status]}`, - }; - } -} - -/** - * @category Accounts - * @category generated - */ -export const rentalOrderBeet = new beet.FixableBeetStruct( - [ - ["car", beetSolana.publicKey], - ["name", beet.utf8String], - ["pickUpDate", beet.utf8String], - ["returnDate", beet.utf8String], - ["price", beet.u64], - ["status", rentalOrderStatusBeet], - ], - RentalOrder.fromArgs, - "RentalOrder", -); diff --git a/tools/shank-and-solita/native/tests/generated/accounts/index.ts b/tools/shank-and-solita/native/tests/generated/accounts/index.ts deleted file mode 100644 index 6b514469..00000000 --- a/tools/shank-and-solita/native/tests/generated/accounts/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./Car"; -export * from "./RentalOrder"; - -import { Car } from "./Car"; -import { RentalOrder } from "./RentalOrder"; - -export const accountProviders = { Car, RentalOrder }; diff --git a/tools/shank-and-solita/native/tests/generated/index.ts b/tools/shank-and-solita/native/tests/generated/index.ts deleted file mode 100644 index deb4a091..00000000 --- a/tools/shank-and-solita/native/tests/generated/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { PublicKey } from "@solana/web3.js"; - -export * from "./accounts"; -export * from "./instructions"; -export * from "./types"; - -/** - * Program address - * - * @category constants - * @category generated - */ -export const PROGRAM_ADDRESS = "8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"; - -/** - * Program public key - * - * @category constants - * @category generated - */ -export const PROGRAM_ID = new PublicKey(PROGRAM_ADDRESS); diff --git a/tools/shank-and-solita/native/tests/generated/instructions/AddCar.ts b/tools/shank-and-solita/native/tests/generated/instructions/AddCar.ts deleted file mode 100644 index 38a644ed..00000000 --- a/tools/shank-and-solita/native/tests/generated/instructions/AddCar.ts +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as beet from "@metaplex-foundation/beet"; -import * as web3 from "@solana/web3.js"; -import { type AddCarArgs, addCarArgsBeet } from "../types/AddCarArgs"; - -/** - * @category Instructions - * @category AddCar - * @category generated - */ -export type AddCarInstructionArgs = { - addCarArgs: AddCarArgs; -}; -/** - * @category Instructions - * @category AddCar - * @category generated - */ -export const AddCarStruct = new beet.FixableBeetArgsStruct< - AddCarInstructionArgs & { - instructionDiscriminator: number; - } ->( - [ - ["instructionDiscriminator", beet.u8], - ["addCarArgs", addCarArgsBeet], - ], - "AddCarInstructionArgs", -); -/** - * Accounts required by the _AddCar_ instruction - * - * @property [_writable_] carAccount The account that will represent the Car being created - * @property [_writable_] payer Fee payer - * @category Instructions - * @category AddCar - * @category generated - */ -export type AddCarInstructionAccounts = { - carAccount: web3.PublicKey; - payer: web3.PublicKey; - systemProgram?: web3.PublicKey; -}; - -export const addCarInstructionDiscriminator = 0; - -/** - * Creates a _AddCar_ instruction. - * - * @param accounts that will be accessed while the instruction is processed - * @param args to provide as instruction data to the program - * - * @category Instructions - * @category AddCar - * @category generated - */ -export function createAddCarInstruction( - accounts: AddCarInstructionAccounts, - args: AddCarInstructionArgs, - programId = new web3.PublicKey("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"), -) { - const [data] = AddCarStruct.serialize({ - instructionDiscriminator: addCarInstructionDiscriminator, - ...args, - }); - const keys: web3.AccountMeta[] = [ - { - pubkey: accounts.carAccount, - isWritable: true, - isSigner: false, - }, - { - pubkey: accounts.payer, - isWritable: true, - isSigner: false, - }, - { - pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, - isWritable: false, - isSigner: false, - }, - ]; - - const ix = new web3.TransactionInstruction({ - programId, - keys, - data, - }); - return ix; -} diff --git a/tools/shank-and-solita/native/tests/generated/instructions/BookRental.ts b/tools/shank-and-solita/native/tests/generated/instructions/BookRental.ts deleted file mode 100644 index 4b2ec9e2..00000000 --- a/tools/shank-and-solita/native/tests/generated/instructions/BookRental.ts +++ /dev/null @@ -1,103 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as beet from "@metaplex-foundation/beet"; -import * as web3 from "@solana/web3.js"; -import { type BookRentalArgs, bookRentalArgsBeet } from "../types/BookRentalArgs"; - -/** - * @category Instructions - * @category BookRental - * @category generated - */ -export type BookRentalInstructionArgs = { - bookRentalArgs: BookRentalArgs; -}; -/** - * @category Instructions - * @category BookRental - * @category generated - */ -export const BookRentalStruct = new beet.FixableBeetArgsStruct< - BookRentalInstructionArgs & { - instructionDiscriminator: number; - } ->( - [ - ["instructionDiscriminator", beet.u8], - ["bookRentalArgs", bookRentalArgsBeet], - ], - "BookRentalInstructionArgs", -); -/** - * Accounts required by the _BookRental_ instruction - * - * @property [_writable_] rentalAccount The account that will represent the actual order for the rental - * @property [] carAccount The account representing the Car being rented in this order - * @property [_writable_] payer Fee payer - * @category Instructions - * @category BookRental - * @category generated - */ -export type BookRentalInstructionAccounts = { - rentalAccount: web3.PublicKey; - carAccount: web3.PublicKey; - payer: web3.PublicKey; - systemProgram?: web3.PublicKey; -}; - -export const bookRentalInstructionDiscriminator = 1; - -/** - * Creates a _BookRental_ instruction. - * - * @param accounts that will be accessed while the instruction is processed - * @param args to provide as instruction data to the program - * - * @category Instructions - * @category BookRental - * @category generated - */ -export function createBookRentalInstruction( - accounts: BookRentalInstructionAccounts, - args: BookRentalInstructionArgs, - programId = new web3.PublicKey("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"), -) { - const [data] = BookRentalStruct.serialize({ - instructionDiscriminator: bookRentalInstructionDiscriminator, - ...args, - }); - const keys: web3.AccountMeta[] = [ - { - pubkey: accounts.rentalAccount, - isWritable: true, - isSigner: false, - }, - { - pubkey: accounts.carAccount, - isWritable: false, - isSigner: false, - }, - { - pubkey: accounts.payer, - isWritable: true, - isSigner: false, - }, - { - pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, - isWritable: false, - isSigner: false, - }, - ]; - - const ix = new web3.TransactionInstruction({ - programId, - keys, - data, - }); - return ix; -} diff --git a/tools/shank-and-solita/native/tests/generated/instructions/PickUpCar.ts b/tools/shank-and-solita/native/tests/generated/instructions/PickUpCar.ts deleted file mode 100644 index 329a6fce..00000000 --- a/tools/shank-and-solita/native/tests/generated/instructions/PickUpCar.ts +++ /dev/null @@ -1,76 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as beet from "@metaplex-foundation/beet"; -import * as web3 from "@solana/web3.js"; - -/** - * @category Instructions - * @category PickUpCar - * @category generated - */ -export const PickUpCarStruct = new beet.BeetArgsStruct<{ - instructionDiscriminator: number; -}>([["instructionDiscriminator", beet.u8]], "PickUpCarInstructionArgs"); -/** - * Accounts required by the _PickUpCar_ instruction - * - * @property [_writable_] rentalAccount The account representing the active rental - * @property [] carAccount The account representing the Car being rented in this order - * @property [_writable_] payer Fee payer - * @category Instructions - * @category PickUpCar - * @category generated - */ -export type PickUpCarInstructionAccounts = { - rentalAccount: web3.PublicKey; - carAccount: web3.PublicKey; - payer: web3.PublicKey; -}; - -export const pickUpCarInstructionDiscriminator = 2; - -/** - * Creates a _PickUpCar_ instruction. - * - * @param accounts that will be accessed while the instruction is processed - * @category Instructions - * @category PickUpCar - * @category generated - */ -export function createPickUpCarInstruction( - accounts: PickUpCarInstructionAccounts, - programId = new web3.PublicKey("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"), -) { - const [data] = PickUpCarStruct.serialize({ - instructionDiscriminator: pickUpCarInstructionDiscriminator, - }); - const keys: web3.AccountMeta[] = [ - { - pubkey: accounts.rentalAccount, - isWritable: true, - isSigner: false, - }, - { - pubkey: accounts.carAccount, - isWritable: false, - isSigner: false, - }, - { - pubkey: accounts.payer, - isWritable: true, - isSigner: false, - }, - ]; - - const ix = new web3.TransactionInstruction({ - programId, - keys, - data, - }); - return ix; -} diff --git a/tools/shank-and-solita/native/tests/generated/instructions/ReturnCar.ts b/tools/shank-and-solita/native/tests/generated/instructions/ReturnCar.ts deleted file mode 100644 index 1a7dc0e0..00000000 --- a/tools/shank-and-solita/native/tests/generated/instructions/ReturnCar.ts +++ /dev/null @@ -1,76 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as beet from "@metaplex-foundation/beet"; -import * as web3 from "@solana/web3.js"; - -/** - * @category Instructions - * @category ReturnCar - * @category generated - */ -export const ReturnCarStruct = new beet.BeetArgsStruct<{ - instructionDiscriminator: number; -}>([["instructionDiscriminator", beet.u8]], "ReturnCarInstructionArgs"); -/** - * Accounts required by the _ReturnCar_ instruction - * - * @property [_writable_] rentalAccount The account representing the active rental - * @property [] carAccount The account representing the Car being rented in this order - * @property [_writable_] payer Fee payer - * @category Instructions - * @category ReturnCar - * @category generated - */ -export type ReturnCarInstructionAccounts = { - rentalAccount: web3.PublicKey; - carAccount: web3.PublicKey; - payer: web3.PublicKey; -}; - -export const returnCarInstructionDiscriminator = 3; - -/** - * Creates a _ReturnCar_ instruction. - * - * @param accounts that will be accessed while the instruction is processed - * @category Instructions - * @category ReturnCar - * @category generated - */ -export function createReturnCarInstruction( - accounts: ReturnCarInstructionAccounts, - programId = new web3.PublicKey("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"), -) { - const [data] = ReturnCarStruct.serialize({ - instructionDiscriminator: returnCarInstructionDiscriminator, - }); - const keys: web3.AccountMeta[] = [ - { - pubkey: accounts.rentalAccount, - isWritable: true, - isSigner: false, - }, - { - pubkey: accounts.carAccount, - isWritable: false, - isSigner: false, - }, - { - pubkey: accounts.payer, - isWritable: true, - isSigner: false, - }, - ]; - - const ix = new web3.TransactionInstruction({ - programId, - keys, - data, - }); - return ix; -} diff --git a/tools/shank-and-solita/native/tests/generated/instructions/index.ts b/tools/shank-and-solita/native/tests/generated/instructions/index.ts deleted file mode 100644 index f1522543..00000000 --- a/tools/shank-and-solita/native/tests/generated/instructions/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./AddCar"; -export * from "./BookRental"; -export * from "./PickUpCar"; -export * from "./ReturnCar"; diff --git a/tools/shank-and-solita/native/tests/generated/types/AddCarArgs.ts b/tools/shank-and-solita/native/tests/generated/types/AddCarArgs.ts deleted file mode 100644 index 72be6064..00000000 --- a/tools/shank-and-solita/native/tests/generated/types/AddCarArgs.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as beet from "@metaplex-foundation/beet"; -export type AddCarArgs = { - year: number; - make: string; - model: string; -}; - -/** - * @category userTypes - * @category generated - */ -export const addCarArgsBeet = new beet.FixableBeetArgsStruct( - [ - ["year", beet.u16], - ["make", beet.utf8String], - ["model", beet.utf8String], - ], - "AddCarArgs", -); diff --git a/tools/shank-and-solita/native/tests/generated/types/BookRentalArgs.ts b/tools/shank-and-solita/native/tests/generated/types/BookRentalArgs.ts deleted file mode 100644 index f236b7ef..00000000 --- a/tools/shank-and-solita/native/tests/generated/types/BookRentalArgs.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as beet from "@metaplex-foundation/beet"; -export type BookRentalArgs = { - name: string; - pickUpDate: string; - returnDate: string; - price: beet.bignum; -}; - -/** - * @category userTypes - * @category generated - */ -export const bookRentalArgsBeet = new beet.FixableBeetArgsStruct( - [ - ["name", beet.utf8String], - ["pickUpDate", beet.utf8String], - ["returnDate", beet.utf8String], - ["price", beet.u64], - ], - "BookRentalArgs", -); diff --git a/tools/shank-and-solita/native/tests/generated/types/RentalOrderStatus.ts b/tools/shank-and-solita/native/tests/generated/types/RentalOrderStatus.ts deleted file mode 100644 index 66d5f5a1..00000000 --- a/tools/shank-and-solita/native/tests/generated/types/RentalOrderStatus.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as beet from "@metaplex-foundation/beet"; -/** - * @category enums - * @category generated - */ -export enum RentalOrderStatus { - Created = 0, - PickedUp = 1, - Returned = 2, -} - -/** - * @category userTypes - * @category generated - */ -export const rentalOrderStatusBeet = beet.fixedScalarEnum(RentalOrderStatus) as beet.FixedSizeBeet< - RentalOrderStatus, - RentalOrderStatus ->; diff --git a/tools/shank-and-solita/native/tests/generated/types/index.ts b/tools/shank-and-solita/native/tests/generated/types/index.ts deleted file mode 100644 index dc2300b8..00000000 --- a/tools/shank-and-solita/native/tests/generated/types/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./AddCarArgs"; -export * from "./BookRentalArgs"; -export * from "./RentalOrderStatus"; diff --git a/tools/shank-and-solita/native/tests/test.ts b/tools/shank-and-solita/native/tests/test.ts deleted file mode 100644 index b1ab61ac..00000000 --- a/tools/shank-and-solita/native/tests/test.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { Connection, Keypair, PublicKey, SystemProgram, sendAndConfirmTransaction, Transaction } from "@solana/web3.js"; -import { describe, it } from "mocha"; -import { - type AddCarArgs, - Car, - createAddCarInstruction, - createBookRentalInstruction, - createPickUpCarInstruction, - createReturnCarInstruction, - RentalOrder, - RentalOrderStatus, -} from "./generated"; - -function loadKeypairFromFile(path: string): Keypair { - return Keypair.fromSecretKey(Buffer.from(JSON.parse(require("node:fs").readFileSync(path, "utf-8")))); -} - -const carBmw: AddCarArgs = { - year: 2020, - make: "BMW", - model: "iX1", -}; - -const carMercedes: AddCarArgs = { - year: 2019, - make: "Mercedes-Benz", - model: "EQS", -}; - -const rentalInfo = { - name: "Fred Flinstone", - pickUpDate: "01/28/2023 8:00 AM", - returnDate: "01/28/2023 10:00 PM", - price: 300, -}; - -describe("Car Rental Service", () => { - const connection = new Connection("https://api.devnet.solana.com", "confirmed"); - const payer = loadKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); - const program = loadKeypairFromFile("./program/target/deploy/car_rental_service-keypair.json"); - - let bmwPublicKey: PublicKey; - let _mercedesPublicKey: PublicKey; - - async function createCar(car: AddCarArgs): Promise { - const carAccountPublicKey = PublicKey.findProgramAddressSync( - [Buffer.from("car"), Buffer.from(car.make), Buffer.from(car.model)], - program.publicKey, - )[0]; - const ix = createAddCarInstruction( - { - carAccount: carAccountPublicKey, - payer: payer.publicKey, - systemProgram: SystemProgram.programId, - }, - { addCarArgs: { ...car } }, - ); - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer], { skipPreflight: true }); - await connection.confirmTransaction(sx); - const carData = await Car.fromAccountAddress(connection, carAccountPublicKey); - console.log("New car created:"); - console.log(` Year : ${carData.year}`); - console.log(` Make : ${carData.make}`); - console.log(` Model : ${carData.model}`); - return carAccountPublicKey; - } - - it("Create a car that can be rented", async () => { - bmwPublicKey = await createCar(carBmw); - }); - it("Create another car that can be rented", async () => { - _mercedesPublicKey = await createCar(carMercedes); - }); - - const evaluateStatus = (status: RentalOrderStatus): string => { - if (status === RentalOrderStatus.Created) return "Created"; - if (status === RentalOrderStatus.PickedUp) return "Picked Up"; - return "Returned"; - }; - - async function printRentalDetails(rentalPublicKey: PublicKey, carPublicKey: PublicKey) { - const rentalData = await RentalOrder.fromAccountAddress(connection, rentalPublicKey); - const carData = await Car.fromAccountAddress(connection, carPublicKey); - console.log("Rental booked:"); - console.log(" Vehicle details:"); - console.log(` Year : ${carData.year}`); - console.log(` Make : ${carData.make}`); - console.log(` Model : ${carData.model}`); - console.log(` Name : ${rentalData.name}`); - console.log(` Pick Up : ${rentalData.pickUpDate}`); - console.log(` Return : ${rentalData.returnDate}`); - console.log(` Price : ${rentalData.price}`); - console.log(` Status : ${evaluateStatus(rentalData.status)}`); - } - - it("Book a new rental", async () => { - const rentalAccountPublicKey = PublicKey.findProgramAddressSync( - [Buffer.from("rental_order"), bmwPublicKey.toBuffer(), payer.publicKey.toBuffer()], - program.publicKey, - )[0]; - const ix = createBookRentalInstruction( - { - rentalAccount: rentalAccountPublicKey, - carAccount: bmwPublicKey, - payer: payer.publicKey, - systemProgram: SystemProgram.programId, - }, - { - bookRentalArgs: { ...rentalInfo }, - }, - ); - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - await connection.confirmTransaction(sx); - await printRentalDetails(rentalAccountPublicKey, bmwPublicKey); - }); - - it("Pick up your rental car", async () => { - const rentalAccountPublicKey = PublicKey.findProgramAddressSync( - [Buffer.from("rental_order"), bmwPublicKey.toBuffer(), payer.publicKey.toBuffer()], - program.publicKey, - )[0]; - const ix = createPickUpCarInstruction({ - rentalAccount: rentalAccountPublicKey, - carAccount: bmwPublicKey, - payer: payer.publicKey, - }); - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - await connection.confirmTransaction(sx); - await printRentalDetails(rentalAccountPublicKey, bmwPublicKey); - }); - - it("Return your rental car", async () => { - const rentalAccountPublicKey = PublicKey.findProgramAddressSync( - [Buffer.from("rental_order"), bmwPublicKey.toBuffer(), payer.publicKey.toBuffer()], - program.publicKey, - )[0]; - const ix = createReturnCarInstruction({ - rentalAccount: rentalAccountPublicKey, - carAccount: bmwPublicKey, - payer: payer.publicKey, - }); - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - await connection.confirmTransaction(sx); - await printRentalDetails(rentalAccountPublicKey, bmwPublicKey); - }); -}); diff --git a/tools/shank-and-solita/native/tests/tsconfig.test.json b/tools/shank-and-solita/native/tests/tsconfig.test.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/tools/shank-and-solita/native/tests/tsconfig.test.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} From 929564e9aba9f38cb6b55131caf2b703b6fd0a5a Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 21:44:03 +0000 Subject: [PATCH 037/138] style(shank-and-codama): biome-format generated client, test, and IDL --- tools/shank-and-codama/native/codama.ts | 2 +- .../program/idl/car_rental_service.json | 54 +++------- .../generated/src/generated/accounts/car.ts | 21 ++-- .../src/generated/accounts/rentalOrder.ts | 21 ++-- .../src/generated/instructions/addCar.ts | 99 ++++++------------- .../src/generated/instructions/bookRental.ts | 96 ++++++------------ .../src/generated/instructions/pickUpCar.ts | 94 ++++++------------ .../src/generated/instructions/returnCar.ts | 94 ++++++------------ .../generated/programs/carRentalService.ts | 56 +++++------ .../src/generated/types/rentalOrderStatus.ts | 14 +-- tools/shank-and-codama/native/tests/test.ts | 20 ++-- 11 files changed, 182 insertions(+), 389 deletions(-) diff --git a/tools/shank-and-codama/native/codama.ts b/tools/shank-and-codama/native/codama.ts index eebe79cc..6117001a 100644 --- a/tools/shank-and-codama/native/codama.ts +++ b/tools/shank-and-codama/native/codama.ts @@ -12,7 +12,7 @@ import { readFileSync, rmSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; -import { rootNodeFromAnchor, type AnchorIdl } from "@codama/nodes-from-anchor"; +import { type AnchorIdl, rootNodeFromAnchor } from "@codama/nodes-from-anchor"; import { renderVisitor } from "@codama/renderers-js"; import { createFromRoot } from "codama"; diff --git a/tools/shank-and-codama/native/program/idl/car_rental_service.json b/tools/shank-and-codama/native/program/idl/car_rental_service.json index 3292978d..bd014148 100644 --- a/tools/shank-and-codama/native/program/idl/car_rental_service.json +++ b/tools/shank-and-codama/native/program/idl/car_rental_service.json @@ -9,25 +9,19 @@ "name": "carAccount", "isMut": true, "isSigner": false, - "docs": [ - "The account that will represent the Car being created" - ] + "docs": ["The account that will represent the Car being created"] }, { "name": "payer", "isMut": true, "isSigner": false, - "docs": [ - "Fee payer" - ] + "docs": ["Fee payer"] }, { "name": "systemProgram", "isMut": false, "isSigner": false, - "docs": [ - "The System Program" - ] + "docs": ["The System Program"] } ], "args": [ @@ -50,33 +44,25 @@ "name": "rentalAccount", "isMut": true, "isSigner": false, - "docs": [ - "The account that will represent the actual order for the rental" - ] + "docs": ["The account that will represent the actual order for the rental"] }, { "name": "carAccount", "isMut": false, "isSigner": false, - "docs": [ - "The account representing the Car being rented in this order" - ] + "docs": ["The account representing the Car being rented in this order"] }, { "name": "payer", "isMut": true, "isSigner": false, - "docs": [ - "Fee payer" - ] + "docs": ["Fee payer"] }, { "name": "systemProgram", "isMut": false, "isSigner": false, - "docs": [ - "The System Program" - ] + "docs": ["The System Program"] } ], "args": [ @@ -99,25 +85,19 @@ "name": "rentalAccount", "isMut": true, "isSigner": false, - "docs": [ - "The account representing the active rental" - ] + "docs": ["The account representing the active rental"] }, { "name": "carAccount", "isMut": false, "isSigner": false, - "docs": [ - "The account representing the Car being rented in this order" - ] + "docs": ["The account representing the Car being rented in this order"] }, { "name": "payer", "isMut": true, "isSigner": false, - "docs": [ - "Fee payer" - ] + "docs": ["Fee payer"] } ], "args": [], @@ -133,25 +113,19 @@ "name": "rentalAccount", "isMut": true, "isSigner": false, - "docs": [ - "The account representing the active rental" - ] + "docs": ["The account representing the active rental"] }, { "name": "carAccount", "isMut": false, "isSigner": false, - "docs": [ - "The account representing the Car being rented in this order" - ] + "docs": ["The account representing the Car being rented in this order"] }, { "name": "payer", "isMut": true, "isSigner": false, - "docs": [ - "Fee payer" - ] + "docs": ["Fee payer"] } ], "args": [], @@ -284,4 +258,4 @@ "origin": "shank", "address": "8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ" } -} \ No newline at end of file +} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts index 871f35d6..1da00ac7 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts @@ -7,12 +7,20 @@ */ import { + type Account, + type Address, addDecoderSizePrefix, addEncoderSizePrefix, assertAccountExists, assertAccountsExist, + type Codec, combineCodec, + type Decoder, decodeAccount, + type EncodedAccount, + type Encoder, + type FetchAccountConfig, + type FetchAccountsConfig, fetchEncodedAccount, fetchEncodedAccounts, getStructDecoder, @@ -23,14 +31,6 @@ import { getU32Encoder, getUtf8Decoder, getUtf8Encoder, - type Account, - type Address, - type Codec, - type Decoder, - type EncodedAccount, - type Encoder, - type FetchAccountConfig, - type FetchAccountsConfig, type MaybeAccount, type MaybeEncodedAccount, } from "@solana/kit"; @@ -71,10 +71,7 @@ export function decodeCar( export function decodeCar( encodedAccount: EncodedAccount | MaybeEncodedAccount, ): Account | MaybeAccount { - return decodeAccount( - encodedAccount as MaybeEncodedAccount, - getCarDecoder(), - ); + return decodeAccount(encodedAccount as MaybeEncodedAccount, getCarDecoder()); } export async function fetchCar( diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts index 539854a1..668a53c9 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts @@ -7,12 +7,20 @@ */ import { + type Account, + type Address, addDecoderSizePrefix, addEncoderSizePrefix, assertAccountExists, assertAccountsExist, + type Codec, combineCodec, + type Decoder, decodeAccount, + type EncodedAccount, + type Encoder, + type FetchAccountConfig, + type FetchAccountsConfig, fetchEncodedAccount, fetchEncodedAccounts, getAddressDecoder, @@ -25,14 +33,6 @@ import { getU64Encoder, getUtf8Decoder, getUtf8Encoder, - type Account, - type Address, - type Codec, - type Decoder, - type EncodedAccount, - type Encoder, - type FetchAccountConfig, - type FetchAccountsConfig, type MaybeAccount, type MaybeEncodedAccount, } from "@solana/kit"; @@ -99,10 +99,7 @@ export function decodeRentalOrder( export function decodeRentalOrder( encodedAccount: EncodedAccount | MaybeEncodedAccount, ): Account | MaybeAccount { - return decodeAccount( - encodedAccount as MaybeEncodedAccount, - getRentalOrderDecoder(), - ); + return decodeAccount(encodedAccount as MaybeEncodedAccount, getRentalOrderDecoder()); } export async function fetchRentalOrder( diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts index 3ef59108..eed0d904 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts @@ -7,38 +7,35 @@ */ import { + type AccountMeta, + type Address, addDecoderSizePrefix, addEncoderSizePrefix, + type Codec, combineCodec, + type Decoder, + type Encoder, getStructDecoder, getStructEncoder, + getU8Decoder, + getU8Encoder, getU16Decoder, getU16Encoder, getU32Decoder, getU32Encoder, - getU8Decoder, - getU8Encoder, getUtf8Decoder, getUtf8Encoder, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - transformEncoder, - type AccountMeta, - type Address, - type Codec, - type Decoder, - type Encoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, + transformEncoder, type WritableAccount, } from "@solana/kit"; -import { - getAccountMetaFactory, - type ResolvedInstructionAccount, -} from "@solana/program-client-core"; +import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; export const ADD_CAR_DISCRIMINATOR = 0; @@ -51,22 +48,15 @@ export type AddCarInstruction< TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, TAccountCarAccount extends string | AccountMeta = string, TAccountPayer extends string | AccountMeta = string, - TAccountSystemProgram extends string | AccountMeta = - "11111111111111111111111111111111", + TAccountSystemProgram extends string | AccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ - TAccountCarAccount extends string - ? WritableAccount - : TAccountCarAccount, - TAccountPayer extends string - ? WritableAccount - : TAccountPayer, - TAccountSystemProgram extends string - ? ReadonlyAccount - : TAccountSystemProgram, + TAccountCarAccount extends string ? WritableAccount : TAccountCarAccount, + TAccountPayer extends string ? WritableAccount : TAccountPayer, + TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, ...TRemainingAccounts, ] >; @@ -105,14 +95,8 @@ export function getAddCarInstructionDataDecoder(): Decoder { - return combineCodec( - getAddCarInstructionDataEncoder(), - getAddCarInstructionDataDecoder(), - ); +export function getAddCarInstructionDataCodec(): Codec { + return combineCodec(getAddCarInstructionDataEncoder(), getAddCarInstructionDataDecoder()); } export type AddCarInput< @@ -139,15 +123,9 @@ export function getAddCarInstruction< >( input: AddCarInput, config?: { programAddress?: TProgramAddress }, -): AddCarInstruction< - TProgramAddress, - TAccountCarAccount, - TAccountPayer, - TAccountSystemProgram -> { +): AddCarInstruction { // Program address. - const programAddress = - config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { @@ -155,18 +133,14 @@ export function getAddCarInstruction< payer: { value: input.payer ?? null, isWritable: true }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, }; - const accounts = originalAccounts as Record< - keyof typeof originalAccounts, - ResolvedInstructionAccount - >; + const accounts = originalAccounts as Record; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = - "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); @@ -176,16 +150,9 @@ export function getAddCarInstruction< getAccountMeta("payer", accounts.payer), getAccountMeta("systemProgram", accounts.systemProgram), ], - data: getAddCarInstructionDataEncoder().encode( - args as AddCarInstructionDataArgs, - ), + data: getAddCarInstructionDataEncoder().encode(args as AddCarInstructionDataArgs), programAddress, - } as AddCarInstruction< - TProgramAddress, - TAccountCarAccount, - TAccountPayer, - TAccountSystemProgram - >); + } as AddCarInstruction); } export type ParsedAddCarInstruction< @@ -204,22 +171,14 @@ export type ParsedAddCarInstruction< data: AddCarInstructionData; }; -export function parseAddCarInstruction< - TProgram extends string, - TAccountMetas extends readonly AccountMeta[], ->( - instruction: Instruction & - InstructionWithAccounts & - InstructionWithData, +export function parseAddCarInstruction( + instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedAddCarInstruction { if (instruction.accounts.length < 3) { - throw new SolanaError( - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 3, - }, - ); + throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 3, + }); } let accountIndex = 0; const getNextAccount = () => { diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts index 64465322..d0324b70 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts @@ -7,38 +7,35 @@ */ import { + type AccountMeta, + type Address, addDecoderSizePrefix, addEncoderSizePrefix, + type Codec, combineCodec, + type Decoder, + type Encoder, getStructDecoder, getStructEncoder, + getU8Decoder, + getU8Encoder, getU32Decoder, getU32Encoder, getU64Decoder, getU64Encoder, - getU8Decoder, - getU8Encoder, getUtf8Decoder, getUtf8Encoder, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - transformEncoder, - type AccountMeta, - type Address, - type Codec, - type Decoder, - type Encoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, + transformEncoder, type WritableAccount, } from "@solana/kit"; -import { - getAccountMetaFactory, - type ResolvedInstructionAccount, -} from "@solana/program-client-core"; +import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; export const BOOK_RENTAL_DISCRIMINATOR = 1; @@ -52,25 +49,16 @@ export type BookRentalInstruction< TAccountRentalAccount extends string | AccountMeta = string, TAccountCarAccount extends string | AccountMeta = string, TAccountPayer extends string | AccountMeta = string, - TAccountSystemProgram extends string | AccountMeta = - "11111111111111111111111111111111", + TAccountSystemProgram extends string | AccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ - TAccountRentalAccount extends string - ? WritableAccount - : TAccountRentalAccount, - TAccountCarAccount extends string - ? ReadonlyAccount - : TAccountCarAccount, - TAccountPayer extends string - ? WritableAccount - : TAccountPayer, - TAccountSystemProgram extends string - ? ReadonlyAccount - : TAccountSystemProgram, + TAccountRentalAccount extends string ? WritableAccount : TAccountRentalAccount, + TAccountCarAccount extends string ? ReadonlyAccount : TAccountCarAccount, + TAccountPayer extends string ? WritableAccount : TAccountPayer, + TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, ...TRemainingAccounts, ] >; @@ -113,14 +101,8 @@ export function getBookRentalInstructionDataDecoder(): Decoder { - return combineCodec( - getBookRentalInstructionDataEncoder(), - getBookRentalInstructionDataDecoder(), - ); +export function getBookRentalInstructionDataCodec(): Codec { + return combineCodec(getBookRentalInstructionDataEncoder(), getBookRentalInstructionDataDecoder()); } export type BookRentalInput< @@ -150,12 +132,7 @@ export function getBookRentalInstruction< TAccountSystemProgram extends string, TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, >( - input: BookRentalInput< - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer, - TAccountSystemProgram - >, + input: BookRentalInput, config?: { programAddress?: TProgramAddress }, ): BookRentalInstruction< TProgramAddress, @@ -165,8 +142,7 @@ export function getBookRentalInstruction< TAccountSystemProgram > { // Program address. - const programAddress = - config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { @@ -175,18 +151,14 @@ export function getBookRentalInstruction< payer: { value: input.payer ?? null, isWritable: true }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, }; - const accounts = originalAccounts as Record< - keyof typeof originalAccounts, - ResolvedInstructionAccount - >; + const accounts = originalAccounts as Record; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = - "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); @@ -197,9 +169,7 @@ export function getBookRentalInstruction< getAccountMeta("payer", accounts.payer), getAccountMeta("systemProgram", accounts.systemProgram), ], - data: getBookRentalInstructionDataEncoder().encode( - args as BookRentalInstructionDataArgs, - ), + data: getBookRentalInstructionDataEncoder().encode(args as BookRentalInstructionDataArgs), programAddress, } as BookRentalInstruction< TProgramAddress, @@ -228,22 +198,14 @@ export type ParsedBookRentalInstruction< data: BookRentalInstructionData; }; -export function parseBookRentalInstruction< - TProgram extends string, - TAccountMetas extends readonly AccountMeta[], ->( - instruction: Instruction & - InstructionWithAccounts & - InstructionWithData, +export function parseBookRentalInstruction( + instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedBookRentalInstruction { if (instruction.accounts.length < 4) { - throw new SolanaError( - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 4, - }, - ); + throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 4, + }); } let accountIndex = 0; const getNextAccount = () => { diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts index c3ca7b13..a91a2ec0 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts @@ -7,30 +7,27 @@ */ import { - combineCodec, - getStructDecoder, - getStructEncoder, - getU8Decoder, - getU8Encoder, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - transformEncoder, type AccountMeta, type Address, + combineCodec, type FixedSizeCodec, type FixedSizeDecoder, type FixedSizeEncoder, + getStructDecoder, + getStructEncoder, + getU8Decoder, + getU8Encoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, + transformEncoder, type WritableAccount, } from "@solana/kit"; -import { - getAccountMetaFactory, - type ResolvedInstructionAccount, -} from "@solana/program-client-core"; +import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; export const PICK_UP_CAR_DISCRIMINATOR = 2; @@ -49,15 +46,9 @@ export type PickUpCarInstruction< InstructionWithData & InstructionWithAccounts< [ - TAccountRentalAccount extends string - ? WritableAccount - : TAccountRentalAccount, - TAccountCarAccount extends string - ? ReadonlyAccount - : TAccountCarAccount, - TAccountPayer extends string - ? WritableAccount - : TAccountPayer, + TAccountRentalAccount extends string ? WritableAccount : TAccountRentalAccount, + TAccountCarAccount extends string ? ReadonlyAccount : TAccountCarAccount, + TAccountPayer extends string ? WritableAccount : TAccountPayer, ...TRemainingAccounts, ] >; @@ -67,10 +58,10 @@ export type PickUpCarInstructionData = { discriminator: number }; export type PickUpCarInstructionDataArgs = {}; export function getPickUpCarInstructionDataEncoder(): FixedSizeEncoder { - return transformEncoder( - getStructEncoder([["discriminator", getU8Encoder()]]), - (value) => ({ ...value, discriminator: PICK_UP_CAR_DISCRIMINATOR }), - ); + return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ + ...value, + discriminator: PICK_UP_CAR_DISCRIMINATOR, + })); } export function getPickUpCarInstructionDataDecoder(): FixedSizeDecoder { @@ -81,10 +72,7 @@ export function getPickUpCarInstructionDataCodec(): FixedSizeCodec< PickUpCarInstructionDataArgs, PickUpCarInstructionData > { - return combineCodec( - getPickUpCarInstructionDataEncoder(), - getPickUpCarInstructionDataDecoder(), - ); + return combineCodec(getPickUpCarInstructionDataEncoder(), getPickUpCarInstructionDataDecoder()); } export type PickUpCarInput< @@ -106,21 +94,11 @@ export function getPickUpCarInstruction< TAccountPayer extends string, TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, >( - input: PickUpCarInput< - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer - >, + input: PickUpCarInput, config?: { programAddress?: TProgramAddress }, -): PickUpCarInstruction< - TProgramAddress, - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer -> { +): PickUpCarInstruction { // Program address. - const programAddress = - config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { @@ -128,10 +106,7 @@ export function getPickUpCarInstruction< carAccount: { value: input.carAccount ?? null, isWritable: false }, payer: { value: input.payer ?? null, isWritable: true }, }; - const accounts = originalAccounts as Record< - keyof typeof originalAccounts, - ResolvedInstructionAccount - >; + const accounts = originalAccounts as Record; const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ @@ -142,12 +117,7 @@ export function getPickUpCarInstruction< ], data: getPickUpCarInstructionDataEncoder().encode({}), programAddress, - } as PickUpCarInstruction< - TProgramAddress, - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer - >); + } as PickUpCarInstruction); } export type ParsedPickUpCarInstruction< @@ -166,22 +136,14 @@ export type ParsedPickUpCarInstruction< data: PickUpCarInstructionData; }; -export function parsePickUpCarInstruction< - TProgram extends string, - TAccountMetas extends readonly AccountMeta[], ->( - instruction: Instruction & - InstructionWithAccounts & - InstructionWithData, +export function parsePickUpCarInstruction( + instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedPickUpCarInstruction { if (instruction.accounts.length < 3) { - throw new SolanaError( - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 3, - }, - ); + throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 3, + }); } let accountIndex = 0; const getNextAccount = () => { diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts index 2d444a3a..d3ec60a8 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts @@ -7,30 +7,27 @@ */ import { - combineCodec, - getStructDecoder, - getStructEncoder, - getU8Decoder, - getU8Encoder, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - transformEncoder, type AccountMeta, type Address, + combineCodec, type FixedSizeCodec, type FixedSizeDecoder, type FixedSizeEncoder, + getStructDecoder, + getStructEncoder, + getU8Decoder, + getU8Encoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, + transformEncoder, type WritableAccount, } from "@solana/kit"; -import { - getAccountMetaFactory, - type ResolvedInstructionAccount, -} from "@solana/program-client-core"; +import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; export const RETURN_CAR_DISCRIMINATOR = 3; @@ -49,15 +46,9 @@ export type ReturnCarInstruction< InstructionWithData & InstructionWithAccounts< [ - TAccountRentalAccount extends string - ? WritableAccount - : TAccountRentalAccount, - TAccountCarAccount extends string - ? ReadonlyAccount - : TAccountCarAccount, - TAccountPayer extends string - ? WritableAccount - : TAccountPayer, + TAccountRentalAccount extends string ? WritableAccount : TAccountRentalAccount, + TAccountCarAccount extends string ? ReadonlyAccount : TAccountCarAccount, + TAccountPayer extends string ? WritableAccount : TAccountPayer, ...TRemainingAccounts, ] >; @@ -67,10 +58,10 @@ export type ReturnCarInstructionData = { discriminator: number }; export type ReturnCarInstructionDataArgs = {}; export function getReturnCarInstructionDataEncoder(): FixedSizeEncoder { - return transformEncoder( - getStructEncoder([["discriminator", getU8Encoder()]]), - (value) => ({ ...value, discriminator: RETURN_CAR_DISCRIMINATOR }), - ); + return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ + ...value, + discriminator: RETURN_CAR_DISCRIMINATOR, + })); } export function getReturnCarInstructionDataDecoder(): FixedSizeDecoder { @@ -81,10 +72,7 @@ export function getReturnCarInstructionDataCodec(): FixedSizeCodec< ReturnCarInstructionDataArgs, ReturnCarInstructionData > { - return combineCodec( - getReturnCarInstructionDataEncoder(), - getReturnCarInstructionDataDecoder(), - ); + return combineCodec(getReturnCarInstructionDataEncoder(), getReturnCarInstructionDataDecoder()); } export type ReturnCarInput< @@ -106,21 +94,11 @@ export function getReturnCarInstruction< TAccountPayer extends string, TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, >( - input: ReturnCarInput< - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer - >, + input: ReturnCarInput, config?: { programAddress?: TProgramAddress }, -): ReturnCarInstruction< - TProgramAddress, - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer -> { +): ReturnCarInstruction { // Program address. - const programAddress = - config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { @@ -128,10 +106,7 @@ export function getReturnCarInstruction< carAccount: { value: input.carAccount ?? null, isWritable: false }, payer: { value: input.payer ?? null, isWritable: true }, }; - const accounts = originalAccounts as Record< - keyof typeof originalAccounts, - ResolvedInstructionAccount - >; + const accounts = originalAccounts as Record; const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ @@ -142,12 +117,7 @@ export function getReturnCarInstruction< ], data: getReturnCarInstructionDataEncoder().encode({}), programAddress, - } as ReturnCarInstruction< - TProgramAddress, - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer - >); + } as ReturnCarInstruction); } export type ParsedReturnCarInstruction< @@ -166,22 +136,14 @@ export type ParsedReturnCarInstruction< data: ReturnCarInstructionData; }; -export function parseReturnCarInstruction< - TProgram extends string, - TAccountMetas extends readonly AccountMeta[], ->( - instruction: Instruction & - InstructionWithAccounts & - InstructionWithData, +export function parseReturnCarInstruction( + instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedReturnCarInstruction { if (instruction.accounts.length < 3) { - throw new SolanaError( - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 3, - }, - ); + throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 3, + }); } let accountIndex = 0; const getNextAccount = () => { diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts b/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts index d0ed2a1a..f054d668 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts @@ -7,23 +7,23 @@ */ import { - assertIsInstructionWithAccounts, - containsBytes, - extendClient, - getU8Encoder, - SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, - SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, - SolanaError, type Address, + assertIsInstructionWithAccounts, type ClientWithPayer, type ClientWithRpc, type ClientWithTransactionPlanning, type ClientWithTransactionSending, + containsBytes, + extendClient, type GetAccountInfoApi, type GetMultipleAccountsApi, + getU8Encoder, type Instruction, type InstructionWithData, type ReadonlyUint8Array, + SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, + SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, + SolanaError, } from "@solana/kit"; import { addSelfFetchFunctions, @@ -32,29 +32,29 @@ import { type SelfPlanAndSendFunctions, } from "@solana/program-client-core"; import { - getCarCodec, - getRentalOrderCodec, type Car, type CarArgs, + getCarCodec, + getRentalOrderCodec, type RentalOrder, type RentalOrderArgs, } from "../accounts"; import { + type AddCarInput, + type BookRentalInput, getAddCarInstruction, getBookRentalInstruction, getPickUpCarInstruction, getReturnCarInstruction, - parseAddCarInstruction, - parseBookRentalInstruction, - parsePickUpCarInstruction, - parseReturnCarInstruction, - type AddCarInput, - type BookRentalInput, type ParsedAddCarInstruction, type ParsedBookRentalInstruction, type ParsedPickUpCarInstruction, type ParsedReturnCarInstruction, type PickUpCarInput, + parseAddCarInstruction, + parseBookRentalInstruction, + parsePickUpCarInstruction, + parseReturnCarInstruction, type ReturnCarInput, } from "../instructions"; @@ -89,10 +89,10 @@ export function identifyCarRentalServiceInstruction( if (containsBytes(data, getU8Encoder().encode(3), 0)) { return CarRentalServiceInstruction.ReturnCar; } - throw new SolanaError( - SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, - { instructionData: data, programName: "carRentalService" }, - ); + throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, { + instructionData: data, + programName: "carRentalService", + }); } export type ParsedCarRentalServiceInstruction< @@ -145,13 +145,10 @@ export function parseCarRentalServiceInstruction( }; } default: - throw new SolanaError( - SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, - { - instructionType: instructionType as string, - programName: "carRentalService", - }, - ); + throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, { + instructionType: instructionType as string, + programName: "carRentalService", + }); } } @@ -162,8 +159,7 @@ export type CarRentalServicePlugin = { export type CarRentalServicePluginAccounts = { car: ReturnType & SelfFetchFunctions; - rentalOrder: ReturnType & - SelfFetchFunctions; + rentalOrder: ReturnType & SelfFetchFunctions; }; export type CarRentalServicePluginInstructions = { @@ -181,9 +177,7 @@ export type CarRentalServicePluginInstructions = { ) => ReturnType & SelfPlanAndSendFunctions; }; -export type CarRentalServicePluginRequirements = ClientWithRpc< - GetAccountInfoApi & GetMultipleAccountsApi -> & +export type CarRentalServicePluginRequirements = ClientWithRpc & ClientWithPayer & ClientWithTransactionPlanning & ClientWithTransactionSending; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts b/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts index f4d5054d..6034aec0 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts @@ -8,11 +8,11 @@ import { combineCodec, - getEnumDecoder, - getEnumEncoder, type FixedSizeCodec, type FixedSizeDecoder, type FixedSizeEncoder, + getEnumDecoder, + getEnumEncoder, } from "@solana/kit"; export enum RentalOrderStatus { @@ -31,12 +31,6 @@ export function getRentalOrderStatusDecoder(): FixedSizeDecoder { - return combineCodec( - getRentalOrderStatusEncoder(), - getRentalOrderStatusDecoder(), - ); +export function getRentalOrderStatusCodec(): FixedSizeCodec { + return combineCodec(getRentalOrderStatusEncoder(), getRentalOrderStatusDecoder()); } diff --git a/tools/shank-and-codama/native/tests/test.ts b/tools/shank-and-codama/native/tests/test.ts index f940acbb..e74f8368 100644 --- a/tools/shank-and-codama/native/tests/test.ts +++ b/tools/shank-and-codama/native/tests/test.ts @@ -13,18 +13,18 @@ import { test } from "node:test"; import { fileURLToPath } from "node:url"; import { + type Address, address, + appendTransactionMessageInstruction, + createTransactionMessage, + generateKeyPairSigner, getAddressEncoder, getProgramDerivedAddress, - generateKeyPairSigner, getUtf8Encoder, lamports, pipe, - appendTransactionMessageInstruction, - createTransactionMessage, setTransactionMessageFeePayerSigner, signTransactionMessageWithSigners, - type Address, } from "@solana/kit"; import { FailedTransactionMetadata, LiteSVM } from "litesvm"; @@ -98,11 +98,7 @@ test("car rental service: add_car, book_rental, pick_up_car", async () => { const model = "iX1"; const carAccount = await carPda(programId, make, model); - await sendIx( - svm, - payer, - getAddCarInstruction({ carAccount, payer, year: 2020, make, model }), - ); + await sendIx(svm, payer, getAddCarInstruction({ carAccount, payer, year: 2020, make, model })); const carRaw = svm.getAccount(carAccount); assert.ok(carRaw?.exists, "car account should exist"); @@ -136,11 +132,7 @@ test("car rental service: add_car, book_rental, pick_up_car", async () => { assert.equal(rental.data.status, RentalOrderStatus.Created); // 3. pick_up_car - await sendIx( - svm, - payer, - getPickUpCarInstruction({ rentalAccount, carAccount, payer: payer.address }), - ); + await sendIx(svm, payer, getPickUpCarInstruction({ rentalAccount, carAccount, payer: payer.address })); rentalRaw = svm.getAccount(rentalAccount); assert.ok(rentalRaw?.exists, "rental account should still exist"); From 92d24b676e218a1ba5b39bd4d139680dad4f42f3 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 22:03:18 +0000 Subject: [PATCH 038/138] Fix and re-enable token-extensions metadata Anchor example for Anchor 1.0 / Solana 3.x The example failed to build after the repo moved to Anchor 1.0 / Solana 3.x because it pinned ancient spl-token-metadata-interface 0.3.3 / spl-type-length-value 0.4.3, which dragged in an old solana-zk-token-sdk that no longer compiles. - Bump spl-token-metadata-interface to 0.8.0 and spl-type-length-value to 0.9.1 (aligned with the version anchor-spl 1.0 pulls, resolving a VariableLenPack trait version clash). - initialize.rs: replace removed DEFAULT_EXEMPTION_THRESHOLD / DEFAULT_LAMPORTS_PER_BYTE_YEAR rent calc with Rent::get()?.minimum_balance(); drop the now-unused rent imports. - Add the renamed program_id field (formerly token_program_id) to the TokenMetadataInitialize / TokenMetadataUpdateField / TokenMetadataUpdateAuthority CPI account structs. - Rename handle_process_* instruction fns to process_* to match lib.rs. - Make the instructions module public so the LiteSVM test can reference its arg/enum types. - Add #![allow(clippy::diverging_sub_expression)] for the Anchor #[program] macro false positive. - Remove the example from .github/.ghaignore. Verified: cargo build-sbf, cargo test (LiteSVM full flow passes), cargo fmt --check, and cargo clippy --tests -D warnings all pass. https://claude.ai/code/session_013dpnF6uSGWXjkJJZseqzcP --- .github/.ghaignore | 3 -- .../anchor/programs/metadata/Cargo.toml | 4 +- .../metadata/src/instructions/emit.rs | 2 +- .../metadata/src/instructions/initialize.rs | 10 ++--- .../metadata/src/instructions/remove_key.rs | 4 +- .../src/instructions/update_authority.rs | 4 +- .../metadata/src/instructions/update_field.rs | 4 +- .../anchor/programs/metadata/src/lib.rs | 4 +- .../programs/metadata/tests/test_metadata.rs | 40 ++++++++++++++----- 9 files changed, 44 insertions(+), 31 deletions(-) diff --git a/.github/.ghaignore b/.github/.ghaignore index 0ee23466..f282d982 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -1,5 +1,2 @@ -# build failed - program outdated -tokens/token-extensions/metadata/anchor - # dependency issues tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/Cargo.toml b/tokens/token-extensions/metadata/anchor/programs/metadata/Cargo.toml index ca6dfca4..2295ed2e 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/Cargo.toml +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/Cargo.toml @@ -22,8 +22,8 @@ custom-panic = [] [dependencies] anchor-lang = "1.0.0" anchor-spl = "1.0.0" -spl-token-metadata-interface = "0.3.3" -spl-type-length-value = "0.4.3" +spl-token-metadata-interface = "0.8.0" +spl-type-length-value = "0.9.1" [dev-dependencies] litesvm = "0.11.0" diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/emit.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/emit.rs index e52527f8..72749e2f 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/emit.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/emit.rs @@ -11,7 +11,7 @@ pub struct Emit<'info> { // Invoke the emit instruction from spl_token_metadata_interface directly // There is not an anchor CpiContext for this instruction -pub fn handle_process_emit(context: Context) -> Result<()> { +pub fn process_emit(context: Context) -> Result<()> { invoke( &emit( &context.accounts.token_program.key(), // token program id diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/initialize.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/initialize.rs index 4fb894bf..9f57330f 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/initialize.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/initialize.rs @@ -1,7 +1,4 @@ use anchor_lang::prelude::*; -use anchor_lang::solana_program::rent::{ - DEFAULT_EXEMPTION_THRESHOLD, DEFAULT_LAMPORTS_PER_BYTE_YEAR, -}; use anchor_lang::system_program::{transfer, Transfer}; use anchor_spl::token_interface::{ token_metadata_initialize, Mint, Token2022, TokenMetadataInitialize, @@ -27,7 +24,7 @@ pub struct Initialize<'info> { pub system_program: Program<'info, System>, } -pub fn handle_process_initialize(context: Context, args: TokenMetadataArgs) -> Result<()> { +pub fn process_initialize(context: Context, args: TokenMetadataArgs) -> Result<()> { let TokenMetadataArgs { name, symbol, uri } = args; // Define token metadata @@ -42,8 +39,7 @@ pub fn handle_process_initialize(context: Context, args: TokenMetada let data_len = 4 + token_metadata.get_packed_len()?; // Calculate lamports required for the additional metadata - let lamports = - data_len as u64 * DEFAULT_LAMPORTS_PER_BYTE_YEAR * DEFAULT_EXEMPTION_THRESHOLD as u64; + let lamports = Rent::get()?.minimum_balance(data_len); // Transfer additional lamports to mint account transfer( @@ -62,7 +58,7 @@ pub fn handle_process_initialize(context: Context, args: TokenMetada CpiContext::new( context.accounts.token_program.key(), TokenMetadataInitialize { - token_program_id: context.accounts.token_program.to_account_info(), + program_id: context.accounts.token_program.to_account_info(), mint: context.accounts.mint_account.to_account_info(), metadata: context.accounts.mint_account.to_account_info(), mint_authority: context.accounts.payer.to_account_info(), diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/remove_key.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/remove_key.rs index e2a838b3..d171e18d 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/remove_key.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/remove_key.rs @@ -19,13 +19,13 @@ pub struct RemoveKey<'info> { // Invoke the remove_key instruction from spl_token_metadata_interface directly // There is not an anchor CpiContext for this instruction -pub fn handle_process_remove_key(context: Context, key: String) -> Result<()> { +pub fn process_remove_key(context: Context, key: String) -> Result<()> { invoke( &remove_key( &context.accounts.token_program.key(), // token program id &context.accounts.mint_account.key(), // "metadata" account &context.accounts.update_authority.key(), // update authority - key, // key to remove + key, // key to remove true, // idempotent flag, if true transaction will not fail if key does not exist ), &[ diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_authority.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_authority.rs index 7134e86b..92a8ac1e 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_authority.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_authority.rs @@ -18,7 +18,7 @@ pub struct UpdateAuthority<'info> { pub system_program: Program<'info, System>, } -pub fn handle_process_update_authority(context: Context) -> Result<()> { +pub fn process_update_authority(context: Context) -> Result<()> { let new_authority_key = match &context.accounts.new_authority { Some(account) => OptionalNonZeroPubkey::try_from(Some(account.key()))?, None => OptionalNonZeroPubkey::try_from(None)?, @@ -29,7 +29,7 @@ pub fn handle_process_update_authority(context: Context) -> Res CpiContext::new( context.accounts.token_program.key(), TokenMetadataUpdateAuthority { - token_program_id: context.accounts.token_program.to_account_info(), + program_id: context.accounts.token_program.to_account_info(), metadata: context.accounts.mint_account.to_account_info(), current_authority: context.accounts.current_authority.to_account_info(), diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_field.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_field.rs index 2fc3e591..cdd5504a 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_field.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_field.rs @@ -23,7 +23,7 @@ pub struct UpdateField<'info> { pub system_program: Program<'info, System>, } -pub fn handle_process_update_field(context: Context, args: UpdateFieldArgs) -> Result<()> { +pub fn process_update_field(context: Context, args: UpdateFieldArgs) -> Result<()> { let UpdateFieldArgs { field, value } = args; // Convert to Field type from spl_token_metadata_interface @@ -80,7 +80,7 @@ pub fn handle_process_update_field(context: Context, args: UpdateFi CpiContext::new( context.accounts.token_program.key(), TokenMetadataUpdateField { - token_program_id: context.accounts.token_program.to_account_info(), + program_id: context.accounts.token_program.to_account_info(), metadata: context.accounts.mint_account.to_account_info(), update_authority: context.accounts.authority.to_account_info(), }, diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/src/lib.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/src/lib.rs index 3a5770aa..1496bd5e 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/src/lib.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/src/lib.rs @@ -1,7 +1,9 @@ +#![allow(clippy::diverging_sub_expression)] + use anchor_lang::prelude::*; use instructions::*; -mod instructions; +pub mod instructions; declare_id!("BJHEDXSQfD9kBFvhw8ZCGmPFRihzvbMoxoHUKpXdpn4D"); diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/tests/test_metadata.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/tests/test_metadata.rs index 5ed4c5ce..3b34a126 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/tests/test_metadata.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/tests/test_metadata.rs @@ -4,11 +4,11 @@ use { InstructionData, ToAccountMetas, }, litesvm::LiteSVM, + solana_keypair::Keypair, solana_kite::{ create_wallet, send_transaction_from_instructions, token_extensions::TOKEN_EXTENSIONS_PROGRAM_ID, }, - solana_keypair::Keypair, solana_signer::Signer, }; @@ -47,7 +47,13 @@ fn test_metadata_full_flow() { } .to_account_metas(None), ); - send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + send_transaction_from_instructions( + &mut svm, + vec![initialize_ix], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); // Verify mint exists let mint_account = svm @@ -75,7 +81,8 @@ fn test_metadata_full_flow() { } .to_account_metas(None), ); - send_transaction_from_instructions(&mut svm, vec![update_name_ix], &[&payer], &payer.pubkey()).unwrap(); + send_transaction_from_instructions(&mut svm, vec![update_name_ix], &[&payer], &payer.pubkey()) + .unwrap(); svm.expire_blockhash(); // Step 3: Add custom field @@ -96,7 +103,13 @@ fn test_metadata_full_flow() { } .to_account_metas(None), ); - send_transaction_from_instructions(&mut svm, vec![add_custom_field_ix], &[&payer], &payer.pubkey()).unwrap(); + send_transaction_from_instructions( + &mut svm, + vec![add_custom_field_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); svm.expire_blockhash(); // Step 4: Remove custom field @@ -114,7 +127,8 @@ fn test_metadata_full_flow() { } .to_account_metas(None), ); - send_transaction_from_instructions(&mut svm, vec![remove_key_ix], &[&payer], &payer.pubkey()).unwrap(); + send_transaction_from_instructions(&mut svm, vec![remove_key_ix], &[&payer], &payer.pubkey()) + .unwrap(); svm.expire_blockhash(); // Step 5: Update authority to None @@ -130,7 +144,13 @@ fn test_metadata_full_flow() { } .to_account_metas(None), ); - send_transaction_from_instructions(&mut svm, vec![update_authority_ix], &[&payer], &payer.pubkey()).unwrap(); + send_transaction_from_instructions( + &mut svm, + vec![update_authority_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); svm.expire_blockhash(); // Step 6: Emit metadata (verify it doesn't fail) @@ -143,14 +163,12 @@ fn test_metadata_full_flow() { } .to_account_metas(None), ); - send_transaction_from_instructions(&mut svm, vec![emit_ix], &[&payer], &payer.pubkey()).unwrap(); + send_transaction_from_instructions(&mut svm, vec![emit_ix], &[&payer], &payer.pubkey()) + .unwrap(); // Verify mint still exists after all operations let mint_account = svm .get_account(&mint_keypair.pubkey()) .expect("Mint account should still exist after all metadata operations"); - assert!( - !mint_account.data.is_empty(), - "Mint should still have data" - ); + assert!(!mint_account.data.is_empty(), "Mint should still have data"); } From 91880a14d58f5c50969dc5ec4c29348f4720eff7 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 22:13:09 +0000 Subject: [PATCH 039/138] Re-enable nft-meta-data-pointer anchor example (extension_nft) Fix the dependency/API issues that had this Token-2022 metadata-pointer "chop tree" game example tagged "dependency issues" in .github/.ghaignore, and re-enable it in CI. Dependencies: - Bump session-keys 2.0.3 -> 3.1.1. 2.x pins anchor-lang <=0.30 and fails to compile against the Anchor 1.0 / Solana 3.x API; 3.1.1 is the first release supporting anchor-lang >=0.28,<2.0. The gasless session-token lesson (#[session_auth_or] / SessionToken) is preserved. - Drop the standalone spl-token-2022 v6 / spl-token v4 / spl-token-metadata- interface pins. They dragged a second solana-pubkey major (vs the one anchor-lang/anchor-spl 1.0 use), breaking the CPI builders with Pubkey type mismatches. Token-2022 + token-metadata now go through anchor-spl's bundled re-exports (anchor_spl::token_interface::spl_token_2022 and anchor_spl::token_2022_extensions::spl_token_metadata_interface), keeping a single consistent type universe. Source fixes: - Route program/invoke imports through anchor_lang::solana_program. - Rename the chop_tree handler context param to `ctx` (the #[session_auth_or] macro expands code that refers to the binding by that literal name). - AccountInfo -> UncheckedAccount for the unchecked mint / token_account fields (silences the Anchor 1.0 deprecation warning). - #![allow(clippy::diverging_sub_expression)] for the #[program] macro. Test: - Replace the (untracked) TS test with a Rust LiteSVM integration test (Anchor.toml [scripts] test = "cargo test"). It drives init_player -> mint_nft -> chop_tree and asserts on-chain state. The session path is exercised via its main-wallet fallback (session_token = None), so no session-keys program fixture is needed (the program only reads the session token, never CPIs into it). The program id is referenced via extension_nft::ID so it survives CI's `anchor keys sync`. CI plumbing: - Add a self-contained package.json + pnpm-lock.yaml in the anchor dir so `pnpm install --frozen-lockfile` resolves there instead of walking up into the sibling nx app package.json (which has no lockfile). - Remove the example from .github/.ghaignore. Verified: cargo build-sbf, cargo test (LiteSVM passes), cargo fmt --check, cargo clippy --tests -D warnings, pnpm install --frozen-lockfile. https://claude.ai/code/session_013dpnF6uSGWXjkJJZseqzcP --- .github/.ghaignore | 2 - .../anchor-example/anchor/Anchor.toml | 2 +- .../anchor-example/anchor/package.json | 12 + .../anchor-example/anchor/pnpm-lock.yaml | 9 + .../anchor/programs/extension_nft/Cargo.toml | 27 ++- .../src/instructions/chop_tree.rs | 7 +- .../src/instructions/mint_nft.rs | 119 ++++----- .../anchor/programs/extension_nft/src/lib.rs | 13 +- .../extension_nft/tests/test_extension_nft.rs | 225 ++++++++++++++++++ 9 files changed, 346 insertions(+), 70 deletions(-) create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/package.json create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/pnpm-lock.yaml create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs diff --git a/.github/.ghaignore b/.github/.ghaignore index f282d982..e69de29b 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -1,2 +0,0 @@ -# dependency issues -tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/Anchor.toml b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/Anchor.toml index f36d5d2c..379bee00 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/Anchor.toml +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/Anchor.toml @@ -13,4 +13,4 @@ cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/package.json b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/package.json new file mode 100644 index 00000000..7ba4cb9d --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/package.json @@ -0,0 +1,12 @@ +{ + "name": "extension-nft-anchor", + "version": "1.0.0", + "description": "Anchor 'chop tree' game minting Token-2022 NFTs with the metadata-pointer extension. Tested with a Rust LiteSVM integration test (anchor test -> cargo test).", + "private": true, + "license": "MIT", + "scripts": { + "build": "anchor build", + "test": "anchor test", + "build-and-test": "anchor build && anchor test" + } +} diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/pnpm-lock.yaml b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/pnpm-lock.yaml new file mode 100644 index 00000000..9b60ae17 --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/pnpm-lock.yaml @@ -0,0 +1,9 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: {} diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/Cargo.toml b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/Cargo.toml index 22da393f..abd18765 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/Cargo.toml +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/Cargo.toml @@ -23,12 +23,27 @@ custom-panic = [] [dependencies] anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } anchor-spl = { version = "1.0.0" } -# session-keys pinned to 2.0.3 โ€” check compatibility with Anchor 1.0/Solana 3.x -session-keys = { version = "2.0.3", features = ["no-entrypoint"] } -# Removed solana-program pin (=2.1.15) โ€” Anchor 1.0 requires Solana 3.x deps -spl-token-2022 = { version="6", features = [ "no-entrypoint" ] } -spl-token = { version = "4.0.1", features = [ "no-entrypoint" ] } -spl-token-metadata-interface = "0.7.0" +# session-keys 3.1.1 is the first release that supports Anchor >=0.28,<2.0 +# (so it builds against Anchor 1.0). Earlier 2.x releases pin Anchor <=0.30 +# and fail to compile against the Anchor 1.0 / Solana 3.x API. Provides the +# gasless session-token lesson via `#[session_auth_or]` / `SessionToken`. +session-keys = { version = "3.1.1", features = ["no-entrypoint"] } +# Token-2022 + token-metadata access goes through anchor-spl's bundled +# re-exports (`anchor_spl::token_interface::spl_token_2022`, which is +# `spl-token-2022-interface`, and `anchor_spl::token_2022_extensions:: +# spl_token_metadata_interface`). Pinning standalone `spl-token-2022` / +# `spl-token-metadata-interface` here pulls a second copy on a different +# `solana-pubkey` major than anchor-lang/anchor-spl use, which breaks the +# CPI builders with `Pubkey` type mismatches. Relying on anchor-spl's +# re-exports keeps a single, consistent type universe. + +[dev-dependencies] +litesvm = "0.11.0" +solana-keypair = "3.0.1" +solana-signer = "3.0.0" +solana-instruction = "3.0.0" +solana-pubkey = "3.0.0" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/chop_tree.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/chop_tree.rs index 2120f3a7..e32ab30a 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/chop_tree.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/chop_tree.rs @@ -2,9 +2,10 @@ pub use crate::errors::GameErrorCode; pub use crate::state::game_data::GameData; use crate::{state::player_data::PlayerData, NftAuthority}; use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Token2022}; +use anchor_lang::solana_program::program::invoke_signed; +use anchor_spl::token_2022_extensions::spl_token_metadata_interface; +use anchor_spl::token_interface::{spl_token_2022, Token2022}; use session_keys::{Session, SessionToken}; -use solana_program::program::invoke_signed; pub fn chop_tree(context: Context, counter: u16, amount: u64) -> Result<()> { // Save game_data bump on first creation (init_if_needed). See init_player.rs @@ -92,7 +93,7 @@ pub struct ChopTree<'info> { pub system_program: Program<'info, System>, /// CHECK: Make sure the ata to the mint is actually owned by the signer #[account(mut)] - pub mint: AccountInfo<'info>, + pub mint: UncheckedAccount<'info>, #[account( init_if_needed, seeds = [b"nft_authority".as_ref()], diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/mint_nft.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/mint_nft.rs index d24bddea..e0f48e2a 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/mint_nft.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/mint_nft.rs @@ -2,26 +2,28 @@ pub use crate::constants::TOKEN_METADATA_EXTENSION_SPACE; pub use crate::errors::GameErrorCode; pub use crate::errors::ProgramErrorCode; pub use crate::state::game_data::GameData; -use anchor_lang::{ prelude::*, system_program }; +use anchor_lang::solana_program::program::{invoke, invoke_signed}; +use anchor_lang::{prelude::*, system_program}; use anchor_spl::{ - associated_token::{ self, AssociatedToken }, + associated_token::{self, AssociatedToken}, token_2022, - token_interface::{ spl_token_2022::instruction::AuthorityType, Token2022 }, + token_2022_extensions::spl_token_metadata_interface, + token_interface::{ + spl_token_2022::{self, extension::ExtensionType, instruction::AuthorityType, state::Mint}, + Token2022, + }, }; -use solana_program::program::{ invoke, invoke_signed }; -use spl_token_2022::{ extension::ExtensionType, state::Mint }; pub fn handle_mint_nft(context: Context) -> Result<()> { msg!("Mint nft with meta data extension and additional meta data"); - let space = match - ExtensionType::try_calculate_account_len::(&[ExtensionType::MetadataPointer]) - { - Ok(space) => space, - Err(_) => { - return err!(ProgramErrorCode::InvalidMintAccountSpace); - } - }; + let space = + match ExtensionType::try_calculate_account_len::(&[ExtensionType::MetadataPointer]) { + Ok(space) => space, + Err(_) => { + return err!(ProgramErrorCode::InvalidMintAccountSpace); + } + }; // Space required for the inline SPL Token Metadata extension TLV. The // metadata lives on the mint account itself (not a separate account) @@ -42,39 +44,44 @@ pub fn handle_mint_nft(context: Context) -> Result<()> { system_program::CreateAccount { from: context.accounts.signer.to_account_info(), to: context.accounts.mint.to_account_info(), - } + }, ), lamports_required, space as u64, - &context.accounts.token_program.key() + &context.accounts.token_program.key(), )?; // Assign the mint to the token program system_program::assign( - CpiContext::new(context.accounts.token_program.key(), system_program::Assign { - account_to_assign: context.accounts.mint.to_account_info(), - }), - &token_2022::ID + CpiContext::new( + context.accounts.token_program.key(), + system_program::Assign { + account_to_assign: context.accounts.mint.to_account_info(), + }, + ), + &token_2022::ID, )?; // Initialize the metadata pointer (Need to do this before initializing the mint) - let init_meta_data_pointer_ix = match - spl_token_2022::extension::metadata_pointer::instruction::initialize( + let init_meta_data_pointer_ix = + match spl_token_2022::extension::metadata_pointer::instruction::initialize( &Token2022::id(), &context.accounts.mint.key(), Some(context.accounts.nft_authority.key()), - Some(context.accounts.mint.key()) - ) - { - Ok(ix) => ix, - Err(_) => { - return err!(ProgramErrorCode::CantInitializeMetadataPointer); - } - }; + Some(context.accounts.mint.key()), + ) { + Ok(ix) => ix, + Err(_) => { + return err!(ProgramErrorCode::CantInitializeMetadataPointer); + } + }; invoke( &init_meta_data_pointer_ix, - &[context.accounts.mint.to_account_info(), context.accounts.nft_authority.to_account_info()] + &[ + context.accounts.mint.to_account_info(), + context.accounts.nft_authority.to_account_info(), + ], )?; // Initialize the mint cpi @@ -82,10 +89,11 @@ pub fn handle_mint_nft(context: Context) -> Result<()> { context.accounts.token_program.key(), token_2022::InitializeMint2 { mint: context.accounts.mint.to_account_info(), - } + }, ); - token_2022::initialize_mint2(mint_cpi_ix, 0, &context.accounts.nft_authority.key(), None).unwrap(); + token_2022::initialize_mint2(mint_cpi_ix, 0, &context.accounts.nft_authority.key(), None) + .unwrap(); // We use a PDA as a mint authority for the metadata account because // we want to be able to update the NFT from the program. @@ -93,7 +101,10 @@ pub fn handle_mint_nft(context: Context) -> Result<()> { let bump = context.bumps.nft_authority; let signer: &[&[&[u8]]] = &[&[seeds, &[bump]]]; - msg!("Init metadata {0}", context.accounts.nft_authority.to_account_info().key); + msg!( + "Init metadata {0}", + context.accounts.nft_authority.to_account_info().key + ); // Init the metadata account let init_token_meta_data_ix = &spl_token_metadata_interface::instruction::initialize( @@ -104,7 +115,7 @@ pub fn handle_mint_nft(context: Context) -> Result<()> { context.accounts.nft_authority.to_account_info().key, "Beaver".to_string(), "BVA".to_string(), - "https://arweave.net/MHK3Iopy0GgvDoM7LkkiAdg7pQqExuuWvedApCnzfj0".to_string() + "https://arweave.net/MHK3Iopy0GgvDoM7LkkiAdg7pQqExuuWvedApCnzfj0".to_string(), ); invoke_signed( @@ -113,7 +124,7 @@ pub fn handle_mint_nft(context: Context) -> Result<()> { context.accounts.mint.to_account_info().clone(), context.accounts.nft_authority.to_account_info().clone(), ], - signer + signer, )?; // Update the metadata account with an additional metadata field in this case the player level @@ -123,29 +134,27 @@ pub fn handle_mint_nft(context: Context) -> Result<()> { context.accounts.mint.key, context.accounts.nft_authority.to_account_info().key, spl_token_metadata_interface::state::Field::Key("level".to_string()), - "1".to_string() + "1".to_string(), ), &[ context.accounts.mint.to_account_info().clone(), context.accounts.nft_authority.to_account_info().clone(), ], - signer + signer, )?; // Create the associated token account - associated_token::create( - CpiContext::new( - context.accounts.associated_token_program.key(), - associated_token::Create { - payer: context.accounts.signer.to_account_info(), - associated_token: context.accounts.token_account.to_account_info(), - authority: context.accounts.signer.to_account_info(), - mint: context.accounts.mint.to_account_info(), - system_program: context.accounts.system_program.to_account_info(), - token_program: context.accounts.token_program.to_account_info(), - } - ) - )?; + associated_token::create(CpiContext::new( + context.accounts.associated_token_program.key(), + associated_token::Create { + payer: context.accounts.signer.to_account_info(), + associated_token: context.accounts.token_account.to_account_info(), + authority: context.accounts.signer.to_account_info(), + mint: context.accounts.mint.to_account_info(), + system_program: context.accounts.system_program.to_account_info(), + token_program: context.accounts.token_program.to_account_info(), + }, + ))?; // Mint one token to the associated token account of the player token_2022::mint_to( @@ -156,9 +165,9 @@ pub fn handle_mint_nft(context: Context) -> Result<()> { to: context.accounts.token_account.to_account_info(), authority: context.accounts.nft_authority.to_account_info(), }, - signer + signer, ), - 1 + 1, )?; // Freeze the mint authority so no more tokens can be minted to make it an NFT @@ -169,10 +178,10 @@ pub fn handle_mint_nft(context: Context) -> Result<()> { current_authority: context.accounts.nft_authority.to_account_info(), account_or_mint: context.accounts.mint.to_account_info(), }, - signer + signer, ), AuthorityType::MintTokens, - None + None, )?; Ok(()) @@ -186,7 +195,7 @@ pub struct MintNft<'info> { pub token_program: Program<'info, Token2022>, /// CHECK: We will create this one for the user #[account(mut)] - pub token_account: AccountInfo<'info>, + pub token_account: UncheckedAccount<'info>, #[account(mut)] pub mint: Signer<'info>, pub rent: Sysvar<'info, Rent>, diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs index 6515214f..02ea5493 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs @@ -1,3 +1,7 @@ +// The Anchor `#[program]` macro expands to code that clippy flags as a +// diverging sub-expression; this allow is the accepted workaround in this repo. +#![allow(clippy::diverging_sub_expression)] + pub use crate::errors::GameErrorCode; pub use anchor_lang::prelude::*; pub use session_keys::{session_auth_or, Session, SessionError}; @@ -28,12 +32,15 @@ pub mod extension_nft { // lets the player either use their session token or their main wallet. (The counter is only // there so that the player can do multiple transactions in the same block. Without it multiple transactions // in the same block would result in the same signature and therefore fail.) + // NOTE: the `#[session_auth_or]` macro injects code that refers to the + // context binding by the literal name `ctx`, so this handler's context + // parameter must be named `ctx` (not `context`) for the macro to expand. #[session_auth_or( - context.accounts.player.authority.key() == context.accounts.signer.key(), + ctx.accounts.player.authority.key() == ctx.accounts.signer.key(), GameErrorCode::WrongAuthority )] - pub fn chop_tree(context: Context, _level_seed: String, counter: u16) -> Result<()> { - chop_tree::chop_tree(context, counter, 1) + pub fn chop_tree(ctx: Context, _level_seed: String, counter: u16) -> Result<()> { + chop_tree::chop_tree(ctx, counter, 1) } pub fn mint_nft(context: Context) -> Result<()> { diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs new file mode 100644 index 00000000..89291327 --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs @@ -0,0 +1,225 @@ +//! LiteSVM integration test for the `extension_nft` "chop tree" game program. +//! +//! It drives the full happy path against an in-memory validator: +//! 1. `init_player` โ€” create the player + game-data PDAs. +//! 2. `mint_nft` โ€” mint a Token-2022 NFT that carries its metadata inline via +//! the metadata-pointer + token-metadata extensions. +//! 3. `chop_tree` โ€” gain wood/lose energy and push the new wood total into the +//! NFT metadata as an additional field. +//! +//! The session-keys lesson (`#[session_auth_or]`) is exercised through its +//! *fallback* branch: `chop_tree` is signed directly by the player's main +//! wallet with `session_token = None`, so the macro checks +//! `player.authority == signer`. This keeps the test self-contained โ€” it does +//! not need the on-chain session-keys program as a fixture, because the program +//! never CPIs into it (the session token is only ever read as an account). +//! +//! IMPORTANT: CI runs `anchor keys sync` before building, which rewrites the +//! program's `declare_id!`. We therefore reference the id via `extension_nft::ID` +//! (the crate constant) rather than a hardcoded literal, so the test keeps +//! working after the id is regenerated. + +use { + anchor_lang::{ + prelude::Pubkey, solana_program::system_program, InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_instruction::Instruction, + solana_keypair::Keypair, + solana_kite::{create_wallet, get_pda_and_bump, send_transaction_from_instructions, Seed}, + solana_signer::Signer, +}; + +// Token-2022 and Associated-Token-Account program ids (the modern, fixed +// on-chain addresses bundled by LiteSVM). +const TOKEN_2022_ID: Pubkey = Pubkey::from_str_const("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"); +const ASSOCIATED_TOKEN_ID: Pubkey = + Pubkey::from_str_const("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); +const RENT_SYSVAR_ID: Pubkey = + Pubkey::from_str_const("SysvarRent111111111111111111111111111111111"); + +const LEVEL_SEED: &str = "level1"; + +fn setup() -> (LiteSVM, Pubkey) { + let program_id = extension_nft::ID; + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/extension_nft.so"); + svm.add_program(program_id, bytes).unwrap(); + (svm, program_id) +} + +/// Derive the player PDA: seeds = [b"player", authority]. +fn player_pda(program_id: &Pubkey, authority: &Pubkey) -> Pubkey { + get_pda_and_bump( + &[Seed::from(b"player".as_ref()), Seed::from(*authority)], + program_id, + ) + .0 +} + +/// Derive the game-data PDA: seeds = [level_seed]. +fn game_data_pda(program_id: &Pubkey, level_seed: &str) -> Pubkey { + get_pda_and_bump(&[Seed::from(level_seed)], program_id).0 +} + +/// Derive the NFT-authority PDA: seeds = [b"nft_authority"]. +fn nft_authority_pda(program_id: &Pubkey) -> Pubkey { + get_pda_and_bump(&[Seed::from(b"nft_authority".as_ref())], program_id).0 +} + +/// Derive the associated token account for (wallet, mint) under Token-2022. +fn associated_token_address(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[wallet.as_ref(), TOKEN_2022_ID.as_ref(), mint.as_ref()], + &ASSOCIATED_TOKEN_ID, + ) + .0 +} + +fn init_player_ix(program_id: &Pubkey, signer: &Pubkey) -> Instruction { + Instruction { + program_id: *program_id, + accounts: extension_nft::accounts::InitPlayer { + player: player_pda(program_id, signer), + game_data: game_data_pda(program_id, LEVEL_SEED), + signer: *signer, + system_program: system_program::id(), + } + .to_account_metas(None), + data: extension_nft::instruction::InitPlayer { + _level_seed: LEVEL_SEED.to_string(), + } + .data(), + } +} + +fn mint_nft_ix(program_id: &Pubkey, signer: &Pubkey, mint: &Pubkey) -> Instruction { + Instruction { + program_id: *program_id, + accounts: extension_nft::accounts::MintNft { + signer: *signer, + system_program: system_program::id(), + token_program: TOKEN_2022_ID, + token_account: associated_token_address(signer, mint), + mint: *mint, + rent: RENT_SYSVAR_ID, + associated_token_program: ASSOCIATED_TOKEN_ID, + nft_authority: nft_authority_pda(program_id), + } + .to_account_metas(None), + data: extension_nft::instruction::MintNft {}.data(), + } +} + +fn chop_tree_ix(program_id: &Pubkey, signer: &Pubkey, mint: &Pubkey, counter: u16) -> Instruction { + Instruction { + program_id: *program_id, + accounts: extension_nft::accounts::ChopTree { + // session_token is optional; pass None -> the macro falls back to + // the main-wallet authority check. + session_token: None, + player: player_pda(program_id, signer), + game_data: game_data_pda(program_id, LEVEL_SEED), + signer: *signer, + system_program: system_program::id(), + mint: *mint, + nft_authority: nft_authority_pda(program_id), + token_program: TOKEN_2022_ID, + } + .to_account_metas(None), + data: extension_nft::instruction::ChopTree { + _level_seed: LEVEL_SEED.to_string(), + counter, + } + .data(), + } +} + +/// Decode the borsh `PlayerData` account (after the 8-byte discriminator). +struct Player { + wood: u64, + energy: u64, +} + +fn fetch_player(svm: &LiteSVM, player: &Pubkey) -> Player { + use anchor_lang::AnchorDeserialize; + let account = svm.get_account(player).expect("player account exists"); + // Skip the 8-byte Anchor discriminator. + let mut data = &account.data[8..]; + // PlayerData layout: authority(32) name(4+len) level(1) xp(8) wood(8) + // energy(8) last_login(8) last_id(2) bump(1). + let _authority = <[u8; 32]>::deserialize(&mut data).unwrap(); + let _name = String::deserialize(&mut data).unwrap(); + let _level = u8::deserialize(&mut data).unwrap(); + let _xp = u64::deserialize(&mut data).unwrap(); + let wood = u64::deserialize(&mut data).unwrap(); + let energy = u64::deserialize(&mut data).unwrap(); + Player { wood, energy } +} + +#[test] +fn test_init_player_mint_and_chop() { + let (mut svm, program_id) = setup(); + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); + let signer = payer.pubkey(); + + // 1. init_player + send_transaction_from_instructions( + &mut svm, + vec![init_player_ix(&program_id, &signer)], + &[&payer], + &signer, + ) + .expect("init_player should succeed"); + + let player_addr = player_pda(&program_id, &signer); + let player = fetch_player(&svm, &player_addr); + assert_eq!(player.wood, 0, "fresh player starts with no wood"); + assert_eq!( + player.energy, 100, + "fresh player starts at max energy (100)" + ); + + // 2. mint_nft โ€” the mint account is a fresh keypair (it's a Signer in the + // instruction because the program creates it via a system CPI). + let mint = Keypair::new(); + send_transaction_from_instructions( + &mut svm, + vec![mint_nft_ix(&program_id, &signer, &mint.pubkey())], + &[&payer, &mint], + &signer, + ) + .expect("mint_nft should succeed"); + + // The mint account is now owned by the Token-2022 program and holds the + // inline metadata extension, so it is comfortably larger than a bare mint. + let mint_account = svm.get_account(&mint.pubkey()).expect("mint exists"); + assert_eq!( + mint_account.owner, TOKEN_2022_ID, + "mint owned by Token-2022" + ); + assert!( + mint_account.data.len() > 82, + "mint carries extension data (got {} bytes)", + mint_account.data.len() + ); + + // The associated token account should exist and hold the single NFT. + let ata = associated_token_address(&signer, &mint.pubkey()); + let ata_account = svm.get_account(&ata).expect("ATA created"); + assert_eq!(ata_account.owner, TOKEN_2022_ID, "ATA owned by Token-2022"); + + // 3. chop_tree โ€” needs the existing mint so it can push the new wood total + // into the NFT metadata. Signed by the player's main wallet (no session). + send_transaction_from_instructions( + &mut svm, + vec![chop_tree_ix(&program_id, &signer, &mint.pubkey(), 1)], + &[&payer], + &signer, + ) + .expect("chop_tree should succeed"); + + let player = fetch_player(&svm, &player_addr); + assert_eq!(player.wood, 1, "player gained 1 wood from chopping"); + assert_eq!(player.energy, 99, "player spent 1 energy chopping"); +} From b78db00a21ab5e478d8f9a8c433b8017ad649d86 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 22:20:46 +0000 Subject: [PATCH 040/138] fix(nft-meta-data-pointer): merge into one #[error_code] enum (anchor IDL build allows only one) --- .../anchor/programs/extension_nft/src/errors.rs | 6 ++---- .../programs/extension_nft/src/instructions/mint_nft.rs | 5 ++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/errors.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/errors.rs index e4921a22..e855d93e 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/errors.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/errors.rs @@ -1,15 +1,13 @@ use anchor_lang::error_code; +// Anchor's IDL build allows only a single `#[error_code]` enum per program, so +// the game and program-level errors live in one enum. #[error_code] pub enum GameErrorCode { #[msg("Not enough energy")] NotEnoughEnergy, #[msg("Wrong Authority")] WrongAuthority, -} - -#[error_code] -pub enum ProgramErrorCode { #[msg("Invalid Mint account space")] InvalidMintAccountSpace, #[msg("Cant initialize metadata_pointer")] diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/mint_nft.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/mint_nft.rs index e0f48e2a..980e6ad7 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/mint_nft.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/mint_nft.rs @@ -1,6 +1,5 @@ pub use crate::constants::TOKEN_METADATA_EXTENSION_SPACE; pub use crate::errors::GameErrorCode; -pub use crate::errors::ProgramErrorCode; pub use crate::state::game_data::GameData; use anchor_lang::solana_program::program::{invoke, invoke_signed}; use anchor_lang::{prelude::*, system_program}; @@ -21,7 +20,7 @@ pub fn handle_mint_nft(context: Context) -> Result<()> { match ExtensionType::try_calculate_account_len::(&[ExtensionType::MetadataPointer]) { Ok(space) => space, Err(_) => { - return err!(ProgramErrorCode::InvalidMintAccountSpace); + return err!(GameErrorCode::InvalidMintAccountSpace); } }; @@ -72,7 +71,7 @@ pub fn handle_mint_nft(context: Context) -> Result<()> { ) { Ok(ix) => ix, Err(_) => { - return err!(ProgramErrorCode::CantInitializeMetadataPointer); + return err!(GameErrorCode::CantInitializeMetadataPointer); } }; From 3ec025c38cdc328bf32cf3c89fbe2736997d010f Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 23:10:30 +0000 Subject: [PATCH 041/138] chore(basics/counter): remove mpl-stack example (legacy Shank+Solita; superseded by tools/shank-and-codama) --- Cargo.toml | 1 - basics/counter/mpl-stack/.solitarc.js | 16 -- basics/counter/mpl-stack/Cargo.toml | 22 --- basics/counter/mpl-stack/README.md | 13 -- .../mpl-stack/idl/counter_mpl_stack.json | 42 ----- .../mpl-stack/idl/counter_solana_native.json | 33 ---- basics/counter/mpl-stack/jest.config.js | 6 - basics/counter/mpl-stack/package.json | 30 ---- basics/counter/mpl-stack/src/lib.rs | 65 -------- basics/counter/mpl-stack/src/state.rs | 7 - .../counter/mpl-stack/tests/counter.test.ts | 111 -------------- .../ts/generated/accounts/Counter.ts | 145 ------------------ .../mpl-stack/ts/generated/accounts/index.ts | 5 - .../counter/mpl-stack/ts/generated/index.ts | 20 --- .../ts/generated/instructions/Increment.ts | 62 -------- .../ts/generated/instructions/index.ts | 1 - basics/counter/mpl-stack/ts/index.ts | 1 - 17 files changed, 580 deletions(-) delete mode 100644 basics/counter/mpl-stack/.solitarc.js delete mode 100644 basics/counter/mpl-stack/Cargo.toml delete mode 100644 basics/counter/mpl-stack/README.md delete mode 100644 basics/counter/mpl-stack/idl/counter_mpl_stack.json delete mode 100644 basics/counter/mpl-stack/idl/counter_solana_native.json delete mode 100644 basics/counter/mpl-stack/jest.config.js delete mode 100644 basics/counter/mpl-stack/package.json delete mode 100644 basics/counter/mpl-stack/src/lib.rs delete mode 100644 basics/counter/mpl-stack/src/state.rs delete mode 100644 basics/counter/mpl-stack/tests/counter.test.ts delete mode 100644 basics/counter/mpl-stack/ts/generated/accounts/Counter.ts delete mode 100644 basics/counter/mpl-stack/ts/generated/accounts/index.ts delete mode 100644 basics/counter/mpl-stack/ts/generated/index.ts delete mode 100644 basics/counter/mpl-stack/ts/generated/instructions/Increment.ts delete mode 100644 basics/counter/mpl-stack/ts/generated/instructions/index.ts delete mode 100644 basics/counter/mpl-stack/ts/index.ts diff --git a/Cargo.toml b/Cargo.toml index 3e79eb10..81c2df58 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,6 @@ members = [ "basics/counter/native/program", "basics/counter/pinocchio/program", "basics/counter/anchor/programs/counter_anchor", - "basics/counter/mpl-stack", "basics/create-account/native/program", "basics/create-account/pinocchio/program", "basics/create-account/anchor/programs/create-system-account", diff --git a/basics/counter/mpl-stack/.solitarc.js b/basics/counter/mpl-stack/.solitarc.js deleted file mode 100644 index 8ea5faec..00000000 --- a/basics/counter/mpl-stack/.solitarc.js +++ /dev/null @@ -1,16 +0,0 @@ -// @ts-check -const path = require("node:path"); -const programDir = path.join(__dirname); -const idlDir = path.join(__dirname, "idl"); -const sdkDir = path.join(__dirname, "ts", "generated"); -const binaryInstallDir = path.join(__dirname, "target", "solita"); - -module.exports = { - idlGenerator: "shank", - programName: "counter_mpl_stack", - programId: "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS", - idlDir, - sdkDir, - binaryInstallDir, - programDir, -}; diff --git a/basics/counter/mpl-stack/Cargo.toml b/basics/counter/mpl-stack/Cargo.toml deleted file mode 100644 index cc936565..00000000 --- a/basics/counter/mpl-stack/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "counter-mpl-stack" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib", "lib"] - -[features] -no-entrypoint = [] -cpi = ["no-entrypoint"] -default = [] -custom-heap = [] -custom-panic = [] - -[dependencies] -borsh = "1.6" -shank = "0.4.8" -solana-program = "4.0" - -[lints.rust] -unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/counter/mpl-stack/README.md b/basics/counter/mpl-stack/README.md deleted file mode 100644 index bf6c733f..00000000 --- a/basics/counter/mpl-stack/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Counter: MPL Stack - -A Solana-native counter built using the MPL (Metaplex) stack. - -## Setup - -1. Build the [program](https://solana.com/docs/terminology#program): `cargo build-sbf` -2. Build the IDL: `shank build` -3. Build the TypeScript SDK: `pnpm solita` - - Temporary workaround: edit `ts/generated/accounts/Counter.ts` line 58 to - `const accountInfo = await connection.getAccountInfo(address, { commitment: "confirmed" });` - so that the tests pass. Future Solita versions will fix this. -4. Run tests: `pnpm test` diff --git a/basics/counter/mpl-stack/idl/counter_mpl_stack.json b/basics/counter/mpl-stack/idl/counter_mpl_stack.json deleted file mode 100644 index 3369f316..00000000 --- a/basics/counter/mpl-stack/idl/counter_mpl_stack.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "version": "0.1.0", - "name": "counter_mpl_stack", - "instructions": [ - { - "name": "Increment", - "accounts": [ - { - "name": "counter", - "isMut": true, - "isSigner": false, - "desc": "Counter account to increment" - } - ], - "args": [], - "discriminant": { - "type": "u8", - "value": 0 - } - } - ], - "accounts": [ - { - "name": "Counter", - "type": { - "kind": "struct", - "fields": [ - { - "name": "count", - "type": "u64" - } - ] - } - } - ], - "metadata": { - "origin": "shank", - "address": "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS", - "binaryVersion": "0.0.8", - "libVersion": "0.0.8" - } -} diff --git a/basics/counter/mpl-stack/idl/counter_solana_native.json b/basics/counter/mpl-stack/idl/counter_solana_native.json deleted file mode 100644 index 97b709b9..00000000 --- a/basics/counter/mpl-stack/idl/counter_solana_native.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "version": "0.1.0", - "name": "counter_solana_native", - "instructions": [ - { - "name": "Increment", - "accounts": [], - "args": [], - "discriminant": { - "type": "u8", - "value": 0 - } - } - ], - "accounts": [ - { - "name": "Counter", - "type": { - "kind": "struct", - "fields": [ - { - "name": "count", - "type": "u64" - } - ] - } - } - ], - "metadata": { - "origin": "shank", - "address": "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS" - } -} diff --git a/basics/counter/mpl-stack/jest.config.js b/basics/counter/mpl-stack/jest.config.js deleted file mode 100644 index 4dd7c478..00000000 --- a/basics/counter/mpl-stack/jest.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - preset: "ts-jest/presets/default", - testEnvironment: "node", - testTimeout: 100000, - resolver: "ts-jest-resolver", -}; diff --git a/basics/counter/mpl-stack/package.json b/basics/counter/mpl-stack/package.json deleted file mode 100644 index 9097c339..00000000 --- a/basics/counter/mpl-stack/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "counter-mpl-stack", - "version": "0.1.0", - "description": "Counter program written using MPL tooling", - "main": "index.js", - "author": "ngundotra", - "license": "Apache-2.0", - "private": false, - "scripts": { - "start-validator": "solana-test-validator --reset --quiet --bpf-program Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS ./target/deploy/counter_solana_native.so", - "run-tests": "jest tests --detectOpenHandles", - "test": "start-server-and-test start-validator http://localhost:8899/health run-tests" - }, - "devDependencies": { - "@types/bn.js": "^5.1.1", - "@types/jest": "^29.0.0", - "chai": "^4.3.6", - "jest": "^29.0.2", - "start-server-and-test": "^1.14.0", - "ts-jest": "^28.0.8", - "ts-jest-resolver": "^2.0.0", - "ts-node": "^10.9.1", - "typescript": "^4.8.2" - }, - "dependencies": { - "@metaplex-foundation/beet": "^0.6.1", - "@metaplex-foundation/solita": "^0.15.2", - "@solana/web3.js": "^1.98.4" - } -} diff --git a/basics/counter/mpl-stack/src/lib.rs b/basics/counter/mpl-stack/src/lib.rs deleted file mode 100644 index 4fd7da61..00000000 --- a/basics/counter/mpl-stack/src/lib.rs +++ /dev/null @@ -1,65 +0,0 @@ -use borsh::{BorshDeserialize, BorshSerialize}; -use shank::ShankInstruction; -use solana_program::{ - account_info::{next_account_info, AccountInfo}, - declare_id, - entrypoint::ProgramResult, - msg, - program_error::ProgramError, - pubkey::Pubkey, -}; - -mod state; -use state::*; - -declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"); - -#[cfg(not(feature = "no-entrypoint"))] -use solana_program::entrypoint; - -#[cfg(not(feature = "no-entrypoint"))] -entrypoint!(process_instruction); - -#[derive(ShankInstruction, BorshDeserialize, BorshSerialize)] -pub enum Instruction { - #[account(0, writable, name = "counter", desc = "Counter account to increment")] - Increment, -} - -pub fn process_instruction( - _program_id: &Pubkey, - accounts: &[AccountInfo], - instruction_data: &[u8], -) -> ProgramResult { - let (instruction_discriminant, instruction_data_inner) = instruction_data.split_at(1); - match instruction_discriminant[0] { - 0 => { - msg!("Instruction: Increment"); - process_increment_counter(accounts, instruction_data_inner)?; - } - _ => { - msg!("Error: unknown instruction") - } - } - Ok(()) -} - -pub fn process_increment_counter( - accounts: &[AccountInfo], - _instruction_data: &[u8], -) -> Result<(), ProgramError> { - let account_info_iter = &mut accounts.iter(); - - let counter_account = next_account_info(account_info_iter)?; - assert!( - counter_account.is_writable, - "Counter account must be writable" - ); - - let mut counter = Counter::try_from_slice(&counter_account.try_borrow_mut_data()?)?; - counter.count += 1; - counter.serialize(&mut *counter_account.data.borrow_mut())?; - - msg!("Counter state incremented to {:?}", counter.count); - Ok(()) -} diff --git a/basics/counter/mpl-stack/src/state.rs b/basics/counter/mpl-stack/src/state.rs deleted file mode 100644 index 745af6f2..00000000 --- a/basics/counter/mpl-stack/src/state.rs +++ /dev/null @@ -1,7 +0,0 @@ -use borsh::{BorshDeserialize, BorshSerialize}; -use shank::ShankAccount; - -#[derive(ShankAccount, BorshSerialize, BorshDeserialize, Debug, Clone)] -pub struct Counter { - pub count: u64, -} diff --git a/basics/counter/mpl-stack/tests/counter.test.ts b/basics/counter/mpl-stack/tests/counter.test.ts deleted file mode 100644 index dc345a80..00000000 --- a/basics/counter/mpl-stack/tests/counter.test.ts +++ /dev/null @@ -1,111 +0,0 @@ -import type { bignum } from "@metaplex-foundation/beet"; -import { - Connection, - Keypair, - LAMPORTS_PER_SOL, - SystemProgram, - sendAndConfirmTransaction, - Transaction, - type TransactionInstruction, -} from "@solana/web3.js"; -import { BN } from "bn.js"; -import { assert } from "chai"; - -import { Counter, createIncrementInstruction, PROGRAM_ID } from "../ts"; - -function convertBignumToNumber(bignum: bignum): number { - return new BN(bignum).toNumber(); -} - -describe("Counter Solana Native", () => { - const connection = new Connection("http://localhost:8899"); - - it("Test allocate counter + increment tx", async () => { - // Randomly generate our wallet - const payerKeypair = Keypair.generate(); - const payer = payerKeypair.publicKey; - - // Randomly generate the account key - // to sign for setting up the Counter state - const counterKeypair = Keypair.generate(); - const counter = counterKeypair.publicKey; - - // Airdrop our wallet 1 Sol - await connection.requestAirdrop(payer, LAMPORTS_PER_SOL); - - // Create a TransactionInstruction to interact with our counter program - const allocIx: TransactionInstruction = SystemProgram.createAccount({ - fromPubkey: payer, - newAccountPubkey: counter, - lamports: await connection.getMinimumBalanceForRentExemption(Counter.byteSize), - space: Counter.byteSize, - programId: PROGRAM_ID, - }); - const incrementIx: TransactionInstruction = createIncrementInstruction({ - counter, - }); - const tx = new Transaction().add(allocIx).add(incrementIx); - - // Explicitly set the feePayer to be our wallet (this is set to first signer by default) - tx.feePayer = payer; - - // Fetch a "timestamp" so validators know this is a recent transaction - tx.recentBlockhash = (await connection.getLatestBlockhash("confirmed")).blockhash; - - // Send transaction to network (local network) - await sendAndConfirmTransaction(connection, tx, [payerKeypair, counterKeypair], { - skipPreflight: true, - commitment: "confirmed", - }); - - // Get the counter account info from network - const count = (await Counter.fromAccountAddress(connection, counter)).count; - assert(new BN(count).toNumber() === 1, "Expected count to have been 1"); - console.log(`[alloc+increment] count is: ${count}`); - }); - it("Test allocate tx and increment tx", async () => { - const payerKeypair = Keypair.generate(); - const payer = payerKeypair.publicKey; - - const counterKeypair = Keypair.generate(); - const counter = counterKeypair.publicKey; - - await connection.requestAirdrop(payer, LAMPORTS_PER_SOL); - - // Check allocate tx - const allocIx: TransactionInstruction = SystemProgram.createAccount({ - fromPubkey: payer, - newAccountPubkey: counter, - lamports: await connection.getMinimumBalanceForRentExemption(Counter.byteSize), - space: Counter.byteSize, - programId: PROGRAM_ID, - }); - let tx = new Transaction().add(allocIx); - tx.feePayer = payer; - tx.recentBlockhash = (await connection.getLatestBlockhash("confirmed")).blockhash; - await sendAndConfirmTransaction(connection, tx, [payerKeypair, counterKeypair], { - skipPreflight: true, - commitment: "confirmed", - }); - - let count = (await Counter.fromAccountAddress(connection, counter)).count; - assert(convertBignumToNumber(count) === 0, "Expected count to have been 0"); - console.log(`[allocate] count is: ${count}`); - - // Check increment tx - const incrementIx: TransactionInstruction = createIncrementInstruction({ - counter, - }); - tx = new Transaction().add(incrementIx); - tx.feePayer = payer; - tx.recentBlockhash = (await connection.getLatestBlockhash("confirmed")).blockhash; - await sendAndConfirmTransaction(connection, tx, [payerKeypair], { - skipPreflight: true, - commitment: "confirmed", - }); - - count = (await Counter.fromAccountAddress(connection, counter)).count; - assert(convertBignumToNumber(count) === 1, "Expected count to have been 1"); - console.log(`[increment] count is: ${count}`); - }); -}); diff --git a/basics/counter/mpl-stack/ts/generated/accounts/Counter.ts b/basics/counter/mpl-stack/ts/generated/accounts/Counter.ts deleted file mode 100644 index 159e2972..00000000 --- a/basics/counter/mpl-stack/ts/generated/accounts/Counter.ts +++ /dev/null @@ -1,145 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as beet from "@metaplex-foundation/beet"; -import * as beetSolana from "@metaplex-foundation/beet-solana"; -import * as web3 from "@solana/web3.js"; - -/** - * Arguments used to create {@link Counter} - * @category Accounts - * @category generated - */ -export type CounterArgs = { - count: beet.bignum; -}; -/** - * Holds the data for the {@link Counter} Account and provides de/serialization - * functionality for that data - * - * @category Accounts - * @category generated - */ -export class Counter implements CounterArgs { - private constructor(readonly count: beet.bignum) {} - - /** - * Creates a {@link Counter} instance from the provided args. - */ - static fromArgs(args: CounterArgs) { - return new Counter(args.count); - } - - /** - * Deserializes the {@link Counter} from the data of the provided {@link web3.AccountInfo}. - * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. - */ - static fromAccountInfo(accountInfo: web3.AccountInfo, offset = 0): [Counter, number] { - return Counter.deserialize(accountInfo.data, offset); - } - - /** - * Retrieves the account info from the provided address and deserializes - * the {@link Counter} from its data. - * - * @throws Error if no account info is found at the address or if deserialization fails - */ - static async fromAccountAddress(connection: web3.Connection, address: web3.PublicKey): Promise { - const accountInfo = await connection.getAccountInfo(address, { - commitment: "confirmed", - }); - if (accountInfo == null) { - throw new Error(`Unable to find Counter account at ${address}`); - } - return Counter.fromAccountInfo(accountInfo, 0)[0]; - } - - /** - * Provides a {@link web3.Connection.getProgramAccounts} config builder, - * to fetch accounts matching filters that can be specified via that builder. - * - * @param programId - the program that owns the accounts we are filtering - */ - static gpaBuilder(programId: web3.PublicKey = new web3.PublicKey("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS")) { - return beetSolana.GpaBuilder.fromStruct(programId, counterBeet); - } - - /** - * Deserializes the {@link Counter} from the provided data Buffer. - * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. - */ - static deserialize(buf: Buffer, offset = 0): [Counter, number] { - return counterBeet.deserialize(buf, offset); - } - - /** - * Serializes the {@link Counter} into a Buffer. - * @returns a tuple of the created Buffer and the offset up to which the buffer was written to store it. - */ - serialize(): [Buffer, number] { - return counterBeet.serialize(this); - } - - /** - * Returns the byteSize of a {@link Buffer} holding the serialized data of - * {@link Counter} - */ - static get byteSize() { - return counterBeet.byteSize; - } - - /** - * Fetches the minimum balance needed to exempt an account holding - * {@link Counter} data from rent - * - * @param connection used to retrieve the rent exemption information - */ - static async getMinimumBalanceForRentExemption( - connection: web3.Connection, - commitment?: web3.Commitment, - ): Promise { - return connection.getMinimumBalanceForRentExemption(Counter.byteSize, commitment); - } - - /** - * Determines if the provided {@link Buffer} has the correct byte size to - * hold {@link Counter} data. - */ - static hasCorrectByteSize(buf: Buffer, offset = 0) { - return buf.byteLength - offset === Counter.byteSize; - } - - /** - * Returns a readable version of {@link Counter} properties - * and can be used to convert to JSON and/or logging - */ - pretty() { - return { - count: (() => { - const x = <{ toNumber: () => number }>this.count; - if (typeof x.toNumber === "function") { - try { - return x.toNumber(); - } catch (_) { - return x; - } - } - return x; - })(), - }; - } -} - -/** - * @category Accounts - * @category generated - */ -export const counterBeet = new beet.BeetStruct( - [["count", beet.u64]], - Counter.fromArgs, - "Counter", -); diff --git a/basics/counter/mpl-stack/ts/generated/accounts/index.ts b/basics/counter/mpl-stack/ts/generated/accounts/index.ts deleted file mode 100644 index 4a738244..00000000 --- a/basics/counter/mpl-stack/ts/generated/accounts/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from "./Counter"; - -import { Counter } from "./Counter"; - -export const accountProviders = { Counter }; diff --git a/basics/counter/mpl-stack/ts/generated/index.ts b/basics/counter/mpl-stack/ts/generated/index.ts deleted file mode 100644 index 8a3d9703..00000000 --- a/basics/counter/mpl-stack/ts/generated/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { PublicKey } from "@solana/web3.js"; - -export * from "./accounts"; -export * from "./instructions"; - -/** - * Program address - * - * @category constants - * @category generated - */ -export const PROGRAM_ADDRESS = "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"; - -/** - * Program public key - * - * @category constants - * @category generated - */ -export const PROGRAM_ID = new PublicKey(PROGRAM_ADDRESS); diff --git a/basics/counter/mpl-stack/ts/generated/instructions/Increment.ts b/basics/counter/mpl-stack/ts/generated/instructions/Increment.ts deleted file mode 100644 index afc81456..00000000 --- a/basics/counter/mpl-stack/ts/generated/instructions/Increment.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as beet from "@metaplex-foundation/beet"; -import * as web3 from "@solana/web3.js"; - -/** - * @category Instructions - * @category Increment - * @category generated - */ -export const IncrementStruct = new beet.BeetArgsStruct<{ - instructionDiscriminator: number; -}>([["instructionDiscriminator", beet.u8]], "IncrementInstructionArgs"); -/** - * Accounts required by the _Increment_ instruction - * - * @property [_writable_] counter Counter account to increment - * @category Instructions - * @category Increment - * @category generated - */ -export type IncrementInstructionAccounts = { - counter: web3.PublicKey; -}; - -export const incrementInstructionDiscriminator = 0; - -/** - * Creates a _Increment_ instruction. - * - * @param accounts that will be accessed while the instruction is processed - * @category Instructions - * @category Increment - * @category generated - */ -export function createIncrementInstruction( - accounts: IncrementInstructionAccounts, - programId = new web3.PublicKey("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"), -) { - const [data] = IncrementStruct.serialize({ - instructionDiscriminator: incrementInstructionDiscriminator, - }); - const keys: web3.AccountMeta[] = [ - { - pubkey: accounts.counter, - isWritable: true, - isSigner: false, - }, - ]; - - const ix = new web3.TransactionInstruction({ - programId, - keys, - data, - }); - return ix; -} diff --git a/basics/counter/mpl-stack/ts/generated/instructions/index.ts b/basics/counter/mpl-stack/ts/generated/instructions/index.ts deleted file mode 100644 index 84936e74..00000000 --- a/basics/counter/mpl-stack/ts/generated/instructions/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./Increment"; diff --git a/basics/counter/mpl-stack/ts/index.ts b/basics/counter/mpl-stack/ts/index.ts deleted file mode 100644 index e84c86c6..00000000 --- a/basics/counter/mpl-stack/ts/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./generated"; From f1db9221832ed724bcfa56f47953b7486845cdc3 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Tue, 9 Jun 2026 12:46:35 -0400 Subject: [PATCH 042/138] refactor(finance/escrow): extract PDA-aware token transfer/close helpers Add an owning_pda_seeds option to transfer_tokens and a new close_token_account helper in shared.rs, then use them across make_offer, take_offer, and cancel_offer. This removes the duplicated CpiContext::new_with_signer + transfer_checked/close_account boilerplate that was hand-rolled in each handler. No behavior change: per-maker PDA seeds and has_one checks are unchanged. Verified with cargo test (5 tests pass). --- .../escrow/src/instructions/cancel_offer.rs | 58 ++++++---------- .../escrow/src/instructions/make_offer.rs | 3 +- .../escrow/src/instructions/shared.rs | 44 +++++++++++- .../escrow/src/instructions/take_offer.rs | 68 +++++++------------ 4 files changed, 87 insertions(+), 86 deletions(-) diff --git a/finance/escrow/anchor/programs/escrow/src/instructions/cancel_offer.rs b/finance/escrow/anchor/programs/escrow/src/instructions/cancel_offer.rs index 85f1e2b6..92472a37 100644 --- a/finance/escrow/anchor/programs/escrow/src/instructions/cancel_offer.rs +++ b/finance/escrow/anchor/programs/escrow/src/instructions/cancel_offer.rs @@ -2,14 +2,13 @@ use anchor_lang::prelude::*; use anchor_spl::{ associated_token::AssociatedToken, - token_interface::{ - close_account, transfer_checked, CloseAccount, Mint, TokenAccount, TokenInterface, - TransferChecked, - }, + token_interface::{Mint, TokenAccount, TokenInterface}, }; use crate::Offer; +use super::{close_token_account, transfer_tokens}; + // Cancel an outstanding offer. Without this handler, an abandoned offer would // keep the maker's token-A locked in the vault forever (and the offer // account's rent unclaimed). The maker signs, the vault tokens flow back to @@ -55,45 +54,28 @@ pub struct CancelOffer<'info> { pub fn handle_cancel_offer(context: Context) -> Result<()> { let maker_key = context.accounts.maker.key(); let id_bytes = context.accounts.offer.id.to_le_bytes(); - let seeds = &[ - b"offer".as_ref(), - maker_key.as_ref(), - id_bytes.as_ref(), - &[context.accounts.offer.bump], - ]; - let signer_seeds = [&seeds[..]]; + let bump = [context.accounts.offer.bump]; + let offer_seeds: &[&[u8]] = &[b"offer", maker_key.as_ref(), id_bytes.as_ref(), &bump]; // Move all tokens back from the vault to the maker. - let vault_amount = context.accounts.vault.amount; - let transfer_accounts = TransferChecked { - from: context.accounts.vault.to_account_info(), - mint: context.accounts.token_mint_a.to_account_info(), - to: context.accounts.maker_token_account_a.to_account_info(), - authority: context.accounts.offer.to_account_info(), - }; - let cpi_context = CpiContext::new_with_signer( - context.accounts.token_program.key(), - transfer_accounts, - &signer_seeds, - ); - transfer_checked( - cpi_context, - vault_amount, - context.accounts.token_mint_a.decimals, + transfer_tokens( + &context.accounts.vault, + &context.accounts.maker_token_account_a, + &context.accounts.vault.amount, + &context.accounts.token_mint_a, + &context.accounts.offer.to_account_info(), + &context.accounts.token_program, + Some(offer_seeds), )?; // Close the vault, sending its rent lamports back to the maker. - let close_accounts = CloseAccount { - account: context.accounts.vault.to_account_info(), - destination: context.accounts.maker.to_account_info(), - authority: context.accounts.offer.to_account_info(), - }; - let cpi_context = CpiContext::new_with_signer( - context.accounts.token_program.key(), - close_accounts, - &signer_seeds, - ); - close_account(cpi_context)?; + close_token_account( + &context.accounts.vault, + &context.accounts.maker.to_account_info(), + &context.accounts.offer.to_account_info(), + &context.accounts.token_program, + Some(offer_seeds), + )?; // The offer account itself is closed by the `close = maker` constraint // above, which refunds its rent to the maker. diff --git a/finance/escrow/anchor/programs/escrow/src/instructions/make_offer.rs b/finance/escrow/anchor/programs/escrow/src/instructions/make_offer.rs index b94d2862..a40ac32f 100644 --- a/finance/escrow/anchor/programs/escrow/src/instructions/make_offer.rs +++ b/finance/escrow/anchor/programs/escrow/src/instructions/make_offer.rs @@ -76,8 +76,9 @@ pub fn handle_send_offered_tokens_to_vault( &context.accounts.vault, &token_a_offered_amount, &context.accounts.token_mint_a, - &context.accounts.maker, + &context.accounts.maker.to_account_info(), &context.accounts.token_program, + None, ) } diff --git a/finance/escrow/anchor/programs/escrow/src/instructions/shared.rs b/finance/escrow/anchor/programs/escrow/src/instructions/shared.rs index dcac2116..349c107b 100644 --- a/finance/escrow/anchor/programs/escrow/src/instructions/shared.rs +++ b/finance/escrow/anchor/programs/escrow/src/instructions/shared.rs @@ -1,16 +1,21 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::{ - transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, + close_account, transfer_checked, CloseAccount, Mint, TokenAccount, TokenInterface, + TransferChecked, }; +// Transfer tokens from one token account to another. +// When transferring out of a token account owned by a PDA, pass the PDA's +// signer seeds via owning_pda_seeds; otherwise pass None. pub fn transfer_tokens<'info>( from: &InterfaceAccount<'info, TokenAccount>, to: &InterfaceAccount<'info, TokenAccount>, amount: &u64, mint: &InterfaceAccount<'info, Mint>, - authority: &Signer<'info>, + authority: &AccountInfo<'info>, token_program: &Interface<'info, TokenInterface>, + owning_pda_seeds: Option<&[&[u8]]>, ) -> Result<()> { let transfer_accounts = TransferChecked { from: from.to_account_info(), @@ -19,7 +24,40 @@ pub fn transfer_tokens<'info>( authority: authority.to_account_info(), }; - let cpi_context = CpiContext::new(token_program.key(), transfer_accounts); + let signer_seeds = owning_pda_seeds.map(|seeds| [seeds]); + let cpi_context = match signer_seeds.as_ref() { + Some(signer_seeds) => { + CpiContext::new_with_signer(token_program.key(), transfer_accounts, signer_seeds) + } + None => CpiContext::new(token_program.key(), transfer_accounts), + }; transfer_checked(cpi_context, *amount, mint.decimals) } + +// Close a token account, sending its rent lamports to destination. +// When the token account is owned by a PDA, pass the PDA's signer seeds via +// owning_pda_seeds; otherwise pass None. +pub fn close_token_account<'info>( + token_account: &InterfaceAccount<'info, TokenAccount>, + destination: &AccountInfo<'info>, + authority: &AccountInfo<'info>, + token_program: &Interface<'info, TokenInterface>, + owning_pda_seeds: Option<&[&[u8]]>, +) -> Result<()> { + let close_accounts = CloseAccount { + account: token_account.to_account_info(), + destination: destination.to_account_info(), + authority: authority.to_account_info(), + }; + + let signer_seeds = owning_pda_seeds.map(|seeds| [seeds]); + let cpi_context = match signer_seeds.as_ref() { + Some(signer_seeds) => { + CpiContext::new_with_signer(token_program.key(), close_accounts, signer_seeds) + } + None => CpiContext::new(token_program.key(), close_accounts), + }; + + close_account(cpi_context) +} diff --git a/finance/escrow/anchor/programs/escrow/src/instructions/take_offer.rs b/finance/escrow/anchor/programs/escrow/src/instructions/take_offer.rs index 11acc687..e3813b65 100644 --- a/finance/escrow/anchor/programs/escrow/src/instructions/take_offer.rs +++ b/finance/escrow/anchor/programs/escrow/src/instructions/take_offer.rs @@ -2,15 +2,12 @@ use anchor_lang::prelude::*; use anchor_spl::{ associated_token::AssociatedToken, - token_interface::{ - close_account, transfer_checked, CloseAccount, Mint, TokenAccount, TokenInterface, - TransferChecked, - }, + token_interface::{Mint, TokenAccount, TokenInterface}, }; use crate::Offer; -use super::transfer_tokens; +use super::{close_token_account, transfer_tokens}; #[derive(Accounts)] pub struct TakeOffer<'info> { @@ -82,50 +79,33 @@ pub fn handle_send_wanted_tokens_to_maker(context: &Context) -> Resul &context.accounts.maker_token_account_b, &context.accounts.offer.token_b_wanted_amount, &context.accounts.token_mint_b, - &context.accounts.taker, + &context.accounts.taker.to_account_info(), &context.accounts.token_program, + None, ) } pub fn handle_withdraw_and_close_vault(context: Context) -> Result<()> { - let seeds = &[ - b"offer", - context.accounts.maker.to_account_info().key.as_ref(), - &context.accounts.offer.id.to_le_bytes()[..], - &[context.accounts.offer.bump], - ]; - let signer_seeds = [&seeds[..]]; - - let accounts = TransferChecked { - from: context.accounts.vault.to_account_info(), - mint: context.accounts.token_mint_a.to_account_info(), - to: context.accounts.taker_token_account_a.to_account_info(), - authority: context.accounts.offer.to_account_info(), - }; - - let cpi_context = CpiContext::new_with_signer( - context.accounts.token_program.key(), - accounts, - &signer_seeds, - ); - - transfer_checked( - cpi_context, - context.accounts.vault.amount, - context.accounts.token_mint_a.decimals, - )?; - - let accounts = CloseAccount { - account: context.accounts.vault.to_account_info(), - destination: context.accounts.taker.to_account_info(), - authority: context.accounts.offer.to_account_info(), - }; + let maker_key = context.accounts.maker.key(); + let id_bytes = context.accounts.offer.id.to_le_bytes(); + let bump = [context.accounts.offer.bump]; + let offer_seeds: &[&[u8]] = &[b"offer", maker_key.as_ref(), id_bytes.as_ref(), &bump]; - let cpi_context = CpiContext::new_with_signer( - context.accounts.token_program.key(), - accounts, - &signer_seeds, - ); + transfer_tokens( + &context.accounts.vault, + &context.accounts.taker_token_account_a, + &context.accounts.vault.amount, + &context.accounts.token_mint_a, + &context.accounts.offer.to_account_info(), + &context.accounts.token_program, + Some(offer_seeds), + )?; - close_account(cpi_context) + close_token_account( + &context.accounts.vault, + &context.accounts.taker.to_account_info(), + &context.accounts.offer.to_account_info(), + &context.accounts.token_program, + Some(offer_seeds), + ) } From 907197ab6b970244d7dbcad57207e9e6edd92f90 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Tue, 9 Jun 2026 12:49:38 -0400 Subject: [PATCH 043/138] Start with Escrow at top --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 22749bb6..f930adb6 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,6 @@ Each example is available in one or more of the following frameworks: ## Financial Software -### Betting Market - -Parimutuel (pooled) prediction market โ€” an admin opens an event with multiple outcomes, bettors stake tokens on an outcome, and at settlement the losing pool (minus a protocol fee) is split among winners in proportion to their stake. - -[โš“ Anchor](./tokens/betting-market/anchor) - - ### Escrow **Start here โ€” the best first finance program to learn on Solana.** A neutral account that holds funds until both sides deliver, like a real-estate escrow or a lawyer's trust account. The maker deposits token A and names how much token B they want; when a taker supplies token B, the program swaps both in a single all-or-nothing transaction. This swap is the core idea behind every onchain exchange. @@ -54,6 +47,13 @@ A managed investment fund onchain, like an ETF or mutual fund. Investors deposit [โš“ Anchor](./finance/vault-strategy/anchor) +### Betting Market + +Parimutuel (pooled) prediction market โ€” an admin opens an event with multiple outcomes, bettors stake tokens on an outcome, and at settlement the losing pool (minus a protocol fee) is split among winners in proportion to their stake. + +[โš“ Anchor](./tokens/betting-market/anchor) + + ## Single concept examples ### Hello Solana From 3ed874c571726061d2e65fca69fecf589a60cfc4 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 9 Jun 2026 19:47:27 +0000 Subject: [PATCH 044/138] fix(tests): use correct NVDAx (8) and USDC (6) mint decimals The base mint was using 6 decimals matching USDC, but the real NVDAx token on-chain has 8 decimals. Split MINT_DECIMALS into BASE_DECIMALS=8 and QUOTE_DECIMALS=6 and add a comment explaining the price resolution consequence: with these two mints, one tick = 10^(8-6) = $100/share. https://claude.ai/code/session_01G6iaAjzg8aoFwe8ZWWG9VR --- .../programs/order-book/tests/test_order_book.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/defi/order-book/anchor/programs/order-book/tests/test_order_book.rs b/defi/order-book/anchor/programs/order-book/tests/test_order_book.rs index 89c1d0cf..11da28f4 100644 --- a/defi/order-book/anchor/programs/order-book/tests/test_order_book.rs +++ b/defi/order-book/anchor/programs/order-book/tests/test_order_book.rs @@ -43,9 +43,11 @@ const MARKET_USER_SEED: &[u8] = b"market_user"; // `#[account(zero)]` check fails if the account size is wrong. const ORDER_BOOK_ACCOUNT_SIZE: u64 = order_book::state::ORDER_BOOK_ACCOUNT_SIZE as u64; -// Six decimals matches USDC and keeps "1 token" == 1_000_000 base units, -// which keeps the arithmetic in the assertions easy to read. -const MINT_DECIMALS: u8 = 6; +// NVDAx has 8 decimals on-chain; USDC has 6. Because the program stores +// price as raw_quote per raw_base, one tick = 10^(base_dec - quote_dec) = 100 +// USDC/share โ€” the minimum representable price step with these two mints. +const BASE_DECIMALS: u8 = 8; // NVDAx (https://explorer.solana.com/address/Xsc9qvGR1efVDFGLrVsmkzv3qi45LTBjeUKSPmx9qEh) +const QUOTE_DECIMALS: u8 = 6; // USDC // Market parameters used across every test. `tick_size = 1` is permissive // enough for most scenarios; a dedicated test overrides it to verify the @@ -148,8 +150,8 @@ fn full_setup() -> Scenario { let buyer = create_wallet(&mut svm, 10_000_000_000).unwrap(); let seller = create_wallet(&mut svm, 10_000_000_000).unwrap(); - let base_mint = create_token_mint(&mut svm, &authority, MINT_DECIMALS, None).unwrap(); - let quote_mint = create_token_mint(&mut svm, &authority, MINT_DECIMALS, None).unwrap(); + let base_mint = create_token_mint(&mut svm, &authority, BASE_DECIMALS, None).unwrap(); + let quote_mint = create_token_mint(&mut svm, &authority, QUOTE_DECIMALS, None).unwrap(); // Create and fund every trader's ATAs up-front so individual tests do // not need to worry about mint/ATA side effects, only about order-book state. From 9c22bf26f6a4478faacfb318f107ceafd1807049 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 9 Jun 2026 20:58:49 +0000 Subject: [PATCH 045/138] feat: add base_lot_size to fix NVDAx/USDC price resolution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without base_lot_size, raw-unit prices for NVDAx (8 dec) / USDC (6 dec) produce a $100 minimum tick โ€” unusable at real NVIDIA prices. Fix: quantities are now in lots (1 lot = base_lot_size raw base tokens); setting base_lot_size = 10^(d_base - d_quote) = 100 makes `price` equal the human-readable USDC/share rate with a $1 minimum tick. All base-token flows updated with u128 overflow-safe arithmetic per Solana best practices: ask lock in place_order, bid fill receipt, ask fill maker credit, and ask cancel refund in cancel_order. Tests split MINT_DECIMALS into BASE_DECIMALS=8 / QUOTE_DECIMALS=6, add BASE_LOT_SIZE=100, update all assertions, and add a rejection test for zero base_lot_size. https://claude.ai/code/session_01G6iaAjzg8aoFwe8ZWWG9VR --- .../anchor/programs/order-book/src/errors.rs | 3 + .../src/instructions/cancel_order.rs | 7 +- .../src/instructions/initialize_market.rs | 3 + .../src/instructions/place_order.rs | 20 ++++- .../anchor/programs/order-book/src/lib.rs | 2 + .../programs/order-book/src/state/market.rs | 13 ++++ .../order-book/tests/test_order_book.rs | 75 +++++++++++++------ 7 files changed, 95 insertions(+), 28 deletions(-) diff --git a/defi/order-book/anchor/programs/order-book/src/errors.rs b/defi/order-book/anchor/programs/order-book/src/errors.rs index f2a96860..f362524e 100644 --- a/defi/order-book/anchor/programs/order-book/src/errors.rs +++ b/defi/order-book/anchor/programs/order-book/src/errors.rs @@ -23,6 +23,9 @@ pub enum ErrorCode { #[msg("Price does not align with tick size")] InvalidTickSize, + #[msg("Base lot size must be greater than zero")] + InvalidBaseLotSize, + #[msg("Quantity is below minimum order size")] BelowMinOrderSize, diff --git a/defi/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs b/defi/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs index b27316a0..ddf4caa3 100644 --- a/defi/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs +++ b/defi/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs @@ -43,9 +43,14 @@ pub fn handle_cancel_order(context: Context) -> Result<()> { .ok_or(ErrorCode::NumericalOverflow)?; } OrderSide::Ask => { + let base_amount: u64 = (remaining as u128) + .checked_mul(context.accounts.market.base_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .try_into() + .map_err(|_| error!(ErrorCode::NumericalOverflow))?; market_user.unsettled_base = market_user .unsettled_base - .checked_add(remaining) + .checked_add(base_amount) .ok_or(ErrorCode::NumericalOverflow)?; } } diff --git a/defi/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs b/defi/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs index f77c8972..90fc1699 100644 --- a/defi/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs +++ b/defi/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs @@ -12,9 +12,11 @@ pub fn handle_initialize_market( context: Context, fee_basis_points: u16, tick_size: u64, + base_lot_size: u64, min_order_size: u64, ) -> Result<()> { require!(tick_size > 0, ErrorCode::InvalidTickSize); + require!(base_lot_size > 0, ErrorCode::InvalidBaseLotSize); require!(min_order_size > 0, ErrorCode::BelowMinOrderSize); require!( fee_basis_points <= MAX_FEE_BASIS_POINTS, @@ -31,6 +33,7 @@ pub fn handle_initialize_market( market.order_book = context.accounts.order_book.key(); market.fee_basis_points = fee_basis_points; market.tick_size = tick_size; + market.base_lot_size = base_lot_size; market.min_order_size = min_order_size; market.is_active = true; market.bump = context.bumps.market; diff --git a/defi/order-book/anchor/programs/order-book/src/instructions/place_order.rs b/defi/order-book/anchor/programs/order-book/src/instructions/place_order.rs index 3fa1952d..b203752e 100644 --- a/defi/order-book/anchor/programs/order-book/src/instructions/place_order.rs +++ b/defi/order-book/anchor/programs/order-book/src/instructions/place_order.rs @@ -75,7 +75,11 @@ pub fn handle_place_order<'info>( context.accounts.user_base_account.to_account_info(), context.accounts.base_mint.to_account_info(), context.accounts.base_mint.decimals, - quantity, + (quantity as u128) + .checked_mul(market.base_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .try_into() + .map_err(|_| error!(ErrorCode::NumericalOverflow))?, context.accounts.base_vault.to_account_info(), ), }; @@ -218,8 +222,13 @@ pub fn handle_place_order<'info>( .checked_add(net_quote_to_maker) .ok_or(ErrorCode::NumericalOverflow)?; + let base_from_fill: u64 = (fill.fill_quantity as u128) + .checked_mul(market.base_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .try_into() + .map_err(|_| error!(ErrorCode::NumericalOverflow))?; taker_base_received = taker_base_received - .checked_add(fill.fill_quantity) + .checked_add(base_from_fill) .ok_or(ErrorCode::NumericalOverflow)?; // Price improvement: taker locked (price * quantity) but @@ -241,9 +250,14 @@ pub fn handle_place_order<'info>( } // Taker Ask, resting Bid. Taker gives base, gets quote. OrderSide::Ask => { + let base_from_fill: u64 = (fill.fill_quantity as u128) + .checked_mul(market.base_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .try_into() + .map_err(|_| error!(ErrorCode::NumericalOverflow))?; maker_market_user.unsettled_base = maker_market_user .unsettled_base - .checked_add(fill.fill_quantity) + .checked_add(base_from_fill) .ok_or(ErrorCode::NumericalOverflow)?; let net_quote_to_taker = gross_quote diff --git a/defi/order-book/anchor/programs/order-book/src/lib.rs b/defi/order-book/anchor/programs/order-book/src/lib.rs index 1e06df24..2589acb3 100644 --- a/defi/order-book/anchor/programs/order-book/src/lib.rs +++ b/defi/order-book/anchor/programs/order-book/src/lib.rs @@ -19,12 +19,14 @@ pub mod order_book { context: Context, fee_basis_points: u16, tick_size: u64, + base_lot_size: u64, min_order_size: u64, ) -> Result<()> { instructions::initialize_market::handle_initialize_market( context, fee_basis_points, tick_size, + base_lot_size, min_order_size, ) } diff --git a/defi/order-book/anchor/programs/order-book/src/state/market.rs b/defi/order-book/anchor/programs/order-book/src/state/market.rs index 42a81504..2cb87efd 100644 --- a/defi/order-book/anchor/programs/order-book/src/state/market.rs +++ b/defi/order-book/anchor/programs/order-book/src/state/market.rs @@ -31,6 +31,19 @@ pub struct Market { pub tick_size: u64, + // Number of raw base-token units per lot. Quantities throughout the + // program are in lots; this factor converts them to raw token units for + // SPL transfers. For a base mint with d_base decimals and quote with + // d_quote, set base_lot_size = 10^(d_base - d_quote) so that one raw + // quote unit buys exactly one lot of base at price = 1, making `price` + // equal to the human-readable USDC-per-token rate. + // + // Example โ€” NVDAx (8 dec) / USDC (6 dec): + // base_lot_size = 10^(8-6) = 100 raw NVDAx per lot + // price = 130 โ†’ $130.00 per NVDAx share + // tick_size = 1 โ†’ $1.00 minimum price increment + pub base_lot_size: u64, + pub min_order_size: u64, pub is_active: bool, diff --git a/defi/order-book/anchor/programs/order-book/tests/test_order_book.rs b/defi/order-book/anchor/programs/order-book/tests/test_order_book.rs index 11da28f4..e33c8e2a 100644 --- a/defi/order-book/anchor/programs/order-book/tests/test_order_book.rs +++ b/defi/order-book/anchor/programs/order-book/tests/test_order_book.rs @@ -49,11 +49,14 @@ const ORDER_BOOK_ACCOUNT_SIZE: u64 = order_book::state::ORDER_BOOK_ACCOUNT_SIZE const BASE_DECIMALS: u8 = 8; // NVDAx (https://explorer.solana.com/address/Xsc9qvGR1efVDFGLrVsmkzv3qi45LTBjeUKSPmx9qEh) const QUOTE_DECIMALS: u8 = 6; // USDC -// Market parameters used across every test. `tick_size = 1` is permissive -// enough for most scenarios; a dedicated test overrides it to verify the -// tick check fires. +// Market parameters used across every test. `tick_size = 1` and +// `base_lot_size = 100` match the NVDAx/USDC decimal configuration +// (BASE_DECIMALS=8, QUOTE_DECIMALS=6): price = human USDC/share, +// tick = $1.00, 1 lot = 100 raw NVDAx. A dedicated test overrides +// tick_size to verify the tick check fires. const FEE_BASIS_POINTS: u16 = 10; const TICK_SIZE: u64 = 1; +const BASE_LOT_SIZE: u64 = 100; const MIN_ORDER_SIZE: u64 = 1; // Funding for each trader's token accounts. Large enough to cover every @@ -250,6 +253,7 @@ fn build_initialize_market_ix( sc: &Scenario, fee_basis_points: u16, tick_size: u64, + base_lot_size: u64, min_order_size: u64, ) -> Instruction { Instruction::new_with_bytes( @@ -257,6 +261,7 @@ fn build_initialize_market_ix( &order_book::instruction::InitializeMarket { fee_basis_points, tick_size, + base_lot_size, min_order_size, } .data(), @@ -449,7 +454,7 @@ fn initialize_market_and_users(sc: &mut Scenario) { // program, zero-initialized) before initialize_market's `#[account(zero)]` // check passes. let create_ix = build_create_order_book_account_ix(sc, &sc.authority.pubkey()); - let init_ix = build_initialize_market_ix(sc, FEE_BASIS_POINTS, TICK_SIZE, MIN_ORDER_SIZE); + let init_ix = build_initialize_market_ix(sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, MIN_ORDER_SIZE); send_transaction_from_instructions( &mut sc.svm, vec![create_ix, init_ix], @@ -492,7 +497,7 @@ fn initialize_market_sets_market_and_order_book() { let mut sc = full_setup(); let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); - let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, MIN_ORDER_SIZE); + let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, MIN_ORDER_SIZE); send_transaction_from_instructions( &mut sc.svm, vec![create_ix, ix], @@ -540,7 +545,7 @@ fn create_market_user_tracks_market_and_owner() { let mut sc = full_setup(); let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); - let init_ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, MIN_ORDER_SIZE); + let init_ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, MIN_ORDER_SIZE); send_transaction_from_instructions( &mut sc.svm, vec![create_ix, init_ix], @@ -637,14 +642,14 @@ fn place_ask_locks_base_in_vault() { send_transaction_from_instructions(&mut sc.svm, vec![ix], &[&sc.seller], &sc.seller.pubkey()) .unwrap(); - // An ask locks `quantity` of base tokens in the base vault. + // An ask locks quantity * base_lot_size raw base tokens in the base vault. assert_eq!( get_token_account_balance(&sc.svm, &sc.base_vault.pubkey()).unwrap(), - ASK_QUANTITY + ASK_QUANTITY * BASE_LOT_SIZE ); assert_eq!( get_token_account_balance(&sc.svm, &sc.seller_base_ata).unwrap(), - TRADER_STARTING_BALANCE - ASK_QUANTITY + TRADER_STARTING_BALANCE - ASK_QUANTITY * BASE_LOT_SIZE ); assert_eq!( get_token_account_balance(&sc.svm, &sc.quote_vault.pubkey()).unwrap(), @@ -688,7 +693,7 @@ fn place_order_rejects_unaligned_tick() { let unusual_tick_size: u64 = 50; let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); let init_ix = - build_initialize_market_ix(&sc, FEE_BASIS_POINTS, unusual_tick_size, MIN_ORDER_SIZE); + build_initialize_market_ix(&sc, FEE_BASIS_POINTS, unusual_tick_size, BASE_LOT_SIZE, MIN_ORDER_SIZE); send_transaction_from_instructions( &mut sc.svm, vec![create_ix, init_ix], @@ -745,7 +750,7 @@ fn place_order_rejects_below_min_order_size() { let elevated_min_order_size: u64 = 10; let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); let init_ix = - build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, elevated_min_order_size); + build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, elevated_min_order_size); send_transaction_from_instructions( &mut sc.svm, vec![create_ix, init_ix], @@ -838,12 +843,12 @@ fn cancel_ask_credits_unsettled_base() { // updates the unsettled balance. Settlement is a separate step. assert_eq!( get_token_account_balance(&sc.svm, &sc.base_vault.pubkey()).unwrap(), - ASK_QUANTITY + ASK_QUANTITY * BASE_LOT_SIZE ); // Seller's ATA hasn't received anything back yet. assert_eq!( get_token_account_balance(&sc.svm, &sc.seller_base_ata).unwrap(), - TRADER_STARTING_BALANCE - ASK_QUANTITY + TRADER_STARTING_BALANCE - ASK_QUANTITY * BASE_LOT_SIZE ); } @@ -1082,7 +1087,7 @@ fn initialize_market_rejects_zero_tick_size() { let zero_tick_size: u64 = 0; let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); - let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, zero_tick_size, MIN_ORDER_SIZE); + let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, zero_tick_size, BASE_LOT_SIZE, MIN_ORDER_SIZE); let result = send_transaction_from_instructions( &mut sc.svm, vec![create_ix, ix], @@ -1098,6 +1103,27 @@ fn initialize_market_rejects_zero_tick_size() { assert!(result.is_err(), "tick_size == 0 must be rejected"); } +#[test] +fn initialize_market_rejects_zero_base_lot_size() { + let mut sc = full_setup(); + + let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); + let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, 0, MIN_ORDER_SIZE); + let result = send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix, ix], + &[ + &sc.authority, + &sc.order_book, + &sc.base_vault, + &sc.quote_vault, + &sc.fee_vault, + ], + &sc.authority.pubkey(), + ); + assert!(result.is_err(), "base_lot_size == 0 must be rejected"); +} + #[test] fn initialize_market_rejects_oversized_fee() { let mut sc = full_setup(); @@ -1109,6 +1135,7 @@ fn initialize_market_rejects_oversized_fee() { &sc, over_cap_fee_basis_points, TICK_SIZE, + BASE_LOT_SIZE, MIN_ORDER_SIZE, ); let result = send_transaction_from_instructions( @@ -1264,7 +1291,7 @@ fn taker_bid_fully_crosses_best_ask() { ); let (buyer_base, buyer_quote) = read_user_unsettled(&sc.svm, &sc.buyer_market_user); - assert_eq!(buyer_base, QUANTITY); + assert_eq!(buyer_base, QUANTITY * BASE_LOT_SIZE); // No price improvement here โ€” buyer's limit == maker's price โ€” so no // quote rebate lands in the taker's unsettled_quote. assert_eq!(buyer_quote, 0); @@ -1339,7 +1366,7 @@ fn taker_ask_fully_crosses_best_bid() { ); // Maker (buyer) received the base tokens they paid for. let (buyer_base, _buyer_quote) = read_user_unsettled(&sc.svm, &sc.buyer_market_user); - assert_eq!(buyer_base, QUANTITY); + assert_eq!(buyer_base, QUANTITY * BASE_LOT_SIZE); // Taker (seller) received the net-of-fee quote. let (_seller_base, seller_quote) = read_user_unsettled(&sc.svm, &sc.seller_market_user); @@ -1409,16 +1436,16 @@ fn taker_partially_fills_resting_order_rest_stays_on_book() { // what was delivered to the taker's unsettled_base โ€” which never left // the vault, just got re-tagged as owed to the buyer). // - // Total base in vault stays == MAKER_ASK_QUANTITY, because fills are - // bucket-accounting inside the single vault. + // Total base in vault stays == MAKER_ASK_QUANTITY * BASE_LOT_SIZE, because + // fills are bucket-accounting inside the single vault. assert_eq!( get_token_account_balance(&sc.svm, &sc.base_vault.pubkey()).unwrap(), - MAKER_ASK_QUANTITY + MAKER_ASK_QUANTITY * BASE_LOT_SIZE ); - // Taker received TAKER_BID_QUANTITY base tokens. + // Taker received TAKER_BID_QUANTITY lots = TAKER_BID_QUANTITY * BASE_LOT_SIZE raw base tokens. let (buyer_base, _) = read_user_unsettled(&sc.svm, &sc.buyer_market_user); - assert_eq!(buyer_base, TAKER_BID_QUANTITY); + assert_eq!(buyer_base, TAKER_BID_QUANTITY * BASE_LOT_SIZE); } #[test] @@ -1586,9 +1613,9 @@ fn taker_crosses_multiple_resting_orders_best_price_first() { assert_eq!(read_order_fill_and_status(&sc.svm, &order_one).1, ORDER_STATUS_FILLED); assert_eq!(read_order_fill_and_status(&sc.svm, &order_two).1, ORDER_STATUS_FILLED); - // Taker got `TAKER_BID_QUANTITY` base tokens. + // Taker got TAKER_BID_QUANTITY lots = TAKER_BID_QUANTITY * BASE_LOT_SIZE raw base tokens. let (buyer_base, buyer_quote_rebate) = read_user_unsettled(&sc.svm, &sc.buyer_market_user); - assert_eq!(buyer_base, TAKER_BID_QUANTITY); + assert_eq!(buyer_base, TAKER_BID_QUANTITY * BASE_LOT_SIZE); // Price-improvement rebate: taker locked at 1000/unit but 30 units // filled at 900. Rebate = (1000 - 900) * 30 = 3_000. @@ -1767,7 +1794,7 @@ fn taker_bid_gets_price_improvement_from_resting_ask() { // price-improvement rebate. let expected_rebate: u64 = (TAKER_BID_PRICE - MAKER_ASK_PRICE) * QUANTITY; let (buyer_base, buyer_quote) = read_user_unsettled(&sc.svm, &sc.buyer_market_user); - assert_eq!(buyer_base, QUANTITY); + assert_eq!(buyer_base, QUANTITY * BASE_LOT_SIZE); assert_eq!(buyer_quote, expected_rebate); } From 21ff523d5d893002622fb7e7169ea6436b237fb5 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 9 Jun 2026 21:40:33 +0000 Subject: [PATCH 046/138] feat: add quote_lot_size for full decimal generality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adopts the Serum/Openbook two-lot model. Previously the program was only correct when d_base >= d_quote (e.g. NVDAx/USDC), because quote amounts were computed as price ร— quantity raw quote tokens with no scaling on the quote side. With quote_lot_size, all raw-quote amounts become: raw_quote = price ร— quantity ร— quote_lot_size Choosing base_lot_size = 10^max(d_base - d_quote, 0) and quote_lot_size = 10^max(d_quote - d_base, 0) makes price the human-readable quote/base rate and tick_size=1 one atomic price increment regardless of which mint has more decimals. NVDAx (8 dec) / USDC (6 dec): base_lot_size=100, quote_lot_size=1 (values unchanged) WBTC (8 dec) / HD-USDC (18 dec): base_lot_size=1, quote_lot_size=10^10 Changes: InvalidQuoteLotSize error; quote_lot_size field on Market; new param in initialize_market; bid lock, gross_quote, and locked_for_this_fill in place_order all gain x quote_lot_size; bid cancel refund in cancel_order gains x quote_lot_size; settle_funds untouched (already operates on raw amounts in unsettled_*). Tests add QUOTE_LOT_SIZE=1, update all call sites and assertions, add rejection test for zero quote_lot_size. https://claude.ai/code/session_01G6iaAjzg8aoFwe8ZWWG9VR --- .../anchor/programs/order-book/src/errors.rs | 3 + .../src/instructions/cancel_order.rs | 9 +- .../src/instructions/initialize_market.rs | 3 + .../src/instructions/place_order.rs | 6 ++ .../anchor/programs/order-book/src/lib.rs | 2 + .../programs/order-book/src/state/market.rs | 36 +++++--- .../order-book/tests/test_order_book.rs | 88 ++++++++++++------- 7 files changed, 99 insertions(+), 48 deletions(-) diff --git a/defi/order-book/anchor/programs/order-book/src/errors.rs b/defi/order-book/anchor/programs/order-book/src/errors.rs index f362524e..b3738c77 100644 --- a/defi/order-book/anchor/programs/order-book/src/errors.rs +++ b/defi/order-book/anchor/programs/order-book/src/errors.rs @@ -26,6 +26,9 @@ pub enum ErrorCode { #[msg("Base lot size must be greater than zero")] InvalidBaseLotSize, + #[msg("Quote lot size must be greater than zero")] + InvalidQuoteLotSize, + #[msg("Quantity is below minimum order size")] BelowMinOrderSize, diff --git a/defi/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs b/defi/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs index ddf4caa3..984a10b7 100644 --- a/defi/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs +++ b/defi/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs @@ -27,14 +27,13 @@ pub fn handle_cancel_order(context: Context) -> Result<()> { let market_user = &mut context.accounts.market_user; match order.side { OrderSide::Bid => { - // u128 intermediate: the lock was originally taken on a - // u64 quote balance, so price * remaining must fit u64 - // โ€” but the multiplication itself can transiently exceed - // u64. Mirror the same pattern as place_order: widen, - // multiply, narrow. + // u128 intermediates mirror the bid-lock formula in place_order: + // raw_quote = price ร— remaining ร— quote_lot_size let quote_amount: u64 = (order.price as u128) .checked_mul(remaining as u128) .ok_or(ErrorCode::NumericalOverflow)? + .checked_mul(context.accounts.market.quote_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? .try_into() .map_err(|_| error!(ErrorCode::NumericalOverflow))?; market_user.unsettled_quote = market_user diff --git a/defi/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs b/defi/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs index 90fc1699..a2d925bd 100644 --- a/defi/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs +++ b/defi/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs @@ -13,10 +13,12 @@ pub fn handle_initialize_market( fee_basis_points: u16, tick_size: u64, base_lot_size: u64, + quote_lot_size: u64, min_order_size: u64, ) -> Result<()> { require!(tick_size > 0, ErrorCode::InvalidTickSize); require!(base_lot_size > 0, ErrorCode::InvalidBaseLotSize); + require!(quote_lot_size > 0, ErrorCode::InvalidQuoteLotSize); require!(min_order_size > 0, ErrorCode::BelowMinOrderSize); require!( fee_basis_points <= MAX_FEE_BASIS_POINTS, @@ -34,6 +36,7 @@ pub fn handle_initialize_market( market.fee_basis_points = fee_basis_points; market.tick_size = tick_size; market.base_lot_size = base_lot_size; + market.quote_lot_size = quote_lot_size; market.min_order_size = min_order_size; market.is_active = true; market.bump = context.bumps.market; diff --git a/defi/order-book/anchor/programs/order-book/src/instructions/place_order.rs b/defi/order-book/anchor/programs/order-book/src/instructions/place_order.rs index b203752e..13a227be 100644 --- a/defi/order-book/anchor/programs/order-book/src/instructions/place_order.rs +++ b/defi/order-book/anchor/programs/order-book/src/instructions/place_order.rs @@ -67,6 +67,8 @@ pub fn handle_place_order<'info>( (price as u128) .checked_mul(quantity as u128) .ok_or(ErrorCode::NumericalOverflow)? + .checked_mul(market.quote_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? .try_into() .map_err(|_| error!(ErrorCode::NumericalOverflow))?, context.accounts.quote_vault.to_account_info(), @@ -194,6 +196,8 @@ pub fn handle_place_order<'info>( let gross_quote: u64 = (fill.fill_price as u128) .checked_mul(fill.fill_quantity as u128) .ok_or(ErrorCode::NumericalOverflow)? + .checked_mul(market.quote_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? .try_into() .map_err(|_| error!(ErrorCode::NumericalOverflow))?; @@ -239,6 +243,8 @@ pub fn handle_place_order<'info>( let locked_for_this_fill: u64 = (price as u128) .checked_mul(fill.fill_quantity as u128) .ok_or(ErrorCode::NumericalOverflow)? + .checked_mul(market.quote_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? .try_into() .map_err(|_| error!(ErrorCode::NumericalOverflow))?; let rebate: u64 = locked_for_this_fill diff --git a/defi/order-book/anchor/programs/order-book/src/lib.rs b/defi/order-book/anchor/programs/order-book/src/lib.rs index 2589acb3..d0ca768a 100644 --- a/defi/order-book/anchor/programs/order-book/src/lib.rs +++ b/defi/order-book/anchor/programs/order-book/src/lib.rs @@ -20,6 +20,7 @@ pub mod order_book { fee_basis_points: u16, tick_size: u64, base_lot_size: u64, + quote_lot_size: u64, min_order_size: u64, ) -> Result<()> { instructions::initialize_market::handle_initialize_market( @@ -27,6 +28,7 @@ pub mod order_book { fee_basis_points, tick_size, base_lot_size, + quote_lot_size, min_order_size, ) } diff --git a/defi/order-book/anchor/programs/order-book/src/state/market.rs b/defi/order-book/anchor/programs/order-book/src/state/market.rs index 2cb87efd..f8db5579 100644 --- a/defi/order-book/anchor/programs/order-book/src/state/market.rs +++ b/defi/order-book/anchor/programs/order-book/src/state/market.rs @@ -31,19 +31,35 @@ pub struct Market { pub tick_size: u64, - // Number of raw base-token units per lot. Quantities throughout the - // program are in lots; this factor converts them to raw token units for - // SPL transfers. For a base mint with d_base decimals and quote with - // d_quote, set base_lot_size = 10^(d_base - d_quote) so that one raw - // quote unit buys exactly one lot of base at price = 1, making `price` - // equal to the human-readable USDC-per-token rate. + // Two-lot model (mirrors Serum/Openbook): both sides of the book are + // denominated in their respective lots rather than raw token units. + // This makes `price` and `quantity` human-readable regardless of the + // individual mints' decimal counts. // - // Example โ€” NVDAx (8 dec) / USDC (6 dec): - // base_lot_size = 10^(8-6) = 100 raw NVDAx per lot - // price = 130 โ†’ $130.00 per NVDAx share - // tick_size = 1 โ†’ $1.00 minimum price increment + // raw_base = quantity ร— base_lot_size + // raw_quote = quantity ร— price ร— quote_lot_size + // + // Choose: + // base_lot_size = 10^max(d_base โˆ’ d_quote, 0) + // quote_lot_size = 10^max(d_quote โˆ’ d_base, 0) + // + // so that exactly one of the two is > 1 (or both are 1 when d_base == d_quote). + // With those values `price` equals the human-readable quote/base rate and + // `tick_size = 1` is a single atomic increment. + // + // Examples: + // NVDAx (8 dec) / USDC (6 dec): base_lot_size=100, quote_lot_size=1 + // price=130, qty=1 lot โ†’ 130 ร— 1 ร— 1 = 130 raw USDC per 100 raw NVDAx + // = $130.00 per NVDAx share โœ“ + // + // WBTC (8 dec) / HD-USDC (18 dec): base_lot_size=1, quote_lot_size=10^10 + // price=60_000, qty=1 satoshi-lot โ†’ 60_000 ร— 1 ร— 10^10 = 6ร—10^14 raw HD-USDC + // = $60,000 per BTC โœ“ pub base_lot_size: u64, + // Raw quote-token units per quote lot. See base_lot_size comment above. + pub quote_lot_size: u64, + pub min_order_size: u64, pub is_active: bool, diff --git a/defi/order-book/anchor/programs/order-book/tests/test_order_book.rs b/defi/order-book/anchor/programs/order-book/tests/test_order_book.rs index e33c8e2a..e3b0a252 100644 --- a/defi/order-book/anchor/programs/order-book/tests/test_order_book.rs +++ b/defi/order-book/anchor/programs/order-book/tests/test_order_book.rs @@ -43,20 +43,20 @@ const MARKET_USER_SEED: &[u8] = b"market_user"; // `#[account(zero)]` check fails if the account size is wrong. const ORDER_BOOK_ACCOUNT_SIZE: u64 = order_book::state::ORDER_BOOK_ACCOUNT_SIZE as u64; -// NVDAx has 8 decimals on-chain; USDC has 6. Because the program stores -// price as raw_quote per raw_base, one tick = 10^(base_dec - quote_dec) = 100 -// USDC/share โ€” the minimum representable price step with these two mints. +// NVDAx has 8 decimals on-chain; USDC has 6. const BASE_DECIMALS: u8 = 8; // NVDAx (https://explorer.solana.com/address/Xsc9qvGR1efVDFGLrVsmkzv3qi45LTBjeUKSPmx9qEh) const QUOTE_DECIMALS: u8 = 6; // USDC -// Market parameters used across every test. `tick_size = 1` and -// `base_lot_size = 100` match the NVDAx/USDC decimal configuration -// (BASE_DECIMALS=8, QUOTE_DECIMALS=6): price = human USDC/share, -// tick = $1.00, 1 lot = 100 raw NVDAx. A dedicated test overrides -// tick_size to verify the tick check fires. +// Two-lot model for NVDAx/USDC (d_base=8, d_quote=6): +// base_lot_size = 10^max(8-6, 0) = 100 โ†’ 1 lot = 100 raw NVDAx +// quote_lot_size = 10^max(6-8, 0) = 1 โ†’ 1 quote-lot = 1 raw USDC +// raw_base = quantity ร— 100 +// raw_quote = price ร— quantity ร— 1 (= human USDC/share ร— lots) +// tick_size = 1 โ†’ $1.00 minimum price increment const FEE_BASIS_POINTS: u16 = 10; const TICK_SIZE: u64 = 1; const BASE_LOT_SIZE: u64 = 100; +const QUOTE_LOT_SIZE: u64 = 1; const MIN_ORDER_SIZE: u64 = 1; // Funding for each trader's token accounts. Large enough to cover every @@ -254,6 +254,7 @@ fn build_initialize_market_ix( fee_basis_points: u16, tick_size: u64, base_lot_size: u64, + quote_lot_size: u64, min_order_size: u64, ) -> Instruction { Instruction::new_with_bytes( @@ -262,6 +263,7 @@ fn build_initialize_market_ix( fee_basis_points, tick_size, base_lot_size, + quote_lot_size, min_order_size, } .data(), @@ -454,7 +456,7 @@ fn initialize_market_and_users(sc: &mut Scenario) { // program, zero-initialized) before initialize_market's `#[account(zero)]` // check passes. let create_ix = build_create_order_book_account_ix(sc, &sc.authority.pubkey()); - let init_ix = build_initialize_market_ix(sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, MIN_ORDER_SIZE); + let init_ix = build_initialize_market_ix(sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, QUOTE_LOT_SIZE, MIN_ORDER_SIZE); send_transaction_from_instructions( &mut sc.svm, vec![create_ix, init_ix], @@ -497,7 +499,7 @@ fn initialize_market_sets_market_and_order_book() { let mut sc = full_setup(); let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); - let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, MIN_ORDER_SIZE); + let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, QUOTE_LOT_SIZE, MIN_ORDER_SIZE); send_transaction_from_instructions( &mut sc.svm, vec![create_ix, ix], @@ -545,7 +547,7 @@ fn create_market_user_tracks_market_and_owner() { let mut sc = full_setup(); let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); - let init_ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, MIN_ORDER_SIZE); + let init_ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, QUOTE_LOT_SIZE, MIN_ORDER_SIZE); send_transaction_from_instructions( &mut sc.svm, vec![create_ix, init_ix], @@ -597,8 +599,8 @@ fn place_bid_locks_quote_in_vault() { send_transaction_from_instructions(&mut sc.svm, vec![ix], &[&sc.buyer], &sc.buyer.pubkey()) .unwrap(); - // A bid locks price * quantity in the quote vault. - let locked_quote = BID_PRICE * BID_QUANTITY; + // A bid locks price * quantity * quote_lot_size raw quote tokens. + let locked_quote = BID_PRICE * BID_QUANTITY * QUOTE_LOT_SIZE; assert_eq!( get_token_account_balance(&sc.svm, &sc.quote_vault.pubkey()).unwrap(), locked_quote @@ -693,7 +695,7 @@ fn place_order_rejects_unaligned_tick() { let unusual_tick_size: u64 = 50; let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); let init_ix = - build_initialize_market_ix(&sc, FEE_BASIS_POINTS, unusual_tick_size, BASE_LOT_SIZE, MIN_ORDER_SIZE); + build_initialize_market_ix(&sc, FEE_BASIS_POINTS, unusual_tick_size, BASE_LOT_SIZE, QUOTE_LOT_SIZE, MIN_ORDER_SIZE); send_transaction_from_instructions( &mut sc.svm, vec![create_ix, init_ix], @@ -750,7 +752,7 @@ fn place_order_rejects_below_min_order_size() { let elevated_min_order_size: u64 = 10; let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); let init_ix = - build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, elevated_min_order_size); + build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, QUOTE_LOT_SIZE, elevated_min_order_size); send_transaction_from_instructions( &mut sc.svm, vec![create_ix, init_ix], @@ -1087,7 +1089,7 @@ fn initialize_market_rejects_zero_tick_size() { let zero_tick_size: u64 = 0; let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); - let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, zero_tick_size, BASE_LOT_SIZE, MIN_ORDER_SIZE); + let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, zero_tick_size, BASE_LOT_SIZE, QUOTE_LOT_SIZE, MIN_ORDER_SIZE); let result = send_transaction_from_instructions( &mut sc.svm, vec![create_ix, ix], @@ -1108,7 +1110,7 @@ fn initialize_market_rejects_zero_base_lot_size() { let mut sc = full_setup(); let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); - let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, 0, MIN_ORDER_SIZE); + let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, 0, QUOTE_LOT_SIZE, MIN_ORDER_SIZE); let result = send_transaction_from_instructions( &mut sc.svm, vec![create_ix, ix], @@ -1124,6 +1126,27 @@ fn initialize_market_rejects_zero_base_lot_size() { assert!(result.is_err(), "base_lot_size == 0 must be rejected"); } +#[test] +fn initialize_market_rejects_zero_quote_lot_size() { + let mut sc = full_setup(); + + let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); + let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, 0, MIN_ORDER_SIZE); + let result = send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix, ix], + &[ + &sc.authority, + &sc.order_book, + &sc.base_vault, + &sc.quote_vault, + &sc.fee_vault, + ], + &sc.authority.pubkey(), + ); + assert!(result.is_err(), "quote_lot_size == 0 must be rejected"); +} + #[test] fn initialize_market_rejects_oversized_fee() { let mut sc = full_setup(); @@ -1136,6 +1159,7 @@ fn initialize_market_rejects_oversized_fee() { over_cap_fee_basis_points, TICK_SIZE, BASE_LOT_SIZE, + QUOTE_LOT_SIZE, MIN_ORDER_SIZE, ); let result = send_transaction_from_instructions( @@ -1238,7 +1262,7 @@ fn taker_bid_fully_crosses_best_ask() { // that trader starting balances easily cover it. const PRICE: u64 = 1000; const QUANTITY: u64 = 100; - const EXPECTED_GROSS_QUOTE: u64 = PRICE * QUANTITY; + const EXPECTED_GROSS_QUOTE: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; const EXPECTED_FEE: u64 = EXPECTED_GROSS_QUOTE * FEE_BASIS_POINTS as u64 / 10_000; const EXPECTED_NET_TO_MAKER: u64 = EXPECTED_GROSS_QUOTE - EXPECTED_FEE; @@ -1316,7 +1340,7 @@ fn taker_ask_fully_crosses_best_bid() { const MAKER_BID_ID: u64 = 1; const PRICE: u64 = 1000; const QUANTITY: u64 = 100; - const EXPECTED_GROSS_QUOTE: u64 = PRICE * QUANTITY; + const EXPECTED_GROSS_QUOTE: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; const EXPECTED_FEE: u64 = EXPECTED_GROSS_QUOTE * FEE_BASIS_POINTS as u64 / 10_000; const EXPECTED_NET_TO_TAKER: u64 = EXPECTED_GROSS_QUOTE - EXPECTED_FEE; @@ -1618,14 +1642,13 @@ fn taker_crosses_multiple_resting_orders_best_price_first() { assert_eq!(buyer_base, TAKER_BID_QUANTITY * BASE_LOT_SIZE); // Price-improvement rebate: taker locked at 1000/unit but 30 units - // filled at 900. Rebate = (1000 - 900) * 30 = 3_000. - const PRICE_IMPROVEMENT_REBATE: u64 = (TAKER_BID_PRICE - BEST_ASK_PRICE) * BEST_ASK_QUANTITY; + // filled at 900. Rebate = (1000 - 900) * 30 * quote_lot_size. + const PRICE_IMPROVEMENT_REBATE: u64 = (TAKER_BID_PRICE - BEST_ASK_PRICE) * BEST_ASK_QUANTITY * QUOTE_LOT_SIZE; assert_eq!(buyer_quote_rebate, PRICE_IMPROVEMENT_REBATE); - // Seller's net unsettled_quote = sum of (fill_price * fill_qty - fee) - // across both fills. - let gross_one: u64 = BEST_ASK_PRICE * BEST_ASK_QUANTITY; - let gross_two: u64 = SECOND_ASK_PRICE * SECOND_ASK_QUANTITY; + // Seller's net unsettled_quote = sum of (fill_price * fill_qty * quote_lot_size - fee). + let gross_one: u64 = BEST_ASK_PRICE * BEST_ASK_QUANTITY * QUOTE_LOT_SIZE; + let gross_two: u64 = SECOND_ASK_PRICE * SECOND_ASK_QUANTITY * QUOTE_LOT_SIZE; let fee_one: u64 = gross_one * FEE_BASIS_POINTS as u64 / 10_000; let fee_two: u64 = gross_two * FEE_BASIS_POINTS as u64 / 10_000; let expected_seller_quote = (gross_one - fee_one) + (gross_two - fee_two); @@ -1783,16 +1806,15 @@ fn taker_bid_gets_price_improvement_from_resting_ask() { .unwrap(); // Maker got 900-per-unit (minus fee), not 1000. - let gross_to_maker: u64 = MAKER_ASK_PRICE * QUANTITY; + let gross_to_maker: u64 = MAKER_ASK_PRICE * QUANTITY * QUOTE_LOT_SIZE; let fee: u64 = gross_to_maker * FEE_BASIS_POINTS as u64 / 10_000; let expected_net_to_maker: u64 = gross_to_maker - fee; let (_, seller_quote) = read_user_unsettled(&sc.svm, &sc.seller_market_user); assert_eq!(seller_quote, expected_net_to_maker); - // Taker locked (TAKER_BID_PRICE * QUANTITY) of quote up front; only - // (MAKER_ASK_PRICE * QUANTITY) was spent. The difference is the - // price-improvement rebate. - let expected_rebate: u64 = (TAKER_BID_PRICE - MAKER_ASK_PRICE) * QUANTITY; + // Taker locked (TAKER_BID_PRICE * QUANTITY * QUOTE_LOT_SIZE) up front; + // only (MAKER_ASK_PRICE * QUANTITY * QUOTE_LOT_SIZE) was spent. + let expected_rebate: u64 = (TAKER_BID_PRICE - MAKER_ASK_PRICE) * QUANTITY * QUOTE_LOT_SIZE; let (buyer_base, buyer_quote) = read_user_unsettled(&sc.svm, &sc.buyer_market_user); assert_eq!(buyer_base, QUANTITY * BASE_LOT_SIZE); assert_eq!(buyer_quote, expected_rebate); @@ -1808,7 +1830,7 @@ fn fee_vault_receives_exactly_bps_of_taker_gross() { const MAKER_ASK_ID: u64 = 1; const PRICE: u64 = 500; const QUANTITY: u64 = 200; - const GROSS: u64 = PRICE * QUANTITY; + const GROSS: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; const EXPECTED_FEE: u64 = GROSS * FEE_BASIS_POINTS as u64 / 10_000; let __ix5 = build_place_order_ix( @@ -1865,7 +1887,7 @@ fn authority_can_withdraw_fees_after_match() { const MAKER_ASK_ID: u64 = 1; const PRICE: u64 = 2000; const QUANTITY: u64 = 50; - const GROSS: u64 = PRICE * QUANTITY; + const GROSS: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; const EXPECTED_FEE: u64 = GROSS * FEE_BASIS_POINTS as u64 / 10_000; let __ix7 = build_place_order_ix( @@ -1934,7 +1956,7 @@ fn settle_funds_after_match_pays_out_both_unsettled_balances() { const MAKER_ASK_ID: u64 = 1; const PRICE: u64 = 1000; const QUANTITY: u64 = 100; - const GROSS: u64 = PRICE * QUANTITY; + const GROSS: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; const EXPECTED_FEE: u64 = GROSS * FEE_BASIS_POINTS as u64 / 10_000; const EXPECTED_NET_QUOTE_TO_SELLER: u64 = GROSS - EXPECTED_FEE; From 4647f0eaa558bab84fcdf7656831c078acb16868 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 9 Jun 2026 21:51:46 +0000 Subject: [PATCH 047/138] docs: clarify critbit is depth-bounded, not self-balancing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "Balanced-by-construction" lumped critbit in with red-black/AVL trees, which it isn't โ€” critbit never rotates or recolours. Reframe the ยง8 heading and prose around the accurate property: a radix trie whose depth is bounded by the key's bit width (<=128), so it cannot degenerate under adversarial insert order. The security conclusion is unchanged. https://claude.ai/code/session_01G6iaAjzg8aoFwe8ZWWG9VR --- defi/order-book/anchor/README.md | 49 ++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/defi/order-book/anchor/README.md b/defi/order-book/anchor/README.md index 2265ae72..ed0bdc39 100644 --- a/defi/order-book/anchor/README.md +++ b/defi/order-book/anchor/README.md @@ -70,8 +70,8 @@ call `settle_funds` to pull their balances out. that can withdraw accumulated fees. - An **OrderBook** account โ€” two stores: bids sorted highest-first, asks sorted lowest-first, each holding up to 1024 entries. Rather - than a plain list of orders, each side uses a balanced tree for fast - lookup โ€” see [Ensuring fast order matching performance](#ensuring-fast-order-matching-performance). + than a plain list of orders, each side uses a depth-bounded tree (a + critbit trie) for fast lookup โ€” see [Ensuring fast order matching performance](#ensuring-fast-order-matching-performance). Each entry stores enough to drive matching (price, quantity, `order_id`); the full `Order` PDA holds the authoritative state. - A **MarketUser** PDA โ€” one per `(market, wallet)` pair. Tracks the @@ -895,9 +895,10 @@ instead of 1 024. The specific data structure used here is a [critbit tree](https://cr.yp.to/critbit.html) (short for *critical-bit tree*) โ€” a compact binary radix trie where each internal node splits on -the first bit where two keys disagree. It has the same O(log n) bounds -as other balanced trees but operates on fixed-width integer keys, so no -rebalancing rotations are needed. This implementation is ported from +the first bit where two keys disagree. Unlike a self-balancing BST it +never rotates or recolours nodes; its depth is instead bounded by the +*bit width of the key* rather than the number of orders, so it stays +shallow no matter what order keys arrive in. This implementation is ported from [Openbook v2](https://github.com/openbook-dex/openbook-v2); [Phoenix](https://github.com/Ellipsis-Labs/phoenix-v1) uses the same approach. Both are production Solana CLOBs worth reading alongside this @@ -1550,15 +1551,18 @@ Ordered by difficulty. `place_order`, skip resting entries whose `expires_at` is past; add a permissionless `sweep_expired` instruction. -### Why a balanced tree (critbit)? +### Why a depth-bounded tree (critbit)? -**Tree balancing must be guaranteed, not assumed.** A plain binary +**Worst-case depth must be bounded, not assumed.** A plain binary search tree only keeps a roughly-balanced shape when its inputs arrive in random order. In an order book an attacker chooses the inputs โ€” the prices of their orders โ€” so nothing they choose can be allowed to -determine the tree's shape. A *balanced-by-construction* tree -(red-black, critbit, AVL, โ€ฆ) enforces a bounded shape via invariants -maintained on every insert and delete, regardless of input order. +inflate the tree's depth. Two families of structure defend against +this: *self-balancing* BSTs (red-black, AVL, โ€ฆ) that restore a bounded +height with rotations on every insert and delete, and *radix tries* +like critbit whose depth is capped by the key's bit width no matter +which keys are present. Both keep every operation cheap regardless of +input order; this example uses the second. **Concrete attack on a plain BST.** An attacker posts orders at monotonically increasing prices ($100, $101, $102, $103, โ€ฆ). Each new @@ -1568,20 +1572,21 @@ degenerated into a linked list of length N. Lookups, inserts, and matches all walk O(N) instead of O(log N). **Why this matters on Solana specifically.** Solana transactions have -a ~1.4M compute-unit budget. If `place_order` walks an unbalanced book +a ~1.4M compute-unit budget. If `place_order` walks a degenerate book and exceeds the CU limit mid-match, the transaction aborts and the placer pays fees for nothing. Worse, *legitimate users' orders fail -because an adversary skewed the tree shape*. A balanced-by-construction -tree bounds every operation at O(log N) regardless of input, so the -attack is structurally impossible. - -**Why critbit specifically.** Critbit (a binary radix trie keyed on -the price bits) is balanced-by-construction in a different way from a -red-black tree: tree depth is bounded by the *bit width of the sort -key* (128 bits here โ€” price in the high 64, sequence number in the -low 64), not by insertion order. Inserts and deletes don't need -rotations or recolouring; the trie shape is a deterministic function -of which keys are present. This example uses the critbit slab from +because an adversary skewed the tree shape*. A depth-bounded tree keeps +every operation cheap regardless of input, so the attack is +structurally impossible. + +**Why critbit specifically.** Critbit is a binary radix trie keyed on +the order's sort bits โ€” *not* a self-balancing BST, so it never rotates +or recolours nodes. Its shape is a deterministic function of which keys +are present, and its depth can never exceed the *bit width of the sort +key* (128 bits here โ€” price in the high 64, sequence number in the low +64), so it cannot degenerate into a long chain under any insert order. +An insert splits exactly one leaf and adds exactly one inner node; a +delete splices one out. This example uses the critbit slab from Openbook v2 (`src/state/slab/`). ### Harder From 9b5a86734430bd808607302085f8808932bb1a49 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 20:59:53 +0000 Subject: [PATCH 048/138] docs and style sweep: truthful testing docs, remove dead scaffold, em-dash and onchain spelling fixes - CONTRIBUTING.md: describe the real test setup (Rust LiteSVM for Anchor, QuasarSVM for Quasar) instead of the TypeScript/tsx instructions that contradicted every project's 'test = cargo test' - compression READMEs: the three anchor variants claimed 'no tests/' while shipping full LiteSVM suites; the three quasar twins claimed real tests while shipping comment-only files. Both now tell the truth - token-swap/anchor: fix B-to-A swap underpayment (trader paid 'output' of token B instead of 'input_amount'); add B-to-A conservation and invariant tests so both directions of the symmetric flow are covered - remove dead anchor migrations/deploy.ts scripts, escrow .mocharc.json and register.js, and account-data's ts-mocha script pointing at a nonexistent file - delete the '[registry] section removed' history comment from every Anchor.toml; rewrite removal-history comments as present-state ones - replace em-dashes with regular dashes; 'onchain' spelling; 'Token Extensions' instead of 'Token-2022' in prose; fix 'succesfully' typos - add missing root READMEs (betting-market, nft-operations), root README Tools section for shank-and-codama; fix cnft-vault fixtures README copy-paste https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- CHANGELOG.md | 6 +- CONTRIBUTING.md | 26 +-- README.md | 42 ++-- basics/account-data/anchor/Anchor.toml | 5 +- basics/account-data/quasar/Cargo.toml | 2 +- basics/checking-accounts/anchor/Anchor.toml | 2 - basics/checking-accounts/quasar/Cargo.toml | 2 +- .../quasar/src/instructions/check_accounts.rs | 2 +- basics/close-account/anchor/Anchor.toml | 2 - .../close-account/anchor/migrations/deploy.ts | 12 -- basics/close-account/quasar/src/tests.rs | 7 +- basics/counter/anchor/Anchor.toml | 2 - basics/counter/anchor/migrations/deploy.ts | 12 -- basics/counter/quasar/Cargo.toml | 2 +- basics/create-account/README.md | 6 +- basics/create-account/anchor/Anchor.toml | 2 - .../programs/create-system-account/src/lib.rs | 2 +- .../create-account/native/program/src/lib.rs | 2 +- .../pinocchio/program/src/lib.rs | 2 +- basics/create-account/quasar/Cargo.toml | 2 +- basics/cross-program-invocation/README.md | 2 +- .../anchor/Anchor.toml | 2 - .../anchor/migrations/deploy.ts | 12 -- .../anchor/programs/hand/tests/test_hand.rs | 2 +- .../cross-program-invocation/quasar/README.md | 6 +- .../quasar/hand/Cargo.toml | 2 +- .../hand/src/instructions/pull_lever.rs | 2 +- .../quasar/hand/src/lib.rs | 2 +- .../quasar/hand/src/tests.rs | 2 +- .../quasar/lever/Cargo.toml | 2 +- .../lever/src/instructions/switch_power.rs | 2 +- basics/favorites/anchor/Anchor.toml | 2 - basics/favorites/anchor/migrations/deploy.ts | 12 -- basics/hello-solana/README.md | 2 +- basics/hello-solana/anchor/Anchor.toml | 2 - basics/hello-solana/quasar/Cargo.toml | 2 +- basics/pda-rent-payer/anchor/Anchor.toml | 2 - basics/pda-rent-payer/quasar/Cargo.toml | 2 +- .../src/instructions/init_rent_vault.rs | 6 +- basics/processing-instructions/README.md | 2 +- .../anchor/Anchor.toml | 2 - .../quasar/src/instructions/go_to_park.rs | 4 +- .../anchor/Anchor.toml | 2 - .../native/tests/test.ts | 2 +- .../quasar/Cargo.toml | 2 +- basics/pyth/README.md | 2 +- basics/pyth/anchor/Anchor.toml | 2 - basics/pyth/anchor/README.md | 4 +- .../anchor/programs/pythexample/src/lib.rs | 2 +- .../programs/pythexample/tests/test_pyth.rs | 2 +- basics/pyth/quasar/Cargo.toml | 2 +- basics/pyth/quasar/src/tests.rs | 2 +- basics/realloc/README.md | 2 +- basics/realloc/anchor/Anchor.toml | 2 - basics/realloc/anchor/migrations/deploy.ts | 12 -- .../quasar/src/instructions/initialize.rs | 2 +- basics/realloc/quasar/src/tests.rs | 2 +- basics/rent/README.md | 2 +- basics/rent/anchor/Anchor.toml | 2 - .../anchor/programs/rent-example/src/lib.rs | 2 +- basics/rent/native/program/src/lib.rs | 2 +- basics/rent/pinocchio/program/src/lib.rs | 2 +- basics/rent/quasar/Cargo.toml | 2 +- basics/repository-layout/README.md | 2 +- basics/repository-layout/anchor/Anchor.toml | 2 - .../carnival/src/instructions/get_on_ride.rs | 5 +- basics/repository-layout/quasar/Cargo.toml | 2 +- .../src/instructions/carnival_context.rs | 2 +- .../quasar/src/instructions/get_on_ride.rs | 2 +- basics/transfer-sol/README.md | 2 +- basics/transfer-sol/anchor/Anchor.toml | 2 - basics/transfer-sol/quasar/Cargo.toml | 2 +- compression/cnft-burn/anchor/Anchor.toml | 2 - compression/cnft-burn/anchor/README.md | 15 +- .../cnft-burn/anchor/migrations/deploy.ts | 12 -- .../programs/cnft-burn/tests/test_burn.rs | 10 +- .../cnft-burn/anchor/tests/fixtures/README.md | 8 +- compression/cnft-burn/quasar/Cargo.toml | 4 +- compression/cnft-burn/quasar/README.md | 8 +- .../quasar/src/instructions/burn_cnft.rs | 2 +- compression/cnft-burn/quasar/src/tests.rs | 8 +- compression/cnft-vault/anchor/Anchor.toml | 2 - compression/cnft-vault/anchor/README.md | 15 +- .../programs/cnft-vault/tests/test_vault.rs | 12 +- .../anchor/tests/fixtures/README.md | 8 +- compression/cnft-vault/quasar/Cargo.toml | 4 +- compression/cnft-vault/quasar/README.md | 8 +- .../quasar/src/instructions/withdraw.rs | 4 +- .../quasar/src/instructions/withdraw_two.rs | 6 +- compression/cnft-vault/quasar/src/lib.rs | 6 +- compression/cnft-vault/quasar/src/tests.rs | 8 +- compression/cutils/anchor/Anchor.toml | 2 - compression/cutils/anchor/README.md | 17 +- .../programs/cutils/src/instructions/mint.rs | 2 +- .../programs/cutils/tests/test_cutils.rs | 16 +- .../cutils/anchor/tests/fixtures/README.md | 8 +- compression/cutils/quasar/Cargo.toml | 4 +- compression/cutils/quasar/README.md | 8 +- .../cutils/quasar/src/instructions/verify.rs | 2 +- compression/cutils/quasar/src/tests.rs | 8 +- finance/escrow/anchor/.mocharc.json | 6 - finance/escrow/anchor/Anchor.toml | 2 - finance/escrow/anchor/README.md | 6 +- finance/escrow/anchor/migrations/deploy.ts | 12 -- finance/escrow/anchor/register.js | 4 - finance/escrow/quasar/Cargo.toml | 2 +- finance/order-book/anchor/README.md | 202 +++++++++--------- .../anchor/programs/order-book/Cargo.toml | 2 +- .../src/instructions/cancel_order.rs | 2 +- .../src/instructions/initialize_market.rs | 6 +- .../src/instructions/place_order.rs | 20 +- .../src/instructions/settle_funds.rs | 2 +- .../src/instructions/withdraw_fees.rs | 4 +- .../anchor/programs/order-book/src/lib.rs | 2 +- .../programs/order-book/src/state/matching.rs | 6 +- .../order-book/src/state/order_book.rs | 14 +- .../order-book/src/state/slab/iterator.rs | 6 +- .../order-book/src/state/slab/nodes.rs | 14 +- .../order-book/src/state/slab/ordertree.rs | 10 +- .../order-book/tests/test_order_book.rs | 40 ++-- finance/token-swap/README.md | 158 +++++++------- finance/token-swap/anchor/Anchor.toml | 1 - .../anchor/programs/token-swap/src/errors.rs | 2 +- .../src/instructions/deposit_liquidity.rs | 16 +- .../src/instructions/swap_tokens.rs | 8 +- .../src/instructions/withdraw_liquidity.rs | 2 +- .../token-swap/src/state/pool_config.rs | 2 +- .../programs/token-swap/tests/test_swap.rs | 142 +++++++++++- finance/token-swap/quasar/Cargo.toml | 2 +- .../src/instructions/claim_admin_fees.rs | 2 +- .../quasar/src/instructions/create_config.rs | 2 +- .../quasar/src/instructions/create_pool.rs | 6 +- finance/token-swap/quasar/src/lib.rs | 18 +- finance/token-swap/quasar/src/state.rs | 2 +- finance/token-swap/quasar/src/tests.rs | 18 +- .../vault-strategy}/tests/vault_strategy.rs | 0 scripts/generate-quasar-readmes.mjs | 36 ++-- tokens/betting-market/README.md | 7 + tokens/betting-market/anchor/README.md | 20 +- .../src/instructions/claim_winnings.rs | 2 +- .../programs/betting-market/src/state/user.rs | 2 +- tokens/create-token/README.md | 2 +- tokens/create-token/anchor/Anchor.toml | 4 +- tokens/create-token/quasar/Cargo.toml | 2 +- tokens/nft-minter/README.md | 2 +- tokens/nft-minter/anchor/Anchor.toml | 4 +- tokens/nft-minter/quasar/Cargo.toml | 2 +- tokens/nft-minter/quasar/src/lib.rs | 4 +- tokens/nft-operations/README.md | 7 + tokens/nft-operations/anchor/Anchor.toml | 4 +- tokens/nft-operations/anchor/README.md | 8 +- .../src/instructions/verify_collection.rs | 2 +- tokens/nft-operations/quasar/Cargo.toml | 2 +- .../src/instructions/create_collection.rs | 4 +- .../quasar/src/instructions/mint_nft.rs | 4 +- .../src/instructions/verify_collection.rs | 2 +- tokens/pda-mint-authority/anchor/Anchor.toml | 4 +- tokens/pda-mint-authority/quasar/Cargo.toml | 2 +- .../basics/anchor/Anchor.toml | 2 - .../token-extensions/basics/anchor/README.md | 2 +- .../basics/anchor/migrations/deploy.ts | 12 -- .../token-extensions/basics/quasar/Cargo.toml | 2 +- .../token-extensions/basics/quasar/README.md | 2 +- .../token-extensions/basics/quasar/src/lib.rs | 14 +- .../cpi-guard/anchor/Anchor.toml | 2 - .../cpi-guard/anchor/README.md | 2 +- .../cpi-guard/anchor/migrations/deploy.ts | 12 -- .../cpi-guard/tests/test_cpi_guard.rs | 4 +- .../cpi-guard/quasar/README.md | 2 +- .../cpi-guard/quasar/src/lib.rs | 2 +- .../cpi-guard/quasar/src/tests.rs | 2 +- .../default-account-state/anchor/Anchor.toml | 2 - .../default-account-state/anchor/README.md | 2 +- .../anchor/migrations/deploy.ts | 12 -- .../tests/test_default_account_state.rs | 8 +- .../default-account-state/native/README.md | 2 +- .../native/program/tests/test.rs | 4 +- .../default-account-state/quasar/README.md | 2 +- .../default-account-state/quasar/src/lib.rs | 4 +- .../token-extensions/group/anchor/Anchor.toml | 2 - .../token-extensions/group/anchor/README.md | 2 +- .../group/anchor/migrations/deploy.ts | 12 -- .../token-extensions/group/quasar/README.md | 2 +- .../token-extensions/group/quasar/src/lib.rs | 2 +- .../immutable-owner/anchor/Anchor.toml | 2 - .../immutable-owner/anchor/README.md | 2 +- .../anchor/migrations/deploy.ts | 12 -- .../tests/test_immutable_owner.rs | 2 +- .../immutable-owner/quasar/README.md | 2 +- .../interest-bearing/anchor/Anchor.toml | 2 - .../interest-bearing/anchor/README.md | 2 +- .../anchor/migrations/deploy.ts | 12 -- .../interest-bearing/quasar/README.md | 2 +- .../memo-transfer/anchor/Anchor.toml | 2 - .../memo-transfer/anchor/README.md | 2 +- .../memo-transfer/anchor/migrations/deploy.ts | 12 -- .../memo-transfer/tests/test_memo_transfer.rs | 6 +- .../memo-transfer/quasar/README.md | 2 +- .../metadata/anchor/Anchor.toml | 2 - .../metadata/anchor/README.md | 2 +- .../metadata/anchor/migrations/deploy.ts | 12 -- .../mint-close-authority/anchor/Anchor.toml | 2 - .../mint-close-authority/anchor/README.md | 2 +- .../anchor/migrations/deploy.ts | 12 -- .../native/program/tests/test.rs | 4 +- .../mint-close-authority/quasar/README.md | 2 +- .../native/program/tests/test.rs | 4 +- .../anchor-example/README.md | 4 +- .../anchor-example/anchor/Anchor.toml | 2 - .../anchor/migrations/deploy.ts | 12 -- .../programs/extension_nft/src/constants.rs | 2 +- .../src/instructions/init_player.rs | 2 +- .../extension_nft/src/state/player_data.rs | 2 +- .../extension_nft/tests/test_extension_nft.rs | 26 +-- .../non-transferable/anchor/Anchor.toml | 2 - .../non-transferable/anchor/README.md | 2 +- .../anchor/migrations/deploy.ts | 12 -- .../tests/test_non_transferable.rs | 2 +- .../native/program/tests/test.rs | 4 +- .../non-transferable/quasar/README.md | 2 +- .../permanent-delegate/anchor/Anchor.toml | 2 - .../permanent-delegate/anchor/README.md | 2 +- .../anchor/migrations/deploy.ts | 12 -- .../permanent-delegate/quasar/README.md | 2 +- .../permanent-delegate/quasar/src/lib.rs | 2 +- .../transfer-fee/anchor/Anchor.toml | 2 - .../transfer-fee/anchor/README.md | 2 +- .../transfer-fee/anchor/migrations/deploy.ts | 12 -- .../transfer-fee/native/program/tests/test.rs | 4 +- .../transfer-fee/quasar/README.md | 2 +- .../account-data-as-seed/anchor/Anchor.toml | 2 - .../account-data-as-seed/anchor/README.md | 4 +- .../anchor/migrations/deploy.ts | 12 -- .../initialize_extra_account_meta_list.rs | 4 +- .../anchor/programs/transfer-hook/src/lib.rs | 4 +- .../transfer-hook/tests/test_transfer_hook.rs | 2 +- .../account-data-as-seed/quasar/README.md | 2 +- .../account-data-as-seed/quasar/src/lib.rs | 6 +- .../allow-block-list-token/README.md | 2 +- .../allow-block-list-token/anchor/Anchor.toml | 2 - .../allow-block-list-token/anchor/README.md | 2 +- .../allow-block-list-token/quasar/Cargo.toml | 2 +- .../allow-block-list-token/quasar/README.md | 2 +- .../quasar/src/constants.rs | 2 +- .../quasar/src/instructions/change_mode.rs | 2 +- .../quasar/src/instructions/init_mint.rs | 2 +- .../quasar/src/instructions/tx_hook.rs | 8 +- .../allow-block-list-token/quasar/src/lib.rs | 8 +- .../quasar/src/state.rs | 2 +- .../block-list/pinocchio/program/Cargo.toml | 2 +- .../pinocchio/program/src/state/config.rs | 2 +- .../program/src/token_extensions_utils.rs | 2 +- .../block-list/pinocchio/tests/test.spec.ts | 4 +- .../transfer-hook/block-list/readme.md | 10 +- .../transfer-hook/counter/anchor/Anchor.toml | 2 - .../transfer-hook/counter/anchor/README.md | 2 +- .../counter/anchor/migrations/deploy.ts | 12 -- .../initialize_extra_account_meta_list.rs | 4 +- .../anchor/programs/transfer-hook/src/lib.rs | 2 +- .../tests/test_transfer_hook_counter.rs | 2 +- .../transfer-hook/counter/quasar/README.md | 2 +- .../transfer-hook/counter/quasar/src/lib.rs | 4 +- .../transfer-hook/counter/quasar/src/tests.rs | 2 +- .../hello-world/anchor/Anchor.toml | 4 +- .../hello-world/anchor/README.md | 2 +- .../hello-world/anchor/migrations/deploy.ts | 12 -- .../src/instructions/initialize.rs | 2 +- .../initialize_extra_account_meta_list.rs | 4 +- .../anchor/programs/transfer-hook/src/lib.rs | 2 +- .../transfer-hook/tests/test_transfer_hook.rs | 2 +- .../hello-world/quasar/README.md | 2 +- .../hello-world/quasar/src/lib.rs | 8 +- .../transfer-cost/anchor/Anchor.toml | 2 - .../transfer-cost/anchor/README.md | 2 +- .../transfer-cost/anchor/migrations/deploy.ts | 12 -- .../anchor/programs/transfer-hook/Cargo.toml | 2 +- .../initialize_extra_account_meta_list.rs | 2 +- .../src/instructions/transfer_hook.rs | 2 +- .../transfer-cost/quasar/README.md | 2 +- .../transfer-cost/quasar/src/lib.rs | 2 +- .../transfer-switch/anchor/Anchor.toml | 2 - .../transfer-switch/anchor/README.md | 2 +- .../initialise_extra_account_metas_list.rs | 2 +- .../src/instructions/switch.rs | 2 +- .../src/instructions/transfer_hook.rs | 2 +- .../tests/test_transfer_switch.rs | 4 +- .../transfer-switch/quasar/README.md | 2 +- .../transfer-switch/quasar/src/lib.rs | 10 +- .../transfer-switch/quasar/src/tests.rs | 4 +- .../whitelist/anchor/Anchor.toml | 4 +- .../transfer-hook/whitelist/anchor/README.md | 4 +- .../whitelist/anchor/migrations/deploy.ts | 12 -- .../initialize_extra_account_meta_list.rs | 4 +- .../anchor/programs/transfer-hook/src/lib.rs | 4 +- .../transfer-hook/tests/test_transfer_hook.rs | 2 +- .../transfer-hook/whitelist/quasar/README.md | 2 +- .../transfer-hook/whitelist/quasar/src/lib.rs | 2 +- .../whitelist/quasar/src/tests.rs | 4 +- tokens/token-minter/anchor/Anchor.toml | 4 +- tokens/token-minter/quasar/Cargo.toml | 4 +- .../quasar/src/instructions/create.rs | 2 +- tokens/token-minter/quasar/src/lib.rs | 6 +- tokens/transfer-tokens/anchor/Anchor.toml | 4 +- .../tests/test_transfer_tokens.rs | 2 +- tokens/transfer-tokens/quasar/Cargo.toml | 2 +- tools/shank-and-codama/native/README.md | 24 +-- tools/shank-and-codama/native/tests/test.ts | 2 +- 307 files changed, 880 insertions(+), 1127 deletions(-) delete mode 100644 basics/close-account/anchor/migrations/deploy.ts delete mode 100644 basics/counter/anchor/migrations/deploy.ts delete mode 100644 basics/cross-program-invocation/anchor/migrations/deploy.ts delete mode 100644 basics/favorites/anchor/migrations/deploy.ts delete mode 100644 basics/realloc/anchor/migrations/deploy.ts delete mode 100644 compression/cnft-burn/anchor/migrations/deploy.ts delete mode 100644 finance/escrow/anchor/.mocharc.json delete mode 100644 finance/escrow/anchor/migrations/deploy.ts delete mode 100644 finance/escrow/anchor/register.js rename finance/vault-strategy/anchor/{ => programs/vault-strategy}/tests/vault_strategy.rs (100%) create mode 100644 tokens/betting-market/README.md create mode 100644 tokens/nft-operations/README.md delete mode 100644 tokens/token-extensions/basics/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/cpi-guard/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/default-account-state/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/group/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/immutable-owner/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/interest-bearing/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/memo-transfer/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/metadata/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/mint-close-authority/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/non-transferable/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/permanent-delegate/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/transfer-fee/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/transfer-hook/counter/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/anchor/migrations/deploy.ts delete mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor/migrations/deploy.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 136c0305..7a97d4d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this repository are documented here. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). -## [2026-04-08] โ€” Quicknode fork modernization (Mike MacCana) +## [2026-04-08] - Quicknode fork modernization (Mike MacCana) Mike MacCana led the Quicknode fork of the [Solana Foundation program examples](https://github.com/solana-developers/program-examples) from late 2025. The first commits on this repository lineage are dated **8 April 2026**; the summary below covers that work through the initial merge. @@ -12,13 +12,13 @@ Mike MacCana led the Quicknode fork of the [Solana Foundation program examples]( **Toolchain and frameworks.** The tree had accumulated examples from several years of Solana development (including Anchor releases going back to the ~0.26 era in 2022 and many intermediate versions). The fork brought the Anchor examples up to **Anchor 1.0.0** stable (from 1.0.0-rc.5), refreshed Agave/Solana CLI pins, standardized on **pnpm**, and added parallel implementations in **[Quasar](https://quasar-lang.com/docs)**, **Pinocchio**, **Native Rust**, and **ASM** where applicable. Token-2022 examples were renamed to **`token-extensions`**. -**Testing.** Replaced the old pattern of local validators, Bankrun, and scattered TypeScript `anchor test` flows with **LiteSVM in-process tests** for most Anchor programs โ€” matching current Anchor defaults (`cargo test` wired through `Anchor.toml` / `pnpm test`). Fixed broken or flaky tests across Native, Pinocchio, and Anchor; added missing harnesses (e.g. block-list Pinocchio). CI was reworked for a repo this size: path filtering, caching, matrix sharding, and reliable detection of framework roots. +**Testing.** Replaced the old pattern of local validators, Bankrun, and scattered TypeScript `anchor test` flows with **LiteSVM in-process tests** for most Anchor programs - matching current Anchor defaults (`cargo test` wired through `Anchor.toml` / `pnpm test`). Fixed broken or flaky tests across Native, Pinocchio, and Anchor; added missing harnesses (e.g. block-list Pinocchio). CI was reworked for a repo this size: path filtering, caching, matrix sharding, and reliable detection of framework roots. **Programs and layout.** Broke large monolithic `lib.rs` files into **instruction handler modules**; adopted **`InitSpace`** and explicit PDA bumps instead of magic account sizes; corrected several logic bugs (escrow, token swap invariant, counter authority checks, compression Bubblegum program id, and more). Expanded finance and token-extension coverage; reorganized transfer-hook examples (including block-list under Pinocchio). **Documentation.** Rewrote the root README (framework badges, clearer example blurbs, ASM links), ran a style and **truth audit** on READMEs, and linked canonical [Solana terminology](https://solana.com/docs/references/terminology) on first mention. Added this changelog, `CONTRIBUTING.md` (aligned with LiteSVM testing), README templates, per-example Anchor and Quasar READMEs, fixed Husky for GUI git clients, removed unused maintainer scripts (`sync-package-json`, `cicd.sh`, local-validator helpers for the allow/block-list UI), dropped the orphan `tokens/spl-token-minter/` tree, and removed legacy root `package.json` dependencies (web3.js, Bankrun, chai). -**Removed / deferred.** Dropped duplicate or WIP trees (duplicate block-list Pinocchio copy, Quasar metadata example blocked on `sol_realloc`, root `yarn.lock`). Some examples remain excluded from CI via `.ghaignore` until they build cleanly again (compression, escrow, pyth, and others โ€” see that file for the live list). +**Removed / deferred.** Dropped duplicate or WIP trees (duplicate block-list Pinocchio copy, Quasar metadata example blocked on `sol_realloc`, root `yarn.lock`). Some examples remain excluded from CI via `.ghaignore` until they build cleanly again (compression, escrow, pyth, and others - see that file for the live list). ## Before June 2026 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c905be16..eb6f7fe8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,28 +20,24 @@ Thank you for considering a contribution to this repository. We welcome new exam ## Testing -This repo uses an in-process test runtime โ€” no local validator boot, no `solana-test-validator`, no `anchor test --validator legacy`. +This repo uses an in-process test runtime - no local validator boot, no `solana-test-validator`, no `anchor test --validator legacy`. -For Anchor and Quasar examples, tests are written in TypeScript and run with `node:test` via `tsx`: - -```bash -npx tsx --test --test-reporter=spec tests/*.ts -``` - -The conventional `Anchor.toml` `[scripts]` entry is: +**Anchor examples** are tested in Rust with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). Tests live in `programs//tests/`, load the compiled program with `include_bytes!("../../../target/deploy/.so")`, and run with `cargo test` (build the `.so` first with `cargo build-sbf` or `anchor build`). The conventional `Anchor.toml` `[scripts]` entry is: ```toml [scripts] -test = "npx create-codama-clients; npx tsx --test --test-reporter=spec tests/*.ts" +test = "cargo test" ``` -The TypeScript tests use: +Optional helpers come from the [`solana-kite`](https://crates.io/crates/solana-kite) crate (wallet creation, token mint helpers, `send_transaction_from_instructions`). + +**Quasar examples** are tested in Rust with QuasarSVM. Run `quasar build` (which also generates the Rust client crate under `target/client/rust/` that the tests import), then `quasar test` or `cargo test`. + +**Native and Pinocchio examples** use `litesvm` directly from Rust, except for a few that keep TypeScript tests (`tsx --test` with [`solana-kite`](https://solanakite.org) and [`@solana/kit`](https://solanakit.com)) where the example is specifically about client-side tooling. -- [`solana-kite`](https://solanakite.org) for the connection, wallet creation, token mint helpers, PDA derivation, and `sendTransactionFromInstructions`. -- [`@solana/kit`](https://solanakit.com) for the core types (`KeyPairSigner`, `Address`, `lamports`). -- A [Codama](https://github.com/codama-idl/codama)-generated client (via `npx create-codama-clients`) for invoking the program instructions. Do **not** use `anchor.workspace` or `program.methods.X().rpc()`. +Do not write TypeScript tests for Anchor or Quasar programs, and do not use `anchor.workspace` or `program.methods.X().rpc()`. -Native and Pinocchio examples may use `litesvm` directly from Rust where appropriate. +Tests must exercise the program for real: initialize accounts, send transactions through the program's instruction handlers, and assert resulting state and balances. Placeholder tests (`assert!(true)`, build-only checks) don't count. ## Style @@ -54,7 +50,7 @@ Other conventions: - Use full words rather than abbreviations (`transaction`, not `tx` or `txn`; `account`, not `acc`). - Prefer `async`/`await` over `.then()`/`.catch()`. - Use `Array` rather than `T[]` in TypeScript. -- Avoid magic numbers โ€” name or explain them. +- Avoid magic numbers - name or explain them. - Write "onchain" / "offchain" as single words (no hyphen). ## Excluding an example from CI diff --git a/README.md b/README.md index f930adb6..67305c41 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,11 @@ Each example is available in one or more of the following frameworks: -- [โš“ Anchor](https://www.anchor-lang.com/) โ€” the most popular framework for Solana development. Build with `anchor build`, test with `pnpm test` as defined in `Anchor.toml`. -- [๐Ÿ’ซ Quasar](https://quasar-lang.com/docs) โ€” a newer, more performant framework with Anchor-compatible ergonomics. Run `pnpm test` to execute tests. -- [๐Ÿคฅ Pinocchio](https://github.com/anza-xyz/pinocchio) โ€” a zero-copy, zero-allocation library for Solana programs. Run `pnpm test` to execute tests. -- [๐Ÿฆ€ Native Rust](https://docs.anza.xyz/) โ€” vanilla Rust using Solana's native crates. Run `pnpm test` to execute tests. -- [๐Ÿงฌ ASM](https://github.com/blueshift-gg/sbpf) โ€” hand-written sBPF assembly built with the `sbpf` toolchain. Run `pnpm build-and-test` to build and test. +- [โš“ Anchor](https://www.anchor-lang.com/) - the most popular framework for Solana development. Build with `anchor build`, test with `pnpm test` as defined in `Anchor.toml`. +- [๐Ÿ’ซ Quasar](https://quasar-lang.com/docs) - a newer, more performant framework with Anchor-compatible ergonomics. Run `pnpm test` to execute tests. +- [๐Ÿคฅ Pinocchio](https://github.com/anza-xyz/pinocchio) - a zero-copy, zero-allocation library for Solana programs. Run `pnpm test` to execute tests. +- [๐Ÿฆ€ Native Rust](https://docs.anza.xyz/) - vanilla Rust using Solana's native crates. Run `pnpm test` to execute tests. +- [๐Ÿงฌ ASM](https://github.com/blueshift-gg/sbpf) - hand-written sBPF assembly built with the `sbpf` toolchain. Run `pnpm build-and-test` to build and test. > [!NOTE] > You don't need to write your own program for basic tasks like creating [accounts](https://solana.com/docs/terminology#account), transferring SOL, or minting tokens. These are handled by existing programs like the System Program and Token Program. @@ -19,7 +19,7 @@ Each example is available in one or more of the following frameworks: ### Escrow -**Start here โ€” the best first finance program to learn on Solana.** A neutral account that holds funds until both sides deliver, like a real-estate escrow or a lawyer's trust account. The maker deposits token A and names how much token B they want; when a taker supplies token B, the program swaps both in a single all-or-nothing transaction. This swap is the core idea behind every onchain exchange. +**Start here - the best first finance program to learn on Solana.** A neutral account that holds funds until both sides deliver, like a real-estate escrow or a lawyer's trust account. The maker deposits token A and names how much token B they want; when a taker supplies token B, the program swaps both in a single all-or-nothing transaction. This swap is the core idea behind every onchain exchange. [โš“ Anchor](./finance/escrow/anchor) [๐Ÿ’ซ Quasar](./finance/escrow/quasar) [๐Ÿฆ€ Native](./finance/escrow/native) @@ -49,7 +49,7 @@ A managed investment fund onchain, like an ETF or mutual fund. Investors deposit ### Betting Market -Parimutuel (pooled) prediction market โ€” an admin opens an event with multiple outcomes, bettors stake tokens on an outcome, and at settlement the losing pool (minus a protocol fee) is split among winners in proportion to their stake. +Parimutuel (pooled) prediction market - an admin opens an event with multiple outcomes, bettors stake tokens on an outcome, and at settlement the losing pool (minus a protocol fee) is split among winners in proportion to their stake. [โš“ Anchor](./tokens/betting-market/anchor) @@ -70,7 +70,7 @@ Store and retrieve data using Solana accounts. ### Counter -Use a [PDA](https://solana.com/docs/terminology#program-derived-address-pda) to store global state โ€” a counter that increments when called. +Use a [PDA](https://solana.com/docs/terminology#program-derived-address-pda) to store global state - a counter that increments when called. [โš“ Anchor](./basics/counter/anchor) [๐Ÿ’ซ Quasar](./basics/counter/quasar) [๐Ÿคฅ Pinocchio](./basics/counter/pinocchio) [๐Ÿฆ€ Native](./basics/counter/native) @@ -100,7 +100,7 @@ Create new accounts on the blockchain. ### Cross-Program Invocation -Call one program from another โ€” the hand program invokes the lever program to toggle a switch. +Call one program from another - the hand program invokes the lever program to toggle a switch. [โš“ Anchor](./basics/cross-program-invocation/anchor) [๐Ÿ’ซ Quasar](./basics/cross-program-invocation/quasar) [๐Ÿฆ€ Native](./basics/cross-program-invocation/native) @@ -148,7 +148,7 @@ Send SOL between two accounts. ### Pyth Price Feeds -An **oracle** brings real-world market prices โ€” a dollar, a stock, a token โ€” [onchain](https://solana.com/docs/terminology#onchain), like a Bloomberg terminal feeding live quotes. [Pyth](https://pyth.network/) publishes low-latency prices from institutional sources, each in its own price feed account. This example reads a feed and logs its price, confidence interval, and exponent โ€” the building block an AMM, lending market, or vault uses to value assets. +An **oracle** brings real-world market prices - a dollar, a stock, a token - [onchain](https://solana.com/docs/terminology#onchain), like a Bloomberg terminal feeding live quotes. [Pyth](https://pyth.network/) publishes low-latency prices from institutional sources, each in its own price feed account. This example reads a feed and logs its price, confidence interval, and exponent - the building block an AMM, lending market, or vault uses to value assets. [โš“ Anchor](./basics/pyth/anchor) [๐Ÿ’ซ Quasar](./basics/pyth/quasar) @@ -282,43 +282,43 @@ Create tokens with a built-in transfer fee. [โš“ Anchor](./tokens/token-extensions/transfer-fee/anchor) [๐Ÿ’ซ Quasar](./tokens/token-extensions/transfer-fee/quasar) [๐Ÿฆ€ Native](./tokens/token-extensions/transfer-fee/native) -### Transfer Hook โ€” Hello World +### Transfer Hook - Hello World A minimal transfer hook that executes custom logic on every token transfer. [โš“ Anchor](./tokens/token-extensions/transfer-hook/hello-world/anchor) [๐Ÿ’ซ Quasar](./tokens/token-extensions/transfer-hook/hello-world/quasar) -### Transfer Hook โ€” Counter +### Transfer Hook - Counter Count how many times tokens have been transferred. [โš“ Anchor](./tokens/token-extensions/transfer-hook/counter/anchor) [๐Ÿ’ซ Quasar](./tokens/token-extensions/transfer-hook/counter/quasar) -### Transfer Hook โ€” Account Data as Seed +### Transfer Hook - Account Data as Seed Use token account owner data as seeds to derive extra accounts in a transfer hook. [โš“ Anchor](./tokens/token-extensions/transfer-hook/account-data-as-seed/anchor) [๐Ÿ’ซ Quasar](./tokens/token-extensions/transfer-hook/account-data-as-seed/quasar) -### Transfer Hook โ€” Allow/Block List +### Transfer Hook - Allow/Block List Restrict or allow token transfers using an onchain list managed by a list authority. [โš“ Anchor](./tokens/token-extensions/transfer-hook/allow-block-list-token/anchor) [๐Ÿ’ซ Quasar](./tokens/token-extensions/transfer-hook/allow-block-list-token/quasar) -### Transfer Hook โ€” Transfer Cost +### Transfer Hook - Transfer Cost Charge an additional fee on every token transfer. [โš“ Anchor](./tokens/token-extensions/transfer-hook/transfer-cost/anchor) [๐Ÿ’ซ Quasar](./tokens/token-extensions/transfer-hook/transfer-cost/quasar) -### Transfer Hook โ€” Transfer Switch +### Transfer Hook - Transfer Switch Enable or disable token transfers with an onchain switch. [โš“ Anchor](./tokens/token-extensions/transfer-hook/transfer-switch/anchor) [๐Ÿ’ซ Quasar](./tokens/token-extensions/transfer-hook/transfer-switch/quasar) -### Transfer Hook โ€” Whitelist +### Transfer Hook - Whitelist Restrict transfers so only whitelisted accounts can receive tokens. @@ -344,6 +344,14 @@ Work with Metaplex compressed NFTs. [โš“ Anchor](./compression/cutils/anchor) [๐Ÿ’ซ Quasar](./compression/cutils/quasar) +## Tools + +### Shank and Codama + +Generate an IDL from a native Rust program with [Shank](https://github.com/metaplex-foundation/shank), then generate a TypeScript client from that IDL with [Codama](https://github.com/codama-idl/codama). + +[๐Ÿฆ€ Native](./tools/shank-and-codama/native) + --- **PRs welcome!** Follow the [contributing guidelines](./CONTRIBUTING.md) and see [CHANGELOG.md](./CHANGELOG.md) for release history. diff --git a/basics/account-data/anchor/Anchor.toml b/basics/account-data/anchor/Anchor.toml index d31e9d34..08545285 100644 --- a/basics/account-data/anchor/Anchor.toml +++ b/basics/account-data/anchor/Anchor.toml @@ -8,12 +8,9 @@ skip-lint = false [programs.localnet] account_data_anchor_program = "GpVcgWdgVErgLqsn8VYUch6EqDerMgNqoLSmGyKrd6MR" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "cargo test" -litesvm-test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/litesvm.test.ts" #For litesvm test +test = "cargo test" diff --git a/basics/account-data/quasar/Cargo.toml b/basics/account-data/quasar/Cargo.toml index 35e46ce2..a11557aa 100644 --- a/basics/account-data/quasar/Cargo.toml +++ b/basics/account-data/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-account-data" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/basics/checking-accounts/anchor/Anchor.toml b/basics/checking-accounts/anchor/Anchor.toml index b5dbaa10..ab5a598d 100644 --- a/basics/checking-accounts/anchor/Anchor.toml +++ b/basics/checking-accounts/anchor/Anchor.toml @@ -6,8 +6,6 @@ seeds = false [programs.localnet] checking_account_program = "ECWPhR3rJbaPfyNFgphnjxSEexbTArc7vxD8fnW6tgKw" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/checking-accounts/quasar/Cargo.toml b/basics/checking-accounts/quasar/Cargo.toml index f791fb67..069c83bf 100644 --- a/basics/checking-accounts/quasar/Cargo.toml +++ b/basics/checking-accounts/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-checking-accounts" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/basics/checking-accounts/quasar/src/instructions/check_accounts.rs b/basics/checking-accounts/quasar/src/instructions/check_accounts.rs index aa1efda9..8a1f0f1b 100644 --- a/basics/checking-accounts/quasar/src/instructions/check_accounts.rs +++ b/basics/checking-accounts/quasar/src/instructions/check_accounts.rs @@ -11,7 +11,7 @@ use quasar_lang::prelude::*; pub struct CheckAccounts { /// Checks that this account signed the transaction. pub payer: Signer, - /// No checks performed โ€” the caller is responsible for validation. + /// No checks performed - the caller is responsible for validation. #[account(mut)] pub account_to_create: UncheckedAccount, /// No automatic owner check in Quasar; see note above. diff --git a/basics/close-account/anchor/Anchor.toml b/basics/close-account/anchor/Anchor.toml index a61bb8ae..3c9714ad 100644 --- a/basics/close-account/anchor/Anchor.toml +++ b/basics/close-account/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] close_account_program = "99TQtoDdQ5NS2v5Ppha93aqEmv3vV9VZVfHTP5rGST3c" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/close-account/anchor/migrations/deploy.ts b/basics/close-account/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/basics/close-account/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/basics/close-account/quasar/src/tests.rs b/basics/close-account/quasar/src/tests.rs index a1fcc3d5..6bdef45f 100644 --- a/basics/close-account/quasar/src/tests.rs +++ b/basics/close-account/quasar/src/tests.rs @@ -127,8 +127,7 @@ fn test_close_user() { // owner, and resize data are applied to the BPF input buffer but aren't read back // by the TransactionContext in the test harness. // - // The close instruction executes successfully onchain โ€” verified by: - // - The instruction succeeds (assert_success above) - // - Program log shows "close_user: executing close" when logging is enabled - // - CU consumption is consistent with close operations + // So the strongest assertion available here is that the instruction + // succeeds (assert_success above). The Anchor twin's LiteSVM suite + // verifies the post-close account state (lamports drained, data cleared). } diff --git a/basics/counter/anchor/Anchor.toml b/basics/counter/anchor/Anchor.toml index 93d108fd..4d5b359f 100644 --- a/basics/counter/anchor/Anchor.toml +++ b/basics/counter/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] counter_anchor = "BmDHboaj1kBUoinJKKSRqKfMeRKJqQqEbUj1VgzeQe4A" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/counter/anchor/migrations/deploy.ts b/basics/counter/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/basics/counter/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/basics/counter/quasar/Cargo.toml b/basics/counter/quasar/Cargo.toml index d1e64051..b690d88f 100644 --- a/basics/counter/quasar/Cargo.toml +++ b/basics/counter/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-counter" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/basics/create-account/README.md b/basics/create-account/README.md index 5fff31e4..2867ab03 100644 --- a/basics/create-account/README.md +++ b/basics/create-account/README.md @@ -2,7 +2,7 @@ Create a Solana [account](https://solana.com/docs/terminology#account). -The account is a **system account** โ€” owned by the System Program, which means only the System Program can modify its data. In this example, the account simply holds some SOL. +The account is a **system account** - owned by the System Program, which means only the System Program can modify its data. In this example, the account simply holds some SOL. The tests cover two ways to create the account: @@ -13,5 +13,5 @@ See [cross-program-invocation](../cross-program-invocation) for more CPI example ## Links -- [Solana Cookbook โ€” How to Create a System Account](https://solana.com/developers/cookbook/accounts/create-account) -- [Rust Docs โ€” `solana_system_interface::instruction::create_account`](https://docs.rs/solana-system-interface/latest/solana_system_interface/instruction/fn.create_account.html) +- [Solana Cookbook - How to Create a System Account](https://solana.com/developers/cookbook/accounts/create-account) +- [Rust Docs - `solana_system_interface::instruction::create_account`](https://docs.rs/solana-system-interface/latest/solana_system_interface/instruction/fn.create_account.html) diff --git a/basics/create-account/anchor/Anchor.toml b/basics/create-account/anchor/Anchor.toml index b5ac95c8..18431cd4 100644 --- a/basics/create-account/anchor/Anchor.toml +++ b/basics/create-account/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] create_system_account = "ARVNCsYKDQsCLHbwUTJLpFXVrJdjhWZStyzvxmKe2xHi" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/create-account/anchor/programs/create-system-account/src/lib.rs b/basics/create-account/anchor/programs/create-system-account/src/lib.rs index 921c357b..8323b4d2 100644 --- a/basics/create-account/anchor/programs/create-system-account/src/lib.rs +++ b/basics/create-account/anchor/programs/create-system-account/src/lib.rs @@ -30,7 +30,7 @@ pub mod create_system_account { &context.accounts.system_program.key(), // Owner Program )?; - msg!("Account created succesfully."); + msg!("Account created successfully."); Ok(()) } } diff --git a/basics/create-account/native/program/src/lib.rs b/basics/create-account/native/program/src/lib.rs index be1864b4..e26cda14 100644 --- a/basics/create-account/native/program/src/lib.rs +++ b/basics/create-account/native/program/src/lib.rs @@ -34,6 +34,6 @@ fn process_instruction( &[payer.clone(), new_account.clone(), system_program.clone()], )?; - msg!("Account created succesfully."); + msg!("Account created successfully."); Ok(()) } diff --git a/basics/create-account/pinocchio/program/src/lib.rs b/basics/create-account/pinocchio/program/src/lib.rs index ea66cfd7..2a97f466 100644 --- a/basics/create-account/pinocchio/program/src/lib.rs +++ b/basics/create-account/pinocchio/program/src/lib.rs @@ -34,6 +34,6 @@ fn process_instruction( } .invoke()?; - log!("Account created succesfully."); + log!("Account created successfully."); Ok(()) } diff --git a/basics/create-account/quasar/Cargo.toml b/basics/create-account/quasar/Cargo.toml index 3387bec7..0be3a1d3 100644 --- a/basics/create-account/quasar/Cargo.toml +++ b/basics/create-account/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-create-account" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/basics/cross-program-invocation/README.md b/basics/cross-program-invocation/README.md index 6e81fc62..d63c2864 100644 --- a/basics/cross-program-invocation/README.md +++ b/basics/cross-program-invocation/README.md @@ -11,7 +11,7 @@ Consider this sequence in a token [mint](https://solana.com/docs/terminology#tok 3. Create and initialize a user's [token account](https://solana.com/docs/terminology#token-account) for the mint. 4. Mint some tokens to the user's token account. -You cannot create a metadata account without first having the mint. Once you decide that steps 1 and 4 must be onchain, the only sensible option is to also do steps 2 and 3 onchain โ€” you cannot pause a program mid-flight to let the client do work. +You cannot create a metadata account without first having the mint. Once you decide that steps 1 and 4 must be onchain, the only sensible option is to also do steps 2 and 3 onchain - you cannot pause a program mid-flight to let the client do work. ## Native setup notes diff --git a/basics/cross-program-invocation/anchor/Anchor.toml b/basics/cross-program-invocation/anchor/Anchor.toml index 2e116931..4d93696d 100644 --- a/basics/cross-program-invocation/anchor/Anchor.toml +++ b/basics/cross-program-invocation/anchor/Anchor.toml @@ -9,8 +9,6 @@ skip-lint = false hand = "Bi5N7SUQhpGknVcqPTzdFFVueQoxoUu8YTLz75J6fT8A" lever = "E64FVeubGC4NPNF2UBJYX4AkrVowf74fRJD9q6YhwstN" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/cross-program-invocation/anchor/migrations/deploy.ts b/basics/cross-program-invocation/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/basics/cross-program-invocation/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/basics/cross-program-invocation/anchor/programs/hand/tests/test_hand.rs b/basics/cross-program-invocation/anchor/programs/hand/tests/test_hand.rs index 0bb83e1a..7c97448e 100644 --- a/basics/cross-program-invocation/anchor/programs/hand/tests/test_hand.rs +++ b/basics/cross-program-invocation/anchor/programs/hand/tests/test_hand.rs @@ -58,7 +58,7 @@ fn test_pull_lever_cpi() { env!("CARGO_MANIFEST_DIR"), "/../../target/deploy/lever.so" )) - .expect("lever.so not found โ€” run `anchor build` first"); + .expect("lever.so not found - run `anchor build` first"); svm.add_program(hand_program_id, hand_bytes).unwrap(); svm.add_program(lever_program_id, &lever_bytes).unwrap(); let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); diff --git a/basics/cross-program-invocation/quasar/README.md b/basics/cross-program-invocation/quasar/README.md index edf789ca..99797486 100644 --- a/basics/cross-program-invocation/quasar/README.md +++ b/basics/cross-program-invocation/quasar/README.md @@ -1,9 +1,9 @@ -# Cross-Program Invocation โ€” Quasar +# Cross-Program Invocation - Quasar This example contains **two separate Quasar [programs](https://solana.com/docs/terminology#program)** that work together: -- **`lever/`** โ€” A program with [onchain](https://solana.com/docs/terminology#onchain) `PowerStatus` state and a `switch_power` [instruction handler](https://solana.com/docs/terminology#instruction-handler) that toggles a boolean. -- **`hand/`** โ€” A program that calls the lever program's `switch_power` via [CPI](https://solana.com/docs/terminology#cross-program-invocation-cpi). +- **`lever/`** - A program with [onchain](https://solana.com/docs/terminology#onchain) `PowerStatus` state and a `switch_power` [instruction handler](https://solana.com/docs/terminology#instruction-handler) that toggles a boolean. +- **`hand/`** - A program that calls the lever program's `switch_power` via [CPI](https://solana.com/docs/terminology#cross-program-invocation-cpi). ## Building diff --git a/basics/cross-program-invocation/quasar/hand/Cargo.toml b/basics/cross-program-invocation/quasar/hand/Cargo.toml index 95cb621b..ebbc9b0d 100644 --- a/basics/cross-program-invocation/quasar/hand/Cargo.toml +++ b/basics/cross-program-invocation/quasar/hand/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-hand" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. [workspace] [lints.rust.unexpected_cfgs] diff --git a/basics/cross-program-invocation/quasar/hand/src/instructions/pull_lever.rs b/basics/cross-program-invocation/quasar/hand/src/instructions/pull_lever.rs index 95f1d7eb..8132228c 100644 --- a/basics/cross-program-invocation/quasar/hand/src/instructions/pull_lever.rs +++ b/basics/cross-program-invocation/quasar/hand/src/instructions/pull_lever.rs @@ -2,7 +2,7 @@ use quasar_lang::prelude::*; /// Accounts for the hand program's pull_lever instruction. /// The lever_program uses `Program` with a custom marker type -/// that implements `Id` โ€” this lets Quasar verify the program address and +/// that implements `Id` - this lets Quasar verify the program address and /// the executable flag during account parsing. #[derive(Accounts)] pub struct PullLever { diff --git a/basics/cross-program-invocation/quasar/hand/src/lib.rs b/basics/cross-program-invocation/quasar/hand/src/lib.rs index e3e425d9..37fc35c1 100644 --- a/basics/cross-program-invocation/quasar/hand/src/lib.rs +++ b/basics/cross-program-invocation/quasar/hand/src/lib.rs @@ -9,7 +9,7 @@ mod tests; declare_id!("Bi5N7SUQhpGknVcqPTzdFFVueQoxoUu8YTLz75J6fT8A"); -/// The lever program's ID โ€” used to verify the correct program is passed. +/// The lever program's ID - used to verify the correct program is passed. pub const LEVER_PROGRAM_ID: Address = address!("E64FVeubGC4NPNF2UBJYX4AkrVowf74fRJD9q6YhwstN"); /// Marker type for the lever program, implementing `Id` so it can be used diff --git a/basics/cross-program-invocation/quasar/hand/src/tests.rs b/basics/cross-program-invocation/quasar/hand/src/tests.rs index 05ede556..753f0105 100644 --- a/basics/cross-program-invocation/quasar/hand/src/tests.rs +++ b/basics/cross-program-invocation/quasar/hand/src/tests.rs @@ -1,7 +1,7 @@ use quasar_svm::{Account, Instruction, Pubkey, QuasarSvm}; use solana_address::Address; -/// Lever program's program ID โ€” must match the lever's declare_id!(). +/// Lever program's program ID - must match the lever's declare_id!(). fn lever_program_id() -> Pubkey { Pubkey::from(crate::LEVER_PROGRAM_ID) } diff --git a/basics/cross-program-invocation/quasar/lever/Cargo.toml b/basics/cross-program-invocation/quasar/lever/Cargo.toml index 6b44f783..066cdcdb 100644 --- a/basics/cross-program-invocation/quasar/lever/Cargo.toml +++ b/basics/cross-program-invocation/quasar/lever/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-lever" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. [workspace] [lints.rust.unexpected_cfgs] diff --git a/basics/cross-program-invocation/quasar/lever/src/instructions/switch_power.rs b/basics/cross-program-invocation/quasar/lever/src/instructions/switch_power.rs index 52ac4401..0f29c1c4 100644 --- a/basics/cross-program-invocation/quasar/lever/src/instructions/switch_power.rs +++ b/basics/cross-program-invocation/quasar/lever/src/instructions/switch_power.rs @@ -16,7 +16,7 @@ pub fn handle_switch_power(accounts: &mut SwitchPower, name: &str) -> Result<(), let new_state = !current; accounts.power.is_on = PodBool::from(new_state); - // Quasar's log() takes &str โ€” no format! in no_std. + // Quasar's log() takes &str - no format! in no_std. // Logging the name verifies the wire format end-to-end: a stale u32 // length prefix would surface here as a corrupted name (e.g. the // first three bytes parsed as zeros, leaving "\0\0\0Al" instead of diff --git a/basics/favorites/anchor/Anchor.toml b/basics/favorites/anchor/Anchor.toml index efc19fb4..d64e4f29 100644 --- a/basics/favorites/anchor/Anchor.toml +++ b/basics/favorites/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] favorites = "ww9C83noARSQVBnqmCUmaVdbJjmiwcV9j2LkXYMoUCV" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/favorites/anchor/migrations/deploy.ts b/basics/favorites/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/basics/favorites/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/basics/hello-solana/README.md b/basics/hello-solana/README.md index 4ba5ce52..a5704f96 100644 --- a/basics/hello-solana/README.md +++ b/basics/hello-solana/README.md @@ -1,6 +1,6 @@ # Hello Solana -Our first Solana [program](https://solana.com/docs/terminology#program) โ€” a "hello, world" that logs a greeting. Along the way, a quick look at what's inside a Solana transaction. +Our first Solana [program](https://solana.com/docs/terminology#program) - a "hello, world" that logs a greeting. Along the way, a quick look at what's inside a Solana transaction. ## Transactions diff --git a/basics/hello-solana/anchor/Anchor.toml b/basics/hello-solana/anchor/Anchor.toml index eff8031e..fcd9e800 100644 --- a/basics/hello-solana/anchor/Anchor.toml +++ b/basics/hello-solana/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] hello_solana = "2phbC62wekpw95XuBk4i1KX4uA8zBUWmYbiTMhicSuBV" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/hello-solana/quasar/Cargo.toml b/basics/hello-solana/quasar/Cargo.toml index 6cbedbd6..c16ce2a5 100644 --- a/basics/hello-solana/quasar/Cargo.toml +++ b/basics/hello-solana/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-hello-solana" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/basics/pda-rent-payer/anchor/Anchor.toml b/basics/pda-rent-payer/anchor/Anchor.toml index 633d86b5..b387fce5 100644 --- a/basics/pda-rent-payer/anchor/Anchor.toml +++ b/basics/pda-rent-payer/anchor/Anchor.toml @@ -6,8 +6,6 @@ seeds = false [programs.localnet] pda_rent_payer = "7Hm9nsYVuBZ9rf8z9AMUHreZRv8Q4vLhqwdVTCawRZtA" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/pda-rent-payer/quasar/Cargo.toml b/basics/pda-rent-payer/quasar/Cargo.toml index 9ed691b8..7248a277 100644 --- a/basics/pda-rent-payer/quasar/Cargo.toml +++ b/basics/pda-rent-payer/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-pda-rent-payer" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/basics/pda-rent-payer/quasar/src/instructions/init_rent_vault.rs b/basics/pda-rent-payer/quasar/src/instructions/init_rent_vault.rs index c186c845..66f25283 100644 --- a/basics/pda-rent-payer/quasar/src/instructions/init_rent_vault.rs +++ b/basics/pda-rent-payer/quasar/src/instructions/init_rent_vault.rs @@ -1,8 +1,8 @@ use quasar_lang::prelude::*; -/// PDA seed marker for the rent-vault account. With the new derive grammar -/// (`address = `) we need a `Seeds` impl to validate the address; -/// `seeds = [b"rent_vault"]` is no longer accepted. +/// PDA seed marker for the rent-vault account. Quasar's derive grammar +/// (`address = `) needs a `Seeds` impl to validate the address; +/// inline `seeds = [b"rent_vault"]` is not accepted. #[derive(Seeds)] #[seeds(b"rent_vault")] pub struct RentVault; diff --git a/basics/processing-instructions/README.md b/basics/processing-instructions/README.md index f8d31a61..68c2bad3 100644 --- a/basics/processing-instructions/README.md +++ b/basics/processing-instructions/README.md @@ -1,6 +1,6 @@ # Custom Instruction Data -Pass your own custom [instruction](https://solana.com/docs/terminology#instruction) data to a [program](https://solana.com/docs/terminology#program). The data must be serialized in a format the Solana runtime can read โ€” typically via the `borsh` crate on both the client and program sides. +Pass your own custom [instruction](https://solana.com/docs/terminology#instruction) data to a [program](https://solana.com/docs/terminology#program). The data must be serialized in a format the Solana runtime can read - typically via the `borsh` crate on both the client and program sides. - **For `native`:** add `borsh` and `borsh-derive` to `Cargo.toml` so you can mark a struct as serializable. - **For [Anchor](https://solana.com/docs/terminology#anchor):** the framework handles serialization for you via the IDL. diff --git a/basics/processing-instructions/anchor/Anchor.toml b/basics/processing-instructions/anchor/Anchor.toml index d4125344..9e3e864b 100644 --- a/basics/processing-instructions/anchor/Anchor.toml +++ b/basics/processing-instructions/anchor/Anchor.toml @@ -6,8 +6,6 @@ seeds = false [programs.localnet] processing_instructions = "DgoL5J44aspizyUs9fcnpGEUJjWTLJRCfx8eYtUMYczf" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/processing-instructions/quasar/src/instructions/go_to_park.rs b/basics/processing-instructions/quasar/src/instructions/go_to_park.rs index ce71aeef..a02f38bc 100644 --- a/basics/processing-instructions/quasar/src/instructions/go_to_park.rs +++ b/basics/processing-instructions/quasar/src/instructions/go_to_park.rs @@ -1,6 +1,6 @@ use quasar_lang::prelude::*; -/// Minimal accounts context โ€” a signer is needed to submit the transaction. +/// Minimal accounts context - a signer is needed to submit the transaction. /// The instruction just processes instruction data (name + height). #[derive(Accounts)] pub struct Park { @@ -12,7 +12,7 @@ pub struct Park { pub fn handle_go_to_park(_accounts: &mut Park, _name: &str, height: u32) -> Result<(), ProgramError> { // Quasar's `log()` takes &str, no format! macro available in no_std. // We can't interpolate the name or height into the log message, so - // we use static messages โ€” same logic as the Anchor version, just + // we use static messages - same logic as the Anchor version, just // without formatted output. log("Welcome to the park!"); if height > 5 { diff --git a/basics/program-derived-addresses/anchor/Anchor.toml b/basics/program-derived-addresses/anchor/Anchor.toml index d8ad92af..c8f1d4fa 100644 --- a/basics/program-derived-addresses/anchor/Anchor.toml +++ b/basics/program-derived-addresses/anchor/Anchor.toml @@ -6,8 +6,6 @@ seeds = false [programs.localnet] program_derived_addresses_program = "oCCQRZyAbVxujyd8m57MPmDzZDmy2FoKW4ULS7KofCE" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/program-derived-addresses/native/tests/test.ts b/basics/program-derived-addresses/native/tests/test.ts index 3065e8c5..c4c0d149 100644 --- a/basics/program-derived-addresses/native/tests/test.ts +++ b/basics/program-derived-addresses/native/tests/test.ts @@ -26,7 +26,7 @@ describe("PDAs", async () => { }, }; - // Empty struct โ€” just needs to serialize to zero bytes + // Empty struct - just needs to serialize to zero bytes const IncrementPageVisitsSchema = { struct: {} }; function borshSerialize(schema: borsh.Schema, data: object): Buffer { diff --git a/basics/program-derived-addresses/quasar/Cargo.toml b/basics/program-derived-addresses/quasar/Cargo.toml index 35551fac..03d8001f 100644 --- a/basics/program-derived-addresses/quasar/Cargo.toml +++ b/basics/program-derived-addresses/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-program-derived-addresses" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/basics/pyth/README.md b/basics/pyth/README.md index 40817584..ac5599e4 100644 --- a/basics/pyth/README.md +++ b/basics/pyth/README.md @@ -2,7 +2,7 @@ [Pyth](https://pyth.network/) is an oracle that publishes low-latency market data from institutional sources [onchain](https://solana.com/docs/terminology#onchain). You can use it to read real-world asset prices from Solana [programs](https://solana.com/docs/terminology#program). -Each asset's price lives in its own Solana [account](https://solana.com/docs/terminology#account) โ€” a **price feed**. +Each asset's price lives in its own Solana [account](https://solana.com/docs/terminology#account) - a **price feed**. For example, the SOL/USD price feed on mainnet lives at `H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG`. diff --git a/basics/pyth/anchor/Anchor.toml b/basics/pyth/anchor/Anchor.toml index d89a162d..93967357 100644 --- a/basics/pyth/anchor/Anchor.toml +++ b/basics/pyth/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] pythexample = "GUkjQmrLPFXXNK1bFLKt8XQi6g3TjxcHVspbjDoHvMG2" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/pyth/anchor/README.md b/basics/pyth/anchor/README.md index 0a3d38bd..c26f49dc 100644 --- a/basics/pyth/anchor/README.md +++ b/basics/pyth/anchor/README.md @@ -13,9 +13,9 @@ See also: [Pyth overview](../README.md) and the [repository catalog](../../../RE > error[E0277]: the trait bound `pythnet_sdk::messages::PriceFeedMessage: BorshSerialize` is not satisfied > ``` > -> No published `pyth-solana-receiver-sdk` targets `anchor-lang` 1.0 (which this repo standardizes on), and no `pythnet-sdk` release has migrated to borsh 1.x โ€” so the dependency can't simply be upgraded. Tracked upstream at [pyth-network/pyth-crosschain#3756](https://github.com/pyth-network/pyth-crosschain/issues/3756). +> No published `pyth-solana-receiver-sdk` targets `anchor-lang` 1.0 (which this repo standardizes on), and no `pythnet-sdk` release has migrated to borsh 1.x - so the dependency can't simply be upgraded. Tracked upstream at [pyth-network/pyth-crosschain#3756](https://github.com/pyth-network/pyth-crosschain/issues/3756). > -> As a workaround, `programs/pythexample/src/lib.rs` mirrors the on-chain `PriceUpdateV2` layout locally (same fields, same 8-byte discriminator, owned by the Pyth Receiver program) so accounts written by Pyth deserialize unchanged. Replace the vendored type with the SDK import once an Anchor 1.0 / borsh 1.x compatible release ships. +> As a workaround, `programs/pythexample/src/lib.rs` mirrors the onchain `PriceUpdateV2` layout locally (same fields, same 8-byte discriminator, owned by the Pyth Receiver program) so accounts written by Pyth deserialize unchanged. Replace the vendored type with the SDK import once an Anchor 1.0 / borsh 1.x compatible release ships. ## Major concepts diff --git a/basics/pyth/anchor/programs/pythexample/src/lib.rs b/basics/pyth/anchor/programs/pythexample/src/lib.rs index 8416108c..3e1fe8b2 100644 --- a/basics/pyth/anchor/programs/pythexample/src/lib.rs +++ b/basics/pyth/anchor/programs/pythexample/src/lib.rs @@ -50,7 +50,7 @@ pub struct ReadPrice<'info> { // https://github.com/pyth-network/pyth-crosschain/issues/3756 // // The fields, order, and 8-byte -// discriminator below match the on-chain account exactly, and it is owned by +// discriminator below match the onchain account exactly, and it is owned by // the Pyth Receiver program (see the `Owner` impl), so accounts written by Pyth // deserialize unchanged. Replace this with the SDK type once an Anchor 1.0 / // borsh 1.x compatible `pyth-solana-receiver-sdk` release ships. diff --git a/basics/pyth/anchor/programs/pythexample/tests/test_pyth.rs b/basics/pyth/anchor/programs/pythexample/tests/test_pyth.rs index 04d545fb..03fb9a4f 100644 --- a/basics/pyth/anchor/programs/pythexample/tests/test_pyth.rs +++ b/basics/pyth/anchor/programs/pythexample/tests/test_pyth.rs @@ -97,7 +97,7 @@ fn test_read_price() { ) .unwrap(); - // Call read_price โ€” program just reads the account and logs the price info + // Call read_price - program just reads the account and logs the price info let ix_data = pythexample::instruction::ReadPrice {}.data(); let accounts = pythexample::accounts::ReadPrice { diff --git a/basics/pyth/quasar/Cargo.toml b/basics/pyth/quasar/Cargo.toml index ec4480da..1687eb6f 100644 --- a/basics/pyth/quasar/Cargo.toml +++ b/basics/pyth/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-pyth-example" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/basics/pyth/quasar/src/tests.rs b/basics/pyth/quasar/src/tests.rs index 5655f33d..03b53c82 100644 --- a/basics/pyth/quasar/src/tests.rs +++ b/basics/pyth/quasar/src/tests.rs @@ -52,7 +52,7 @@ fn test_read_price() { address: price_update, lamports: 1_000_000_000, data: account_data, - owner: Pubkey::new_unique(), // UncheckedAccount โ€” no owner validation + owner: Pubkey::new_unique(), // UncheckedAccount - no owner validation executable: false, }; diff --git a/basics/realloc/README.md b/basics/realloc/README.md index 1f68ec97..419898b0 100644 --- a/basics/realloc/README.md +++ b/basics/realloc/README.md @@ -1,6 +1,6 @@ # Realloc -Resize a Solana [account](https://solana.com/docs/terminology#account) after it has been created โ€” grow or shrink the data it can hold. +Resize a Solana [account](https://solana.com/docs/terminology#account) after it has been created - grow or shrink the data it can hold. ## A note on `realloc` vs `resize` diff --git a/basics/realloc/anchor/Anchor.toml b/basics/realloc/anchor/Anchor.toml index eabcf8d2..80cd0ed6 100644 --- a/basics/realloc/anchor/Anchor.toml +++ b/basics/realloc/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] anchor_realloc = "Fod47xKXjdHVQDzkFPBvfdWLm8gEAV4iMSXkfUzCHiSD" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/realloc/anchor/migrations/deploy.ts b/basics/realloc/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/basics/realloc/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/basics/realloc/quasar/src/instructions/initialize.rs b/basics/realloc/quasar/src/instructions/initialize.rs index 82409c47..512ce00c 100644 --- a/basics/realloc/quasar/src/instructions/initialize.rs +++ b/basics/realloc/quasar/src/instructions/initialize.rs @@ -4,7 +4,7 @@ use { }; /// Accounts for initialising a new message account. -/// The message_account is a random keypair (not a PDA) โ€” same as the Anchor version. +/// The message_account is a random keypair (not a PDA) - same as the Anchor version. #[derive(Accounts)] pub struct Initialize { #[account(mut)] diff --git a/basics/realloc/quasar/src/tests.rs b/basics/realloc/quasar/src/tests.rs index 25d35106..5b9f6350 100644 --- a/basics/realloc/quasar/src/tests.rs +++ b/basics/realloc/quasar/src/tests.rs @@ -111,7 +111,7 @@ fn test_update_longer_message() { let payer_after_init = result.account(&payer).unwrap().clone(); let msg_after_init = result.account(&message_account).unwrap().clone(); - // Update with longer message โ€” triggers realloc + // Update with longer message - triggers realloc let update_ix = Instruction { program_id, accounts: vec![ diff --git a/basics/rent/README.md b/basics/rent/README.md index 92b3ec7e..579d6aa0 100644 --- a/basics/rent/README.md +++ b/basics/rent/README.md @@ -2,6 +2,6 @@ All storage on Solana costs **[rent](https://solana.com/docs/terminology#rent)**. -In practice, rent is a small amount and [accounts](https://solana.com/docs/terminology#account) that hold at least two years' worth of rent are **rent-exempt** โ€” they pay nothing. If your account holds more [lamports](https://solana.com/docs/terminology#lamport) than the two-year cost, it isn't charged rent. +In practice, rent is a small amount and [accounts](https://solana.com/docs/terminology#account) that hold at least two years' worth of rent are **rent-exempt** - they pay nothing. If your account holds more [lamports](https://solana.com/docs/terminology#lamport) than the two-year cost, it isn't charged rent. Rent is calculated from the size of the data stored in the account. diff --git a/basics/rent/anchor/Anchor.toml b/basics/rent/anchor/Anchor.toml index 579d486d..b05f48f3 100644 --- a/basics/rent/anchor/Anchor.toml +++ b/basics/rent/anchor/Anchor.toml @@ -6,8 +6,6 @@ seeds = false [programs.localnet] rent_example = "ED6f4gweAE7hWPQPXMt4kWxzDJne8VQEm9zkb1tMpFNB" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/rent/anchor/programs/rent-example/src/lib.rs b/basics/rent/anchor/programs/rent-example/src/lib.rs index 44acf961..3e84d6a4 100644 --- a/basics/rent/anchor/programs/rent-example/src/lib.rs +++ b/basics/rent/anchor/programs/rent-example/src/lib.rs @@ -39,7 +39,7 @@ pub mod rent_example { &context.accounts.system_program.key(), )?; - msg!("Account created succesfully."); + msg!("Account created successfully."); Ok(()) } } diff --git a/basics/rent/native/program/src/lib.rs b/basics/rent/native/program/src/lib.rs index 01c711ab..4161473f 100644 --- a/basics/rent/native/program/src/lib.rs +++ b/basics/rent/native/program/src/lib.rs @@ -43,6 +43,6 @@ fn process_instruction( &[payer.clone(), new_account.clone(), system_program.clone()], )?; - msg!("Account created succesfully."); + msg!("Account created successfully."); Ok(()) } diff --git a/basics/rent/pinocchio/program/src/lib.rs b/basics/rent/pinocchio/program/src/lib.rs index e57f6923..65fbb821 100644 --- a/basics/rent/pinocchio/program/src/lib.rs +++ b/basics/rent/pinocchio/program/src/lib.rs @@ -45,6 +45,6 @@ fn process_instruction( } .invoke()?; - log!("Account created succesfully."); + log!("Account created successfully."); Ok(()) } diff --git a/basics/rent/quasar/Cargo.toml b/basics/rent/quasar/Cargo.toml index 10fe8d76..a9e57e93 100644 --- a/basics/rent/quasar/Cargo.toml +++ b/basics/rent/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-rent" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/basics/repository-layout/README.md b/basics/repository-layout/README.md index 0a9d7475..c0eadd75 100644 --- a/basics/repository-layout/README.md +++ b/basics/repository-layout/README.md @@ -4,4 +4,4 @@ A typical layout for a Solana [program](https://solana.com/docs/terminology#prog > You can structure your `src` folder however you like, as long as it follows Cargo's conventions. This layout is shown so that the patterns in other programs are recognizable. -The `native` and `anchor` layouts are similar. The main difference is the `processor.rs` file in the `native` setup โ€” one of the things [Anchor](https://solana.com/docs/terminology#anchor) abstracts away for you. +The `native` and `anchor` layouts are similar. The main difference is the `processor.rs` file in the `native` setup - one of the things [Anchor](https://solana.com/docs/terminology#anchor) abstracts away for you. diff --git a/basics/repository-layout/anchor/Anchor.toml b/basics/repository-layout/anchor/Anchor.toml index 1223ac40..2a54f9e3 100644 --- a/basics/repository-layout/anchor/Anchor.toml +++ b/basics/repository-layout/anchor/Anchor.toml @@ -6,8 +6,6 @@ seeds = false [programs.localnet] carnival = "8t94SEJh9jVjDwV7cbiuT6BvEsHo4YHP9x9a5rYH1NpP" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/repository-layout/anchor/programs/carnival/src/instructions/get_on_ride.rs b/basics/repository-layout/anchor/programs/carnival/src/instructions/get_on_ride.rs index 7e67d97e..0427f0c3 100644 --- a/basics/repository-layout/anchor/programs/carnival/src/instructions/get_on_ride.rs +++ b/basics/repository-layout/anchor/programs/carnival/src/instructions/get_on_ride.rs @@ -18,9 +18,8 @@ pub fn get_on_ride(ix: GetOnRideInstructionData) -> Result<()> { if ix.ride.eq(&ride.name) { msg!("You're about to ride the {}!", ride.name); - // Refuse service: failures used to log + return Ok(()), which made - // them indistinguishable from a successful ride for callers and - // tests. Return a real error instead. + // Refuse service with a real error so callers and tests can + // distinguish a refused ride from a successful one. if ix.rider_ticket_count < ride.tickets { msg!( " Sorry {}, you need {} tickets to ride the {}!", diff --git a/basics/repository-layout/quasar/Cargo.toml b/basics/repository-layout/quasar/Cargo.toml index 7890f661..ec4cff1d 100644 --- a/basics/repository-layout/quasar/Cargo.toml +++ b/basics/repository-layout/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-carnival" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/basics/repository-layout/quasar/src/instructions/carnival_context.rs b/basics/repository-layout/quasar/src/instructions/carnival_context.rs index 33960b49..0d274dce 100644 --- a/basics/repository-layout/quasar/src/instructions/carnival_context.rs +++ b/basics/repository-layout/quasar/src/instructions/carnival_context.rs @@ -2,7 +2,7 @@ use quasar_lang::prelude::*; use super::{eat_food, get_on_ride, play_game}; -/// Minimal accounts context โ€” a signer submits the transaction. +/// Minimal accounts context - a signer submits the transaction. /// The instructions just process instruction data (no onchain state). #[derive(Accounts)] pub struct CarnivalContext { diff --git a/basics/repository-layout/quasar/src/instructions/get_on_ride.rs b/basics/repository-layout/quasar/src/instructions/get_on_ride.rs index 66b85c5e..a817e63c 100644 --- a/basics/repository-layout/quasar/src/instructions/get_on_ride.rs +++ b/basics/repository-layout/quasar/src/instructions/get_on_ride.rs @@ -3,7 +3,7 @@ use quasar_lang::prelude::*; use crate::state::ride; /// Validate rider requirements and log the result. -/// Quasar's `log()` takes &str โ€” no format! in no_std โ€” so we use static +/// Quasar's `log()` takes &str - no format! in no_std - so we use static /// messages matching the Anchor version's logic without string interpolation. pub fn get_on_ride( _name: &str, diff --git a/basics/transfer-sol/README.md b/basics/transfer-sol/README.md index 9378106e..1d9da7b0 100644 --- a/basics/transfer-sol/README.md +++ b/basics/transfer-sol/README.md @@ -2,4 +2,4 @@ A simple example of transferring SOL between two system [accounts](https://solana.com/docs/terminology#account). SOL can be transferred between many kinds of accounts, not just system accounts (accounts owned by the System Program). -The tests generate a fresh keypair for both the `native` and `anchor` versions. Transferring SOL to the new keypair's address initializes it as a default system account โ€” hence the `/// CHECK` annotation above it in the [Anchor](https://solana.com/docs/terminology#anchor) example. +The tests generate a fresh keypair for both the `native` and `anchor` versions. Transferring SOL to the new keypair's address initializes it as a default system account - hence the `/// CHECK` annotation above it in the [Anchor](https://solana.com/docs/terminology#anchor) example. diff --git a/basics/transfer-sol/anchor/Anchor.toml b/basics/transfer-sol/anchor/Anchor.toml index 7a4567ac..ebd9018e 100644 --- a/basics/transfer-sol/anchor/Anchor.toml +++ b/basics/transfer-sol/anchor/Anchor.toml @@ -6,8 +6,6 @@ seeds = false [programs.localnet] transfer_sol = "4fQVnLWKKKYxtxgGn7Haw8v2g2Hzbu8K61JvWKvqAi7W" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/basics/transfer-sol/quasar/Cargo.toml b/basics/transfer-sol/quasar/Cargo.toml index f7a42e5f..069c8b8d 100644 --- a/basics/transfer-sol/quasar/Cargo.toml +++ b/basics/transfer-sol/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-transfer-sol" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/compression/cnft-burn/anchor/Anchor.toml b/compression/cnft-burn/anchor/Anchor.toml index 94dbfdfb..a9b147ae 100644 --- a/compression/cnft-burn/anchor/Anchor.toml +++ b/compression/cnft-burn/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] cnft_burn = "C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/compression/cnft-burn/anchor/README.md b/compression/cnft-burn/anchor/README.md index 715afc8d..d0fabdd4 100644 --- a/compression/cnft-burn/anchor/README.md +++ b/compression/cnft-burn/anchor/README.md @@ -4,14 +4,21 @@ An [Anchor](https://solana.com/docs/terminology#anchor) [program](https://solana ## Components -- `programs/cnft-burn/` โ€” the Anchor program. -- `migrations/` โ€” deployment script. +- `programs/cnft-burn/` - the Anchor program. +- `migrations/` - deployment script. -There is no `tests/` directory in this example today. The program is intended to be deployed and exercised against a real cluster. +## Testing + +A Rust [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) integration suite lives in `programs/cnft-burn/tests/`. It loads mainnet-dumped fixture binaries for Bubblegum, SPL Account Compression, and SPL Noop from `tests/fixtures/` (see the README there), so the CPIs run against the real programs in-process. + +```bash +cargo build-sbf +cargo test +``` ## Deployment -The program ID declared in [`programs/cnft-burn/src/lib.rs`](programs/cnft-burn/src/lib.rs) is `C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv`. Whether this address is currently deployed on any cluster is not tracked in this repo โ€” verify with `solana program show ` against the cluster you care about. +The program ID declared in [`programs/cnft-burn/src/lib.rs`](programs/cnft-burn/src/lib.rs) is `C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv`. Whether this address is currently deployed on any cluster is not tracked in this repo - verify with `solana program show ` against the cluster you care about. To deploy your own copy, change the program ID in `lib.rs` and `Anchor.toml`, then run `anchor build && anchor deploy`. diff --git a/compression/cnft-burn/anchor/migrations/deploy.ts b/compression/cnft-burn/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/compression/cnft-burn/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/compression/cnft-burn/anchor/programs/cnft-burn/tests/test_burn.rs b/compression/cnft-burn/anchor/programs/cnft-burn/tests/test_burn.rs index 21abbcbf..a2ece44d 100644 --- a/compression/cnft-burn/anchor/programs/cnft-burn/tests/test_burn.rs +++ b/compression/cnft-burn/anchor/programs/cnft-burn/tests/test_burn.rs @@ -8,7 +8,7 @@ //! 3. Mint a single cNFT to `leaf_owner` via `mint_v1`. //! 4. Recompute `data_hash` / `creator_hash` exactly as Bubblegum does. //! 5. Build the Merkle proof for leaf 0 (all empty-node siblings) and read -//! the current root from the on-chain tree account. +//! the current root from the onchain tree account. //! 6. Call our program's `burn_cnft`, signed by `leaf_owner`, and assert the //! transaction succeeds and a second burn fails (leaf already zeroed). @@ -75,8 +75,8 @@ struct MetadataArgs { is_mutable: bool, edition_nonce: Option, token_standard: Option, // TokenStandard enum, encoded by variant index - collection: Option, // None โ€” Collection, kept absent - uses: Option, // None โ€” Uses, kept absent + collection: Option, // None - Collection, kept absent + uses: Option, // None - Uses, kept absent token_program_version: TokenProgramVersion, creators: Vec, } @@ -125,7 +125,7 @@ fn burn_cnft_disc() -> [u8; 8] { out } -// Minimal SHA-256 (FIPS 180-4) โ€” only used to derive the Anchor discriminator. +// Minimal SHA-256 (FIPS 180-4) - only used to derive the Anchor discriminator. fn sha256(input: &[u8]) -> [u8; 32] { const K: [u32; 64] = [ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, @@ -392,7 +392,7 @@ fn test_burn_cnft() { // Proof for leaf index 0 in an otherwise-empty tree: empty-node siblings. let proof = [empty_node(0), empty_node(1), empty_node(2)]; - // Read the current root from the on-chain tree account. + // Read the current root from the onchain tree account. let tree_data = svm.get_account(&merkle_tree.pubkey()).unwrap().data; let root = read_current_root(&tree_data); diff --git a/compression/cnft-burn/anchor/tests/fixtures/README.md b/compression/cnft-burn/anchor/tests/fixtures/README.md index 6e1ab7d3..a10fd95b 100644 --- a/compression/cnft-burn/anchor/tests/fixtures/README.md +++ b/compression/cnft-burn/anchor/tests/fixtures/README.md @@ -1,9 +1,9 @@ -# Test fixtures โ€” mainnet program binaries +# Test fixtures - mainnet program binaries -These `.so` files are the compiled on-chain programs the cNFT-burn test CPIs +These `.so` files are the compiled onchain programs the cNFT-burn test CPIs into, dumped from Solana **mainnet-beta** so [LiteSVM](https://github.com/LiteSVM/litesvm) -can load them locally (LiteSVM only bundles System/Token/Token-2022/ATA). They -are the real programs โ€” not modified โ€” so accounts they create/verify behave +can load them locally (LiteSVM only bundles System/Token/Token Extensions/ATA). They +are the real programs - not modified - so accounts they create/verify behave exactly as on mainnet. | File | Program | Program ID | Source | Dumped (UTC) | Slot | diff --git a/compression/cnft-burn/quasar/Cargo.toml b/compression/cnft-burn/quasar/Cargo.toml index 497e22f2..b4d5fb98 100644 --- a/compression/cnft-burn/quasar/Cargo.toml +++ b/compression/cnft-burn/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-cnft-burn" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] @@ -23,7 +23,7 @@ debug = [] [dependencies] quasar-lang = { git = "https://github.com/blueshift-gg/quasar" } -# Direct dependency for invoke_with_bounds โ€” needed for raw CPI with variable +# Direct dependency for invoke_with_bounds - needed for raw CPI with variable # proof accounts. quasar-lang re-exports types but not the invoke functions. solana-instruction-view = { version = "2", features = ["cpi"] } solana-instruction = { version = "3.2.0" } diff --git a/compression/cnft-burn/quasar/README.md b/compression/cnft-burn/quasar/README.md index 97bd2e3a..edcc0506 100644 --- a/compression/cnft-burn/quasar/README.md +++ b/compression/cnft-burn/quasar/README.md @@ -21,13 +21,9 @@ Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://do ## Testing -In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): +This variant has no automated test suite yet: the instruction handlers CPI into external programs (Bubblegum, SPL Account Compression) and a QuasarSVM harness that loads those fixture binaries has not been written. `quasar build` verifies the program and CPI construction compile. -```bash -cargo test -``` - -Tests invoke instruction handlers and assert onchain state. No local validator. +The Anchor twin at `../anchor/` has a full LiteSVM integration suite that exercises the same flows against mainnet-dumped fixture programs; use it as the behavioural reference. ## Usage diff --git a/compression/cnft-burn/quasar/src/instructions/burn_cnft.rs b/compression/cnft-burn/quasar/src/instructions/burn_cnft.rs index 43c878d1..cf7ca87a 100644 --- a/compression/cnft-burn/quasar/src/instructions/burn_cnft.rs +++ b/compression/cnft-burn/quasar/src/instructions/burn_cnft.rs @@ -47,7 +47,7 @@ pub fn handle_burn_cnft(accounts: &mut BurnCnft, data: &[u8], remaining: Remaini // // `remaining.iter()` yields `Result` in newer // quasar-lang. Reach the inner `AccountView` via the unchecked accessor - // โ€” this CPI only reads proof addresses and views, never touching the + // - this CPI only reads proof addresses and views, never touching the // accounts' data, so the aliasing/borrow invariants are upheld. let placeholder = accounts.system_program.to_account_view().clone(); let mut proof_views: [AccountView; MAX_PROOF_NODES] = diff --git a/compression/cnft-burn/quasar/src/tests.rs b/compression/cnft-burn/quasar/src/tests.rs index 83435d50..0f15d10c 100644 --- a/compression/cnft-burn/quasar/src/tests.rs +++ b/compression/cnft-burn/quasar/src/tests.rs @@ -1,3 +1,5 @@ -// Compressed NFT operations require external programs (Bubblegum, SPL Account -// Compression) that are not available in the quasar-svm test harness. The build -// itself verifies the CPI instruction construction compiles correctly. +// No tests yet: the instruction handlers CPI into external programs +// (Bubblegum, SPL Account Compression) and a QuasarSVM harness that loads +// those fixture binaries has not been written. The Anchor twin's LiteSVM +// suite covers the same flows. TODO: port that suite to QuasarSVM using +// the fixture .so files under ../anchor/tests/fixtures/. diff --git a/compression/cnft-vault/anchor/Anchor.toml b/compression/cnft-vault/anchor/Anchor.toml index bfb853e3..13d4b4e8 100644 --- a/compression/cnft-vault/anchor/Anchor.toml +++ b/compression/cnft-vault/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] cnft_vault = "Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/compression/cnft-vault/anchor/README.md b/compression/cnft-vault/anchor/README.md index 687cb0a3..86066aa1 100644 --- a/compression/cnft-vault/anchor/README.md +++ b/compression/cnft-vault/anchor/README.md @@ -13,19 +13,26 @@ Use this as a reference for working with cNFTs in your own programs. ## Components -- `programs/cnft-vault/` โ€” the Anchor program. +- `programs/cnft-vault/` - the Anchor program. -There is no `tests/` directory in this example today. The program is intended to be deployed and exercised against a real cluster. +## Testing + +A Rust [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) integration suite lives in `programs/cnft-vault/tests/`. It loads mainnet-dumped fixture binaries for Bubblegum, SPL Account Compression, and SPL Noop from `tests/fixtures/` (see the README there), so the CPIs run against the real programs in-process. + +```bash +cargo build-sbf +cargo test +``` ## Deployment -The program ID declared in [`programs/cnft-vault/src/lib.rs`](programs/cnft-vault/src/lib.rs) is `Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D`. Whether this address is currently deployed on any cluster is not tracked in this repo โ€” verify with `solana program show ` against the cluster you care about. +The program ID declared in [`programs/cnft-vault/src/lib.rs`](programs/cnft-vault/src/lib.rs) is `Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D`. Whether this address is currently deployed on any cluster is not tracked in this repo - verify with `solana program show ` against the cluster you care about. To deploy your own copy, change the program ID in `lib.rs` and `Anchor.toml`, then run `anchor build && anchor deploy`. ## Limitations -This is a reference implementation. There's no authorization on withdraws โ€” anyone can withdraw any cNFT in the vault. It's not optimized for compute either. Treat it as a proof of concept. +This is a reference implementation. There's no authorization on withdraws - anyone can withdraw any cNFT in the vault. It's not optimized for compute either. Treat it as a proof of concept. ## Further resources diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs b/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs index a089e891..2b1da953 100644 --- a/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs +++ b/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs @@ -9,7 +9,7 @@ //! holds it) via `mint_v1`. //! 4. Recompute `data_hash` / `creator_hash` exactly as Bubblegum does. //! 5. Build the Merkle proof for leaf 0 (all empty-node siblings) and read -//! the current root from the on-chain tree account. +//! the current root from the onchain tree account. //! 6. Call our program's `withdraw_cnft`, which CPIs Bubblegum `Transfer` //! signed by the vault PDA (`invoke_signed`), to move the cNFT to a //! recipient. Assert the transaction succeeds and that a second withdraw @@ -73,8 +73,8 @@ struct MetadataArgs { is_mutable: bool, edition_nonce: Option, token_standard: Option, // TokenStandard enum, encoded by variant index - collection: Option, // None โ€” Collection, kept absent - uses: Option, // None โ€” Uses, kept absent + collection: Option, // None - Collection, kept absent + uses: Option, // None - Uses, kept absent token_program_version: TokenProgramVersion, creators: Vec, } @@ -123,7 +123,7 @@ fn withdraw_cnft_disc() -> [u8; 8] { out } -// Minimal SHA-256 (FIPS 180-4) โ€” only used to derive the Anchor discriminator. +// Minimal SHA-256 (FIPS 180-4) - only used to derive the Anchor discriminator. fn sha256(input: &[u8]) -> [u8; 32] { const K: [u32; 64] = [ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, @@ -363,7 +363,7 @@ fn test_withdraw_cnft() { creators: vec![creator.clone()], }; - // mint_v1 โ€” leaf_owner and leaf_delegate are the vault PDA. + // mint_v1 - leaf_owner and leaf_delegate are the vault PDA. let mint_ix = Instruction { program_id: BUBBLEGUM_ID, accounts: vec![ @@ -392,7 +392,7 @@ fn test_withdraw_cnft() { // Proof for leaf index 0 in an otherwise-empty tree: empty-node siblings. let proof = [empty_node(0), empty_node(1), empty_node(2)]; - // Read the current root from the on-chain tree account. + // Read the current root from the onchain tree account. let tree_data = svm.get_account(&merkle_tree.pubkey()).unwrap().data; let root = read_current_root(&tree_data); diff --git a/compression/cnft-vault/anchor/tests/fixtures/README.md b/compression/cnft-vault/anchor/tests/fixtures/README.md index 6e1ab7d3..2af152e3 100644 --- a/compression/cnft-vault/anchor/tests/fixtures/README.md +++ b/compression/cnft-vault/anchor/tests/fixtures/README.md @@ -1,9 +1,9 @@ -# Test fixtures โ€” mainnet program binaries +# Test fixtures - mainnet program binaries -These `.so` files are the compiled on-chain programs the cNFT-burn test CPIs +These `.so` files are the compiled onchain programs the cNFT-vault test CPIs into, dumped from Solana **mainnet-beta** so [LiteSVM](https://github.com/LiteSVM/litesvm) -can load them locally (LiteSVM only bundles System/Token/Token-2022/ATA). They -are the real programs โ€” not modified โ€” so accounts they create/verify behave +can load them locally (LiteSVM only bundles System/Token/Token Extensions/ATA). They +are the real programs - not modified - so accounts they create/verify behave exactly as on mainnet. | File | Program | Program ID | Source | Dumped (UTC) | Slot | diff --git a/compression/cnft-vault/quasar/Cargo.toml b/compression/cnft-vault/quasar/Cargo.toml index bd5cb17a..9c3b449f 100644 --- a/compression/cnft-vault/quasar/Cargo.toml +++ b/compression/cnft-vault/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-cnft-vault" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] @@ -23,7 +23,7 @@ debug = [] [dependencies] quasar-lang = { git = "https://github.com/blueshift-gg/quasar" } -# Direct dependency for invoke_signed_with_bounds โ€” needed for raw CPI with +# Direct dependency for invoke_signed_with_bounds - needed for raw CPI with # variable proof accounts. quasar-lang re-exports types but not the invoke fns. solana-instruction-view = { version = "2", features = ["cpi"] } solana-instruction = { version = "3.2.0" } diff --git a/compression/cnft-vault/quasar/README.md b/compression/cnft-vault/quasar/README.md index 2d3fdd4d..6f267f04 100644 --- a/compression/cnft-vault/quasar/README.md +++ b/compression/cnft-vault/quasar/README.md @@ -21,13 +21,9 @@ Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://do ## Testing -In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): +This variant has no automated test suite yet: the instruction handlers CPI into external programs (Bubblegum, SPL Account Compression) and a QuasarSVM harness that loads those fixture binaries has not been written. `quasar build` verifies the program and CPI construction compile. -```bash -cargo test -``` - -Tests invoke instruction handlers and assert onchain state. No local validator. +The Anchor twin at `../anchor/` has a full LiteSVM integration suite that exercises the same flows against mainnet-dumped fixture programs; use it as the behavioural reference. ## Usage diff --git a/compression/cnft-vault/quasar/src/instructions/withdraw.rs b/compression/cnft-vault/quasar/src/instructions/withdraw.rs index 82d61bd7..3f106626 100644 --- a/compression/cnft-vault/quasar/src/instructions/withdraw.rs +++ b/compression/cnft-vault/quasar/src/instructions/withdraw.rs @@ -16,7 +16,7 @@ pub struct Withdraw { /// Tree authority PDA (seeds checked by Bubblegum). #[account(mut)] pub tree_authority: UncheckedAccount, - /// Vault PDA that owns the cNFT โ€” signs the transfer via invoke_signed. + /// Vault PDA that owns the cNFT - signs the transfer via invoke_signed. #[account(address = crate::VaultPda::seeds())] pub leaf_owner: UncheckedAccount, /// New owner to receive the cNFT. @@ -54,7 +54,7 @@ pub fn handle_withdraw_cnft(accounts: &mut Withdraw, data: &[u8], remaining: Rem // // `remaining.iter()` yields `Result` in newer // quasar-lang. Reach the inner `AccountView` via the unchecked accessor - // โ€” we only read addresses/views to forward to the bubblegum CPI as + // - we only read addresses/views to forward to the bubblegum CPI as // proof nodes; no aliased data access. let placeholder = accounts.system_program.to_account_view().clone(); let mut proof_views: [AccountView; MAX_PROOF_NODES] = diff --git a/compression/cnft-vault/quasar/src/instructions/withdraw_two.rs b/compression/cnft-vault/quasar/src/instructions/withdraw_two.rs index 9d4be645..98603de6 100644 --- a/compression/cnft-vault/quasar/src/instructions/withdraw_two.rs +++ b/compression/cnft-vault/quasar/src/instructions/withdraw_two.rs @@ -17,7 +17,7 @@ pub struct WithdrawTwo { /// Tree authority PDA for tree 1. #[account(mut)] pub tree_authority1: UncheckedAccount, - /// Vault PDA that owns the cNFTs โ€” signs both transfers. + /// Vault PDA that owns the cNFTs - signs both transfers. #[account(address = crate::VaultPda::seeds())] pub leaf_owner: UncheckedAccount, /// Recipient for cNFT 1. @@ -55,7 +55,7 @@ pub fn handle_withdraw_two_cnfts(accounts: &mut WithdrawTwo, data: &[u8], remain let args1 = &data[0..TRANSFER_ARGS_LEN]; let proof_1_length = data[TRANSFER_ARGS_LEN] as usize; let args2 = &data[TRANSFER_ARGS_LEN + 1..TRANSFER_ARGS_LEN * 2 + 1]; - // _proof_2_length at data[217] โ€” not needed, remaining after proof1 is proof2 + // _proof_2_length at data[217] - not needed, remaining after proof1 is proof2 // PDA signer seeds let bump_bytes = [leaf_owner_bump]; @@ -69,7 +69,7 @@ pub fn handle_withdraw_two_cnfts(accounts: &mut WithdrawTwo, data: &[u8], remain // // `remaining.iter()` yields `Result` in newer // quasar-lang. Reach the inner `AccountView` via the unchecked accessor - // โ€” we only read addresses/views to forward to the bubblegum CPIs as + // - we only read addresses/views to forward to the bubblegum CPIs as // proof nodes; no aliased data access. let placeholder = accounts.system_program.to_account_view().clone(); let mut all_proofs: [AccountView; MAX_PROOF_NODES * 2] = diff --git a/compression/cnft-vault/quasar/src/lib.rs b/compression/cnft-vault/quasar/src/lib.rs index 5bc921ff..9d4f5052 100644 --- a/compression/cnft-vault/quasar/src/lib.rs +++ b/compression/cnft-vault/quasar/src/lib.rs @@ -26,9 +26,9 @@ const SPL_ACCOUNT_COMPRESSION_ID: Address = Address::new_from_array([ declare_id!("Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D"); -/// Marker carrying the seeds for the vault PDA. Used by the new -/// `address = VaultPda::seeds()` derive form (post-PR-#195) since -/// inline `seeds = [...]` is no longer accepted. +/// Marker carrying the seeds for the vault PDA. Used by the +/// `address = VaultPda::seeds()` derive form; Quasar does not accept +/// inline `seeds = [...]` here. #[derive(Seeds)] #[seeds(b"cNFT-vault")] pub struct VaultPda; diff --git a/compression/cnft-vault/quasar/src/tests.rs b/compression/cnft-vault/quasar/src/tests.rs index 83435d50..0f15d10c 100644 --- a/compression/cnft-vault/quasar/src/tests.rs +++ b/compression/cnft-vault/quasar/src/tests.rs @@ -1,3 +1,5 @@ -// Compressed NFT operations require external programs (Bubblegum, SPL Account -// Compression) that are not available in the quasar-svm test harness. The build -// itself verifies the CPI instruction construction compiles correctly. +// No tests yet: the instruction handlers CPI into external programs +// (Bubblegum, SPL Account Compression) and a QuasarSVM harness that loads +// those fixture binaries has not been written. The Anchor twin's LiteSVM +// suite covers the same flows. TODO: port that suite to QuasarSVM using +// the fixture .so files under ../anchor/tests/fixtures/. diff --git a/compression/cutils/anchor/Anchor.toml b/compression/cutils/anchor/Anchor.toml index 0d2e1b66..9bcb1fd2 100644 --- a/compression/cutils/anchor/Anchor.toml +++ b/compression/cutils/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] cutils = "BuFyrgRYzg2nPhqYrxZ7d9uYUs4VXtxH71U8EcoAfTQZ" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/compression/cutils/anchor/README.md b/compression/cutils/anchor/README.md index 7fe7e594..9a8330a3 100644 --- a/compression/cutils/anchor/README.md +++ b/compression/cutils/anchor/README.md @@ -4,20 +4,27 @@ Example code for working with Metaplex compressed NFTs (cNFTs) inside Solana [An This program shows how to add custom logic around the Bubblegum [mint](https://solana.com/docs/terminology#token-mint) via [CPI](https://solana.com/docs/terminology#cross-program-invocation-cpi). Two handlers: -1. `mint` โ€” mints a cNFT to your collection by CPI'ing Bubblegum. You can also initialize your own program-specific [PDA](https://solana.com/docs/terminology#program-derived-address-pda) in this handler. -2. `verify` โ€” verifies that the owner of a given cNFT actually invoked the [instruction](https://solana.com/docs/terminology#instruction). Useful as a building block for permissioned cNFT-gated logic. +1. `mint` - mints a cNFT to your collection by CPI'ing Bubblegum. You can also initialize your own program-specific [PDA](https://solana.com/docs/terminology#program-derived-address-pda) in this handler. +2. `verify` - verifies that the owner of a given cNFT actually invoked the [instruction](https://solana.com/docs/terminology#instruction). Useful as a building block for permissioned cNFT-gated logic. Use this as a reference for working with cNFTs in your own programs. ## Components -- `programs/cutils/` โ€” the Anchor program. The setup uses a `validate`/`actuate` pattern via Anchor's `access_control` macro; this pairs well with the cNFT verification logic. +- `programs/cutils/` - the Anchor program. The setup uses a `validate`/`actuate` pattern via Anchor's `access_control` macro; this pairs well with the cNFT verification logic. -There is no `tests/` directory in this example today. The program is intended to be deployed and exercised against a real cluster. +## Testing + +A Rust [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) integration suite lives in `programs/cutils/tests/`. It loads mainnet-dumped fixture binaries for Bubblegum, SPL Account Compression, and SPL Noop from `tests/fixtures/` (see the README there), so the CPIs run against the real programs in-process. + +```bash +cargo build-sbf +cargo test +``` ## Deployment -The program ID declared in [`programs/cutils/src/lib.rs`](programs/cutils/src/lib.rs) is `BuFyrgRYzg2nPhqYrxZ7d9uYUs4VXtxH71U8EcoAfTQZ`. Whether this address is currently deployed on any cluster is not tracked in this repo โ€” verify with `solana program show ` against the cluster you care about. +The program ID declared in [`programs/cutils/src/lib.rs`](programs/cutils/src/lib.rs) is `BuFyrgRYzg2nPhqYrxZ7d9uYUs4VXtxH71U8EcoAfTQZ`. Whether this address is currently deployed on any cluster is not tracked in this repo - verify with `solana program show ` against the cluster you care about. To deploy your own copy, change the program ID in `lib.rs` and `Anchor.toml`, then run `anchor build && anchor deploy`. diff --git a/compression/cutils/anchor/programs/cutils/src/instructions/mint.rs b/compression/cutils/anchor/programs/cutils/src/instructions/mint.rs index 338539bc..45adeb64 100644 --- a/compression/cutils/anchor/programs/cutils/src/instructions/mint.rs +++ b/compression/cutils/anchor/programs/cutils/src/instructions/mint.rs @@ -134,7 +134,7 @@ impl Mint<'_> { context.accounts.collection_authority.key(), true, )); - // collection_authority_record_pda โ€” pass as-is + // collection_authority_record_pda - pass as-is accounts.push(AccountMeta::new_readonly( context.accounts.collection_authority_record_pda.key(), false, diff --git a/compression/cutils/anchor/programs/cutils/tests/test_cutils.rs b/compression/cutils/anchor/programs/cutils/tests/test_cutils.rs index e7a23055..36be2b73 100644 --- a/compression/cutils/anchor/programs/cutils/tests/test_cutils.rs +++ b/compression/cutils/anchor/programs/cutils/tests/test_cutils.rs @@ -1,9 +1,9 @@ //! LiteSVM integration test for the `cutils` Anchor program. //! //! The cutils program exposes two instructions: -//! * `mint` โ€” CPIs Bubblegum `MintToCollectionV1` to mint a cNFT into a +//! * `mint` - CPIs Bubblegum `MintToCollectionV1` to mint a cNFT into a //! (Token-Metadata) verified collection and a Bubblegum tree. -//! * `verify` โ€” recomputes the V1 leaf hash and CPIs SPL account-compression +//! * `verify` - recomputes the V1 leaf hash and CPIs SPL account-compression //! `verify_leaf` to prove the leaf is present in the tree. //! //! Full flow exercised here: @@ -21,7 +21,7 @@ //! them for the minted leaf (note: after MintToCollectionV1 the collection //! is stored *verified*, so the data_hash reflects `verified = true`). //! 6. Build the Merkle proof for leaf 0 (all empty-node siblings), read the -//! live root from the on-chain tree account, and call cutils `verify`, +//! live root from the onchain tree account, and call cutils `verify`, //! asserting success. A second `verify` with a tampered data_hash must //! fail. @@ -98,7 +98,7 @@ struct MetadataArgs { edition_nonce: Option, token_standard: Option, // TokenStandard, variant index (NonFungible = 0) collection: Option, - uses: Option, // None โ€” Uses, kept absent + uses: Option, // None - Uses, kept absent token_program_version: TokenProgramVersion, creators: Vec, } @@ -169,7 +169,7 @@ fn anchor_disc(name: &str) -> [u8; 8] { out } -// Minimal SHA-256 (FIPS 180-4) โ€” used only to derive Anchor discriminators, +// Minimal SHA-256 (FIPS 180-4) - used only to derive Anchor discriminators, // avoiding a crypto crate that conflicts with the program's solana version. fn sha256(input: &[u8]) -> [u8; 32] { const K: [u32; 64] = [ @@ -646,12 +646,12 @@ fn test_cutils_mint_and_verify() { // Proof for leaf index 0 in an otherwise-empty tree: empty-node siblings. let proof = [empty_node(0), empty_node(1), empty_node(2)]; - // Read the live root from the on-chain tree account. + // Read the live root from the onchain tree account. let tree_data = svm.get_account(&merkle_tree.pubkey()).unwrap().data; let root = read_current_root(&tree_data); // Sanity: the leaf we computed must equal what the program will recompute, - // and the proof must rebuild the on-chain root. + // and the proof must rebuild the onchain root. let asset_id = get_asset_id(&merkle_tree.pubkey(), 0); let leaf = leaf_schema_v1_hash( &asset_id, @@ -673,7 +673,7 @@ fn test_cutils_mint_and_verify() { } assert_eq!( node, root, - "locally recomputed root must match the on-chain tree root" + "locally recomputed root must match the onchain tree root" ); // ---- Call cutils `verify` ---------------------------------------------- diff --git a/compression/cutils/anchor/tests/fixtures/README.md b/compression/cutils/anchor/tests/fixtures/README.md index e516b6a9..0c41f712 100644 --- a/compression/cutils/anchor/tests/fixtures/README.md +++ b/compression/cutils/anchor/tests/fixtures/README.md @@ -1,9 +1,9 @@ -# Test fixtures โ€” mainnet program binaries +# Test fixtures - mainnet program binaries -These `.so` files are the compiled on-chain programs the cutils test CPIs +These `.so` files are the compiled onchain programs the cutils test CPIs into, dumped from Solana **mainnet-beta** so [LiteSVM](https://github.com/LiteSVM/litesvm) -can load them locally (LiteSVM only bundles System/Token/Token-2022/ATA). They -are the real programs โ€” not modified โ€” so accounts they create/verify behave +can load them locally (LiteSVM only bundles System/Token/Token Extensions/ATA). They +are the real programs - not modified - so accounts they create/verify behave exactly as on mainnet. `mpl_token_metadata.so` is required because the cutils `mint` instruction CPIs diff --git a/compression/cutils/quasar/Cargo.toml b/compression/cutils/quasar/Cargo.toml index 16379e00..94384e5a 100644 --- a/compression/cutils/quasar/Cargo.toml +++ b/compression/cutils/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-cutils" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] @@ -23,7 +23,7 @@ debug = [] [dependencies] quasar-lang = { git = "https://github.com/blueshift-gg/quasar" } -# Direct dependency for invoke_with_bounds โ€” raw CPI with variable proof accounts. +# Direct dependency for invoke_with_bounds - raw CPI with variable proof accounts. solana-instruction-view = { version = "2", features = ["cpi"] } solana-instruction = { version = "3.2.0" } diff --git a/compression/cutils/quasar/README.md b/compression/cutils/quasar/README.md index 9c30e4c5..51ac12c5 100644 --- a/compression/cutils/quasar/README.md +++ b/compression/cutils/quasar/README.md @@ -21,13 +21,9 @@ Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://do ## Testing -In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): +This variant has no automated test suite yet: the instruction handlers CPI into external programs (Bubblegum, SPL Account Compression) and a QuasarSVM harness that loads those fixture binaries has not been written. `quasar build` verifies the program and CPI construction compile. -```bash -cargo test -``` - -Tests invoke instruction handlers and assert onchain state. No local validator. +The Anchor twin at `../anchor/` has a full LiteSVM integration suite that exercises the same flows against mainnet-dumped fixture programs; use it as the behavioural reference. ## Usage diff --git a/compression/cutils/quasar/src/instructions/verify.rs b/compression/cutils/quasar/src/instructions/verify.rs index 2034d4ec..c6051b38 100644 --- a/compression/cutils/quasar/src/instructions/verify.rs +++ b/compression/cutils/quasar/src/instructions/verify.rs @@ -59,7 +59,7 @@ pub fn handle_verify(accounts: &mut Verify, data: &[u8], remaining: RemainingAcc // // `remaining.iter()` yields `Result` in newer // quasar-lang. Reach the inner `AccountView` via the unchecked accessor - // โ€” we only read addresses/views to forward to the compression CPI as + // - we only read addresses/views to forward to the compression CPI as // proof nodes; no aliased data access. let placeholder = accounts.compression_program.to_account_view().clone(); let mut proof_views: [AccountView; MAX_PROOF_NODES] = diff --git a/compression/cutils/quasar/src/tests.rs b/compression/cutils/quasar/src/tests.rs index 83435d50..0f15d10c 100644 --- a/compression/cutils/quasar/src/tests.rs +++ b/compression/cutils/quasar/src/tests.rs @@ -1,3 +1,5 @@ -// Compressed NFT operations require external programs (Bubblegum, SPL Account -// Compression) that are not available in the quasar-svm test harness. The build -// itself verifies the CPI instruction construction compiles correctly. +// No tests yet: the instruction handlers CPI into external programs +// (Bubblegum, SPL Account Compression) and a QuasarSVM harness that loads +// those fixture binaries has not been written. The Anchor twin's LiteSVM +// suite covers the same flows. TODO: port that suite to QuasarSVM using +// the fixture .so files under ../anchor/tests/fixtures/. diff --git a/finance/escrow/anchor/.mocharc.json b/finance/escrow/anchor/.mocharc.json deleted file mode 100644 index 13a83f47..00000000 --- a/finance/escrow/anchor/.mocharc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extension": ["ts"], - "spec": "tests/**/*.ts", - "require": "ts-node/register", - "node-option": ["experimental-specifier-resolution=node", "loader=ts-node/esm"] -} diff --git a/finance/escrow/anchor/Anchor.toml b/finance/escrow/anchor/Anchor.toml index 9901f5b9..865f3795 100644 --- a/finance/escrow/anchor/Anchor.toml +++ b/finance/escrow/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] escrow = "qbuMdeYxYJXBjU6C6qFKjZKjXmrU83eDQomHdrch826" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/finance/escrow/anchor/README.md b/finance/escrow/anchor/README.md index ef5ba5ef..8564beca 100644 --- a/finance/escrow/anchor/README.md +++ b/finance/escrow/anchor/README.md @@ -2,7 +2,7 @@ ## Introduction -This Solana [program](https://solana.com/docs/terminology#program) is an **escrow** โ€” it lets a user swap a specific amount of one token for a desired amount of another token. +This Solana [program](https://solana.com/docs/terminology#program) is an **escrow** - it lets a user swap a specific amount of one token for a desired amount of another token. For example: Alice offers 10 USDC and wants 100 WIF in return. @@ -20,12 +20,12 @@ Based on [Dean Little's Anchor Escrow](https://github.com/deanmlittle/anchor-esc ### Changes from the original -One challenge when teaching is avoiding ambiguity โ€” names have to be clear and not confused with anything else. +One challenge when teaching is avoiding ambiguity - names have to be clear and not confused with anything else. - Several custom handler functions were replaced by helpers from `@solana-developers/helpers` to reduce file size. - Shared token-transfer logic now lives in `instructions/shared.rs`. - The upstream project uses a custom file layout. This version uses the 'multiple files' [Anchor](https://solana.com/docs/terminology#anchor) layout. -- Contexts are separate data structures from the functions that use them. There's no need for OO-style `impl` patterns here โ€” no mutable state is stored in the context, and the methods don't mutate it. +- Contexts are separate data structures from the functions that use them. There's no need for OO-style `impl` patterns here - no mutable state is stored in the context, and the methods don't mutate it. - The name 'deposit' was overloaded. `deposit` is both a verb and a noun, which made the code hard to read: - deposit #1 โ†’ `token_a_offered_amount` - deposit #2 (in `make()`) โ†’ `send_offered_tokens_to_vault` diff --git a/finance/escrow/anchor/migrations/deploy.ts b/finance/escrow/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/finance/escrow/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/finance/escrow/anchor/register.js b/finance/escrow/anchor/register.js deleted file mode 100644 index b9c8afd2..00000000 --- a/finance/escrow/anchor/register.js +++ /dev/null @@ -1,4 +0,0 @@ -import { register } from "node:module"; -import { pathToFileURL } from "node:url"; - -register("ts-node/esm", pathToFileURL("./")); diff --git a/finance/escrow/quasar/Cargo.toml b/finance/escrow/quasar/Cargo.toml index de27742c..8056b58b 100644 --- a/finance/escrow/quasar/Cargo.toml +++ b/finance/escrow/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-escrow" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/finance/order-book/anchor/README.md b/finance/order-book/anchor/README.md index 0d1347ef..b06ee15a 100644 --- a/finance/order-book/anchor/README.md +++ b/finance/order-book/anchor/README.md @@ -1,6 +1,6 @@ -# Order Book โ€” Central Limit Order Book (CLOB) +# Order Book - Central Limit Order Book (CLOB) -This is an **[order book](https://www.investopedia.com/terms/o/order-book.asp)** โ€” specifically, a **[central limit order +This is an **[order book](https://www.investopedia.com/terms/o/order-book.asp)** - specifically, a **[central limit order book (CLOB)](https://www.investopedia.com/terms/o/order-book.asp)**, the standard piece of market infrastructure used by NYSE, NASDAQ, LSE, CME, and every major crypto venue. An Anchor program that runs an onchain order book for a single pair of token mints: @@ -20,7 +20,7 @@ are, skip to [Accounts and PDAs](#2-accounts-and-pdas) or - [A real-world walkthrough: NVDAx/USDC](#a-real-world-walkthrough-nvdaxusdc) 2. [Accounts and PDAs](#2-accounts-and-pdas) 3. [Instruction lifecycle walkthrough](#3-instruction-lifecycle-walkthrough) -4. [The matching engine โ€” step by step](#4-the-matching-engine--step-by-step) +4. [The matching engine - step by step](#4-the-matching-engine--step-by-step) - [Ensuring fast order matching performance](#ensuring-fast-order-matching-performance) 5. [Full-lifecycle worked examples](#5-full-lifecycle-worked-examples) 6. [Safety and edge cases](#6-safety-and-edge-cases) @@ -33,52 +33,52 @@ are, skip to [Accounts and PDAs](#2-accounts-and-pdas) or Two users want to swap tokens at prices they each picked: -- Alice holds **USDC** (the *[quote](https://www.investopedia.com/terms/q/quotecurrency.asp)* mint โ€” the pricing unit, the way USD +- Alice holds **USDC** (the *[quote](https://www.investopedia.com/terms/q/quotecurrency.asp)* mint - the pricing unit, the way USD is the pricing unit in "NVDAx is $950") and wants to buy **NVDAx** - (the *[base](https://www.investopedia.com/terms/b/basecurrency.asp)* mint โ€” the asset being priced), but only if she can + (the *[base](https://www.investopedia.com/terms/b/basecurrency.asp)* mint - the asset being priced), but only if she can get NVDAx at 900 USDC per share or lower. - Bob holds **NVDAx** and wants USDC, but only if he can get at least 950 USDC per NVDAx share he sells. -They post their offers โ€” Alice a *bid* (a buy offer at a limit price), -Bob an *ask* (a sell offer at a limit price) โ€” and wait. Alice's bid +They post their offers - Alice a *bid* (a buy offer at a limit price), +Bob an *ask* (a sell offer at a limit price) - and wait. Alice's bid sits on the book. Bob's ask sits on the book. Neither crosses the other, so nothing happens yet. Later, Carol shows up holding NVDAx and willing to sell at any price โ‰ฅ 900 USDC. She posts an ask at 900. Now Alice's bid (900 USDC) *crosses* -Carol's new ask (900 USDC) โ€” the bid is โ‰ฅ the ask. The program: +Carol's new ask (900 USDC) - the bid is โ‰ฅ the ask. The program: 1. Pairs them up. 2. Locks Carol's NVDAx in the program's base vault (Carol signed this transaction, so only her funds move). -3. Allocates Alice's USDC โ€” already sitting in the quote vault since - Alice placed her bid โ€” to Carol. +3. Allocates Alice's USDC - already sitting in the quote vault since + Alice placed her bid - to Carol. 4. Credits each party's unsettled balance with what they're owed, minus a fee for the market operator. Tokens don't leave the vaults yet; Alice and Carol each call `settle_funds` later to pull them out. -At no point does either of them transfer directly to the other โ€” all +At no point does either of them transfer directly to the other - all token flows go through two program-owned vaults, and both users later call `settle_funds` to pull their balances out. ### The onchain pieces, in plain terms -- A **Market** PDA โ€” one per base/quote pair. Stores fee rate, tick +- A **Market** PDA - one per base/quote pair. Stores fee rate, tick size, minimum order size, the addresses of the four related accounts (base vault, quote vault, fee vault, order book), and the pubkey that can withdraw accumulated fees. -- An **OrderBook** account โ€” two stores: bids sorted highest-first, +- An **OrderBook** account - two stores: bids sorted highest-first, asks sorted lowest-first, each holding up to 1024 entries. Rather than a plain list of orders, each side uses a depth-bounded tree (a - critbit trie) for fast lookup โ€” see [Ensuring fast order matching performance](#ensuring-fast-order-matching-performance). + critbit trie) for fast lookup - see [Ensuring fast order matching performance](#ensuring-fast-order-matching-performance). Each entry stores enough to drive matching (price, quantity, `order_id`); the full `Order` PDA holds the authoritative state. -- A **MarketUser** PDA โ€” one per `(market, wallet)` pair. Tracks the +- A **MarketUser** PDA - one per `(market, wallet)` pair. Tracks the order_ids this user has open and two running tallies (`unsettled_base`, `unsettled_quote`) of tokens owed back to this user from fills or cancellations. -- An **Order** PDA โ€” one per placed order. Stores price, quantity, +- An **Order** PDA - one per placed order. Stores price, quantity, side (bid or ask), fill status, and the owner. - Three token accounts held by the Market PDA: `base_vault` (all sellers' locked base + buyers' bought base waiting to be withdrawn), @@ -87,7 +87,7 @@ call `settle_funds` to pull their balances out. ### Finance background, briefly -For readers new to trading terms โ€” these are the same concepts every +For readers new to trading terms - these are the same concepts every equity, futures, and crypto exchange uses. They're optional; everything above describes the program mechanically. @@ -102,9 +102,9 @@ everything above describes the program mechanically. book on the ask side is the lowest-priced sell offer. - **A [maker](https://www.investopedia.com/terms/m/marketmaker.asp)** is whoever posts an order that doesn't immediately - match โ€” they "make" [liquidity](https://www.investopedia.com/terms/l/liquidity.asp) by leaving their offer on the book + match - they "make" [liquidity](https://www.investopedia.com/terms/l/liquidity.asp) by leaving their offer on the book for others to trade against. A **[taker](https://www.investopedia.com/terms/m/maker_taker.asp)** is whoever walks into the - book and hits the resting orders โ€” they "take" liquidity. + book and hits the resting orders - they "take" liquidity. - **A [taker fee](https://www.investopedia.com/terms/m/maker_taker.asp)** is a cut of each trade taken by the venue from the taker's leg of the trade, expressed in *[basis points](https://www.investopedia.com/terms/b/basispoint.asp)* (bps). One @@ -124,7 +124,7 @@ everything above describes the program mechanically. - **Not deployed, not audited.** Treat as a learning example, not production-ready code. -- **No [immediate-or-cancel](https://www.investopedia.com/terms/i/immediateorcancel.asp) (IOC), [fill-or-kill](https://www.investopedia.com/terms/f/fill-or-kill.asp) (FOK), or post-only orders** โ€” every +- **No [immediate-or-cancel](https://www.investopedia.com/terms/i/immediateorcancel.asp) (IOC), [fill-or-kill](https://www.investopedia.com/terms/f/fill-or-kill.asp) (FOK), or post-only orders** - every order matches what it can at the limit price and rests any remainder on the book. IOC would discard the remainder instead of resting it; FOK would reject the whole order unless it fills entirely; post-only @@ -139,7 +139,7 @@ being priced and the quote is the pricing unit. Bids spend quote and receive base; asks spend base and receive quote. **Limit price.** The worst price at which an order is allowed to -trade โ€” for a bid, the *highest* the buyer will pay; for an ask, the +trade - for a bid, the *highest* the buyer will pay; for an ask, the *lowest* the seller will accept. A bid at 900 won't fill against an ask at 950. @@ -152,7 +152,7 @@ Keeps dust orders from polluting the book. **Match / fill / cross.** Two orders *cross* when the bid's price is โ‰ฅ the ask's price; they *match* (are paired up) and a *fill* is the -result โ€” one crossing event with a fill quantity and a fill price. +result - one crossing event with a fill quantity and a fill price. One call to `place_order` can produce many fills. **[Price improvement](https://www.investopedia.com/terms/p/priceimprovement.asp).** When a taker's limit is better than the best @@ -167,7 +167,7 @@ tokens still sit in the market's vaults. `settle_funds` moves them to the user's own token accounts and zeroes the counters. **Fee vault.** A separate token account (quote mint) owned by the -Market PDA. Every taker fee โ€” `gross * fee_bps / 10_000` per fill โ€” +Market PDA. Every taker fee - `gross * fee_bps / 10_000` per fill - moves here in one batched CPI at the end of `place_order`. **Remaining accounts.** Solana lets the caller pass a tail of extra @@ -187,23 +187,23 @@ This section walks through a complete sequence of trades using four real partici | Token | What it is | Role on this market | |---|---|---| -| **NVDAx** | An onchain NVIDIA share (xStock). Its price tracks the underlying stock. | **Base asset** โ€” the thing being bought and sold | -| **USDC** | A stablecoin redeemable 1:1 for US dollars | **Quote asset** โ€” the currency used for pricing and payment | +| **NVDAx** | An onchain NVIDIA share (xStock). Its price tracks the underlying stock. | **Base asset** - the thing being bought and sold | +| **USDC** | A stablecoin redeemable 1:1 for US dollars | **Quote asset** - the currency used for pricing and payment | -A price of **960** means "960 USDC per NVDAx". The same program logic โ€” identical instruction handlers and account structure โ€” works for any other pair, such as **TSLAx/USDC** (Tesla xStock). +A price of **960** means "960 USDC per NVDAx". The same program logic - identical instruction handlers and account structure - works for any other pair, such as **TSLAx/USDC** (Tesla xStock). ### The participants | Name | Role | Motivation | |---|---|---| | **Maria** | Market authority | Earns 0.25 % ([25 basis points](https://www.investopedia.com/terms/b/basispoint.asp)) on every fill. Her revenue scales with market volume, so she wants a liquid, trusted venue. | -| **Alice** | Retail investor โ€” buyer | Bullish thesis: she expects NVDAx to rise from ~960 USDC to ~1 100 as demand for NVIDIA's AI chips grows. She wants to accumulate NVDAx at a good price before that move. | +| **Alice** | Retail investor - buyer | Bullish thesis: she expects NVDAx to rise from ~960 USDC to ~1 100 as demand for NVIDIA's AI chips grows. She wants to accumulate NVDAx at a good price before that move. | | **Bob** | [Market maker](https://www.investopedia.com/terms/m/marketmaker.asp) | No directional view on NVDAx. Profits from the [bid-ask spread](https://www.investopedia.com/terms/b/bid-askspread.asp): he simultaneously quotes a buy price (bid) below fair value and a sell price (ask) above it. If both sides fill, the difference is his gross revenue. He provides [liquidity](https://www.investopedia.com/terms/l/liquidity.asp) to the market in exchange for that spread. | -| **Carol** | Retail investor โ€” seller | Bought NVDAx at 800 USDC six months ago. It is now trading around 960. She wants to sell some to [realise her profit](https://www.investopedia.com/terms/r/realizedprofit.asp) in USDC. | +| **Carol** | Retail investor - seller | Bought NVDAx at 800 USDC six months ago. It is now trading around 960. She wants to sell some to [realise her profit](https://www.investopedia.com/terms/r/realizedprofit.asp) in USDC. | --- -### Step 1 โ€” Maria creates the market +### Step 1 - Maria creates the market **Instruction: `initialize_market(fee_basis_points=25, tick_size=1, min_order_size=1)`** **Key accounts: `base_mint = NVDAx`, `quote_mint = USDC`** @@ -222,11 +222,11 @@ Maria's wallet signs. Five accounts are created: --- -### Step 2 โ€” Alice, Bob, and Carol register as traders +### Step 2 - Alice, Bob, and Carol register as traders **Instruction: `create_market_user`** (called once by each trader) -Each call creates one `MarketUser` PDA โ€” a per-(trader, market) account that tracks their open orders and any tokens owed to them: +Each call creates one `MarketUser` PDA - a per-(trader, market) account that tracks their open orders and any tokens owed to them: | Account | Seeds | State after | |---|---|---| @@ -236,11 +236,11 @@ Each call creates one `MarketUser` PDA โ€” a per-(trader, market) account that t --- -### Step 3 โ€” Bob posts a sell offer (ask) at 965 USDC +### Step 3 - Bob posts a sell offer (ask) at 965 USDC -Bob estimates NVDAx fair value at 960 USDC. He quotes a 10-USDC spread โ€” ask at 965, bid at 955. He starts by posting the ask. +Bob estimates NVDAx fair value at 960 USDC. He quotes a 10-USDC spread - ask at 965, bid at 955. He starts by posting the ask. -**Instruction: `place_order(side=Ask, price=965, quantity=10)`** (no `remaining_accounts` โ€” book is empty) +**Instruction: `place_order(side=Ask, price=965, quantity=10)`** (no `remaining_accounts` - book is empty) **Token flow:** ``` @@ -264,7 +264,7 @@ bids [] --- -### Step 4 โ€” Alice places a buy offer (bid) at 950 USDC +### Step 4 - Alice places a buy offer (bid) at 950 USDC Alice places a [limit order](https://www.investopedia.com/terms/l/limitorder.asp): she will buy 5 NVDAx but pay no more than 950 USDC each. Her bid (950) does not cross Bob's ask (965), so nothing fills and her bid rests on the book. @@ -294,13 +294,13 @@ The [bid-ask spread](https://www.investopedia.com/terms/b/bid-askspread.asp) is --- -### Step 5 โ€” Carol sells into Alice's bid +### Step 5 - Carol sells into Alice's bid -Carol wants to sell 3 NVDAx. Alice is bidding 950 USDC โ€” above Carol's floor of 945. Carol sends an [ask](https://www.investopedia.com/terms/a/ask.asp) at 945 and passes Alice's resting order as a maker. +Carol wants to sell 3 NVDAx. Alice is bidding 950 USDC - above Carol's floor of 945. Carol sends an [ask](https://www.investopedia.com/terms/a/ask.asp) at 945 and passes Alice's resting order as a maker. **Instruction: `place_order(side=Ask, price=945, quantity=3, remaining_accounts=[alice_order_pda, alice_market_user_pda])`** -**Crossing check:** Carol's ask (945) โ‰ค Alice's bid (950) โœ“ โ€” the orders cross. Fill price = 950 (Alice's price โ€” the resting [maker](https://www.investopedia.com/terms/m/marketmaker.asp) always sets the execution price). Carol named 945 but receives 950 โ€” that is [price improvement](https://www.investopedia.com/terms/p/priceimprovement.asp). +**Crossing check:** Carol's ask (945) โ‰ค Alice's bid (950) โœ“ - the orders cross. Fill price = 950 (Alice's price - the resting [maker](https://www.investopedia.com/terms/m/marketmaker.asp) always sets the execution price). Carol named 945 but receives 950 - that is [price improvement](https://www.investopedia.com/terms/p/priceimprovement.asp). **Token flow (Carol's NVDAx locked up front):** ``` @@ -324,7 +324,7 @@ carol_nvdax_ata --[3 NVDAx]--> base_vault | `fee_vault` | +7 USDC (fee CPI from quote_vault) | | Alice's `Order` PDA (id=2) | `filled_quantity=3`, `status=PartiallyFilled` | | Alice's `MarketUser.unsettled_base` | +3 NVDAx | -| Alice's `MarketUser.open_orders` | `[2]` (still open โ€” 2 of 5 NVDAx remain) | +| Alice's `MarketUser.open_orders` | `[2]` (still open - 2 of 5 NVDAx remain) | | Carol's `MarketUser.unsettled_quote` | +2 843 USDC | | New Carol's `Order` PDA (id=3) | `side=Ask, price=945, qty=3, status=Filled` | | `OrderBook.bids` | Alice's leaf quantity: 5 โ†’ 2 | @@ -335,11 +335,11 @@ asks [(id=1, price=965, qty=10)] โ† Bob (untouched) bids [(id=2, price=950, qty=2)] โ† Alice (3 filled, 2 still resting) ``` -Alice has 3 NVDAx credited to her (tracked in `unsettled_base`). Carol has 2 993 USDC credited (tracked in `unsettled_quote`). Neither amount has left the vaults yet โ€” that happens on `settle_funds`. +Alice has 3 NVDAx credited to her (tracked in `unsettled_base`). Carol has 2 993 USDC credited (tracked in `unsettled_quote`). Neither amount has left the vaults yet - that happens on `settle_funds`. --- -### Step 6 โ€” Settlement: tokens move to wallets +### Step 6 - Settlement: tokens move to wallets [Settlement](https://www.investopedia.com/terms/s/settlement.asp) is when the program pays out what it owes. @@ -357,7 +357,7 @@ quote_vault --[2 843 USDC]--> carol_usdc_ata --- -### Step 7 โ€” Maria sweeps fees +### Step 7 - Maria sweeps fees **Maria calls `withdraw_fees`:** ``` @@ -373,8 +373,8 @@ fee_vault --[7 USDC]--> maria_usdc_ata |---|---|---|---| | **Alice** | 4 750 USDC (for 5 NVDAx) | 3 NVDAx + 1 900 USDC still in `quote_vault` (2-NVDAx bid resting at 950) | Thesis running; waiting for a seller at 950 to fill the rest | | **Carol** | 3 NVDAx (cost 800 each) | 2 843 USDC | Locked in โ‰ˆ 148 USDC/NVDAx profit net of fee | -| **Bob** | 10 NVDAx locked | Nothing yet โ€” ask at 965 unfilled | Earns the spread when a buyer at 965 arrives | -| **Maria** | โ€” | 7 USDC | Fee revenue | +| **Bob** | 10 NVDAx locked | Nothing yet - ask at 965 unfilled | Earns the spread when a buyer at 965 arrives | +| **Maria** | - | 7 USDC | Fee revenue | Alice's remaining 2-NVDAx [bid](https://www.investopedia.com/terms/b/bid.asp) stays on the book. The next seller willing to part with NVDAx at 950 or below will fill it automatically. A **TSLAx/USDC** market runs the same seven steps with different mint addresses. @@ -395,7 +395,7 @@ Alice's remaining 2-NVDAx [bid](https://www.investopedia.com/terms/b/bid.asp) st | Account | PDA? | Authority | Mint | Holds | |---|---|---|---|---| -| `base_vault` | no (regular token account) | Market PDA | base | bids' locked base IS NOT STORED HERE โ€” only asks' locked base sits here pre-match, plus base owed to bid-takers waiting for `settle_funds` | +| `base_vault` | no (regular token account) | Market PDA | base | bids' locked base IS NOT STORED HERE - only asks' locked base sits here pre-match, plus base owed to bid-takers waiting for `settle_funds` | | `quote_vault` | no | Market PDA | quote | bids' locked quote pre-match, plus quote owed to ask-takers and bid-makers waiting for settlement | | `fee_vault` | no | Market PDA | quote | taker fees accumulated across all fills; drained by `withdraw_fees` | @@ -473,7 +473,7 @@ Three reasons: 1. **Unsettled balances are per-market by definition.** Different markets use different `base_mint` / `quote_mint` pairs, so the scalar `unsettled_base` / `unsettled_quote` fields can't be - shared across markets โ€” they'd refer to different tokens. + shared across markets - they'd refer to different tokens. 2. **Open-order indexing is local to one book.** `open_orders` holds `order_id`s that index into a specific market's @@ -503,7 +503,7 @@ At any point in time: (Plus the bit of quote that the matching engine has already taken out as fee and batched into `fee_vault`.) -This is not a hard invariant the program enforces โ€” it emerges from +This is not a hard invariant the program enforces - it emerges from the flows. The invariant worth caring about is the per-event balance: every fill moves tokens from the loser's locked pool to the winner's `unsettled_*`, plus the fee cut to `fee_vault`. The unit tests check @@ -516,12 +516,12 @@ this directly (`settle_funds_after_match_pays_out_both_unsettled_balances`). The program has six instruction handlers. The order a user encounters them is: -1. `initialize_market` (market operator โ€” once) +1. `initialize_market` (market operator - once) 2. `create_market_user` (every user, once per market) -3. `place_order` (a user โ€” as many times as they want) -4. `cancel_order` (a user โ€” to remove a resting order) -5. `settle_funds` (a user โ€” to collect winnings) -6. `withdraw_fees` (market authority โ€” to collect protocol revenue) +3. `place_order` (a user - as many times as they want) +4. `cancel_order` (a user - to remove a resting order) +5. `settle_funds` (a user - to collect winnings) +6. `withdraw_fees` (market authority - to collect protocol revenue) For each, the shape is: who signs, what accounts go in, what PDAs get created, what token flows happen, what state mutates, what checks are @@ -552,10 +552,10 @@ pub fn initialize_market( **Accounts in:** -- `authority` (signer, mut โ€” pays account rent for all five new +- `authority` (signer, mut - pays account rent for all five new accounts) - `market` (PDA, **init**, seeds `["market", base_mint, quote_mint]`) -- `order_book` (not a PDA โ€” client calls `system_program::create_account` +- `order_book` (not a PDA - client calls `system_program::create_account` first, sized to `ORDER_BOOK_ACCOUNT_SIZE`; verified here with `#[account(zero)]`) - `base_mint`, `quote_mint` (read-only) @@ -576,7 +576,7 @@ the supplied parameters plus all the derived fields (`market.authority`, the vault pubkeys, `is_active = true`, `next_order_id = 1`). -The vaults are regular token accounts, *not* PDAs โ€” their +The vaults are regular token accounts, *not* PDAs - their addresses are chosen by the caller (typically fresh keypairs) and captured on the market's state so later instruction handlers can validate them. @@ -590,7 +590,7 @@ trade on. **Accounts in:** -- `owner` (signer, mut โ€” pays rent) +- `owner` (signer, mut - pays rent) - `market` (read-only) - `market_user` (PDA, **init**, seeds `["market_user", market, owner]`) - `system_program` @@ -625,7 +625,7 @@ pub fn place_order<'info>( `["order", market, next_order_id.to_le_bytes()]`) - `market_user` (mut, PDA seeds-checked) - `base_vault`, `quote_vault`, `fee_vault` (all mut, boxed) -- `user_base_account`, `user_quote_account` (mut โ€” the caller's ATAs) +- `user_base_account`, `user_quote_account` (mut - the caller's ATAs) - `base_mint`, `quote_mint` (read-only) - `owner` (signer, mut) - `token_program`, `system_program` @@ -698,14 +698,14 @@ always holds *exactly* what's needed to fulfil every open trading position plus every unsettled balance. **Token movements (during matching, per fill):** see -[ยง4. The matching engine โ€” step by step](#4-the-matching-engine--step-by-step). +[ยง4. The matching engine - step by step](#4-the-matching-engine--step-by-step). Summary: - For a taker bid crossing a resting ask at price `p`: ``` quote_vault --[p * fill_qty * fee_bps / 10_000]--> fee_vault (everything else stays in quote_vault as unsettled_quote for maker) - (base_vault provides the taker's base via unsettled_base โ€” the base + (base_vault provides the taker's base via unsettled_base - the base was pre-locked when the maker placed their ask) ``` @@ -714,7 +714,7 @@ Summary: quote_vault --[p * fill_qty * fee_bps / 10_000]--> fee_vault ``` -No user's ATA is touched during matching โ€” all movements happen +No user's ATA is touched during matching - all movements happen between vaults or inside `MarketUser` counters. Physical payouts wait for `settle_funds`. @@ -775,7 +775,7 @@ On the caller's new `order`: - `order.owner == owner.key()` โ†’ `Unauthorized` - `order.status โˆˆ {Open, PartiallyFilled}` โ†’ `OrderNotCancellable` - The order's `order_id` is present in `order_book` โ†’ `OrderNotFound` - (sanity โ€” shouldn't normally fire since fully-filled orders aren't + (sanity - shouldn't normally fire since fully-filled orders aren't cancellable) **Token movements:** none. Cancellation is an accounting-only step. @@ -804,7 +804,7 @@ zero, so it is safe to call on a heartbeat/cron. - `market` (mut) - `market_user` (mut) - `base_vault`, `quote_vault` (mut, boxed) -- `user_base_account`, `user_quote_account` (mut, boxed โ€” caller's +- `user_base_account`, `user_quote_account` (mut, boxed - caller's ATAs; caller must create them before calling) - `base_mint`, `quote_mint` (boxed, read-only) - `owner` (signer) @@ -846,7 +846,7 @@ double-withdraw. - `market` (mut, `has_one = fee_vault`) - `fee_vault` (mut, boxed) -- `authority_quote_account` (mut, boxed โ€” destination) +- `authority_quote_account` (mut, boxed - destination) - `quote_mint` (boxed) - `authority` (signer) - `token_program` @@ -870,19 +870,19 @@ zero as a side effect of the transfer). --- -## 4. The matching engine โ€” step by step +## 4. The matching engine - step by step This is the heart of the program. Everything in `place_order` after the initial fund lock is matching-engine work. Follow along with [`place_order.rs`](programs/order-book/src/instructions/place_order.rs) and -[`state/matching.rs`](programs/order-book/src/state/matching.rs) โ€” it'll +[`state/matching.rs`](programs/order-book/src/state/matching.rs) - it'll read more easily once you've gone through this section. ### Ensuring fast order matching performance The book must find the best-priced resting order on every `place_order` call. Storing orders in a plain list (`Vec`) would work at small -scale, but finding the best price requires scanning every entry โ€” in +scale, but finding the best price requires scanning every entry - in formal notation that's **O(n)**: double the number of open orders, double the work. @@ -894,7 +894,7 @@ instead of 1 024. The specific data structure used here is a [critbit tree](https://cr.yp.to/critbit.html) (short for *critical-bit -tree*) โ€” a compact binary radix trie where each internal node splits on +tree*) - a compact binary radix trie where each internal node splits on the first bit where two keys disagree. Unlike a self-balancing BST it never rotates or recolours nodes; its depth is instead bounded by the *bit width of the key* rather than the number of orders, so it stays @@ -909,7 +909,7 @@ example. 1. Caller passes `(side, price, quantity)` and, in remaining_accounts, the maker pairs to cross against. 2. The handler locks the required funds into the vault (done up - front, before any matching โ€” see ยง3.3). + front, before any matching - see ยง3.3). 3. **Plan the fills** (pure logic, no mutations): walk the opposite side of the book sorted by price (best price first). For each entry whose price @@ -932,7 +932,7 @@ example. `order_id` to the taker's `open_orders`, set status to `PartiallyFilled` (if any fills) or `Open` (if none). -### 4.2 Why bids spend quote, asks spend base โ€” the full accounting +### 4.2 Why bids spend quote, asks spend base - the full accounting Pick a taker **bid** at price `bp` and quantity `bq`, crossing a resting **ask** at `ap โ‰ค bp` with remaining quantity `aq`. Let @@ -953,7 +953,7 @@ Token flows: ``` quote_vault --[fee]---------> fee_vault (CPI signed by Market PDA, batched across all fills) - # No physical transfer for the base and net-quote legs โ€” they stay in the + # No physical transfer for the base and net-quote legs - they stay in the # vaults, accounted for via unsettled_* counters: maker.unsettled_quote += net_to_maker (maker collects gross - fee) @@ -961,14 +961,14 @@ Token flows: taker.unsettled_quote += rebate (price improvement refund) ``` -The *base* that the taker now owns was already in `base_vault` โ€” +The *base* that the taker now owns was already in `base_vault` - remember, the maker locked it there when placing the ask. The *quote* -that the maker now owns was already in `quote_vault` โ€” the taker +that the maker now owns was already in `quote_vault` - the taker locked `bp * bq` there at the top of this call. Nothing leaves the vaults except the fee. Everything else gets paid out later, on `settle_funds`. -For the opposite direction โ€” a taker **ask** at `ap` crossing a +For the opposite direction - a taker **ask** at `ap` crossing a resting **bid** at `bp โ‰ฅ ap`: ``` @@ -987,9 +987,9 @@ Token flows: No rebate on this side: the maker's bid locked exactly `bp * bid_original_qty` of quote up front, and of that, `bp * fill_qty` is -being spent right now at exactly that price โ€” no leftover. +being spent right now at exactly that price - no leftover. -### 4.3 Worked example โ€” taker bid crosses two resting asks +### 4.3 Worked example - taker bid crosses two resting asks Start with an empty book. Fees 10 bps (0.1%). Tick size 1. @@ -1005,16 +1005,16 @@ Start with an empty book. Fees 10 bps (0.1%). Tick size 1. makers as remaining_accounts: `(order_1, dan_user), (order_2, erin_user)`. - Step A โ€” lock. Faye's quote ATA loses `1000 * 7 = 7000` quote; + Step A - lock. Faye's quote ATA loses `1000 * 7 = 7000` quote; `quote_vault.balance += 7000`. - Step B โ€” plan: + Step B - plan: - Fill 0: resting index 0 (Dan's ask), order_id 1, qty = min(7, 5) = 5, price = 900. `taker_remaining = 7 - 5 = 2`. - Fill 1: resting index 1 (Erin's ask), order_id 2, qty = min(2, 5) = 2, price = 950. `taker_remaining = 0`. - Step C โ€” apply fills: + Step C - apply fills: For Fill 0 (Dan): - gross = 900 * 5 = 4500; fee = 4500 * 10 / 10 000 = 4; @@ -1035,7 +1035,7 @@ Start with an empty book. Fees 10 bps (0.1%). Tick size 1. - `erin_order.filled_quantity = 2`, status = PartiallyFilled (original 5, filled 2), **stays** in `erin_market_user.open_orders`. - Step D โ€” clean book. Dan's ask was fully filled โ†’ leaf removed from + Step D - clean book. Dan's ask was fully filled โ†’ leaf removed from the asks critbit tree. Erin's ask was partially filled โ†’ leaf's `quantity` decremented in place to 3 (no tree rebalancing needed). The `Order` PDA carries `filled_quantity`; the leaf just holds the @@ -1043,16 +1043,16 @@ Start with an empty book. Fees 10 bps (0.1%). Tick size 1. The next taker who wants to hit Erin's ask will pass `order_2` as a maker and see `leaf.quantity = 3`. - Step E โ€” pay the fee. `total_fee_quote = 4 + 1 = 5`. One CPI: + Step E - pay the fee. `total_fee_quote = 4 + 1 = 5`. One CPI: ``` quote_vault --[5 quote]--> fee_vault ``` - Step F โ€” apply Faye's deltas. `faye_market_user.unsettled_base = + Step F - apply Faye's deltas. `faye_market_user.unsettled_base = 0 + 7 = 7`. `faye_market_user.unsettled_quote = 0 + (500 + 100) = 600`. - Step G โ€” rest the remainder. `taker_remaining = 0` โ†’ Faye's new + Step G - rest the remainder. `taker_remaining = 0` โ†’ Faye's new Order is marked `Filled` immediately, not added to the book. 4. Later, each user calls `settle_funds`: @@ -1109,7 +1109,7 @@ Gael decides to cancel. `cancel_order` on order_id 4: - `order_book.bids` cleared. `gael_market_user.open_orders = []`. - `order.status = Cancelled`. -No tokens moved โ€” `quote_vault.balance` still holds the 3640. +No tokens moved - `quote_vault.balance` still holds the 3640. Gael calls `settle_funds`: @@ -1140,9 +1140,9 @@ Market configuration: Cast: **Maria** (market authority + Alice/Bob's broker), **Alice** (seller), **Bob** (buyer). -1. `initialize_market` โ€” Maria runs it. Rent for five accounts comes +1. `initialize_market` - Maria runs it. Rent for five accounts comes out of her wallet. Market is now `is_active`. -2. `create_market_user` โ€” Alice and Bob each run it once. +2. `create_market_user` - Alice and Bob each run it once. 3. Alice posts an ask: `place_order(Ask, 1000, 5)`, no remaining_accounts (empty book). - Lock: `alice_base_account --[5 base]--> base_vault`. @@ -1247,14 +1247,14 @@ Cast: Alice (ask maker), Bob (bid maker, then remainder rests), Carol the bid side) - No rebate on ask-taker side. - Bob's order: filled_quantity 3 โ†’ 7, status PartiallyFilled - (still not fully filled โ€” original 10, filled 7). + (still not fully filled - original 10, filled 7). - Clean book: Bob's book remaining = 10 โˆ’ 7 = 3 > 0, so his entry stays. `order_book.bids = [(2, 1100)]`. - Fee CPI: 22 quote โ†’ fee_vault. - `taker_remaining = 0` โ†’ Carol's new Order marked Filled. Mid-state: `base_vault = 0 + 4 = 4` (from Carol's lock; was 0 - after Bob's settle made it flow โ€” wait, no: Bob's base never + after Bob's settle made it flow - wait, no: Bob's base never settled yet. Let's re-check:) After step 4 Bob's `unsettled_base = 3` (from the 3-base fill @@ -1269,7 +1269,7 @@ Cast: Alice (ask maker), Bob (bid maker, then remainder rests), Carol Cast: Alice (bid maker), nobody else. 1. `initialize_market`, `create_market_user(Alice)`. -2. Alice posts `Bid, 900, 10` โ€” rests on an empty book. +2. Alice posts `Bid, 900, 10` - rests on an empty book. - Lock: 9000 quote from Alice to quote_vault. - No fills. `alice.open_orders = [1]`. `bids = [(1, 900)]`. 3. Alice reconsiders and calls `cancel_order` on her bid. @@ -1285,7 +1285,7 @@ Cast: Alice (bid maker), nobody else. Net delta: Alice is exactly where she started. The vaults are empty. The Order account is still onchain in `Cancelled` state (one could -imagine a future instruction handler to reclaim its rent โ€” see ยง8). +imagine a future instruction handler to reclaim its rent - see ยง8). --- @@ -1323,7 +1323,7 @@ From [`errors.rs`](programs/order-book/src/errors.rs): owe. - **Caller supplies maker pairs.** The matching engine does not - iterate the whole book looking for counterparties โ€” the caller + iterate the whole book looking for counterparties - the caller tells it which resting orders to cross. This is what Openbook v2 does and it's the only way to fit the matching work within a transaction's account budget when the book is large. The cost is @@ -1331,7 +1331,7 @@ From [`errors.rs`](programs/order-book/src/errors.rs): first, pick the crossings, and pass the right accounts. The program still enforces order (price-time priority) and ownership on what the caller passes, so a malicious caller cannot cross a - non-top-of-book maker to hurt someone else โ€” they can only *fail + non-top-of-book maker to hurt someone else - they can only *fail to cross* orders they should have crossed, which only hurts themselves. @@ -1344,8 +1344,8 @@ From [`errors.rs`](programs/order-book/src/errors.rs): - **Fees come out of the gross.** The maker receives `gross - fee`, not `gross`; the fee lives on for a while in `quote_vault` before being moved to `fee_vault` in one batched CPI at the end of - `place_order`. An alternative model โ€” the taker paying `gross + - fee` on top of the lock โ€” is discussed in a comment in + `place_order`. An alternative model - the taker paying `gross + + fee` on top of the lock - is discussed in a comment in `place_order.rs` and left as an exercise. - **Unsettled balances are pure accounting.** No token physically @@ -1363,7 +1363,7 @@ From [`errors.rs`](programs/order-book/src/errors.rs): - **Boxed InterfaceAccounts.** Several handlers use `Box< InterfaceAccount<...>>` for mint/token accounts. That's a BPF - stack-size workaround โ€” each `InterfaceAccount` is ~1 KB on the + stack-size workaround - each `InterfaceAccount` is ~1 KB on the stack and the Solana VM gives handlers a tight budget. Don't unbox these without testing the compute output size. @@ -1375,7 +1375,7 @@ From [`errors.rs`](programs/order-book/src/errors.rs): - **Book capacity check after matching.** The taker's remainder check happens at the end. A bid that clears enough asks to free up 3 slots can then rest its own 1-slot remainder even on a - previously-full book โ€” matching the "liquidity-positive" spirit + previously-full book - matching the "liquidity-positive" spirit of an order book. ### 6.3 Things this example does *not* do @@ -1427,7 +1427,7 @@ run first. From `finance/order-book/anchor/`: ```bash -# 1. Build the .so โ€” target/deploy/order_book.so +# 1. Build the .so - target/deploy/order_book.so anchor build # 2. Run the LiteSVM tests @@ -1555,8 +1555,8 @@ Ordered by difficulty. **Worst-case depth must be bounded, not assumed.** A plain binary search tree only keeps a roughly-balanced shape when its inputs arrive -in random order. In an order book an attacker chooses the inputs โ€” the -prices of their orders โ€” so nothing they choose can be allowed to +in random order. In an order book an attacker chooses the inputs - the +prices of their orders - so nothing they choose can be allowed to inflate the tree's depth. Two families of structure defend against this: *self-balancing* BSTs (red-black, AVL, โ€ฆ) that restore a bounded height with rotations on every insert and delete, and *radix tries* @@ -1580,10 +1580,10 @@ every operation cheap regardless of input, so the attack is structurally impossible. **Why critbit specifically.** Critbit is a binary radix trie keyed on -the order's sort bits โ€” *not* a self-balancing BST, so it never rotates +the order's sort bits - *not* a self-balancing BST, so it never rotates or recolours nodes. Its shape is a deterministic function of which keys are present, and its depth can never exceed the *bit width of the sort -key* (128 bits here โ€” price in the high 64, sequence number in the low +key* (128 bits here - price in the high 64, sequence number in the low 64), so it cannot degenerate into a long chain under any insert order. An insert splits exactly one leaf and adds exactly one inner node; a delete splices one out. This example uses the critbit slab from @@ -1591,7 +1591,7 @@ Openbook v2 (`src/state/slab/`). ### Harder -- **Event queue.** Mirror Openbook's `EventQueue` โ€” `place_order` +- **Event queue.** Mirror Openbook's `EventQueue` - `place_order` writes "fill" events, and a separate `consume_events` instruction processes them in batches for the maker side. Makes matching O(1) in CU cost regardless of the taker's depth. diff --git a/finance/order-book/anchor/programs/order-book/Cargo.toml b/finance/order-book/anchor/programs/order-book/Cargo.toml index 55bb48d8..955f75d8 100644 --- a/finance/order-book/anchor/programs/order-book/Cargo.toml +++ b/finance/order-book/anchor/programs/order-book/Cargo.toml @@ -22,7 +22,7 @@ custom-panic = [] [dependencies] anchor-lang = "1.0.0" anchor-spl = "1.0.0" -# Used by the ported Openbook slab โ€” `bytemuck::Pod` / `Zeroable` on every node +# Used by the ported Openbook slab - `bytemuck::Pod` / `Zeroable` on every node # variant + `min_const_generics` so `[AnyNode; 1024]` can derive Pod without # hitting bytemuck's default-32 array cap. `static_assertions` keeps the slab # layout asserts (node size, alignment) compile-time, matching upstream. diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs b/finance/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs index 984a10b7..1759cd74 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs @@ -56,7 +56,7 @@ pub fn handle_cancel_order(context: Context) -> Result<()> { } // Remove the leaf from the slab. The current cancel API doesn't tell us - // which side the order is on without reading the Order PDA โ€” which we + // which side the order is on without reading the Order PDA - which we // already have, so use it. let mut order_book = context.accounts.order_book.load_mut()?; let removed = order_book.remove_from(order.side, order.order_id).is_some(); diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs b/finance/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs index a2d925bd..384a2432 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs @@ -42,7 +42,7 @@ pub fn handle_initialize_market( market.bump = context.bumps.market; // Zero-copy account: initialize the slab in place. `load_init` is the - // first-write path โ€” every subsequent handler uses `load` / `load_mut`. + // first-write path - every subsequent handler uses `load` / `load_mut`. // The order book is not a PDA (see the comment on the `order_book` // account below), so `bump` is unused and stored as 0. let mut order_book = context.accounts.order_book.load_init()?; @@ -64,7 +64,7 @@ pub struct InitializeMarket<'info> { // The order book is a zero-copy account (~180 KB: two 1024-slot critbit // slabs back to back). Solana's BPF runtime caps inner-CPI account - // allocations at 10 KB, so we can't use Anchor's `init` here โ€” the + // allocations at 10 KB, so we can't use Anchor's `init` here - the // client must call system_program::create_account directly before this // instruction, sizing the account to ORDER_BOOK_ACCOUNT_SIZE, owned by // this program, and zero-initialized. @@ -77,7 +77,7 @@ pub struct InitializeMarket<'info> { // The account is not a PDA; it is a plain account whose keypair the // client generates. The README recommends deriving that keypair // deterministically (e.g. from `["order_book", market]`) so the address - // is predictable โ€” but the program doesn't enforce the derivation. + // is predictable - but the program doesn't enforce the derivation. #[account(zero)] pub order_book: AccountLoader<'info, OrderBook>, diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/place_order.rs b/finance/order-book/anchor/programs/order-book/src/instructions/place_order.rs index 13a227be..203266d6 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/place_order.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/place_order.rs @@ -13,14 +13,14 @@ use crate::state::{ // PlaceOrder check reads clearly and the limit is documented in one place. const MAX_OPEN_ORDERS_PER_USER: usize = 20; -// Basis-points denominator. 10_000 bps == 100% โ€” the universal rate convention +// Basis-points denominator. 10_000 bps == 100% - the universal rate convention // on every major exchange (NYSE, CME, Binance, Coinbase, ...). const BASIS_POINTS_DENOMINATOR: u128 = 10_000; // Remaining accounts are passed in groups of 2 per resting order we intend // to cross: [maker_order, maker_market_user]. We keep it at 2 (instead of // also threading the maker's ATAs) because fills land in the maker's -// unsettled_* balance โ€” the maker drains them later via settle_funds. This +// unsettled_* balance - the maker drains them later via settle_funds. This // mirrors how Openbook v2 works and keeps the per-fill account footprint // small. const ACCOUNTS_PER_MAKER: usize = 2; @@ -47,12 +47,12 @@ pub fn handle_place_order<'info>( ); // Lock up the funds the order would need if filled. Bids lock quote - // (price * quantity); asks lock base (quantity). This always happens โ€” + // (price * quantity); asks lock base (quantity). This always happens - // matching consumes from the locked pot (already in the vault), and any // unmatched remainder rests as a maker order with its lock still in place. // // The bid lock multiplies two u64s. A plain `u64::checked_mul` would - // refuse anything that overflows u64 (~1.8e19) โ€” which is a perfectly + // refuse anything that overflows u64 (~1.8e19) - which is a perfectly // legal lock once you scale by token decimals (e.g. 18-decimal quote // mint * mid-cap price * mid-cap quantity). Promote to u128 for the // multiplication, then narrow back to u64 with try_into so the failure @@ -155,7 +155,7 @@ pub fn handle_place_order<'info>( let mut taker_base_received: u64 = 0; let mut taker_quote_rebate: u64 = 0; let mut taker_quote_received: u64 = 0; - // Aggregate the per-fill fee into a single transfer at the end โ€” + // Aggregate the per-fill fee into a single transfer at the end - // halves CU cost vs one CPI per fill. let mut total_fee_quote: u64 = 0; @@ -185,7 +185,7 @@ pub fn handle_place_order<'info>( // // Strictly "makers pay nothing" would require the taker to bring // (gross + fee) which means pulling more from the taker's ATA on - // every fill โ€” a per-fill CPI that inflates CU cost and account + // every fill - a per-fill CPI that inflates CU cost and account // lists. Real CLOBs (Openbook v2, Phoenix) use a similar // deduct-from-gross pattern for simplicity; the fee can be thought // of as the maker pricing their ask a fraction higher to cover it. @@ -211,7 +211,7 @@ pub fn handle_place_order<'info>( // Defensive invariant: fees are a fraction of gross, never more. // `fee_basis_points <= 10_000` is enforced at market init, so this - // should be unreachable โ€” but a stale assumption here would let a + // should be unreachable - but a stale assumption here would let a // misconfigured market overdraw the maker's net payout. Cheap check. require!(fee_quote <= gross_quote, ErrorCode::NumericalOverflow); @@ -238,7 +238,7 @@ pub fn handle_place_order<'info>( // Price improvement: taker locked (price * quantity) but // only needs (fill_price * fill_quantity) for this fill. // u128 intermediate for the same reason as the bid lock - // and gross_quote above โ€” the original lock is already + // and gross_quote above - the original lock is already // bounded to u64, so this product narrows back cleanly. let locked_for_this_fill: u64 = (price as u128) .checked_mul(fill.fill_quantity as u128) @@ -444,7 +444,7 @@ pub struct PlaceOrder<'info> { // Zero-copy: AccountLoader streams the slab in/out without paying // borsh (de)serialization on every instruction. See order_book.rs for - // the layout. Not a PDA โ€” the client created it directly via + // the layout. Not a PDA - the client created it directly via // system_program::create_account (see initialize_market.rs for why); // `has_one = order_book` on `market` is what ties this specific account // to this specific market. @@ -452,7 +452,7 @@ pub struct PlaceOrder<'info> { pub order_book: AccountLoader<'info, OrderBook>, // The order PDA seed uses the book's `next_order_id` *before* this - // instruction increments it โ€” i.e. the id this new order will receive. + // instruction increments it - i.e. the id this new order will receive. // Read via `load()` so Anchor can derive the PDA at verification time. #[account( init, diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/settle_funds.rs b/finance/order-book/anchor/programs/order-book/src/instructions/settle_funds.rs index c8fe64da..5081fd3a 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/settle_funds.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/settle_funds.rs @@ -94,7 +94,7 @@ pub struct SettleFunds<'info> { )] pub market_user: Account<'info, MarketUser>, - // Boxed for the same reason as in PlaceOrder โ€” + // Boxed for the same reason as in PlaceOrder - // InterfaceAccount is too large to keep on the BPF stack in bulk. #[account(mut)] pub base_vault: Box>, diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/withdraw_fees.rs b/finance/order-book/anchor/programs/order-book/src/instructions/withdraw_fees.rs index 2b44463f..c8f9a8cc 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/withdraw_fees.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/withdraw_fees.rs @@ -7,7 +7,7 @@ use crate::errors::ErrorCode; use crate::state::{Market, MARKET_SEED}; /// Drain the market's accumulated taker fees into the authority's token -/// account. Authority-only โ€” arbitrary callers must not be able to siphon +/// account. Authority-only - arbitrary callers must not be able to siphon /// the fee vault. Transfers the current balance of the fee vault in full; /// a partial-withdraw flavour could take an amount parameter, left out here /// to keep the example focused. @@ -21,7 +21,7 @@ pub fn handle_withdraw_fees(context: Context) -> Result<()> { let fee_balance = context.accounts.fee_vault.amount; if fee_balance == 0 { - // Nothing to do โ€” exit quietly rather than failing, so this + // Nothing to do - exit quietly rather than failing, so this // instruction is safe to call on a cron/heartbeat even when there // haven't been any fills since the last run. return Ok(()); diff --git a/finance/order-book/anchor/programs/order-book/src/lib.rs b/finance/order-book/anchor/programs/order-book/src/lib.rs index d0ca768a..66549dda 100644 --- a/finance/order-book/anchor/programs/order-book/src/lib.rs +++ b/finance/order-book/anchor/programs/order-book/src/lib.rs @@ -73,7 +73,7 @@ pub mod order_book { } /// Drain the fee vault into the market authority's token account. - /// Authority-gated โ€” only the market's stored `authority` may call this. + /// Authority-gated - only the market's stored `authority` may call this. pub fn withdraw_fees(context: Context) -> Result<()> { instructions::withdraw_fees::handle_withdraw_fees(context) } diff --git a/finance/order-book/anchor/programs/order-book/src/state/matching.rs b/finance/order-book/anchor/programs/order-book/src/state/matching.rs index 86b2c85a..11b32e99 100644 --- a/finance/order-book/anchor/programs/order-book/src/state/matching.rs +++ b/finance/order-book/anchor/programs/order-book/src/state/matching.rs @@ -29,7 +29,7 @@ pub struct Fill { pub fill_quantity: u64, /// Price at which the fill clears. Always the resting (maker) order's - /// price โ€” standard order-book rule: maker's posted price wins; the taker + /// price - standard order-book rule: maker's posted price wins; the taker /// gets price improvement vs their limit on bids, and a higher payout /// vs their limit on asks. Also the high 64 bits of the tree key when /// we look the leaf up again at apply time. @@ -39,7 +39,7 @@ pub struct Fill { /// Walk the opposite side of the book and produce the list of fills that /// should occur for the incoming taker order. Does not mutate the book. /// -/// Returns `(fills, taker_remaining)` โ€” `taker_remaining` is what's left +/// Returns `(fills, taker_remaining)` - `taker_remaining` is what's left /// over after crossing, to be rested on the book at the taker's limit price. pub fn plan_fills( order_book: &OrderBook, @@ -65,7 +65,7 @@ pub fn plan_fills( // ask's price; ask takes when its limit is <= the resting bid's // price. The tree walk is in best-price-first order on the resting // side, so the first leaf that fails to cross means every - // subsequent leaf also fails โ€” break, don't continue. + // subsequent leaf also fails - break, don't continue. let resting_price = leaf.price(); let crosses = match incoming_side { OrderSide::Bid => incoming_price >= resting_price, diff --git a/finance/order-book/anchor/programs/order-book/src/state/order_book.rs b/finance/order-book/anchor/programs/order-book/src/state/order_book.rs index 8963651b..db4bf82c 100644 --- a/finance/order-book/anchor/programs/order-book/src/state/order_book.rs +++ b/finance/order-book/anchor/programs/order-book/src/state/order_book.rs @@ -11,7 +11,7 @@ pub const ORDER_BOOK_SEED: &[u8] = b"order_book"; /// Per-side capacity. 1024 leaves is enough for any realistic depth a single /// market quotes; at 88 bytes per node that's ~90 KB per side, so the whole -/// OrderBook account fits in ~180 KB โ€” well under Solana's per-account ceiling +/// OrderBook account fits in ~180 KB - well under Solana's per-account ceiling /// and well within the rent budget a market authority is happy to fund once. pub const MAX_ORDERS_PER_SIDE: usize = MAX_TREE_NODES; @@ -21,7 +21,7 @@ pub const MAX_ORDERS_PER_SIDE: usize = MAX_TREE_NODES; /// /// Stored as one `AccountLoader` (zero-copy). The account is far /// larger than Anchor's borsh `Account` would happily deserialize on every -/// instruction โ€” zero-copy gives us per-field memory access without paying +/// instruction - zero-copy gives us per-field memory access without paying /// the (de)serialization cost. #[account(zero_copy(unsafe))] #[repr(C)] @@ -85,7 +85,7 @@ impl OrderBook { self._padding = [0; 7]; // Slab regions arrive zeroed (Anchor zero_copy guarantees that on - // first init). We only need to write the side tag โ€” every other + // first init). We only need to write the side tag - every other // field already reads as "empty" (bump_index=0, free_list_len=0, // free_list_head=0, all node slots Uninitialized). self.bids.order_tree_type = OrderTreeType::Bids as u8; @@ -130,7 +130,7 @@ impl OrderBook { /// and removed on either side. pub fn remove(&mut self, order_id: u64) -> bool { // We don't know which side the order is on without scanning, so try - // both. Tree lookup is O(log N) โ€” much cheaper than the linear Vec + // both. Tree lookup is O(log N) - much cheaper than the linear Vec // scan the previous implementation did. if self.remove_from(OrderSide::Bid, order_id).is_some() { return true; @@ -145,7 +145,7 @@ impl OrderBook { /// if found, so callers can read its quantity/owner without re-fetching /// the Order account. pub fn remove_from(&mut self, side: OrderSide, order_id: u64) -> Option { - // Tree keys embed price in the high 64 bits โ€” we don't have the price + // Tree keys embed price in the high 64 bits - we don't have the price // at cancellation time, so we can't reconstruct the exact key without // scanning. Linear scan to find the full key, then remove by key. let (root, nodes) = match side { @@ -154,7 +154,7 @@ impl OrderBook { }; // Linear scan to find the full key (price + seq_num) for this - // order_id. Cheap relative to a CPI โ€” and only happens at + // order_id. Cheap relative to a CPI - and only happens at // cancellation, not in the hot matching path. let mut found_key: Option = None; for (_, leaf) in OrderTreeIter::new(nodes, root) { @@ -195,7 +195,7 @@ impl OrderBook { /// against the maker side of the book without reinserting leaves. /// /// Leaves are looked up by (price, order_id) instead of a cached slab - /// handle because removing any leaf rebalances the tree โ€” every other + /// handle because removing any leaf rebalances the tree - every other /// handle in the same plan would be stale after the first removal. /// (price, order_id) reconstructs the exact tree key the leaf was /// inserted with, so the tree walk lands on the right slot every time. diff --git a/finance/order-book/anchor/programs/order-book/src/state/slab/iterator.rs b/finance/order-book/anchor/programs/order-book/src/state/slab/iterator.rs index e52f1a72..1fcfa733 100644 --- a/finance/order-book/anchor/programs/order-book/src/state/slab/iterator.rs +++ b/finance/order-book/anchor/programs/order-book/src/state/slab/iterator.rs @@ -2,7 +2,7 @@ // MIT-licensed. See LICENSE-OPENBOOK in this directory. // // This iterator yields (handle, leaf) pairs in best-price-first order. -// Matching uses pure price-time priority โ€” no oracle peg or time-in-force +// Matching uses pure price-time priority - no oracle peg or time-in-force // filtering needed here. use super::nodes::{InnerNode, LeafNode, NodeHandle, NodeRef}; @@ -15,7 +15,7 @@ use super::ordertree::{OrderTreeNodes, OrderTreeRoot, OrderTreeType}; /// - bids: descending (highest price first) /// /// Within a single price level, earlier orders come first (price-time -/// priority) โ€” that ordering is encoded in the leaf key, so it falls out of +/// priority) - that ordering is encoded in the leaf key, so it falls out of /// the in-order walk automatically. pub struct OrderTreeIter<'a> { nodes: &'a OrderTreeNodes, @@ -27,7 +27,7 @@ pub struct OrderTreeIter<'a> { /// Cached next leaf so `peek` and `next` can share work. next_leaf: Option<(NodeHandle, &'a LeafNode)>, - /// Child indexes to walk: (first, second). For asks we go (0, 1) โ€” i.e. + /// Child indexes to walk: (first, second). For asks we go (0, 1) - i.e. /// down the left child first, then right; for bids we go (1, 0). first: usize, second: usize, diff --git a/finance/order-book/anchor/programs/order-book/src/state/slab/nodes.rs b/finance/order-book/anchor/programs/order-book/src/state/slab/nodes.rs index 1caae6c0..2067f6ee 100644 --- a/finance/order-book/anchor/programs/order-book/src/state/slab/nodes.rs +++ b/finance/order-book/anchor/programs/order-book/src/state/slab/nodes.rs @@ -19,7 +19,7 @@ use crate::state::OrderSide; /// is kept wide to match upstream so the layout stays compatible. pub type NodeHandle = u32; -/// Every node โ€” Inner, Leaf, Free โ€” is padded to the same 88 bytes so the +/// Every node - Inner, Leaf, Free - is padded to the same 88 bytes so the /// underlying `[AnyNode; N]` array is a true slab: we can swap a Leaf for an /// Inner in place without reallocating. Matches the upstream Openbook layout. pub const NODE_SIZE: usize = 88; @@ -79,8 +79,8 @@ pub fn price_from_key(key: u128) -> u64 { /// holding the shared prefix bits, and `prefix_len` telling consumers how many /// of the high bits of `key` are meaningful. /// -/// `tag` is the first byte at offset 0 โ€” same offset as on `LeafNode` and -/// `FreeNode` โ€” so `AnyNode::tag` reads the variant tag from a fixed offset +/// `tag` is the first byte at offset 0 - same offset as on `LeafNode` and +/// `FreeNode` - so `AnyNode::tag` reads the variant tag from a fixed offset /// regardless of which variant is in the slot. /// /// `repr(C, packed(8))` caps field alignment at 8 bytes. Without this, u128 @@ -99,7 +99,7 @@ pub struct InnerNode { /// Number of high `key` bits that all descendants share. pub prefix_len: u32, - /// Only the top `prefix_len` bits of `key` are meaningful โ€” the rest is + /// Only the top `prefix_len` bits of `key` are meaningful - the rest is /// whichever leaf happened to be inserted first below this node. pub key: u128, @@ -143,7 +143,7 @@ impl InnerNode { /// One resting order in the slab. /// /// All the per-order metadata callers care about lives on the corresponding -/// `Order` PDA โ€” the slab leaf only stores what the matching engine needs: +/// `Order` PDA - the slab leaf only stores what the matching engine needs: /// the tree key (price + tie-break), the remaining quantity, the owner, and /// the order_id (which the handler uses to verify the matching `Order` /// account the caller passed in). @@ -175,7 +175,7 @@ pub struct LeafNode { pub order_id: u64, /// Unix timestamp at which the order rested. Not used by matching (the - /// seq_num inside `key` is the tie-break) โ€” kept so offchain tooling + /// seq_num inside `key` is the tie-break) - kept so offchain tooling /// can show an "age" without re-deriving it from a different account. pub timestamp: i64, @@ -205,7 +205,7 @@ impl LeafNode { } } - /// Price half of the tree key โ€” convenience for callers. + /// Price half of the tree key - convenience for callers. #[inline(always)] pub fn price(&self) -> u64 { price_from_key(self.key) diff --git a/finance/order-book/anchor/programs/order-book/src/state/slab/ordertree.rs b/finance/order-book/anchor/programs/order-book/src/state/slab/ordertree.rs index 5ec08653..ea6e983e 100644 --- a/finance/order-book/anchor/programs/order-book/src/state/slab/ordertree.rs +++ b/finance/order-book/anchor/programs/order-book/src/state/slab/ordertree.rs @@ -20,7 +20,7 @@ pub const MAX_TREE_NODES: usize = 1024; /// Root pointer + leaf count for one side of the book. /// -/// `maybe_node` is only meaningful when `leaf_count > 0` โ€” a freshly-zeroed +/// `maybe_node` is only meaningful when `leaf_count > 0` - a freshly-zeroed /// root represents an empty tree. #[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] #[repr(C)] @@ -160,7 +160,7 @@ impl OrderTreeNodes { search_key: u128, ) -> Option { // Stack of (handle, critbit) pairs so we can walk back up to the - // root after splicing the leaf out โ€” same trick the upstream uses. + // root after splicing the leaf out - same trick the upstream uses. let mut stack: Vec<(NodeHandle, bool)> = vec![]; let mut parent_h = root.node()?; @@ -255,7 +255,7 @@ impl OrderTreeNodes { /// Returns the handle of the new leaf and, when a duplicate key collided, /// the leaf that got overwritten. (Callers in this order book embed a /// monotonically increasing seq_num in every key, so collisions cannot - /// actually happen โ€” the case is kept just to match the upstream API.) + /// actually happen - the case is kept just to match the upstream API.) pub fn insert_leaf( &mut self, root: &mut OrderTreeRoot, @@ -294,7 +294,7 @@ impl OrderTreeNodes { if let Some(NodeRef::Inner(inner)) = parent_contents.case() { if shared_prefix_len >= inner.prefix_len { - // The new key shares at least this node's prefix โ€” + // The new key shares at least this node's prefix - // descend. let (child, crit_bit) = inner.walk_down(new_leaf.key); stack.push((parent_handle, crit_bit)); @@ -325,7 +325,7 @@ impl OrderTreeNodes { // replacing it with a freshly-built InnerNode that has the new // leaf and the moved-aside old node as children. We can't go via // `node_mut().as_inner_mut()` here because that would refuse the - // slot when its tag is still LeafNode โ€” instead, write a complete + // slot when its tag is still LeafNode - instead, write a complete // new InnerNode bit-pattern into the slot via AnyNode. let mut new_inner = InnerNode::new(shared_prefix_len, new_leaf.key); new_inner.children[new_leaf_crit_bit as usize] = new_leaf_handle; diff --git a/finance/order-book/anchor/programs/order-book/tests/test_order_book.rs b/finance/order-book/anchor/programs/order-book/tests/test_order_book.rs index e3b0a252..82624f3f 100644 --- a/finance/order-book/anchor/programs/order-book/tests/test_order_book.rs +++ b/finance/order-book/anchor/programs/order-book/tests/test_order_book.rs @@ -4,7 +4,7 @@ //! create user accounts, place bids/asks (locking the appropriate vault), //! reject invalid prices / tick-aligned prices / undersized quantities, //! cancel orders (which credits unsettled balances), settle funds out of -//! the vaults, and โ€” in the matching block near the bottom โ€” cross incoming +//! the vaults, and - in the matching block near the bottom - cross incoming //! orders against resting orders using price-time priority, charge the //! configured taker fee to a fee vault, and drain the fee vault via //! `withdraw_fees`. @@ -36,14 +36,14 @@ const ORDER_SEED: &[u8] = b"order"; const MARKET_USER_SEED: &[u8] = b"market_user"; // Size of the zero-copy OrderBook account, including Anchor's 8-byte -// discriminator. Mirrors `order_book::state::ORDER_BOOK_ACCOUNT_SIZE` โ€” duplicated +// discriminator. Mirrors `order_book::state::ORDER_BOOK_ACCOUNT_SIZE` - duplicated // here so tests are self-contained and stay closer to what an SDK does. // Two 1024-leaf critbit slabs at 88 bytes per node, plus header. If you -// change this, bump the constant in `state/order_book.rs` too โ€” the +// change this, bump the constant in `state/order_book.rs` too - the // `#[account(zero)]` check fails if the account size is wrong. const ORDER_BOOK_ACCOUNT_SIZE: u64 = order_book::state::ORDER_BOOK_ACCOUNT_SIZE as u64; -// NVDAx has 8 decimals on-chain; USDC has 6. +// NVDAx has 8 decimals onchain; USDC has 6. const BASE_DECIMALS: u8 = 8; // NVDAx (https://explorer.solana.com/address/Xsc9qvGR1efVDFGLrVsmkzv3qi45LTBjeUKSPmx9qEh) const QUOTE_DECIMALS: u8 = 6; // USDC @@ -63,7 +63,7 @@ const MIN_ORDER_SIZE: u64 = 1; // order placed in the tests with room to spare. const TRADER_STARTING_BALANCE: u64 = 1_000_000_000; -// Shared order sizing โ€” chosen so price * quantity stays well inside u64 +// Shared order sizing - chosen so price * quantity stays well inside u64 // and the seller's ask sits at the same price as the buyer's bid (matching // is not implemented, they just coexist in the book). const BID_PRICE: u64 = 100; @@ -127,7 +127,7 @@ struct Scenario { fee_vault: Keypair, market: Pubkey, // The order book is a ~180 KB zero-copy account owned by the program. - // It's NOT a PDA โ€” the BPF runtime caps inner-CPI allocations at 10 KB, + // It's NOT a PDA - the BPF runtime caps inner-CPI allocations at 10 KB, // so the client must allocate it directly via system_program::CreateAccount // and pass it in as a signer. See `build_initialize_market_tx` for the // full setup. @@ -219,7 +219,7 @@ fn full_setup() -> Scenario { } // --------------------------------------------------------------------------- -// Instruction builders โ€” one per program entry point. +// Instruction builders - one per program entry point. // --------------------------------------------------------------------------- /// Build the `system_program::CreateAccount` instruction the client must run @@ -235,7 +235,7 @@ fn build_create_order_book_account_ix( payer: &Pubkey, ) -> Instruction { // LiteSVM uses the default rent schedule; minimum_balance() on the - // 180 KB account is around 1.25 SOL โ€” well within the 100 SOL we fund + // 180 KB account is around 1.25 SOL - well within the 100 SOL we fund // the test payer with in `full_setup`. let rent_lamports = sc .svm @@ -341,7 +341,7 @@ fn build_place_order_ix( /// Build a `place_order` instruction with maker (order, market_user) PDA /// pairs appended as remaining accounts. The order-book program expects them in the same -/// order the resting book will be walked โ€” best-priced first (lowest ask +/// order the resting book will be walked - best-priced first (lowest ask /// for a taker bid, highest bid for a taker ask), and within a price level /// earliest-first. Every maker pair must be writable: the program mutates /// the maker's Order (filled_quantity, status) and their MarketUser @@ -452,7 +452,7 @@ fn build_settle_funds_ix( // both user-account creations so tests that just want a ready-to-trade // market do not have to repeat the boilerplate. fn initialize_market_and_users(sc: &mut Scenario) { - // Allocate the OrderBook account first โ€” it has to exist (owned by the + // Allocate the OrderBook account first - it has to exist (owned by the // program, zero-initialized) before initialize_market's `#[account(zero)]` // check passes. let create_ix = build_create_order_book_account_ix(sc, &sc.authority.pubkey()); @@ -610,7 +610,7 @@ fn place_bid_locks_quote_in_vault() { get_token_account_balance(&sc.svm, &sc.buyer_quote_ata).unwrap(), TRADER_STARTING_BALANCE - locked_quote ); - // Base vault untouched โ€” bids never move base tokens. + // Base vault untouched - bids never move base tokens. assert_eq!( get_token_account_balance(&sc.svm, &sc.base_vault.pubkey()).unwrap(), 0 @@ -719,7 +719,7 @@ fn place_order_rejects_unaligned_tick() { ) .unwrap(); - // 75 is not a multiple of 50 โ€” must be rejected by the tick check. + // 75 is not a multiple of 50 - must be rejected by the tick check. let unaligned_price: u64 = 75; let ix = build_place_order_ix( &sc, @@ -841,7 +841,7 @@ fn cancel_ask_credits_unsettled_base() { ) .unwrap(); - // Funds are still in the vault โ€” cancel does not move tokens, it only + // Funds are still in the vault - cancel does not move tokens, it only // updates the unsettled balance. Settlement is a separate step. assert_eq!( get_token_account_balance(&sc.svm, &sc.base_vault.pubkey()).unwrap(), @@ -1258,7 +1258,7 @@ fn taker_bid_fully_crosses_best_ask() { const MAKER_ASK_ID: u64 = 1; // 1000 * 100 = 100_000 quote flows, and 100_000 * 10 bps / 10_000 = 100 - // fee โ€” big enough to be non-zero after integer division, tiny enough + // fee - big enough to be non-zero after integer division, tiny enough // that trader starting balances easily cover it. const PRICE: u64 = 1000; const QUANTITY: u64 = 100; @@ -1286,7 +1286,7 @@ fn taker_bid_fully_crosses_best_ask() { ) .unwrap(); - // Buyer's taker bid at the same price, same qty โ€” fully crosses. + // Buyer's taker bid at the same price, same qty - fully crosses. const TAKER_BID_ID: u64 = 2; let taker_bid_ix = build_place_order_with_makers_ix( &sc, @@ -1316,7 +1316,7 @@ fn taker_bid_fully_crosses_best_ask() { let (buyer_base, buyer_quote) = read_user_unsettled(&sc.svm, &sc.buyer_market_user); assert_eq!(buyer_base, QUANTITY * BASE_LOT_SIZE); - // No price improvement here โ€” buyer's limit == maker's price โ€” so no + // No price improvement here - buyer's limit == maker's price - so no // quote rebate lands in the taker's unsettled_quote. assert_eq!(buyer_quote, 0); @@ -1457,7 +1457,7 @@ fn taker_partially_fills_resting_order_rest_stays_on_book() { assert_eq!(status, ORDER_STATUS_PARTIALLY_FILLED); // Base vault still holds the un-filled portion (seller's lock, minus - // what was delivered to the taker's unsettled_base โ€” which never left + // what was delivered to the taker's unsettled_base - which never left // the vault, just got re-tagged as owed to the buyer). // // Total base in vault stays == MAKER_ASK_QUANTITY * BASE_LOT_SIZE, because @@ -1540,7 +1540,7 @@ fn taker_partially_filled_remainder_rests_on_book() { // The taker's own Order PDA holds the true remaining-on-book quantity // (original_quantity - filled_quantity). On-book quantity isn't stored - // on OrderEntry directly โ€” see state/order_book.rs โ€” so this is the + // on OrderEntry directly - see state/order_book.rs - so this is the // source of truth both here and at runtime. assert_eq!( TAKER_BID_QUANTITY - taker_filled, @@ -1569,7 +1569,7 @@ fn taker_crosses_multiple_resting_orders_best_price_first() { const TAKER_BID_PRICE: u64 = 1000; const TAKER_BID_QUANTITY: u64 = BEST_ASK_QUANTITY + SECOND_ASK_QUANTITY; - // Need to post both asks and both rest โ€” seller places two in sequence. + // Need to post both asks and both rest - seller places two in sequence. let ask_one_ix = build_place_order_ix( &sc, &sc.seller, @@ -1783,7 +1783,7 @@ fn taker_bid_gets_price_improvement_from_resting_ask() { send_transaction_from_instructions(&mut sc.svm, vec![__ix4], &[&sc.seller], &sc.seller.pubkey()).unwrap(); - // Taker bid โ€” limit 1000. + // Taker bid - limit 1000. const TAKER_BID_ID: u64 = 2; let taker_ix = build_place_order_with_makers_ix( &sc, diff --git a/finance/token-swap/README.md b/finance/token-swap/README.md index 4fd1e13e..79e0e537 100644 --- a/finance/token-swap/README.md +++ b/finance/token-swap/README.md @@ -1,6 +1,6 @@ # Token Swap (AMM) -A Constant Product [Automated Market Maker (AMM)](https://www.investopedia.com/terms/a/automated-market-maker-amm.asp) in [Anchor](https://solana.com/docs/terminology#anchor) โ€” the model popularized by Uniswap V2. +A Constant Product [Automated Market Maker (AMM)](https://www.investopedia.com/terms/a/automated-market-maker-amm.asp) in [Anchor](https://solana.com/docs/terminology#anchor) - the model popularized by Uniswap V2. The pool keeps `x * y = K` invariant: if `x` is the reserve of token A and `y` is the reserve of token B, then `x * y` stays constant for a given [liquidity](https://www.investopedia.com/terms/l/liquidity.asp) quantity. @@ -27,14 +27,14 @@ Other bonding-curve designs exist: - **Uniswap V3 Concentrated Liquidity AMM (CLAMM):** splits the curve into buckets; LPs supply liquidity to specific price ranges. - **Trader Joe CLAMM:** like Uniswap V3, but each bucket is a CSAMM. -A CPAMM is the simplest and the cheapest to keep in [account](https://solana.com/docs/terminology#account) state โ€” one pool, one [mint](https://solana.com/docs/terminology#token-mint), easy to reason about. That's what this example implements. +A CPAMM is the simplest and the cheapest to keep in [account](https://solana.com/docs/terminology#account) state - one pool, one [mint](https://solana.com/docs/terminology#token-mint), easy to reason about. That's what this example implements. ## Design Requirements: - **Fee distribution.** Every pool charges a trading fee, paid in the traded token, that rewards [liquidity providers (LPs)](https://www.investopedia.com/terms/l/liquidity-provider.asp). To stay consistent across pools, the fee is shared. -- **Single pool per asset pair.** Avoids liquidity fragmentation. Without a single canonical pool per pair, a [decentralised exchange (DEX)](https://www.investopedia.com/terms/d/decentralized-exchange-dex.asp) would fragment volume across multiple pools, widening spreads โ€” the same problem that motivated the shift away from [order books](https://www.investopedia.com/terms/o/order-book.asp) onchain. +- **Single pool per asset pair.** Avoids liquidity fragmentation. Without a single canonical pool per pair, a [decentralised exchange (DEX)](https://www.investopedia.com/terms/d/decentralized-exchange-dex.asp) would fragment volume across multiple pools, widening spreads - the same problem that motivated the shift away from [order books](https://www.investopedia.com/terms/o/order-book.asp) onchain. - **LP accounting.** The program tracks each LP's deposits. Implementation choices: @@ -74,21 +74,21 @@ programs/token-swap/src/ ### `Config` -Shared configuration for the AMM. **Singleton** โ€” one per deployed program, at PDA seeds `[b"config"]`. +Shared configuration for the AMM. **Singleton** - one per deployed program, at PDA seeds `[b"config"]`. -- `admin: Pubkey` โ€” the admin authority. Only this address can call `claim_admin_fees`. -- `fee: u16` โ€” total trading fee in [basis points (bps)](https://www.investopedia.com/terms/b/basispoint.asp) (must be < 10000). Split between LPs and the admin according to `admin_share_bps`. -- `admin_share_bps: u16` โ€” fraction of the trading fee that goes to the admin, in basis points (must be < 10000). The remainder goes to LPs. Modelled on Uniswap V2 / Raydium: the AMM operator takes a slice of every fee, LPs keep the rest. +- `admin: Pubkey` - the admin authority. Only this address can call `claim_admin_fees`. +- `fee: u16` - total trading fee in [basis points (bps)](https://www.investopedia.com/terms/b/basispoint.asp) (must be < 10000). Split between LPs and the admin according to `admin_share_bps`. +- `admin_share_bps: u16` - fraction of the trading fee that goes to the admin, in basis points (must be < 10000). The remainder goes to LPs. Modelled on Uniswap V2 / Raydium: the AMM operator takes a slice of every fee, LPs keep the rest. ### `PoolConfig` -Per-pool configuration / identity record. Identifies a single pool by which `Config` it belongs to and which two mints it trades, and tracks the admin's accumulated trading-fee claim for each side. The actual pool reserves live in separate token accounts (`pool_a`, `pool_b`) owned by `pool_authority` โ€” they are *not* stored here. +Per-pool configuration / identity record. Identifies a single pool by which `Config` it belongs to and which two mints it trades, and tracks the admin's accumulated trading-fee claim for each side. The actual pool reserves live in separate token accounts (`pool_a`, `pool_b`) owned by `pool_authority` - they are *not* stored here. -- `config: Pubkey` โ€” the parent `Config` account. -- `mint_a: Pubkey` โ€” mint of token A. -- `mint_b: Pubkey` โ€” mint of token B. -- `admin_fees_owed_a: u64` โ€” admin's accumulated fee claim on token A, in base units. Sits physically in `pool_a` but is excluded from the LP curve and from LP-withdrawable amounts. Swept by `claim_admin_fees`. -- `admin_fees_owed_b: u64` โ€” same for token B. +- `config: Pubkey` - the parent `Config` account. +- `mint_a: Pubkey` - mint of token A. +- `mint_b: Pubkey` - mint of token B. +- `admin_fees_owed_a: u64` - admin's accumulated fee claim on token A, in base units. Sits physically in `pool_a` but is excluded from the LP curve and from LP-withdrawable amounts. Swept by `claim_admin_fees`. +- `admin_fees_owed_b: u64` - same for token B. The admin's fees are tracked as *virtual* claims on the existing `pool_a` / `pool_b` reserves rather than as separate vaults. LP-facing math uses **effective reserves** = `pool_X.amount - admin_fees_owed_X` so the admin's owed slice doesn't grow LP [yield](https://www.investopedia.com/terms/y/yield.asp). @@ -106,17 +106,17 @@ Initializes a `PoolConfig` account, an LP mint (`liquidity_provider_mint`), and ### `deposit_liquidity` -Transfers token A and token B from the depositor to the pool, then mints LP tokens to the depositor. `amount_a` and `amount_b` are treated as **upper bounds** โ€” the caller's maximum willingness on each side. The contract clamps both numbers down to the largest pair that lies on the current price line, then pulls exactly that pair. `minimum_lp_tokens_out` is the caller's **lower bound** on what they're willing to receive in LP tokens; the handler reverts with `DepositBelowMinimum` if the post-clamp LP mint amount falls below it. Pass `0` to opt out (any non-zero mint is acceptable). +Transfers token A and token B from the depositor to the pool, then mints LP tokens to the depositor. `amount_a` and `amount_b` are treated as **upper bounds** - the caller's maximum willingness on each side. The contract clamps both numbers down to the largest pair that lies on the current price line, then pulls exactly that pair. `minimum_lp_tokens_out` is the caller's **lower bound** on what they're willing to receive in LP tokens; the handler reverts with `DepositBelowMinimum` if the post-clamp LP mint amount falls below it. Pass `0` to opt out (any non-zero mint is acceptable). -- For the first deposit, both amounts are used as-is and the LP amount is `sqrt(amount_a * amount_b)` โ€” computed with a `u128` integer-sqrt (Newton's method), no floats โ€” with `MINIMUM_LIQUIDITY` locked away forever (to prevent the empty-pool edge case). No admin fees can be owed yet, so this case is unchanged by the admin-fee mechanism. +- For the first deposit, both amounts are used as-is and the LP amount is `sqrt(amount_a * amount_b)` - computed with a `u128` integer-sqrt (Newton's method), no floats - with `MINIMUM_LIQUIDITY` locked away forever (to prevent the empty-pool edge case). No admin fees can be owed yet, so this case is unchanged by the admin-fee mechanism. - For later deposits, the amounts are clamped to the current pool ratio (Uniswap V2's `mint()` pattern): 1. Compute `amount_b_required = amount_a * effective_pool_b / effective_pool_a`. - 2. If `amount_b_required โ‰ค amount_b`, use `(amount_a, amount_b_required)` โ€” the depositor offered enough B, so we take the full A and clamp B down. - 3. Otherwise, compute `amount_a_required = amount_b * effective_pool_a / effective_pool_b` and use `(amount_a_required, amount_b)` โ€” B is the binding side, so we take the full B and clamp A down. + 2. If `amount_b_required โ‰ค amount_b`, use `(amount_a, amount_b_required)` - the depositor offered enough B, so we take the full A and clamp B down. + 3. Otherwise, compute `amount_a_required = amount_b * effective_pool_a / effective_pool_b` and use `(amount_a_required, amount_b)` - B is the binding side, so we take the full B and clamp A down. - All ratio math runs in `u128` with checked arithmetic. No floats are used for money; rounding is always toward the pool (the depositor never gets a sub-base-unit advantage). - The ratio is computed on the **effective reserves** (`pool_X.amount - admin_fees_owed_X`). The admin's owed slice isn't LP-claimable capital, so it doesn't shift the deposit ratio. - If the clamp rounds one of the amounts down to zero (e.g. a depositor offering a sub-base-unit fraction against a thick pool), the handler reverts with `DepositAmountTooSmall` rather than minting LP shares against a zero contribution. -- If the computed LP-token amount falls below `minimum_lp_tokens_out`, the handler reverts with `DepositBelowMinimum`. This is the depositor's slippage guard for cases where the pool ratio shifted between off-chain quote time and tx landing. +- If the computed LP-token amount falls below `minimum_lp_tokens_out`, the handler reverts with `DepositBelowMinimum`. This is the depositor's slippage guard for cases where the pool ratio shifted between offchain quote time and tx landing. ### `swap_tokens` @@ -124,17 +124,17 @@ Swaps a fixed `input_amount` of one token for as much of the other as possible ( - The total trading fee is taken off the input first: `fee_amount = input * fee / 10_000`. - The fee is split between LPs and the admin: - - `admin_portion = fee_amount * admin_share_bps / 10_000` โ€” accumulates as a virtual claim on the input-side reserve (`admin_fees_owed_a` or `admin_fees_owed_b`). Not transferred immediately, swept later by `claim_admin_fees`. Saves a CPI per swap. - - `lp_portion = fee_amount - admin_portion` โ€” stays physically in the reserves and boosts LP yield ("less output for the same input"). + - `admin_portion = fee_amount * admin_share_bps / 10_000` - accumulates as a virtual claim on the input-side reserve (`admin_fees_owed_a` or `admin_fees_owed_b`). Not transferred immediately, swept later by `claim_admin_fees`. Saves a CPI per swap. + - `lp_portion = fee_amount - admin_portion` - stays physically in the reserves and boosts LP yield ("less output for the same input"). - `taxed_input = input - fee_amount` is what enters the curve. - The output is computed against the **effective reserves** (`pool_X.amount - admin_fees_owed_X`), so the admin's outstanding fees do not contribute to the price. The curve math runs in `u128` with checked arithmetic, multiplying before dividing to keep precision; floor rounding favours the pool (Uniswap V2 convention). -- The [price impact](https://www.investopedia.com/terms/p/price-impact.asp) of a swap โ€” the difference between the quoted mid-price and the effective execution price โ€” is determined by the size of the trade relative to the pool's effective reserves. Larger trades move the curve further, resulting in higher price impact. +- The [price impact](https://www.investopedia.com/terms/p/price-impact.asp) of a swap - the difference between the quoted mid-price and the effective execution price - is determined by the size of the trade relative to the pool's effective reserves. Larger trades move the curve further, resulting in higher price impact. - If `output < min_output_amount`, the handler reverts with `SlippageExceeded`. This is the trader's slippage guard for cases where the pool shifted between quote time and tx landing. - After the transfers, the handler reloads the pool accounts and re-verifies that `effective_pool_a * effective_pool_b` is at least as high as before the trade. This is defence in depth: if the curve math were ever wrong in a way that gave the trader too much, the invariant check would fail and revert the trade. Reverts with `InvariantViolated`. ### `withdraw_liquidity` -Burns LP tokens and returns a proportional share of the **effective reserves** (`pool_X.amount - admin_fees_owed_X`) to the LP. The proportion is `amount / (liquidity_provider_mint.supply + MINIMUM_LIQUIDITY)`. The admin's owed slice physically remains in the vaults but is not distributed to exiting LPs โ€” it's claimed separately via `claim_admin_fees`. All math is `u128` with checked arithmetic, multiplying before dividing; floor rounding leaves sub-base-unit dust with the pool (grows LP value for everyone still in). +Burns LP tokens and returns a proportional share of the **effective reserves** (`pool_X.amount - admin_fees_owed_X`) to the LP. The proportion is `amount / (liquidity_provider_mint.supply + MINIMUM_LIQUIDITY)`. The admin's owed slice physically remains in the vaults but is not distributed to exiting LPs - it's claimed separately via `claim_admin_fees`. All math is `u128` with checked arithmetic, multiplying before dividing; floor rounding leaves sub-base-unit dust with the pool (grows LP value for everyone still in). - `minimum_token_a_out` and `minimum_token_b_out` are the LP's per-side slippage floors. If either computed amount falls below its floor, the handler reverts with `WithdrawalBelowMinimum` *before* any tokens move. Pass `0` on either side to opt out. This protects LPs from withdrawing during a pool imbalance (e.g. a large swap landed just before this tx and skewed the mix). @@ -143,66 +143,66 @@ Burns LP tokens and returns a proportional share of the **effective reserves** ( Lets the address stored in `Config.admin` sweep their accumulated trading-fee claim out of a pool. Transfers `admin_fees_owed_a` from `pool_a` to the admin's token-A account and `admin_fees_owed_b` from `pool_b` to the admin's token-B account, signed by `pool_authority`. Then resets both accumulators to zero. - Authorisation: enforced by Anchor's `has_one = admin` constraint on `config` plus the `Signer` constraint on `admin`. Calls from any other signer are rejected. -- The admin's token accounts (`admin_token_a`, `admin_token_b`) must already exist โ€” this handler doesn't auto-create them (keeps the example small). +- The admin's token accounts (`admin_token_a`, `admin_token_b`) must already exist - this handler doesn't auto-create them (keeps the example small). - Idempotent: calling again with the accumulators at zero is a successful no-op (transfers are skipped when owed = 0). ## Program flow: Alice, Bob, Carol, and Dave A worked example, end to end, using this program. The example uses three tokens: -- **NVDAx** โ€” an NVIDIA share (xStock), priced at ~5 USDC offchain. -- **TSLAx** โ€” a Tesla share (xStock), priced at ~180 USDC offchain. -- **USDC** โ€” a USD-pegged [stablecoin](https://www.investopedia.com/terms/s/stablecoin.asp) used as the quote currency in both pools. +- **NVDAx** - an NVIDIA share (xStock), priced at ~5 USDC offchain. +- **TSLAx** - a Tesla share (xStock), priced at ~180 USDC offchain. +- **USDC** - a USD-pegged [stablecoin](https://www.investopedia.com/terms/s/stablecoin.asp) used as the quote currency in both pools. **Cast:** -- **Alice** โ€” AMM operator. Deploys and runs the exchange. Earns a slice of every trading fee via the admin protocol-fee mechanism; also earns LP [yield](https://www.investopedia.com/terms/y/yield.asp) on her own initial deposits. Wants real usage so fee income compounds. She calls `create_config` to fix the trading fee at 0.3% and sets `admin_share_bps = 1667` so she earns ~1/6 of every trading fee (LPs keep the other ~5/6). She seeds both the NVDAx/USDC pool and the TSLAx/USDC pool herself (eating the locked `MINIMUM_LIQUIDITY` cost) so users have something to trade from day one. -- **Bob** โ€” yield farmer / [liquidity provider](https://www.investopedia.com/terms/l/liquidity-provider.asp). Has idle capital (NVDAx and USDC) earning nothing. Wants to earn [passive income](https://www.investopedia.com/terms/p/passiveincome.asp) from the swap fees the pool collects, without actively trading. -- **Carol** โ€” retail trader. Holds USDC and has a bullish [thesis](https://www.investopedia.com/terms/i/investmentthesis.asp) on NVIDIA: she believes NVDAx will appreciate. She wants to swap USDC for NVDAx quickly, without a centralised exchange account. She also later buys TSLAx on the TSLAx/USDC pool. -- **Dave** โ€” [arbitrageur](https://www.investopedia.com/terms/a/arbitrage.asp). Profits by trading the gap between the pool's mid-price and the offchain market price. Side effect: his trades drag the pool price back toward fair value. +- **Alice** - AMM operator. Deploys and runs the exchange. Earns a slice of every trading fee via the admin protocol-fee mechanism; also earns LP [yield](https://www.investopedia.com/terms/y/yield.asp) on her own initial deposits. Wants real usage so fee income compounds. She calls `create_config` to fix the trading fee at 0.3% and sets `admin_share_bps = 1667` so she earns ~1/6 of every trading fee (LPs keep the other ~5/6). She seeds both the NVDAx/USDC pool and the TSLAx/USDC pool herself (eating the locked `MINIMUM_LIQUIDITY` cost) so users have something to trade from day one. +- **Bob** - yield farmer / [liquidity provider](https://www.investopedia.com/terms/l/liquidity-provider.asp). Has idle capital (NVDAx and USDC) earning nothing. Wants to earn [passive income](https://www.investopedia.com/terms/p/passiveincome.asp) from the swap fees the pool collects, without actively trading. +- **Carol** - retail trader. Holds USDC and has a bullish [thesis](https://www.investopedia.com/terms/i/investmentthesis.asp) on NVIDIA: she believes NVDAx will appreciate. She wants to swap USDC for NVDAx quickly, without a centralised exchange account. She also later buys TSLAx on the TSLAx/USDC pool. +- **Dave** - [arbitrageur](https://www.investopedia.com/terms/a/arbitrage.asp). Profits by trading the gap between the pool's mid-price and the offchain market price. Side effect: his trades drag the pool price back toward fair value. -### Step 1 โ€” Alice creates the `Config` +### Step 1 - Alice creates the `Config` The singleton `Config` account is set once per deployed program. Every pool inherits its `fee` and `admin_share_bps`. - **Handler:** `create_config` - **Accounts (`CreateConfigAccounts`):** - - `config` (PDA, created) โ€” seeds `[b"config"]`; stores `admin`, `fee`, `admin_share_bps`, `bump` + - `config` (PDA, created) - seeds `[b"config"]`; stores `admin`, `fee`, `admin_share_bps`, `bump` - `admin` = Alice - `payer` = Alice - `system_program` -- **Args:** `fee = 30` (0.3%), `admin_share_bps = 1667` (Uniswap V2's classic 1/6 default โ€” Alice keeps 1/6 of the trading fee; LPs keep 5/6) +- **Args:** `fee = 30` (0.3%), `admin_share_bps = 1667` (Uniswap V2's classic 1/6 default - Alice keeps 1/6 of the trading fee; LPs keep 5/6) `Config` exists. No pools yet, no liquidity yet. -### Step 2 โ€” Alice creates the NVDAx/USDC pool +### Step 2 - Alice creates the NVDAx/USDC pool - **Handler:** `create_pool` - **Accounts (`CreatePoolAccounts`):** - - `config` โ€” Alice's `Config` - - `pool_config` (PDA, created) โ€” seeds `[config, mint_a, mint_b]`; stores `config`, `mint_a`, `mint_b`, `bump` - - `pool_authority` (PDA) โ€” signs for the pool reserves - - `liquidity_provider_mint` (created) โ€” the LP-token mint, authority = `pool_authority` + - `config` - Alice's `Config` + - `pool_config` (PDA, created) - seeds `[config, mint_a, mint_b]`; stores `config`, `mint_a`, `mint_b`, `bump` + - `pool_authority` (PDA) - signs for the pool reserves + - `liquidity_provider_mint` (created) - the LP-token mint, authority = `pool_authority` - `mint_a` = NVDAx mint, `mint_b` = USDC mint (with `mint_a < mint_b`) - - `pool_a`, `pool_b` (created, ATAs owned by `pool_authority`) โ€” the NVDAx and USDC reserves + - `pool_a`, `pool_b` (created, ATAs owned by `pool_authority`) - the NVDAx and USDC reserves - `payer` = Alice - token, ATA, system programs - **Args:** none NVDAx/USDC pool exists; reserves are empty. No one can swap yet. -### Step 2b โ€” Alice creates the TSLAx/USDC pool +### Step 2b - Alice creates the TSLAx/USDC pool Alice immediately creates a second pool for TSLAx (Tesla xStock, ~180 USDC each). The handler and account shape are identical to Step 2; only the mints differ. - **Handler:** `create_pool` - **Accounts (`CreatePoolAccounts`):** - - `config` โ€” Alice's `Config` (same singleton) - - `pool_config` (PDA, created) โ€” seeds `[config, mint_a, mint_b]`; stores `config`, `mint_a` = TSLAx mint, `mint_b` = USDC mint, `bump` - - `pool_authority` (PDA) โ€” signs for this pool's reserves - - `liquidity_provider_mint` (created) โ€” a separate LP-token mint for this pool + - `config` - Alice's `Config` (same singleton) + - `pool_config` (PDA, created) - seeds `[config, mint_a, mint_b]`; stores `config`, `mint_a` = TSLAx mint, `mint_b` = USDC mint, `bump` + - `pool_authority` (PDA) - signs for this pool's reserves + - `liquidity_provider_mint` (created) - a separate LP-token mint for this pool - `mint_a` = TSLAx mint, `mint_b` = USDC mint (with `mint_a < mint_b`) - - `pool_a`, `pool_b` (created, ATAs owned by `pool_authority`) โ€” the TSLAx and USDC reserves + - `pool_a`, `pool_b` (created, ATAs owned by `pool_authority`) - the TSLAx and USDC reserves - `payer` = Alice - token, ATA, system programs - **Args:** none @@ -213,7 +213,7 @@ Alice seeds the TSLAx/USDC pool with **1 TSLAx and 180 USDC** (a 1:180 ratio mat TSLAx/USDC pool state: **1 TSLAx, 180 USDC**. Mid-price = 180. Alice owns 100% of withdrawable LP supply on this pool. -### Step 3 โ€” Alice seeds initial liquidity in the NVDAx/USDC pool +### Step 3 - Alice seeds initial liquidity in the NVDAx/USDC pool Alice picks a 1:5 ratio so the NVDAx/USDC pool launches at ~5 USDC per NVDAx. She deposits **20 NVDAx and 100 USDC**. @@ -223,42 +223,42 @@ Alice picks a 1:5 ratio so the NVDAx/USDC pool launches at ~5 USDC per NVDAx. Sh - `depositor` = Alice (signer) - `mint_a`, `mint_b` - `pool_a`, `pool_b` (the pool's reserves) - - `liquidity_provider_token` โ€” Alice's LP-token ATA (created) - - `token_a` โ€” Alice's NVDAx ATA, `token_b` โ€” Alice's USDC ATA + - `liquidity_provider_token` - Alice's LP-token ATA (created) + - `token_a` - Alice's NVDAx ATA, `token_b` - Alice's USDC ATA - `payer` = Alice - token, ATA, system programs -- **Args:** `amount_a = 20`, `amount_b = 100`, `minimum_lp_tokens_out = 0` (initial deposit โ€” Alice is the only LP, no slippage risk; production code should still set a floor to guard against frontrun pool-creations) +- **Args:** `amount_a = 20`, `amount_b = 100`, `minimum_lp_tokens_out = 0` (initial deposit - Alice is the only LP, no slippage risk; production code should still set a floor to guard against frontrun pool-creations) Math: - LP tokens minted on the first deposit: `sqrt(20 ร— 100) = sqrt(2000) โ‰ˆ 44.72`. -- Minus the locked `MINIMUM_LIQUIDITY = 100` floor (base units โ€” negligible at major-unit scale). +- Minus the locked `MINIMUM_LIQUIDITY = 100` floor (base units - negligible at major-unit scale). - Alice receives ~44.72 LP tokens. The 100 base-unit dust is locked forever, owned by no one. Alice eats that cost as the price of bootstrapping. NVDAx/USDC pool state: **20 NVDAx, 100 USDC**. Mid-price = 5. Alice owns 100% of withdrawable LP supply on this pool. -### Step 4 โ€” Bob adds liquidity +### Step 4 - Bob adds liquidity At the current 1:5 ratio, Bob deposits **100 NVDAx and 500 USDC**. - **Handler:** `deposit_liquidity` - **Accounts:** same shape as Step 3, `depositor` = Bob -- **Args:** `amount_a = 100`, `amount_b = 500`, `minimum_lp_tokens_out = 223_000_000` (Bob quoted ~223.6 LP off-chain and is unwilling to accept less than ~223.0 if the pool shifts before his tx lands; units here are LP base units at the LP mint's decimals) +- **Args:** `amount_a = 100`, `amount_b = 500`, `minimum_lp_tokens_out = 223_000_000` (Bob quoted ~223.6 LP offchain and is unwilling to accept less than ~223.0 if the pool shifts before his tx lands; units here are LP base units at the LP mint's decimals) Math: subsequent deposits get `min(amount_a / pool_a, amount_b / pool_b) ร— current_lp_supply = min(100/20, 500/100) ร— 44.72 โ‰ˆ 223.6` LP tokens. NVDAx/USDC pool state: **120 NVDAx, 600 USDC**. LP supply ~268.32. Bob owns ~83%, Alice ~17%. -### Step 5 โ€” Carol buys NVDAx with USDC +### Step 5 - Carol buys NVDAx with USDC - **Handler:** `swap_tokens` - **Accounts (`SwapTokensAccounts`):** - - `config` โ€” for the fee + - `config` - for the fee - `pool_config`, `pool_authority` - `trader` = Carol (signer) - `mint_a`, `mint_b` - `pool_a`, `pool_b` (the pool's reserves) - - `token_a` โ€” Carol's NVDAx ATA (created if missing), `token_b` โ€” Carol's USDC ATA + - `token_a` - Carol's NVDAx ATA (created if missing), `token_b` - Carol's USDC ATA - `payer` = Carol - token, ATA, system programs - **Args:** `input_is_token_a = false` (input is token B = USDC), `input_amount = 11`, `min_output_amount = 1.9` @@ -267,19 +267,19 @@ Math (constant product, 0.3% fee from `Config.fee`, fee split per `Config.admin_ - Total fee on the input: `11 ร— 0.003 = 0.033 USDC`. - Fee split: - - Admin slice (`admin_share_bps = 1667`): `0.033 ร— 0.1667 โ‰ˆ 0.0055 USDC` โ€” added to `admin_fees_owed_b`. - - LP slice: `0.033 โˆ’ 0.0055 โ‰ˆ 0.0275 USDC` โ€” stays in the reserves, boosts LP yield. + - Admin slice (`admin_share_bps = 1667`): `0.033 ร— 0.1667 โ‰ˆ 0.0055 USDC` - added to `admin_fees_owed_b`. + - LP slice: `0.033 โˆ’ 0.0055 โ‰ˆ 0.0275 USDC` - stays in the reserves, boosts LP yield. - Input into the curve: `11 โˆ’ 0.033 = 10.967 USDC`. - Effective reserves before the trade: `effective_pool_a = 120`, `effective_pool_b = 600` (admin owes nothing yet). - New effective B: `600 + 10.967 = 610.967` (raw `pool_b.amount` is `611`, minus the new admin slice `0.0055`). - New effective A: `(120 ร— 600) / 610.967 โ‰ˆ 117.844`. - NVDAx out: `120 โˆ’ 117.844 โ‰ˆ 2.156`. -Carol gets ~2.156 NVDAx. Effective price ~5.10 USDC/NVDAx โ€” worse than mid-price because of the fee plus her own price impact. +Carol gets ~2.156 NVDAx. Effective price ~5.10 USDC/NVDAx - worse than mid-price because of the fee plus her own price impact. NVDAx/USDC pool state: **117.844 NVDAx, 611 USDC raw** (`admin_fees_owed_a = 0`, `admin_fees_owed_b โ‰ˆ 0.0055`). Mid-price on the effective reserves drifted up to ~5.18. -### Step 6 โ€” Dave arbitrages the NVDAx/USDC pool +### Step 6 - Dave arbitrages the NVDAx/USDC pool NVDAx still trades at 5.00 offchain; the NVDAx/USDC pool now says 5.18. There's a profitable trade: buy NVDAx offchain at 5.00, sell it into the pool at ~5.18. Dave does it. @@ -291,8 +291,8 @@ Math: - Total fee on the input: `2.15 ร— 0.003 โ‰ˆ 0.00645 NVDAx`. - Fee split: - - Admin slice: `0.00645 ร— 0.1667 โ‰ˆ 0.001075 NVDAx` โ€” added to `admin_fees_owed_a`. - - LP slice: `โ‰ˆ 0.005375 NVDAx` โ€” stays in the reserves. + - Admin slice: `0.00645 ร— 0.1667 โ‰ˆ 0.001075 NVDAx` - added to `admin_fees_owed_a`. + - LP slice: `โ‰ˆ 0.005375 NVDAx` - stays in the reserves. - Input into the curve: `2.15 โˆ’ 0.00645 โ‰ˆ 2.14355 NVDAx`. - Effective reserves before the trade: `effective_pool_a = 117.844` (no A-side admin claim yet), `effective_pool_b โ‰ˆ 611 โˆ’ 0.0055 โ‰ˆ 610.9945`. - New effective A: `117.844 + 2.14355 โ‰ˆ 119.9876`. @@ -301,21 +301,21 @@ Math: Dave paid ~10.75 USDC offchain for 2.15 NVDAx, sold into the pool for ~10.92 USDC. Profit ~0.17 USDC, minus gas. -NVDAx/USDC pool state: **119.987 NVDAx, 600.07 USDC raw**, with `admin_fees_owed_a โ‰ˆ 0.001075` and `admin_fees_owed_b โ‰ˆ 0.0055`. Mid-price on the effective reserves back to ~5.00 โ€” *because* that's the price at which Dave's profit hit zero and he stopped. +NVDAx/USDC pool state: **119.987 NVDAx, 600.07 USDC raw**, with `admin_fees_owed_a โ‰ˆ 0.001075` and `admin_fees_owed_b โ‰ˆ 0.0055`. Mid-price on the effective reserves back to ~5.00 - *because* that's the price at which Dave's profit hit zero and he stopped. -### Step 7 โ€” Carol buys TSLAx with USDC +### Step 7 - Carol buys TSLAx with USDC Separately, Carol decides to add TSLAx exposure on top of her NVDAx purchase. She swaps USDC for TSLAx on the TSLAx/USDC pool Alice created in Step 2b. - **Handler:** `swap_tokens` - **Accounts (`SwapTokensAccounts`):** - - `config` โ€” the same singleton `Config` (fee and admin_share_bps apply to all pools) - - `pool_config` โ€” the TSLAx/USDC `PoolConfig` PDA - - `pool_authority` โ€” the TSLAx/USDC pool authority PDA + - `config` - the same singleton `Config` (fee and admin_share_bps apply to all pools) + - `pool_config` - the TSLAx/USDC `PoolConfig` PDA + - `pool_authority` - the TSLAx/USDC pool authority PDA - `trader` = Carol (signer) - `mint_a` = TSLAx mint, `mint_b` = USDC mint - - `pool_a`, `pool_b` โ€” the TSLAx/USDC reserves (1 TSLAx, 180 USDC after Alice's seed deposit) - - `token_a` โ€” Carol's TSLAx ATA (created if missing), `token_b` โ€” Carol's USDC ATA + - `pool_a`, `pool_b` - the TSLAx/USDC reserves (1 TSLAx, 180 USDC after Alice's seed deposit) + - `token_a` - Carol's TSLAx ATA (created if missing), `token_b` - Carol's USDC ATA - `payer` = Carol - token, ATA, system programs - **Args:** `input_is_token_a = false` (input is token B = USDC), `input_amount = 180`, `min_output_amount = 0.9` @@ -324,39 +324,39 @@ Math (constant product, same 0.3% fee and 1667 bps admin share): - Total fee on the input: `180 ร— 0.003 = 0.54 USDC`. - Fee split: - - Admin slice: `0.54 ร— 0.1667 โ‰ˆ 0.09 USDC` โ€” added to `admin_fees_owed_b` on this pool. - - LP slice: `0.54 โˆ’ 0.09 โ‰ˆ 0.45 USDC` โ€” stays in the TSLAx/USDC reserves. + - Admin slice: `0.54 ร— 0.1667 โ‰ˆ 0.09 USDC` - added to `admin_fees_owed_b` on this pool. + - LP slice: `0.54 โˆ’ 0.09 โ‰ˆ 0.45 USDC` - stays in the TSLAx/USDC reserves. - Input into the curve: `180 โˆ’ 0.54 = 179.46 USDC`. - Effective reserves before the trade: `effective_pool_a = 1 TSLAx`, `effective_pool_b = 180 USDC`. - New effective B: `180 + 179.46 = 359.46` (raw `pool_b.amount` โ‰ˆ `360`, minus the new admin slice `โ‰ˆ 0.09`). - New effective A: `(1 ร— 180) / 359.46 โ‰ˆ 0.5008`. - TSLAx out: `1 โˆ’ 0.5008 โ‰ˆ 0.4992`. -Carol gets ~0.4992 TSLAx. The large price impact (~50% of the pool's TSLAx reserve) reflects the shallow pool depth at this early stage โ€” in a real deployment, Alice would seed the pool with more liquidity to reduce price impact for traders of this size. +Carol gets ~0.4992 TSLAx. The large price impact (~50% of the pool's TSLAx reserve) reflects the shallow pool depth at this early stage - in a real deployment, Alice would seed the pool with more liquidity to reduce price impact for traders of this size. TSLAx/USDC pool state: **~0.5008 TSLAx, ~360 USDC raw** (`admin_fees_owed_b โ‰ˆ 0.09`). Mid-price on the effective reserves has roughly doubled to ~358 USDC per TSLAx, illustrating why deep liquidity matters for minimising price impact. -### Step 8 โ€” Alice claims her admin fees +### Step 8 - Alice claims her admin fees After trading activity on both pools, Alice sweeps her accumulated slice from the NVDAx/USDC pool. - **Handler:** `claim_admin_fees` - **Accounts (`ClaimAdminFeesAccounts`):** - - `config` โ€” Alice's `Config` (the `has_one = admin` constraint enforces that only she can call this) + - `config` - Alice's `Config` (the `has_one = admin` constraint enforces that only she can call this) - `pool_config`, `pool_authority` - `mint_a`, `mint_b` - - `pool_a`, `pool_b` (the pool's reserves โ€” the source of the transfers) + - `pool_a`, `pool_b` (the pool's reserves - the source of the transfers) - `admin` = Alice (signer) - - `admin_token_a` โ€” Alice's NVDAx ATA (must already exist) - - `admin_token_b` โ€” Alice's USDC ATA (must already exist) + - `admin_token_a` - Alice's NVDAx ATA (must already exist) + - `admin_token_b` - Alice's USDC ATA (must already exist) - `token_program` - **Args:** none -She receives her accumulated `admin_fees_owed_a` of NVDAx and `admin_fees_owed_b` of USDC from the NVDAx/USDC pool. Both accumulators reset to zero on the same instruction. From this example's two swaps that's only `~0.001075 NVDAx` and `~0.0055 USDC` โ€” small, because the fee is small and only two trades have happened, but real volume would compound it. She can call `claim_admin_fees` again against the TSLAx/USDC pool (same handler, different `pool_config`) to sweep her ~0.09 USDC slice from Carol's TSLAx trade. +She receives her accumulated `admin_fees_owed_a` of NVDAx and `admin_fees_owed_b` of USDC from the NVDAx/USDC pool. Both accumulators reset to zero on the same instruction. From this example's two swaps that's only `~0.001075 NVDAx` and `~0.0055 USDC` - small, because the fee is small and only two trades have happened, but real volume would compound it. She can call `claim_admin_fees` again against the TSLAx/USDC pool (same handler, different `pool_config`) to sweep her ~0.09 USDC slice from Carol's TSLAx trade. NVDAx/USDC pool state: **119.986 NVDAx, 600.065 USDC raw**, with `admin_fees_owed_a = 0` and `admin_fees_owed_b = 0`. -### Step 9 โ€” Bob withdraws +### Step 9 - Bob withdraws Later on, Bob exits. @@ -375,7 +375,7 @@ He receives his proportional share of the **effective reserves** (`pool_X.amount - **Alice** calls `claim_admin_fees` on NVDAx/USDC, then `claim_admin_fees` on TSLAx/USDC (sweeps her accumulated fee slices from both pools) - **Bob** later calls `withdraw_liquidity` on NVDAx/USDC (exits with his fee income) -What makes this work: `x ร— y = K` on the effective reserves keeps the pool solvent on every swap without anyone quoting prices. LPs are paid in growing effective reserves (their share of the fee, parameterised by `Config.fee` and `Config.admin_share_bps`); the admin earns the other share, accumulated lazily and swept on demand; profit-chasing arbitrageurs incidentally keep the mid-price honest; traders get instant fills against a passive counterparty (the pool). The same `create_pool` handler and the same `swap_tokens` handler work identically for both the NVDAx/USDC and TSLAx/USDC pools โ€” only the mint accounts differ. +What makes this work: `x ร— y = K` on the effective reserves keeps the pool solvent on every swap without anyone quoting prices. LPs are paid in growing effective reserves (their share of the fee, parameterised by `Config.fee` and `Config.admin_share_bps`); the admin earns the other share, accumulated lazily and swept on demand; profit-chasing arbitrageurs incidentally keep the mid-price honest; traders get instant fills against a passive counterparty (the pool). The same `create_pool` handler and the same `swap_tokens` handler work identically for both the NVDAx/USDC and TSLAx/USDC pools - only the mint accounts differ. ## Tests diff --git a/finance/token-swap/anchor/Anchor.toml b/finance/token-swap/anchor/Anchor.toml index 8cc67cb9..43d123db 100644 --- a/finance/token-swap/anchor/Anchor.toml +++ b/finance/token-swap/anchor/Anchor.toml @@ -8,7 +8,6 @@ skip-lint = false [programs.devnet] swap_example = "AsGVFxWqEn8icRBFQApxJe68x3r9zvfSbmiEzYFATGYn" -# [registry] section removed โ€” no longer used in Anchor 1.0 [provider] cluster = "localnet" diff --git a/finance/token-swap/anchor/programs/token-swap/src/errors.rs b/finance/token-swap/anchor/programs/token-swap/src/errors.rs index 69d67a63..58c52044 100644 --- a/finance/token-swap/anchor/programs/token-swap/src/errors.rs +++ b/finance/token-swap/anchor/programs/token-swap/src/errors.rs @@ -74,7 +74,7 @@ pub enum AmmError { // Returned by `create_pool` when `mint_a >= mint_b`. Requiring a strict // ascending order ensures each (mint_a, mint_b) pair has exactly one - // canonical pool PDA โ€” without it, a (X, Y) pool and a (Y, X) pool would + // canonical pool PDA - without it, a (X, Y) pool and a (Y, X) pool would // both be valid, fragmenting liquidity. #[msg("mint_a must be less than mint_b for canonical pool ordering")] InvalidMintOrder, diff --git a/finance/token-swap/anchor/programs/token-swap/src/instructions/deposit_liquidity.rs b/finance/token-swap/anchor/programs/token-swap/src/instructions/deposit_liquidity.rs index d894414c..a6d97ff2 100644 --- a/finance/token-swap/anchor/programs/token-swap/src/instructions/deposit_liquidity.rs +++ b/finance/token-swap/anchor/programs/token-swap/src/instructions/deposit_liquidity.rs @@ -53,14 +53,14 @@ pub fn handle_deposit_liquidity( // is scaled down to match the current price. This mirrors Uniswap V2's // `mint()` pattern (UniswapV2Router._addLiquidity): try the first side at // its requested amount, compute what the other side needs at the current - // ratio, and if it fits we're done โ€” otherwise swap roles and try the + // ratio, and if it fits we're done - otherwise swap roles and try the // other side. // // We use the *effective* (LP-claimable) reserves, not the raw vault // balances, so the admin's accumulated fees don't drag the deposit ratio // off the LP-relevant price. // - // All ratio math is in u128 with checked arithmetic โ€” no floats for + // All ratio math is in u128 with checked arithmetic - no floats for // money. The intermediate `amount_a * pool_b` can overflow u64 (both // factors are u64), but u128 absorbs that with room to spare. let pool_a = &context.accounts.pool_a; @@ -123,9 +123,15 @@ pub fn handle_deposit_liquidity( // LP-mint math. Two branches: // - Initial deposit (pool creation): `liquidity = sqrt(a * b) - MINIMUM_LIQUIDITY`. - // One-time bootstrap; the `MINIMUM_LIQUIDITY` floor is locked - // forever and prevents the first depositor from later draining the - // pool to a sub-base-unit ratio. + // The `MINIMUM_LIQUIDITY` floor is never minted to anyone: the first + // depositor receives `sqrt(a * b) - MINIMUM_LIQUIDITY` LP tokens, and + // withdraw_liquidity adds the floor back into its supply denominator, + // so the floor's share of the reserves stays in the pool, claimable by + // nobody while any LP supply exists. This stops the first depositor + // from draining the pool to a sub-minor-unit ratio. (Uniswap V2 + // instead mints the floor to the zero address; here, if every LP + // token is burned, the floor's leftover reserves simply seed the next + // bootstrap deposit.) // - Subsequent deposit: `liquidity = min(a * supply / pool_a, b * supply / pool_b)`. // This is the canonical Uniswap V2 formula: mint LP tokens in // proportion to the depositor's share of each reserve, taking the diff --git a/finance/token-swap/anchor/programs/token-swap/src/instructions/swap_tokens.rs b/finance/token-swap/anchor/programs/token-swap/src/instructions/swap_tokens.rs index 11c35961..6cf30340 100644 --- a/finance/token-swap/anchor/programs/token-swap/src/instructions/swap_tokens.rs +++ b/finance/token-swap/anchor/programs/token-swap/src/instructions/swap_tokens.rs @@ -51,7 +51,7 @@ pub fn handle_swap_tokens( .ok_or(AmmError::MathOverflow)?; // Narrow back to u64 for storage / transfer. The fee can never exceed // `input` (`fee_amount <= input * 9999 / 10_000 < input`, and `input` - // is u64), so the cast is safe โ€” but use try_into anyway to make the + // is u64), so the cast is safe - but use try_into anyway to make the // invariant explicit in the type system. let fee_amount: u64 = u64::try_from(fee_amount).map_err(|_| AmmError::MathOverflow)?; let admin_portion: u64 = @@ -88,7 +88,7 @@ pub fn handle_swap_tokens( // u128 + checked: the numerator `taxed_input * reserve` can fill the // full u128 (both factors are u64). Multiply before divide to keep // precision. Floor on the divide is protocol-favouring (the pool keeps - // sub-base-unit rounding, the trader gets slightly less output) โ€” same + // sub-base-unit rounding, the trader gets slightly less output) - same // direction as Uniswap V2. let (this_reserve, other_reserve) = if input_is_token_a { (effective_pool_a, effective_pool_b) @@ -213,7 +213,7 @@ pub fn handle_swap_tokens( authority: context.accounts.trader.to_account_info(), }, ), - output, + input_amount, context.accounts.mint_b.decimals, )?; } @@ -229,7 +229,7 @@ pub fn handle_swap_tokens( // Verify the invariant still holds on the LP-claimable (effective) // reserves. This is THE most important defensive check: it catches // "I screwed up the swap math and accidentally gave the user too much" - // bugs that no other test would catch. Defence in depth โ€” runs *after* + // bugs that no other test would catch. Defence in depth - runs *after* // the math (and after the transfers, once balances have been reloaded). // // We tolerate the new invariant being higher because it means a diff --git a/finance/token-swap/anchor/programs/token-swap/src/instructions/withdraw_liquidity.rs b/finance/token-swap/anchor/programs/token-swap/src/instructions/withdraw_liquidity.rs index f587c58d..db8ef01e 100644 --- a/finance/token-swap/anchor/programs/token-swap/src/instructions/withdraw_liquidity.rs +++ b/finance/token-swap/anchor/programs/token-swap/src/instructions/withdraw_liquidity.rs @@ -51,7 +51,7 @@ pub fn handle_withdraw_liquidity( // The `+ MINIMUM_LIQUIDITY` accounts for the bootstrap floor that was // locked away on the first deposit and is *not* part of the LP supply // counter (mint::supply doesn't include it) but *is* part of the - // reserves โ€” so the divisor needs the same adjustment to keep shares + // reserves - so the divisor needs the same adjustment to keep shares // honest. // // u128 + checked: `lp_amount * reserve` can fill the full u128 (both diff --git a/finance/token-swap/anchor/programs/token-swap/src/state/pool_config.rs b/finance/token-swap/anchor/programs/token-swap/src/state/pool_config.rs index 60b8867c..d39a93e5 100644 --- a/finance/token-swap/anchor/programs/token-swap/src/state/pool_config.rs +++ b/finance/token-swap/anchor/programs/token-swap/src/state/pool_config.rs @@ -5,7 +5,7 @@ use anchor_lang::prelude::*; /// Holds the metadata that identifies a single pool: which `Config` it belongs /// to, which two mints it trades, and its canonical bump. The actual pool /// reserves live in separate token accounts (`pool_a`, `pool_b`) owned by the -/// pool authority PDA โ€” they are not stored here. This struct is the pool's +/// pool authority PDA - they are not stored here. This struct is the pool's /// *configuration*, not its state. /// /// In addition to the identity fields, this account tracks the admin's diff --git a/finance/token-swap/anchor/programs/token-swap/tests/test_swap.rs b/finance/token-swap/anchor/programs/token-swap/tests/test_swap.rs index a0adb092..531b109b 100644 --- a/finance/token-swap/anchor/programs/token-swap/tests/test_swap.rs +++ b/finance/token-swap/anchor/programs/token-swap/tests/test_swap.rs @@ -802,7 +802,7 @@ fn deposit_ix(ts: &TestSetup, amount_a: u64, amount_b: u64) -> Instruction { /// care about the success payload (`Ok` only signals "tx landed"), and the /// concrete error type is `solana_kite::SolanaKiteError`. Returning a /// `Result<(), String>` keeps tests insulated from the kite crate's error -/// type โ€” they just need success/failure plus a message for `.expect()`. +/// type - they just need success/failure plus a message for `.expect()`. fn send_deposit(ts: &mut TestSetup, amount_a: u64, amount_b: u64) -> Result<(), String> { let ix = deposit_ix(ts, amount_a, amount_b); send_transaction_from_instructions( @@ -1018,7 +1018,7 @@ fn test_deposit_after_swap_uses_shifted_effective_ratio() { let used_a = holder_a_before - holder_a_after; let used_b = holder_b_before - holder_b_after; assert_eq!(used_b, deposit_b, "amount_b should be fully used"); - // used_a must be close to deposit_a โ€” never the unbounded raw value + // used_a must be close to deposit_a - never the unbounded raw value // (deposit_a + 10). If the bug were still here we'd see something // wildly off (or a transaction failure on transfer_checked). assert!( @@ -1036,7 +1036,7 @@ fn test_deposit_after_swap_uses_shifted_effective_ratio() { fn test_deposit_too_small_for_ratio_reverts() { let mut ts = full_setup(); - // Seed at 4M:1M (A is "cheaper" โ€” 4 A per 1 B). To force amount_b to + // Seed at 4M:1M (A is "cheaper" - 4 A per 1 B). To force amount_b to // round down to zero, the depositor must offer < 4 base units of A // (so amount_b_required = amount_a * 1M / 4M = 0). We offer 1 base unit // of A and a large amount_b. @@ -1282,7 +1282,7 @@ fn test_swap_reverts_when_output_below_min() { // Reset and try the same swap with `min_output_amount = actual + 1`. It // must revert because the pool can't beat the previous output (in fact - // it can't even match it โ€” the first swap shifted the ratio). + // it can't even match it - the first swap shifted the ratio). let mut ts = full_setup(); send_deposit(&mut ts, 4_000_000, 1_000_000).expect("seed"); let too_high = actual_output + 1; @@ -1320,7 +1320,7 @@ fn test_deposit_reverts_when_lp_below_min() { let lp_from_b = (1_000_000u128 * lp_supply as u128) / pool_b_amount as u128; let achievable_lp = lp_from_a.min(lp_from_b) as u64; - // Require *strictly more* than that โ€” the deposit must revert. + // Require *strictly more* than that - the deposit must revert. let strict_ix = deposit_ix_with_min_lp(&ts, 4_000_000, 1_000_000, achievable_lp + 1); let result = send_transaction_from_instructions( @@ -1357,7 +1357,7 @@ fn test_withdraw_reverts_when_below_min() { // Burning half the LP at a 4M:4M pool returns ~2M of each side, but the // exact amount is `lp/2 * 4_000_000 / (lp_supply + MINIMUM_LIQUIDITY)`. - // Demand 4M of A out of a half-burn โ€” clearly impossible, must revert. + // Demand 4M of A out of a half-burn - clearly impossible, must revert. let strict_ix = withdraw_ix_with_min(&ts, lp / 2, 4_000_000, 0); let result = send_transaction_from_instructions( &mut ts.svm, @@ -1387,7 +1387,7 @@ fn test_withdraw_reverts_when_below_min() { } /// Slippage test: passing `min_output_amount = 0` is the explicit -/// "I accept any non-zero output" signal โ€” this is the documented escape +/// "I accept any non-zero output" signal - this is the documented escape /// hatch and must still succeed. #[test] fn test_swap_with_zero_min_output_still_succeeds() { @@ -1407,10 +1407,136 @@ fn test_swap_with_zero_min_output_still_succeeds() { assert!(after_b > before_b, "B balance should increase"); } +/// Helper: build a `swap_tokens` ix that trades token B in for token A. +fn swap_b_to_a_ix(ts: &TestSetup, input_amount: u64, min_output_amount: u64) -> Instruction { + Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::SwapTokens { + input_is_token_a: false, + input_amount, + min_output_amount, + } + .data(), + swap_example::accounts::SwapTokensAccountConstraints { + config: ts.config_key, + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + trader: ts.admin.pubkey(), + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +/// Bโ†’A regression test: the trader must pay the pool exactly `input_amount` +/// of token B, not some other quantity. This pins the trader-to-pool transfer +/// amount in the `input_is_token_a = false` branch, which once shipped a +/// wrong-variable bug (it transferred `output` of token B instead of +/// `input_amount`, so the trader underpaid for every Bโ†’A swap). +#[test] +fn test_swap_b_to_a_trader_pays_full_input() { + let mut ts = full_setup(); + // Seed at 4:1 so the B side is the scarce asset and a Bโ†’A swap returns a + // multiple of its input in A. + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("seed"); + + let holder_a_before = get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + let holder_b_before = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + let pool_a_before = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_before = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + + let input_amount = 100_000u64; + let swap_ix = swap_b_to_a_ix(&ts, input_amount, 1); + send_transaction_from_instructions( + &mut ts.svm, + vec![swap_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .expect("Bโ†’A swap should succeed"); + + let holder_a_after = get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + let holder_b_after = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + let pool_a_after = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_after = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + + // The trader pays exactly input_amount of B... + assert_eq!( + holder_b_before - holder_b_after, + input_amount, + "trader must pay the pool the full input_amount of token B" + ); + assert_eq!( + pool_b_after - pool_b_before, + input_amount, + "pool must receive the full input_amount of token B" + ); + + // ...and receives a positive amount of A, conserved against the pool. + let output = holder_a_after - holder_a_before; + assert!(output > 0, "trader should receive token A"); + assert_eq!( + pool_a_before - pool_a_after, + output, + "token A out of the pool must equal token A received by the trader" + ); +} + +/// Bโ†’A invariant test: after a fee-paying Bโ†’A swap, the effective +/// (LP-claimable) `k = x * y` must not decrease. Run alongside the Aโ†’B +/// variant so both directions of the symmetric flow are exercised. +#[test] +fn test_invariant_holds_after_b_to_a_swap() { + let mut ts = full_setup(); + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("seed"); + + let pool_a_before = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_before = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + let k_before = (pool_a_before as u128) * (pool_b_before as u128); + + let swap_ix = swap_b_to_a_ix(&ts, 100_000, 1); + send_transaction_from_instructions( + &mut ts.svm, + vec![swap_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .expect("Bโ†’A swap should succeed"); + + let pool_a_after = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_after = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + // The swap input was on the B side, so the admin fee accrued on B. + // PoolConfig layout: 8 (discriminator) + 32*3 (config, mint_a, mint_b) + // + 8 (admin_fees_owed_a) โ†’ admin_fees_owed_b starts at byte 112. + let admin_owed_b: u64 = { + let account = ts.svm.get_account(&ts.pool_config_key).unwrap(); + let start = 8 + 32 * 3 + 8; + u64::from_le_bytes(account.data[start..start + 8].try_into().unwrap()) + }; + let effective_a_after = pool_a_after; + let effective_b_after = pool_b_after - admin_owed_b; + let k_after = (effective_a_after as u128) * (effective_b_after as u128); + + assert!( + k_after >= k_before, + "effective invariant must not decrease across a Bโ†’A swap: \ + before={k_before}, after={k_after}" + ); +} + /// Invariant-check test: a normal swap leaves the effective `k = x * y` /// at least as high as before (LP fee adds to LP-claimable reserves; admin /// slice is excluded). This is the runtime guard that catches "the math -/// gave away too much" bugs โ€” verify the happy path doesn't trip it. +/// gave away too much" bugs - verify the happy path doesn't trip it. #[test] fn test_invariant_holds_after_normal_swap() { let mut ts = full_setup(); diff --git a/finance/token-swap/quasar/Cargo.toml b/finance/token-swap/quasar/Cargo.toml index ac95c368..23000d57 100644 --- a/finance/token-swap/quasar/Cargo.toml +++ b/finance/token-swap/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-token-swap" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/finance/token-swap/quasar/src/instructions/claim_admin_fees.rs b/finance/token-swap/quasar/src/instructions/claim_admin_fees.rs index 7c83f4c8..5dd9f5dc 100644 --- a/finance/token-swap/quasar/src/instructions/claim_admin_fees.rs +++ b/finance/token-swap/quasar/src/instructions/claim_admin_fees.rs @@ -19,7 +19,7 @@ pub struct ClaimAdminFeesAccounts { address = PoolPda::seeds(config.address(), mint_a.address(), mint_b.address()), )] pub pool_config: Account, - /// Pool authority PDA โ€” signs the outbound transfers. + /// Pool authority PDA - signs the outbound transfers. #[account(address = PoolAuthorityPda::seeds(config.address(), mint_a.address(), mint_b.address()))] pub pool_authority: UncheckedAccount, pub mint_a: Account, diff --git a/finance/token-swap/quasar/src/instructions/create_config.rs b/finance/token-swap/quasar/src/instructions/create_config.rs index a5e7101d..32a333d0 100644 --- a/finance/token-swap/quasar/src/instructions/create_config.rs +++ b/finance/token-swap/quasar/src/instructions/create_config.rs @@ -4,7 +4,7 @@ use { }; /// `Config` is a global singleton: one account per deployed program, derived -/// at the fixed seed `b"config"`. There is no `id` parameter โ€” calling this +/// at the fixed seed `b"config"`. There is no `id` parameter - calling this /// twice for the same program will fail because the account already exists. #[derive(Accounts)] pub struct CreateConfigAccounts { diff --git a/finance/token-swap/quasar/src/instructions/create_pool.rs b/finance/token-swap/quasar/src/instructions/create_pool.rs index 1d37907d..55b46ae9 100644 --- a/finance/token-swap/quasar/src/instructions/create_pool.rs +++ b/finance/token-swap/quasar/src/instructions/create_pool.rs @@ -13,7 +13,7 @@ use { /// - `liquidity_provider_mint = [b"liquidity", config, mint_a, mint_b]` /// /// `pool_authority` and `liquidity_provider_mint` derive at different -/// on-chain addresses than the Anchor sibling because `#[derive(Seeds)]` +/// onchain addresses than the Anchor sibling because `#[derive(Seeds)]` /// emits the literal prefix first. Internally consistent within this program. #[derive(Accounts)] pub struct CreatePoolAccounts { @@ -26,12 +26,12 @@ pub struct CreatePoolAccounts { address = PoolPda::seeds(config.address(), mint_a.address(), mint_b.address()), )] pub pool_config: Account, - /// Pool authority PDA โ€” signs for pool token operations. + /// Pool authority PDA - signs for pool token operations. #[account( address = PoolAuthorityPda::seeds(config.address(), mint_a.address(), mint_b.address()), )] pub pool_authority: UncheckedAccount, - /// Liquidity token mint โ€” created at a PDA. + /// Liquidity token mint - created at a PDA. #[account( mut, init, diff --git a/finance/token-swap/quasar/src/lib.rs b/finance/token-swap/quasar/src/lib.rs index ba3271de..4403c418 100644 --- a/finance/token-swap/quasar/src/lib.rs +++ b/finance/token-swap/quasar/src/lib.rs @@ -32,7 +32,7 @@ pub const LIQUIDITY_SEED: &[u8] = b"liquidity"; #[seeds(b"config")] pub struct ConfigPda; -/// `PoolConfig` PDA at seeds = [config, mint_a, mint_b] โ€” no string prefix. +/// `PoolConfig` PDA at seeds = [config, mint_a, mint_b] - no string prefix. #[derive(Seeds)] #[seeds(b"", config: Address, mint_a: Address, mint_b: Address)] pub struct PoolPda; @@ -41,8 +41,8 @@ pub struct PoolPda; /// Modelled with prefix b"authority" + the three Address args; the /// rendered slice list ends up [config, mint_a, mint_b, b"authority"] when /// you use `with_bump`. Note: the new \`#[seeds]\` puts the literal -/// prefix first, so the on-chain derivation order is -/// [b"authority", config, mint_a, mint_b] โ€” different from the original +/// prefix first, so the onchain derivation order is +/// [b"authority", config, mint_a, mint_b] - different from the original /// Anchor scheme. Programs are independent so this is consistent and /// correct on its own; the addresses just won't match the Anchor copy. #[derive(Seeds)] @@ -57,13 +57,13 @@ pub struct LiquidityMintPda; /// Simple constant-product AMM (token swap). /// /// Six instructions: -/// 1. `create_config` โ€” initialise the singleton AMM config (admin, fee, +/// 1. `create_config` - initialise the singleton AMM config (admin, fee, /// admin share) -/// 2. `create_pool` โ€” create a liquidity pool for a token pair -/// 3. `deposit_liquidity` โ€” add liquidity and receive LP tokens -/// 4. `withdraw_liquidity` โ€” burn LP tokens and receive pool tokens -/// 5. `swap_tokens` โ€” swap one token for another -/// 6. `claim_admin_fees` โ€” admin sweeps accumulated fee slice from a pool +/// 2. `create_pool` - create a liquidity pool for a token pair +/// 3. `deposit_liquidity` - add liquidity and receive LP tokens +/// 4. `withdraw_liquidity` - burn LP tokens and receive pool tokens +/// 5. `swap_tokens` - swap one token for another +/// 6. `claim_admin_fees` - admin sweeps accumulated fee slice from a pool #[program] mod quasar_token_swap { use super::*; diff --git a/finance/token-swap/quasar/src/state.rs b/finance/token-swap/quasar/src/state.rs index 0c6f83e4..7b4871ff 100644 --- a/finance/token-swap/quasar/src/state.rs +++ b/finance/token-swap/quasar/src/state.rs @@ -25,7 +25,7 @@ pub struct Config { /// /// Holds the metadata that identifies a single pool: which `Config` it belongs /// to and which two mints it trades. The actual pool reserves live in separate -/// token accounts (`pool_a`, `pool_b`) owned by the pool authority PDA โ€” they +/// token accounts (`pool_a`, `pool_b`) owned by the pool authority PDA - they /// are not stored here. This struct is the pool's *configuration*, not its /// state. /// diff --git a/finance/token-swap/quasar/src/tests.rs b/finance/token-swap/quasar/src/tests.rs index ddc0989a..b821ce01 100644 --- a/finance/token-swap/quasar/src/tests.rs +++ b/finance/token-swap/quasar/src/tests.rs @@ -354,7 +354,7 @@ fn setup_pool() -> PoolEnv { ); assert!(r.is_ok(), "setup_pool/create_config: {:?}", r.raw_result); - // Pre-populate mint accounts (no on-chain minting needed for tests). + // Pre-populate mint accounts (no onchain minting needed for tests). let mint_a = Pubkey::new_unique(); let mint_b = Pubkey::new_unique(); svm.set_account(test_mint(mint_a, 6)); @@ -368,7 +368,7 @@ fn setup_pool() -> PoolEnv { let pool_a = Pubkey::new_unique(); let pool_b = Pubkey::new_unique(); - // create_pool โ€” pass empty PDA slots (pool_config, lp_mint) and signer + // create_pool - pass empty PDA slots (pool_config, lp_mint) and signer // slots for non-PDA token accounts (pool_a, pool_b). The SVM commits // all accounts from the merged list, so every new account must appear here. let r = svm.process_instruction( @@ -404,7 +404,7 @@ fn do_deposit(env: &mut PoolEnv, amount_a: u64, amount_b: u64) -> (Pubkey, Pubke env.svm.set_account(ta); env.svm.set_account(tb); - // LP token account will be created by init(idempotent) โ€” pass as signer + // LP token account will be created by init(idempotent) - pass as signer // because system::create_account CPI requires the new account to sign. let lp_token = Pubkey::new_unique(); @@ -423,7 +423,7 @@ fn do_deposit(env: &mut PoolEnv, amount_a: u64, amount_b: u64) -> (Pubkey, Pubke } // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -// Tests โ€” create_config (existing) +// Tests - create_config (existing) // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• #[test] @@ -502,7 +502,7 @@ fn test_create_config_invalid_admin_share() { } // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -// Tests โ€” create_pool +// Tests - create_pool // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• #[test] @@ -518,7 +518,7 @@ fn test_create_pool() { } // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -// Tests โ€” deposit_liquidity +// Tests - deposit_liquidity // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• #[test] @@ -593,7 +593,7 @@ fn test_deposit_insufficient_funds_rejected() { } // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -// Tests โ€” withdraw_liquidity +// Tests - withdraw_liquidity // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• #[test] @@ -638,7 +638,7 @@ fn test_withdraw_liquidity() { } // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -// Tests โ€” swap_tokens +// Tests - swap_tokens // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• #[test] @@ -729,7 +729,7 @@ fn test_swap_slippage_rejected() { } // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -// Tests โ€” claim_admin_fees +// Tests - claim_admin_fees // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• #[test] diff --git a/finance/vault-strategy/anchor/tests/vault_strategy.rs b/finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs similarity index 100% rename from finance/vault-strategy/anchor/tests/vault_strategy.rs rename to finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs diff --git a/scripts/generate-quasar-readmes.mjs b/scripts/generate-quasar-readmes.mjs index 6214fae9..acbbaf6c 100644 --- a/scripts/generate-quasar-readmes.mjs +++ b/scripts/generate-quasar-readmes.mjs @@ -156,93 +156,93 @@ const examples = { concepts: ["Token transfer CPI", "Associated token accounts"], }, "tokens/token-extensions/basics/quasar": { - title: "Token Extensions โ€” Basics", + title: "Token Extensions - Basics", purpose: "Mint and transfer with the [Token Extensions Program](https://solana.com/docs/terminology#token-extensions-program).", concepts: ["Extension mints", "Token Extensions CPI"], }, "tokens/token-extensions/cpi-guard/quasar": { - title: "Token Extensions โ€” CPI Guard", + title: "Token Extensions - CPI Guard", purpose: "Block certain token actions inside CPI contexts.", concepts: ["CPI Guard extension"], }, "tokens/token-extensions/default-account-state/quasar": { - title: "Token Extensions โ€” Default Account State", + title: "Token Extensions - Default Account State", purpose: "New token accounts frozen by default until thawed.", concepts: ["Default account state extension"], }, "tokens/token-extensions/group/quasar": { - title: "Token Extensions โ€” Group Pointer", + title: "Token Extensions - Group Pointer", purpose: "Link mints to a group via Group Pointer.", concepts: ["Group pointer extension"], }, "tokens/token-extensions/immutable-owner/quasar": { - title: "Token Extensions โ€” Immutable Owner", + title: "Token Extensions - Immutable Owner", purpose: "Token accounts with an immutable owner field.", concepts: ["Immutable owner extension"], }, "tokens/token-extensions/interest-bearing/quasar": { - title: "Token Extensions โ€” Interest Bearing", + title: "Token Extensions - Interest Bearing", purpose: "Balances that reflect accrued interest over time.", concepts: ["Interest bearing extension"], }, "tokens/token-extensions/memo-transfer/quasar": { - title: "Token Extensions โ€” Memo Transfer", + title: "Token Extensions - Memo Transfer", purpose: "Require a memo on every transfer.", concepts: ["Memo transfer extension"], }, "tokens/token-extensions/mint-close-authority/quasar": { - title: "Token Extensions โ€” Mint Close Authority", + title: "Token Extensions - Mint Close Authority", purpose: "Designated account may close the mint.", concepts: ["Mint close authority extension"], }, "tokens/token-extensions/non-transferable/quasar": { - title: "Token Extensions โ€” Non-Transferable", + title: "Token Extensions - Non-Transferable", purpose: "Tokens that cannot be transferred.", concepts: ["Non-transferable extension"], }, "tokens/token-extensions/permanent-delegate/quasar": { - title: "Token Extensions โ€” Permanent Delegate", + title: "Token Extensions - Permanent Delegate", purpose: "Permanent delegate retains transfer rights.", concepts: ["Permanent delegate extension"], }, "tokens/token-extensions/transfer-fee/quasar": { - title: "Token Extensions โ€” Transfer Fee", + title: "Token Extensions - Transfer Fee", purpose: "Fee charged on each transfer at the mint.", concepts: ["Transfer fee extension"], }, "tokens/token-extensions/transfer-hook/account-data-as-seed/quasar": { - title: "Transfer Hook โ€” Account Data as Seed", + title: "Transfer Hook - Account Data as Seed", purpose: "Derive extra accounts from token account data in a transfer hook.", concepts: ["Transfer hook", "Extra account metas"], }, "tokens/token-extensions/transfer-hook/allow-block-list-token/quasar": { - title: "Transfer Hook โ€” Allow/Block List", + title: "Transfer Hook - Allow/Block List", purpose: "Allow/block list enforced by a transfer hook program.", concepts: ["Transfer hook", "List authority"], }, "tokens/token-extensions/transfer-hook/counter/quasar": { - title: "Transfer Hook โ€” Counter", + title: "Transfer Hook - Counter", purpose: "Count transfers in hook-side state.", concepts: ["Transfer hook", "Counter PDA"], }, "tokens/token-extensions/transfer-hook/hello-world/quasar": { - title: "Transfer Hook โ€” Hello World", + title: "Transfer Hook - Hello World", purpose: "Minimal transfer hook executed on each transfer.", concepts: ["Transfer hook", "Extra account meta list"], }, "tokens/token-extensions/transfer-hook/transfer-cost/quasar": { - title: "Transfer Hook โ€” Transfer Cost", + title: "Transfer Hook - Transfer Cost", purpose: "Additional fee on each transfer via the hook.", concepts: ["Transfer hook", "Fee collection"], }, "tokens/token-extensions/transfer-hook/transfer-switch/quasar": { - title: "Transfer Hook โ€” Transfer Switch", + title: "Transfer Hook - Transfer Switch", purpose: "Globally enable or disable transfers.", concepts: ["Transfer hook", "Admin switch"], }, "tokens/token-extensions/transfer-hook/whitelist/quasar": { - title: "Transfer Hook โ€” Whitelist", + title: "Transfer Hook - Whitelist", purpose: "Only whitelisted accounts may receive tokens.", concepts: ["Transfer hook", "Whitelist PDA"], }, diff --git a/tokens/betting-market/README.md b/tokens/betting-market/README.md new file mode 100644 index 00000000..41ed37e4 --- /dev/null +++ b/tokens/betting-market/README.md @@ -0,0 +1,7 @@ +# Betting Market + +A parimutuel (pooled) betting market. An admin opens an event and its possible outcomes; bettors stake a token on the outcome they expect to win. All stakes share one pool, and when the admin settles the event, losing stakes (minus a protocol fee) are split among winners in proportion to their stake. + +[โš“ Anchor](./anchor) + +See the [Anchor variant's README](./anchor/README.md) for the account model, payout math, and how to run the tests. diff --git a/tokens/betting-market/anchor/README.md b/tokens/betting-market/anchor/README.md index 39dfdd91..52b0c35f 100644 --- a/tokens/betting-market/anchor/README.md +++ b/tokens/betting-market/anchor/README.md @@ -3,7 +3,7 @@ A parimutuel (pooled) betting market. An admin opens an **event**, adds the possible **outcomes**, and bettors stake a token on the outcome they think will win. Every stake across every outcome goes into one pool. When the admin settles the event to the winning outcome, the -losing stakes โ€” minus a protocol fee โ€” are split among the winners in proportion to their stake. +losing stakes - minus a protocol fee - are split among the winners in proportion to their stake. This is the pooled model used by Solana prediction-market platforms such as Hedgehog Markets, where odds are set by the crowd's stakes rather than by an order book or a fixed-odds bookmaker. @@ -13,32 +13,32 @@ where odds are set by the crowd's stakes rather than by an order book or a fixed It solves the core problem of trustless betting: collecting stakes from many bettors, holding them in one place no single bettor controls, and paying winners by a fixed, public formula. The pool is a token account owned by the event's PDA, so payouts are signed by the program with the event's -seeds โ€” there is no admin key that can move bettors' stakes out of the pool. The admin's only +seeds - there is no admin key that can move bettors' stakes out of the pool. The admin's only powers are creating events/outcomes and choosing the winning outcome (or cancelling). ## Major Concepts ### Accounts -- **Config** (`seeds = [b"config"]`) โ€” one per deployment. Holds the `admin` (the only key that can +- **Config** (`seeds = [b"config"]`) - one per deployment. Holds the `admin` (the only key that can create events/outcomes, settle, and cancel), the `token_mint` every market accepts, the `fee_recipient`, and the `fee_bps`. -- **Event** (`seeds = [b"event", event_id]`) โ€” one betting market. Tracks `total_pool`, `status` - (`Open` / `Settled` / `Cancelled`), and โ€” once settled โ€” the `winning_outcome_index`, +- **Event** (`seeds = [b"event", event_id]`) - one betting market. Tracks `total_pool`, `status` + (`Open` / `Settled` / `Cancelled`), and - once settled - the `winning_outcome_index`, `winning_pool`, and `distributable_losing_pool` that the payout formula reads. The `fee_bps` is snapshotted at creation so later Config changes can't alter a market bettors have already joined. -- **Outcome** (`seeds = [b"outcome", event, index]`) โ€” one possible result. Its `total_amount` is +- **Outcome** (`seeds = [b"outcome", event, index]`) - one possible result. Its `total_amount` is the outcome's share of the pool and the denominator for pro-rata payouts when it wins. -- **Bet** (`seeds = [b"bet", outcome, bettor]`) โ€” a bettor's total stake on one outcome. Re-betting +- **Bet** (`seeds = [b"bet", outcome, bettor]`) - a bettor's total stake on one outcome. Re-betting the same outcome adds to the existing Bet, so there is exactly one per (outcome, bettor). -- **User** (`seeds = [b"user", wallet]`) โ€” a per-wallet index listing the bettor's Bet addresses, so +- **User** (`seeds = [b"user", wallet]`) - a per-wallet index listing the bettor's Bet addresses, so a client can find someone's positions without scanning every Bet on the program. The list is capped (see `MAX_BETS_PER_USER`) to keep the account a fixed size; the Bet accounts are the authoritative stake record. ### The vault -Each event owns a single vault token account โ€” the associated token account of the Event PDA for +Each event owns a single vault token account - the associated token account of the Event PDA for `config.token_mint`. `place_bet` moves the stake from the bettor's token account into this vault. `settle_event`, `claim_winnings`, and `claim_refund` move tokens back out, with the program signing as the Event PDA (`seeds = [b"event", event_id, bump]`). @@ -80,7 +80,7 @@ division floors each share, leaving at most a few base units of dust in the vaul | `claim_refund` | bettor | After a cancellation, reclaims the exact stake. | `add_outcome` is locked once betting starts, so the field of choices can't change under existing -bettors. `settle_event` rejects a winning outcome with no bets โ€” use `cancel_event` to unwind an +bettors. `settle_event` rejects a winning outcome with no bets - use `cancel_event` to unwind an event that can't be resolved fairly. ## Setup diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs index c4d3c0c3..47135bd3 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs @@ -65,7 +65,7 @@ pub fn handle_claim_winnings(context: Context) -> Result<()> { // Parimutuel split: winners share the losing pool in proportion to their // own stake. Work in u128 and divide once, after the multiply, so the - // result is floored a single time โ€” dividing first would throw away + // result is floored a single time - dividing first would throw away // precision. The floor leaves at most a few base units of dust in the vault. let losing_pool_share_numerator = stake as u128 * distributable_losing_pool as u128; let winnings = (losing_pool_share_numerator / winning_pool as u128) as u64; diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/user.rs b/tokens/betting-market/anchor/programs/betting-market/src/state/user.rs index b8deb4f9..a38cbaec 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/state/user.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/state/user.rs @@ -3,7 +3,7 @@ use anchor_lang::prelude::*; // A bettor can hold at most this many distinct bets (one per outcome they back). // Re-betting an outcome adds to the existing Bet, so this caps the number of // *different* outcomes a user has staked on, not the number of times they bet. -// A fixed cap keeps the account a constant size โ€” no reallocation on each bet. +// A fixed cap keeps the account a constant size - no reallocation on each bet. pub const MAX_BETS_PER_USER: usize = 32; // Per-wallet index of a bettor's bets, so a client can list someone's positions diff --git a/tokens/create-token/README.md b/tokens/create-token/README.md index 4b1ed65b..dc4e544b 100644 --- a/tokens/create-token/README.md +++ b/tokens/create-token/README.md @@ -31,7 +31,7 @@ A token is represented [onchain](https://solana.com/docs/terminology#onchain) by } ``` -Metadata about a mint โ€” name, symbol, image URI โ€” lives in a separate **Metadata [Account](https://solana.com/docs/terminology#account)**: +Metadata about a mint - name, symbol, image URI - lives in a separate **Metadata [Account](https://solana.com/docs/terminology#account)**: ```typescript { diff --git a/tokens/create-token/anchor/Anchor.toml b/tokens/create-token/anchor/Anchor.toml index c13c0f16..1b6d1e6c 100644 --- a/tokens/create-token/anchor/Anchor.toml +++ b/tokens/create-token/anchor/Anchor.toml @@ -8,14 +8,12 @@ skip-lint = false [programs.localnet] create_token = "GwvQ53QTu1xz3XXYfG5m5jEqwhMBvVBudPS8TUuFYnhT" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests โ€” the validator tests (test.ts) need Metaplex Token +# Only run bankrun tests - the validator tests (test.ts) need Metaplex Token # Metadata cloned from mainnet which is too slow/unreliable in CI. # bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). test = "cargo test" diff --git a/tokens/create-token/quasar/Cargo.toml b/tokens/create-token/quasar/Cargo.toml index 329ef92e..42c073e5 100644 --- a/tokens/create-token/quasar/Cargo.toml +++ b/tokens/create-token/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-create-token" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/tokens/nft-minter/README.md b/tokens/nft-minter/README.md index 8a17c967..c7090214 100644 --- a/tokens/nft-minter/README.md +++ b/tokens/nft-minter/README.md @@ -10,4 +10,4 @@ The way to do that is to remove the mint authority from the mint: Setting the mint authority to `null` permanently disables minting. **This is irreversible.** -You can do this manually, or use Metaplex to mark the NFT as a Limited Edition. When you use an Edition โ€” such as a Master Edition โ€” for your NFT, you get extra Metaplex metadata, and the mint authority is delegated to the Master Edition account. That delegation effectively disables future minting. Be sure you understand the trade-offs of letting the Master Edition account hold the mint authority instead of setting it permanently to `null`. +You can do this manually, or use Metaplex to mark the NFT as a Limited Edition. When you use an Edition - such as a Master Edition - for your NFT, you get extra Metaplex metadata, and the mint authority is delegated to the Master Edition account. That delegation effectively disables future minting. Be sure you understand the trade-offs of letting the Master Edition account hold the mint authority instead of setting it permanently to `null`. diff --git a/tokens/nft-minter/anchor/Anchor.toml b/tokens/nft-minter/anchor/Anchor.toml index e156133c..4a27cd42 100644 --- a/tokens/nft-minter/anchor/Anchor.toml +++ b/tokens/nft-minter/anchor/Anchor.toml @@ -9,14 +9,12 @@ seeds = true [programs.localnet] nft_minter = "52quezNUzc1Ej6Jh6L4bvtxPW8j6TEFHuLVAWiFvdnsc" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests โ€” the validator tests (test.ts) need Metaplex Token +# Only run bankrun tests - the validator tests (test.ts) need Metaplex Token # Metadata cloned from mainnet which is too slow/unreliable in CI. # bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). test = "cargo test" diff --git a/tokens/nft-minter/quasar/Cargo.toml b/tokens/nft-minter/quasar/Cargo.toml index c40707f7..367dbe2f 100644 --- a/tokens/nft-minter/quasar/Cargo.toml +++ b/tokens/nft-minter/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-nft-minter" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/tokens/nft-minter/quasar/src/lib.rs b/tokens/nft-minter/quasar/src/lib.rs index fde20297..4bdc8317 100644 --- a/tokens/nft-minter/quasar/src/lib.rs +++ b/tokens/nft-minter/quasar/src/lib.rs @@ -34,14 +34,14 @@ pub struct MintNft { #[account(mut)] pub payer: Signer, - /// Metadata PDA โ€” initialised via the Metaplex program by an explicit + /// Metadata PDA - initialised via the Metaplex program by an explicit /// CPI below; stays an UncheckedAccount because the new /// `metadata(...)` behaviour only accepts compile-time literals for /// name / symbol / uri. #[account(mut)] pub metadata_account: UncheckedAccount, - /// Master edition PDA โ€” initialised via the Metaplex program below. + /// Master edition PDA - initialised via the Metaplex program below. #[account(mut)] pub edition_account: UncheckedAccount, diff --git a/tokens/nft-operations/README.md b/tokens/nft-operations/README.md new file mode 100644 index 00000000..352411d0 --- /dev/null +++ b/tokens/nft-operations/README.md @@ -0,0 +1,7 @@ +# NFT Operations + +Create an NFT collection, mint NFTs into it, and verify NFTs as collection members using the Metaplex Token Metadata program. + +[โš“ Anchor](./anchor) [๐Ÿ’ซ Quasar](./quasar) + +Each variant's README covers its setup and how to run the tests. diff --git a/tokens/nft-operations/anchor/Anchor.toml b/tokens/nft-operations/anchor/Anchor.toml index 45d87e06..bcc5d063 100644 --- a/tokens/nft-operations/anchor/Anchor.toml +++ b/tokens/nft-operations/anchor/Anchor.toml @@ -11,14 +11,12 @@ mint_nft = "3EMcczaGi9ivdLxvvFwRbGYeEUEHpGwabXegARw4jLxa" [programs.devnet] mint_nft = "3EMcczaGi9ivdLxvvFwRbGYeEUEHpGwabXegARw4jLxa" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests โ€” the validator tests (mint-nft.ts) need Metaplex Token +# Only run bankrun tests - the validator tests (mint-nft.ts) need Metaplex Token # Metadata cloned from mainnet which is too slow/unreliable in CI. # bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). test = "cargo test" diff --git a/tokens/nft-operations/anchor/README.md b/tokens/nft-operations/anchor/README.md index f05d2697..6113c1ac 100644 --- a/tokens/nft-operations/anchor/README.md +++ b/tokens/nft-operations/anchor/README.md @@ -1,6 +1,6 @@ # NFT Operations -Create an NFT collection, mint an NFT, and verify an NFT as part of a collection โ€” all using Metaplex Token Metadata. +Create an NFT collection, mint an NFT, and verify an NFT as part of a collection - all using Metaplex Token Metadata. ## Program setup @@ -71,7 +71,7 @@ pub struct CreateCollection<'info> { - `token_program` / `associated_token_program`: create new [ATAs](https://solana.com/docs/terminology#associated-token-account-ata) and mint tokens. - `token_metadata_program`: the MPL Token Metadata program, used to create the metadata and master edition accounts. -Both `metadata` and `master_edition` are `UncheckedAccount` because they are uninitialized at the start of the [instruction](https://solana.com/docs/terminology#instruction) โ€” the Token Metadata program initializes them via CPI. +Both `metadata` and `master_edition` are `UncheckedAccount` because they are uninitialized at the start of the [instruction](https://solana.com/docs/terminology#instruction) - the Token Metadata program initializes them via CPI. Had we written: @@ -234,7 +234,7 @@ pub struct MintNFT<'info> { Apart from `collection_mint`, the accounts are the same as the collection creation flow. A collection is just a regular NFT with the `collection_details` field set and the `collection` field on `data` set to `None`. An NFT belonging to a collection has `collection_details` set to `None` and the `collection` field on `data` set to a `Collection` struct with the collection's key and a `verified` boolean. `verified` starts false and flips to true once the NFT is verified as part of the collection. -That's where the `collection` account comes from โ€” it provides the address that goes into the `Collection` struct on the NFT's metadata. +That's where the `collection` account comes from - it provides the address that goes into the `Collection` struct on the NFT's metadata. ### Implementation for `MintNFT` @@ -407,7 +407,7 @@ pub struct VerifyCollectionMint<'info> { - `sysvar_instruction`: provides access to the serialized instruction data for the running transaction. - `token_metadata_program`: MPL Token Metadata, used to perform the verification CPI. -Only the NFT and collection NFT metadata accounts need to be mutable โ€” both are updated. The NFT metadata gets its `verified` boolean flipped to true, and the collection NFT metadata has its collection size incremented. +Only the NFT and collection NFT metadata accounts need to be mutable - both are updated. The NFT metadata gets its `verified` boolean flipped to true, and the collection NFT metadata has its collection size incremented. ### Implementation for `VerifyCollectionMint` diff --git a/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/verify_collection.rs b/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/verify_collection.rs index 880dcb2b..ec329153 100644 --- a/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/verify_collection.rs +++ b/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/verify_collection.rs @@ -12,7 +12,7 @@ use anchor_spl::{ token::Mint, metadata::Metadata, }; -// In Anchor 1.0, sysvar::instructions::ID moved โ€” use the well-known address directly +// In Anchor 1.0, sysvar::instructions::ID moved - use the well-known address directly const INSTRUCTIONS_SYSVAR_ID: Pubkey = anchor_lang::solana_program::pubkey::pubkey!("Sysvar1nstructions1111111111111111111111111"); #[derive(Accounts)] diff --git a/tokens/nft-operations/quasar/Cargo.toml b/tokens/nft-operations/quasar/Cargo.toml index 5d2cc6b8..7f6cf364 100644 --- a/tokens/nft-operations/quasar/Cargo.toml +++ b/tokens/nft-operations/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-nft-operations" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/tokens/nft-operations/quasar/src/instructions/create_collection.rs b/tokens/nft-operations/quasar/src/instructions/create_collection.rs index 8ac792cf..d9baa4f9 100644 --- a/tokens/nft-operations/quasar/src/instructions/create_collection.rs +++ b/tokens/nft-operations/quasar/src/instructions/create_collection.rs @@ -27,10 +27,10 @@ pub struct CreateCollection { /// PDA used as mint authority and update authority. #[account(address = MintAuthorityPda::seeds())] pub mint_authority: UncheckedAccount, - /// Metadata PDA โ€” initialised by the Metaplex program. + /// Metadata PDA - initialised by the Metaplex program. #[account(mut)] pub metadata: UncheckedAccount, - /// Master edition PDA โ€” initialised by the Metaplex program. + /// Master edition PDA - initialised by the Metaplex program. #[account(mut)] pub master_edition: UncheckedAccount, /// Token account to hold the collection NFT. diff --git a/tokens/nft-operations/quasar/src/instructions/mint_nft.rs b/tokens/nft-operations/quasar/src/instructions/mint_nft.rs index 53be3dc3..ec6a757b 100644 --- a/tokens/nft-operations/quasar/src/instructions/mint_nft.rs +++ b/tokens/nft-operations/quasar/src/instructions/mint_nft.rs @@ -30,10 +30,10 @@ pub struct MintNft { token(mint = mint, authority = owner, token_program = token_program), )] pub destination: Account, - /// Metadata PDA โ€” initialised by the Metaplex program. + /// Metadata PDA - initialised by the Metaplex program. #[account(mut)] pub metadata: UncheckedAccount, - /// Master edition PDA โ€” initialised by the Metaplex program. + /// Master edition PDA - initialised by the Metaplex program. #[account(mut)] pub master_edition: UncheckedAccount, /// PDA used as mint authority and update authority. diff --git a/tokens/nft-operations/quasar/src/instructions/verify_collection.rs b/tokens/nft-operations/quasar/src/instructions/verify_collection.rs index 031b902a..5c254570 100644 --- a/tokens/nft-operations/quasar/src/instructions/verify_collection.rs +++ b/tokens/nft-operations/quasar/src/instructions/verify_collection.rs @@ -12,7 +12,7 @@ use { /// The Anchor version uses typed `MetadataAccount` / `MasterEditionAccount` /// wrappers for owner and discriminant validation. In Quasar we use /// `UncheckedAccount` and rely on the Metaplex program itself to validate -/// the accounts during CPI โ€” the onchain program enforces correctness. +/// the accounts during CPI - the onchain program enforces correctness. #[derive(Accounts)] pub struct VerifyCollectionMint { pub authority: Signer, diff --git a/tokens/pda-mint-authority/anchor/Anchor.toml b/tokens/pda-mint-authority/anchor/Anchor.toml index e46e35c7..53ccdcd2 100644 --- a/tokens/pda-mint-authority/anchor/Anchor.toml +++ b/tokens/pda-mint-authority/anchor/Anchor.toml @@ -8,14 +8,12 @@ skip-lint = false [programs.localnet] token_minter = "3LFrPHqwk5jMrmiz48BFj6NV2k4NjobgTe1jChzx3JGD" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests โ€” the validator tests (test.ts) need Metaplex Token +# Only run bankrun tests - the validator tests (test.ts) need Metaplex Token # Metadata cloned from mainnet which is too slow/unreliable in CI. # bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). test = "cargo test" diff --git a/tokens/pda-mint-authority/quasar/Cargo.toml b/tokens/pda-mint-authority/quasar/Cargo.toml index 83828582..638cb98f 100644 --- a/tokens/pda-mint-authority/quasar/Cargo.toml +++ b/tokens/pda-mint-authority/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-pda-mint-authority" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. [workspace] [lints.rust.unexpected_cfgs] diff --git a/tokens/token-extensions/basics/anchor/Anchor.toml b/tokens/token-extensions/basics/anchor/Anchor.toml index d50924a7..49b424c0 100644 --- a/tokens/token-extensions/basics/anchor/Anchor.toml +++ b/tokens/token-extensions/basics/anchor/Anchor.toml @@ -7,8 +7,6 @@ skip-lint = false [programs.localnet] anchor = "6qNqxkRF791FXFeQwqYQLEzAbGiqDULC5SSHVsfRoG89" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/basics/anchor/README.md b/tokens/token-extensions/basics/anchor/README.md index 42a04649..f1997633 100644 --- a/tokens/token-extensions/basics/anchor/README.md +++ b/tokens/token-extensions/basics/anchor/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Basics (Anchor) +# Token Extensions - Basics (Anchor) Create mints, mint tokens, and transfer using the [Token Extensions Program](https://solana.com/docs/terminology#token-extensions-program). diff --git a/tokens/token-extensions/basics/anchor/migrations/deploy.ts b/tokens/token-extensions/basics/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/basics/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/basics/quasar/Cargo.toml b/tokens/token-extensions/basics/quasar/Cargo.toml index f1b48734..cac6228f 100644 --- a/tokens/token-extensions/basics/quasar/Cargo.toml +++ b/tokens/token-extensions/basics/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-token-2022-basics" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. [workspace] [lints.rust.unexpected_cfgs] diff --git a/tokens/token-extensions/basics/quasar/README.md b/tokens/token-extensions/basics/quasar/README.md index fec9c267..e6c23813 100644 --- a/tokens/token-extensions/basics/quasar/README.md +++ b/tokens/token-extensions/basics/quasar/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Basics (Quasar) +# Token Extensions - Basics (Quasar) Mint and transfer with the [Token Extensions Program](https://solana.com/docs/terminology#token-extensions-program). diff --git a/tokens/token-extensions/basics/quasar/src/lib.rs b/tokens/token-extensions/basics/quasar/src/lib.rs index 5ab5ace0..8f51a080 100644 --- a/tokens/token-extensions/basics/quasar/src/lib.rs +++ b/tokens/token-extensions/basics/quasar/src/lib.rs @@ -10,9 +10,9 @@ mod tests; declare_id!("22222222222222222222222222222222222222222222"); -/// Correct Token-2022 program ID. +/// Correct Token Extensions program ID. /// -/// quasar-spl 0.0.0 ships incorrect bytes for the Token-2022 address +/// quasar-spl 0.0.0 ships incorrect bytes for the Token Extensions address /// (`TokenzSRvw8aVrEuYKv3gLJaYV39h1EWGpCCGYBJPZQ` instead of the real /// `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb`). We define a local /// marker with the correct mainnet address until that's fixed upstream. @@ -25,8 +25,8 @@ impl Id for Token2022Program { ]); } -/// Demonstrates Token-2022 basics: minting tokens and transferring (checked) -/// via raw CPI to the Token-2022 program. +/// Demonstrates Token Extensions basics: minting tokens and transferring (checked) +/// via raw CPI to the Token Extensions program. #[program] mod quasar_token_2022_basics { use super::*; @@ -37,14 +37,14 @@ mod quasar_token_2022_basics { handle_mint_token(&mut ctx.accounts, amount) } - /// Transfer tokens using transfer_checked (required for Token-2022). + /// Transfer tokens using transfer_checked (required for Token Extensions). #[instruction(discriminator = 1)] pub fn transfer_token(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { handle_transfer_token(&mut ctx.accounts, amount) } } -/// Accounts for minting tokens via Token-2022. +/// Accounts for minting tokens via Token Extensions. #[derive(Accounts)] pub struct MintToken { #[account(mut)] @@ -77,7 +77,7 @@ fn handle_mint_token(accounts: &mut MintToken, amount: u64) -> Result<(), Progra .invoke() } -/// Accounts for transferring tokens via Token-2022 transfer_checked. +/// Accounts for transferring tokens via Token Extensions transfer_checked. #[derive(Accounts)] pub struct TransferToken { #[account(mut)] diff --git a/tokens/token-extensions/cpi-guard/anchor/Anchor.toml b/tokens/token-extensions/cpi-guard/anchor/Anchor.toml index dd7636b1..22ea7193 100644 --- a/tokens/token-extensions/cpi-guard/anchor/Anchor.toml +++ b/tokens/token-extensions/cpi-guard/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] cpi_guard = "6tU3MEowU6oxxeDZLSxEwzcEZsZrhBJsfUR6xECvShid" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/cpi-guard/anchor/README.md b/tokens/token-extensions/cpi-guard/anchor/README.md index da380d5c..e0220463 100644 --- a/tokens/token-extensions/cpi-guard/anchor/README.md +++ b/tokens/token-extensions/cpi-guard/anchor/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” CPI Guard (Anchor) +# Token Extensions - CPI Guard (Anchor) Enable CPI Guard so certain token actions cannot run inside a CPI context. diff --git a/tokens/token-extensions/cpi-guard/anchor/migrations/deploy.ts b/tokens/token-extensions/cpi-guard/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/cpi-guard/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/cpi-guard/anchor/programs/cpi-guard/tests/test_cpi_guard.rs b/tokens/token-extensions/cpi-guard/anchor/programs/cpi-guard/tests/test_cpi_guard.rs index 378b3550..dd1b81b5 100644 --- a/tokens/token-extensions/cpi-guard/anchor/programs/cpi-guard/tests/test_cpi_guard.rs +++ b/tokens/token-extensions/cpi-guard/anchor/programs/cpi-guard/tests/test_cpi_guard.rs @@ -31,7 +31,7 @@ fn setup() -> (LiteSVM, Pubkey, Keypair) { } /// Create a basic Token Extensions token account (165 bytes, no extensions). -/// Uses explicit keypair โ€” kite's ATA creation won't work here because +/// Uses explicit keypair - kite's ATA creation won't work here because /// we need to reallocate and add the CPI Guard extension later. fn create_basic_token_account_instructions( payer: &Pubkey, @@ -154,7 +154,7 @@ fn test_cpi_guard_prevents_transfer_then_allows_after_disable() { ).unwrap(); svm.expire_blockhash(); - // Step 6: Try CPI transfer โ€” should fail because CPI Guard is enabled + // Step 6: Try CPI transfer - should fail because CPI Guard is enabled let (recipient_token_account, _bump) = Pubkey::find_program_address(&[b"pda"], &program_id); diff --git a/tokens/token-extensions/cpi-guard/quasar/README.md b/tokens/token-extensions/cpi-guard/quasar/README.md index 1715b8cd..19f8ce21 100644 --- a/tokens/token-extensions/cpi-guard/quasar/README.md +++ b/tokens/token-extensions/cpi-guard/quasar/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” CPI Guard (Quasar) +# Token Extensions - CPI Guard (Quasar) Block certain token actions inside CPI contexts. diff --git a/tokens/token-extensions/cpi-guard/quasar/src/lib.rs b/tokens/token-extensions/cpi-guard/quasar/src/lib.rs index 40f3b75b..74d63c9c 100644 --- a/tokens/token-extensions/cpi-guard/quasar/src/lib.rs +++ b/tokens/token-extensions/cpi-guard/quasar/src/lib.rs @@ -10,7 +10,7 @@ mod tests; declare_id!("22222222222222222222222222222222222222222222"); -/// Correct Token-2022 program ID (quasar-spl 0.0.0 has wrong bytes). +/// Correct Token Extensions program ID (quasar-spl 0.0.0 has wrong bytes). pub struct Token2022Program; impl Id for Token2022Program { const ID: Address = Address::new_from_array([ diff --git a/tokens/token-extensions/cpi-guard/quasar/src/tests.rs b/tokens/token-extensions/cpi-guard/quasar/src/tests.rs index ef2a93b4..a2f0b383 100644 --- a/tokens/token-extensions/cpi-guard/quasar/src/tests.rs +++ b/tokens/token-extensions/cpi-guard/quasar/src/tests.rs @@ -43,7 +43,7 @@ fn token_account(address: Pubkey, mint: Pubkey, owner: Pubkey, amount: u64) -> A ) } -/// Test CPI transfer_checked (without CPI guard โ€” should succeed). +/// Test CPI transfer_checked (without CPI guard - should succeed). #[test] fn test_cpi_transfer() { let mut svm = setup(); diff --git a/tokens/token-extensions/default-account-state/anchor/Anchor.toml b/tokens/token-extensions/default-account-state/anchor/Anchor.toml index 4ec0a46f..38444c91 100644 --- a/tokens/token-extensions/default-account-state/anchor/Anchor.toml +++ b/tokens/token-extensions/default-account-state/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] default_account_state = "5LdYbHiUsFxVG8bfqoeBkhBYMRmWZb3BoLuABgYW7coB" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/default-account-state/anchor/README.md b/tokens/token-extensions/default-account-state/anchor/README.md index c9529c20..1b6702ac 100644 --- a/tokens/token-extensions/default-account-state/anchor/README.md +++ b/tokens/token-extensions/default-account-state/anchor/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Default Account State (Anchor) +# Token Extensions - Default Account State (Anchor) New token accounts are frozen by default until thawed. diff --git a/tokens/token-extensions/default-account-state/anchor/migrations/deploy.ts b/tokens/token-extensions/default-account-state/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/default-account-state/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/tests/test_default_account_state.rs b/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/tests/test_default_account_state.rs index c0666812..9fccce6d 100644 --- a/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/tests/test_default_account_state.rs +++ b/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/tests/test_default_account_state.rs @@ -19,7 +19,7 @@ use { }; /// Create a Token Extensions token account (165 bytes, no extra extensions). -/// Uses explicit keypair โ€” not an ATA โ€” so we can inspect account state bytes. +/// Uses explicit keypair - not an ATA - so we can inspect account state bytes. fn create_token_account_instruction( payer: &Pubkey, token_account: &Pubkey, @@ -102,7 +102,7 @@ fn test_default_account_state() { "Token account should be frozen (state=2)" ); - // Step 3: Attempt to mint to the frozen account โ€” should fail + // Step 3: Attempt to mint to the frozen account - should fail let result = mint_tokens_to_token_extensions_account( &mut svm, &mint_keypair.pubkey(), @@ -134,7 +134,7 @@ fn test_default_account_state() { send_transaction_from_instructions(&mut svm, vec![update_ix], &[&payer], &payer.pubkey()).unwrap(); svm.expire_blockhash(); - // Step 5: Create a new token account โ€” should be initialized (not frozen) now + // Step 5: Create a new token account - should be initialized (not frozen) now let token2 = Keypair::new(); let create_token2_ixs = create_token_account_instruction( &payer.pubkey(), @@ -152,7 +152,7 @@ fn test_default_account_state() { "Token account should be initialized (state=1)" ); - // Step 6: Mint to the new account โ€” should succeed + // Step 6: Mint to the new account - should succeed mint_tokens_to_token_extensions_account( &mut svm, &mint_keypair.pubkey(), diff --git a/tokens/token-extensions/default-account-state/native/README.md b/tokens/token-extensions/default-account-state/native/README.md index fffb3634..a2f30b8b 100644 --- a/tokens/token-extensions/default-account-state/native/README.md +++ b/tokens/token-extensions/default-account-state/native/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Default Account State +# Token Extensions - Default Account State This extension sets a default state for all [token accounts](https://solana.com/docs/terminology#token-account) of a given [mint](https://solana.com/docs/terminology#token-mint). diff --git a/tokens/token-extensions/default-account-state/native/program/tests/test.rs b/tokens/token-extensions/default-account-state/native/program/tests/test.rs index 5e2567e1..8e99a783 100644 --- a/tokens/token-extensions/default-account-state/native/program/tests/test.rs +++ b/tokens/token-extensions/default-account-state/native/program/tests/test.rs @@ -26,7 +26,7 @@ fn test_create_token_with_default_account_state() { include_bytes!("../../tests/fixtures/token_2022_default_account_state_program.so"); svm.add_program(program_id, program_bytes).unwrap(); - // litesvm bundles the SPL Token-2022 program by default. + // litesvm bundles the Token Extensions program by default. let token_program_id = spl_token_2022_interface::id(); let payer = Keypair::new(); @@ -62,7 +62,7 @@ fn test_create_token_with_default_account_state() { svm.send_transaction(tx).unwrap(); - // The mint should be owned by Token-2022, carry the DefaultAccountState + // The mint should be owned by Token Extensions, carry the DefaultAccountState // extension, and that default state should have been flipped to // Initialized by the program (it starts as Frozen). let mint_account = svm.get_account(&mint.pubkey()).unwrap(); diff --git a/tokens/token-extensions/default-account-state/quasar/README.md b/tokens/token-extensions/default-account-state/quasar/README.md index 88d3bd04..e655c664 100644 --- a/tokens/token-extensions/default-account-state/quasar/README.md +++ b/tokens/token-extensions/default-account-state/quasar/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Default Account State (Quasar) +# Token Extensions - Default Account State (Quasar) New token accounts frozen by default until thawed. diff --git a/tokens/token-extensions/default-account-state/quasar/src/lib.rs b/tokens/token-extensions/default-account-state/quasar/src/lib.rs index 947b71ed..23393545 100644 --- a/tokens/token-extensions/default-account-state/quasar/src/lib.rs +++ b/tokens/token-extensions/default-account-state/quasar/src/lib.rs @@ -11,7 +11,7 @@ mod tests; declare_id!("22222222222222222222222222222222222222222222"); -/// Correct Token-2022 program ID (quasar-spl 0.0.0 has wrong bytes). +/// Correct Token Extensions program ID (quasar-spl 0.0.0 has wrong bytes). pub struct Token2022Program; impl Id for Token2022Program { const ID: Address = Address::new_from_array([ @@ -60,7 +60,7 @@ fn handle_initialize(accounts: &mut Initialize) -> Result<(), ProgramError> { let mint_size: u64 = 171; let lamports = Rent::get()?.try_minimum_balance(mint_size as usize)?; - // 1. Create account owned by Token-2022 + // 1. Create account owned by Token Extensions accounts .system_program .create_account( diff --git a/tokens/token-extensions/group/anchor/Anchor.toml b/tokens/token-extensions/group/anchor/Anchor.toml index 7f3f1d97..b7029fcb 100644 --- a/tokens/token-extensions/group/anchor/Anchor.toml +++ b/tokens/token-extensions/group/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] group = "4XCDGMD8fsdjUzmYj6d9if8twFt1f23Ym52iDmWK8fFs" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/group/anchor/README.md b/tokens/token-extensions/group/anchor/README.md index 69b0028a..169b7372 100644 --- a/tokens/token-extensions/group/anchor/README.md +++ b/tokens/token-extensions/group/anchor/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Group Pointer (Anchor) +# Token Extensions - Group Pointer (Anchor) Link tokens to a group using the Group Pointer extension. diff --git a/tokens/token-extensions/group/anchor/migrations/deploy.ts b/tokens/token-extensions/group/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/group/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/group/quasar/README.md b/tokens/token-extensions/group/quasar/README.md index 91ca9a79..62606abc 100644 --- a/tokens/token-extensions/group/quasar/README.md +++ b/tokens/token-extensions/group/quasar/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Group Pointer (Quasar) +# Token Extensions - Group Pointer (Quasar) Link mints to a group via Group Pointer. diff --git a/tokens/token-extensions/group/quasar/src/lib.rs b/tokens/token-extensions/group/quasar/src/lib.rs index d9c4fad4..d7665346 100644 --- a/tokens/token-extensions/group/quasar/src/lib.rs +++ b/tokens/token-extensions/group/quasar/src/lib.rs @@ -22,7 +22,7 @@ impl Id for Token2022Program { /// Creates a mint with the GroupPointer extension. /// /// The Token Group and Token Member extensions are not yet fully enabled on -/// the Token-2022 program. This example demonstrates initializing the +/// the Token Extensions program. This example demonstrates initializing the /// GroupPointer extension on a mint. Actual group/member initialization /// is commented out in the Anchor version as well. #[program] diff --git a/tokens/token-extensions/immutable-owner/anchor/Anchor.toml b/tokens/token-extensions/immutable-owner/anchor/Anchor.toml index 82cf05bc..2c283e0d 100644 --- a/tokens/token-extensions/immutable-owner/anchor/Anchor.toml +++ b/tokens/token-extensions/immutable-owner/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] immutable_owner = "6g5URpqqurW8RbKjuGeRCVZBKky3J4kYcLeotQ6vj6UT" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/immutable-owner/anchor/README.md b/tokens/token-extensions/immutable-owner/anchor/README.md index 295ea8d8..83ee103c 100644 --- a/tokens/token-extensions/immutable-owner/anchor/README.md +++ b/tokens/token-extensions/immutable-owner/anchor/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Immutable Owner (Anchor) +# Token Extensions - Immutable Owner (Anchor) Create token accounts whose owner field cannot be changed after creation. diff --git a/tokens/token-extensions/immutable-owner/anchor/migrations/deploy.ts b/tokens/token-extensions/immutable-owner/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/immutable-owner/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/immutable-owner/anchor/programs/immutable-owner/tests/test_immutable_owner.rs b/tokens/token-extensions/immutable-owner/anchor/programs/immutable-owner/tests/test_immutable_owner.rs index dad6478b..50e30db9 100644 --- a/tokens/token-extensions/immutable-owner/anchor/programs/immutable-owner/tests/test_immutable_owner.rs +++ b/tokens/token-extensions/immutable-owner/anchor/programs/immutable-owner/tests/test_immutable_owner.rs @@ -90,7 +90,7 @@ fn test_create_token_account_with_immutable_owner() { token_data.data.len() ); - // Step 3: Attempt to change the account owner โ€” should fail due to immutable owner + // Step 3: Attempt to change the account owner - should fail due to immutable owner let new_owner = Keypair::new(); let set_authority_ix = set_authority_instruction( &token_keypair.pubkey(), diff --git a/tokens/token-extensions/immutable-owner/quasar/README.md b/tokens/token-extensions/immutable-owner/quasar/README.md index b951799c..3486ee51 100644 --- a/tokens/token-extensions/immutable-owner/quasar/README.md +++ b/tokens/token-extensions/immutable-owner/quasar/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Immutable Owner (Quasar) +# Token Extensions - Immutable Owner (Quasar) Token accounts with an immutable owner field. diff --git a/tokens/token-extensions/interest-bearing/anchor/Anchor.toml b/tokens/token-extensions/interest-bearing/anchor/Anchor.toml index 44a07fa9..303e73ef 100644 --- a/tokens/token-extensions/interest-bearing/anchor/Anchor.toml +++ b/tokens/token-extensions/interest-bearing/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] interest_bearing = "DMQdkzRJz8uQSN8Kx2QYmQJn6xLKhsu3LcPYxs314MgC" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/interest-bearing/anchor/README.md b/tokens/token-extensions/interest-bearing/anchor/README.md index 3b42b894..74b6ad19 100644 --- a/tokens/token-extensions/interest-bearing/anchor/README.md +++ b/tokens/token-extensions/interest-bearing/anchor/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Interest Bearing (Anchor) +# Token Extensions - Interest Bearing (Anchor) Display balances that accrue interest over time using the interest-bearing extension. diff --git a/tokens/token-extensions/interest-bearing/anchor/migrations/deploy.ts b/tokens/token-extensions/interest-bearing/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/interest-bearing/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/interest-bearing/quasar/README.md b/tokens/token-extensions/interest-bearing/quasar/README.md index a1e340ce..b225a3bb 100644 --- a/tokens/token-extensions/interest-bearing/quasar/README.md +++ b/tokens/token-extensions/interest-bearing/quasar/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Interest Bearing (Quasar) +# Token Extensions - Interest Bearing (Quasar) Balances that reflect accrued interest over time. diff --git a/tokens/token-extensions/memo-transfer/anchor/Anchor.toml b/tokens/token-extensions/memo-transfer/anchor/Anchor.toml index 88e101df..86cc116c 100644 --- a/tokens/token-extensions/memo-transfer/anchor/Anchor.toml +++ b/tokens/token-extensions/memo-transfer/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] memo_transfer = "5BQyC7y2Pc283woThq11uZRqsgcRbBRLKz4yQ8BJadi2" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/memo-transfer/anchor/README.md b/tokens/token-extensions/memo-transfer/anchor/README.md index eb359e3e..613bc8dd 100644 --- a/tokens/token-extensions/memo-transfer/anchor/README.md +++ b/tokens/token-extensions/memo-transfer/anchor/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Memo Transfer (Anchor) +# Token Extensions - Memo Transfer (Anchor) Require a memo on every transfer via the memo-transfer extension. diff --git a/tokens/token-extensions/memo-transfer/anchor/migrations/deploy.ts b/tokens/token-extensions/memo-transfer/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/memo-transfer/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/tests/test_memo_transfer.rs b/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/tests/test_memo_transfer.rs index 85c85e8c..be4e6fb9 100644 --- a/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/tests/test_memo_transfer.rs +++ b/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/tests/test_memo_transfer.rs @@ -26,7 +26,7 @@ fn memo_program_id() -> Pubkey { } /// Create a Token Extensions token account (165 bytes, no extra extensions). -/// Uses explicit keypair โ€” not an ATA โ€” because the test needs multiple +/// Uses explicit keypair - not an ATA - because the test needs multiple /// source accounts for the same owner+mint. fn create_token_account_instructions( payer: &Pubkey, @@ -161,7 +161,7 @@ fn test_memo_transfer() { ).unwrap(); svm.expire_blockhash(); - // Step 4: Transfer without memo โ€” should fail + // Step 4: Transfer without memo - should fail let transfer_ix = transfer_instruction( &source_keypair.pubkey(), &token_keypair.pubkey(), @@ -175,7 +175,7 @@ fn test_memo_transfer() { ); svm.expire_blockhash(); - // Step 5: Transfer with memo โ€” should succeed + // Step 5: Transfer with memo - should succeed let memo_ix = memo_instruction("hello, world", &[&payer.pubkey()]); let transfer_ix = transfer_instruction( &source_keypair.pubkey(), diff --git a/tokens/token-extensions/memo-transfer/quasar/README.md b/tokens/token-extensions/memo-transfer/quasar/README.md index f21b2106..a50449ad 100644 --- a/tokens/token-extensions/memo-transfer/quasar/README.md +++ b/tokens/token-extensions/memo-transfer/quasar/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Memo Transfer (Quasar) +# Token Extensions - Memo Transfer (Quasar) Require a memo on every transfer. diff --git a/tokens/token-extensions/metadata/anchor/Anchor.toml b/tokens/token-extensions/metadata/anchor/Anchor.toml index 14b1e98d..e036a3f5 100644 --- a/tokens/token-extensions/metadata/anchor/Anchor.toml +++ b/tokens/token-extensions/metadata/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] metadata = "BJHEDXSQfD9kBFvhw8ZCGmPFRihzvbMoxoHUKpXdpn4D" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/metadata/anchor/README.md b/tokens/token-extensions/metadata/anchor/README.md index 371ff677..eb758e65 100644 --- a/tokens/token-extensions/metadata/anchor/README.md +++ b/tokens/token-extensions/metadata/anchor/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Onchain Metadata (Anchor) +# Token Extensions - Onchain Metadata (Anchor) Store token metadata inside the mint account using Token Extensions metadata. diff --git a/tokens/token-extensions/metadata/anchor/migrations/deploy.ts b/tokens/token-extensions/metadata/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/metadata/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/mint-close-authority/anchor/Anchor.toml b/tokens/token-extensions/mint-close-authority/anchor/Anchor.toml index 630ccf80..782fb5a3 100644 --- a/tokens/token-extensions/mint-close-authority/anchor/Anchor.toml +++ b/tokens/token-extensions/mint-close-authority/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] mint_close_authority = "AcfQLsYKuzprcCNH1n96pKKgAbAnZchwpbr3gbVN742n" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/mint-close-authority/anchor/README.md b/tokens/token-extensions/mint-close-authority/anchor/README.md index 69e99d8e..22e53fe5 100644 --- a/tokens/token-extensions/mint-close-authority/anchor/README.md +++ b/tokens/token-extensions/mint-close-authority/anchor/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Mint Close Authority (Anchor) +# Token Extensions - Mint Close Authority (Anchor) Designate an account allowed to close the mint and reclaim lamports. diff --git a/tokens/token-extensions/mint-close-authority/anchor/migrations/deploy.ts b/tokens/token-extensions/mint-close-authority/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/mint-close-authority/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs b/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs index 69796994..553f096e 100644 --- a/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs +++ b/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs @@ -25,7 +25,7 @@ fn test_create_token_with_mint_close_authority() { include_bytes!("../../tests/fixtures/token_2022_mint_close_authority_program.so"); svm.add_program(program_id, program_bytes).unwrap(); - // litesvm bundles the SPL Token-2022 program by default. + // litesvm bundles the Token Extensions program by default. let token_program_id = spl_token_2022_interface::id(); let payer = Keypair::new(); @@ -58,7 +58,7 @@ fn test_create_token_with_mint_close_authority() { svm.send_transaction(tx).unwrap(); - // The mint should be owned by Token-2022 and carry the MintCloseAuthority + // The mint should be owned by Token Extensions and carry the MintCloseAuthority // extension pointing at the payer. let mint_account = svm.get_account(&mint.pubkey()).unwrap(); assert_eq!(mint_account.owner, token_program_id); diff --git a/tokens/token-extensions/mint-close-authority/quasar/README.md b/tokens/token-extensions/mint-close-authority/quasar/README.md index beab3875..8c11a408 100644 --- a/tokens/token-extensions/mint-close-authority/quasar/README.md +++ b/tokens/token-extensions/mint-close-authority/quasar/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Mint Close Authority (Quasar) +# Token Extensions - Mint Close Authority (Quasar) Designated account may close the mint. diff --git a/tokens/token-extensions/multiple-extensions/native/program/tests/test.rs b/tokens/token-extensions/multiple-extensions/native/program/tests/test.rs index f6f414a1..2962284c 100644 --- a/tokens/token-extensions/multiple-extensions/native/program/tests/test.rs +++ b/tokens/token-extensions/multiple-extensions/native/program/tests/test.rs @@ -26,7 +26,7 @@ fn test_create_token_with_multiple_extensions() { include_bytes!("../../tests/fixtures/token_2022_multiple_extensions_program.so"); svm.add_program(program_id, program_bytes).unwrap(); - // litesvm bundles the SPL Token-2022 program by default. + // litesvm bundles the Token Extensions program by default. let token_program_id = spl_token_2022_interface::id(); let payer = Keypair::new(); @@ -59,7 +59,7 @@ fn test_create_token_with_multiple_extensions() { svm.send_transaction(tx).unwrap(); - // The mint should now exist, be owned by Token-2022, and carry both the + // The mint should now exist, be owned by Token Extensions, and carry both the // MintCloseAuthority and NonTransferable extensions. let mint_account = svm.get_account(&mint.pubkey()).unwrap(); assert_eq!(mint_account.owner, token_program_id); diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/README.md b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/README.md index 36be1cd0..43d72a1f 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/README.md +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/README.md @@ -2,7 +2,7 @@ An Anchor [program](https://solana.com/docs/terminology#program) that mints an NFT using the [Token Extensions](https://solana.com/docs/terminology#token-extensions-program) metadata-pointer extension. The mint itself stores its own metadata via the metadata extension, so no separate Metaplex metadata [account](https://solana.com/docs/terminology#account) is needed. -This is particularly useful for games โ€” you get arbitrary key/value metadata stored [onchain](https://solana.com/docs/terminology#onchain) that you can use to record character state. In this example, the player's level and collected wood are stored on the NFT. +This is particularly useful for games - you get arbitrary key/value metadata stored [onchain](https://solana.com/docs/terminology#onchain) that you can use to record character state. In this example, the player's level and collected wood are stored on the NFT. When marketplaces support additional metadata, NFTs can be filtered or ranked by those fields, e.g. by character level. @@ -37,7 +37,7 @@ Creating an NFT this way: 5. Add any custom fields (e.g. `level`). 6. Create the player's [Associated Token Account](https://solana.com/docs/terminology#associated-token-account-ata). 7. Mint one token to the ATA. -8. Remove the mint authority โ€” irreversible, makes it an NFT. +8. Remove the mint authority - irreversible, makes it an NFT. See `programs/extension_nft/src/instructions/mint_nft.rs` for the Rust implementation. diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/Anchor.toml b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/Anchor.toml index 379bee00..90c302c3 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/Anchor.toml +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/Anchor.toml @@ -6,8 +6,6 @@ seeds = false [programs.localnet] extension_nft = "9aZZ7TJ2fQZxY8hMtWXywp5y6BgqC4N2BPcr9FDT47sW" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/migrations/deploy.ts b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/migrations/deploy.ts deleted file mode 100644 index 20e6e1c1..00000000 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@project-serum/anchor"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/constants.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/constants.rs index b7d445d2..a2854482 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/constants.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/constants.rs @@ -5,6 +5,6 @@ pub const MAX_WOOD_PER_TREE: u64 = 100000; /// Rough over-allocation for the inline SPL Token Metadata extension TLV /// appended to the Mint account. The TLV is dynamic (name / symbol / uri / /// key-value additional fields), so we cannot derive it via `InitSpace`. -/// 250 bytes is enough headroom for our fixture NFTs โ€” raise if you add +/// 250 bytes is enough headroom for our fixture NFTs - raise if you add /// longer strings or many extra fields. pub const TOKEN_METADATA_EXTENSION_SPACE: usize = 250; diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/init_player.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/init_player.rs index 797bed02..f75b6c86 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/init_player.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/init_player.rs @@ -8,7 +8,7 @@ pub fn handle_init_player(context: Context) -> Result<()> { context.accounts.player.last_login = Clock::get()?.unix_timestamp; context.accounts.player.authority = context.accounts.signer.key(); context.accounts.player.bump = context.bumps.player; - // init_if_needed โ€” only save bump if this is the first init. Subsequent + // init_if_needed - only save bump if this is the first init. Subsequent // calls reuse the existing account and must not overwrite the stored bump // (they'd be equal anyway because PDA derivation is deterministic, but // guarding keeps the intent crystal-clear). diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/state/player_data.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/state/player_data.rs index eed69d1f..90c6fa64 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/state/player_data.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/state/player_data.rs @@ -5,7 +5,7 @@ use anchor_lang::prelude::*; #[derive(InitSpace)] pub struct PlayerData { pub authority: Pubkey, - /// Player name. Capped at 32 bytes โ€” a conservative upper bound for + /// Player name. Capped at 32 bytes - a conservative upper bound for /// display names; bump `#[max_len]` if you need room for emoji-heavy /// or international names (each non-ASCII codepoint costs up to 4 bytes). #[max_len(32)] diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs index 89291327..050764db 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs @@ -1,17 +1,17 @@ //! LiteSVM integration test for the `extension_nft` "chop tree" game program. //! //! It drives the full happy path against an in-memory validator: -//! 1. `init_player` โ€” create the player + game-data PDAs. -//! 2. `mint_nft` โ€” mint a Token-2022 NFT that carries its metadata inline via +//! 1. `init_player` - create the player + game-data PDAs. +//! 2. `mint_nft` - mint a Token Extensions NFT that carries its metadata inline via //! the metadata-pointer + token-metadata extensions. -//! 3. `chop_tree` โ€” gain wood/lose energy and push the new wood total into the +//! 3. `chop_tree` - gain wood/lose energy and push the new wood total into the //! NFT metadata as an additional field. //! //! The session-keys lesson (`#[session_auth_or]`) is exercised through its //! *fallback* branch: `chop_tree` is signed directly by the player's main //! wallet with `session_token = None`, so the macro checks -//! `player.authority == signer`. This keeps the test self-contained โ€” it does -//! not need the on-chain session-keys program as a fixture, because the program +//! `player.authority == signer`. This keeps the test self-contained - it does +//! not need the onchain session-keys program as a fixture, because the program //! never CPIs into it (the session token is only ever read as an account). //! //! IMPORTANT: CI runs `anchor keys sync` before building, which rewrites the @@ -30,8 +30,8 @@ use { solana_signer::Signer, }; -// Token-2022 and Associated-Token-Account program ids (the modern, fixed -// on-chain addresses bundled by LiteSVM). +// Token Extensions and Associated-Token-Account program ids (the modern, fixed +// onchain addresses bundled by LiteSVM). const TOKEN_2022_ID: Pubkey = Pubkey::from_str_const("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"); const ASSOCIATED_TOKEN_ID: Pubkey = Pubkey::from_str_const("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); @@ -67,7 +67,7 @@ fn nft_authority_pda(program_id: &Pubkey) -> Pubkey { get_pda_and_bump(&[Seed::from(b"nft_authority".as_ref())], program_id).0 } -/// Derive the associated token account for (wallet, mint) under Token-2022. +/// Derive the associated token account for (wallet, mint) under Token Extensions. fn associated_token_address(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { Pubkey::find_program_address( &[wallet.as_ref(), TOKEN_2022_ID.as_ref(), mint.as_ref()], @@ -180,7 +180,7 @@ fn test_init_player_mint_and_chop() { "fresh player starts at max energy (100)" ); - // 2. mint_nft โ€” the mint account is a fresh keypair (it's a Signer in the + // 2. mint_nft - the mint account is a fresh keypair (it's a Signer in the // instruction because the program creates it via a system CPI). let mint = Keypair::new(); send_transaction_from_instructions( @@ -191,12 +191,12 @@ fn test_init_player_mint_and_chop() { ) .expect("mint_nft should succeed"); - // The mint account is now owned by the Token-2022 program and holds the + // The mint account is now owned by the Token Extensions program and holds the // inline metadata extension, so it is comfortably larger than a bare mint. let mint_account = svm.get_account(&mint.pubkey()).expect("mint exists"); assert_eq!( mint_account.owner, TOKEN_2022_ID, - "mint owned by Token-2022" + "mint owned by Token Extensions" ); assert!( mint_account.data.len() > 82, @@ -207,9 +207,9 @@ fn test_init_player_mint_and_chop() { // The associated token account should exist and hold the single NFT. let ata = associated_token_address(&signer, &mint.pubkey()); let ata_account = svm.get_account(&ata).expect("ATA created"); - assert_eq!(ata_account.owner, TOKEN_2022_ID, "ATA owned by Token-2022"); + assert_eq!(ata_account.owner, TOKEN_2022_ID, "ATA owned by Token Extensions"); - // 3. chop_tree โ€” needs the existing mint so it can push the new wood total + // 3. chop_tree - needs the existing mint so it can push the new wood total // into the NFT metadata. Signed by the player's main wallet (no session). send_transaction_from_instructions( &mut svm, diff --git a/tokens/token-extensions/non-transferable/anchor/Anchor.toml b/tokens/token-extensions/non-transferable/anchor/Anchor.toml index 2fbd1bb8..7e3e072f 100644 --- a/tokens/token-extensions/non-transferable/anchor/Anchor.toml +++ b/tokens/token-extensions/non-transferable/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] non_transferable = "8Bz4wpHaUckiC169Rg5ZfaBHFemp5S8RwTSDTKzhJ9W" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/non-transferable/anchor/README.md b/tokens/token-extensions/non-transferable/anchor/README.md index b8f620df..ff52fbbb 100644 --- a/tokens/token-extensions/non-transferable/anchor/README.md +++ b/tokens/token-extensions/non-transferable/anchor/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Non-Transferable (Anchor) +# Token Extensions - Non-Transferable (Anchor) Create tokens that cannot be transferred between accounts. diff --git a/tokens/token-extensions/non-transferable/anchor/migrations/deploy.ts b/tokens/token-extensions/non-transferable/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/non-transferable/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/non-transferable/anchor/programs/non-transferable/tests/test_non_transferable.rs b/tokens/token-extensions/non-transferable/anchor/programs/non-transferable/tests/test_non_transferable.rs index 3ec60c6b..06d0eabe 100644 --- a/tokens/token-extensions/non-transferable/anchor/programs/non-transferable/tests/test_non_transferable.rs +++ b/tokens/token-extensions/non-transferable/anchor/programs/non-transferable/tests/test_non_transferable.rs @@ -89,7 +89,7 @@ fn test_create_non_transferable_mint_and_attempt_transfer() { ).unwrap(); svm.expire_blockhash(); - // Step 4: Attempt transfer โ€” should fail because mint is NonTransferable + // Step 4: Attempt transfer - should fail because mint is NonTransferable let result = transfer_checked_token_extensions( &mut svm, &source_ata, diff --git a/tokens/token-extensions/non-transferable/native/program/tests/test.rs b/tokens/token-extensions/non-transferable/native/program/tests/test.rs index 27458358..4927b8f4 100644 --- a/tokens/token-extensions/non-transferable/native/program/tests/test.rs +++ b/tokens/token-extensions/non-transferable/native/program/tests/test.rs @@ -25,7 +25,7 @@ fn test_create_non_transferable_token() { include_bytes!("../../tests/fixtures/token_2022_non_transferable_program.so"); svm.add_program(program_id, program_bytes).unwrap(); - // litesvm bundles the SPL Token-2022 program by default. + // litesvm bundles the Token Extensions program by default. let token_program_id = spl_token_2022_interface::id(); let payer = Keypair::new(); @@ -57,7 +57,7 @@ fn test_create_non_transferable_token() { svm.send_transaction(tx).unwrap(); - // The mint should be owned by Token-2022 and carry the NonTransferable + // The mint should be owned by Token Extensions and carry the NonTransferable // extension (it has no fields; presence is what we assert). let mint_account = svm.get_account(&mint.pubkey()).unwrap(); assert_eq!(mint_account.owner, token_program_id); diff --git a/tokens/token-extensions/non-transferable/quasar/README.md b/tokens/token-extensions/non-transferable/quasar/README.md index 87d9c370..87bd8496 100644 --- a/tokens/token-extensions/non-transferable/quasar/README.md +++ b/tokens/token-extensions/non-transferable/quasar/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Non-Transferable (Quasar) +# Token Extensions - Non-Transferable (Quasar) Tokens that cannot be transferred. diff --git a/tokens/token-extensions/permanent-delegate/anchor/Anchor.toml b/tokens/token-extensions/permanent-delegate/anchor/Anchor.toml index 04095b38..3403b668 100644 --- a/tokens/token-extensions/permanent-delegate/anchor/Anchor.toml +++ b/tokens/token-extensions/permanent-delegate/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] permanent_delegate = "A9rxKS84ZoJVyeTfQbCEfxME2vvAM4uwSMjkmhR5XWb1" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/permanent-delegate/anchor/README.md b/tokens/token-extensions/permanent-delegate/anchor/README.md index 750f8175..7f80c076 100644 --- a/tokens/token-extensions/permanent-delegate/anchor/README.md +++ b/tokens/token-extensions/permanent-delegate/anchor/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Permanent Delegate (Anchor) +# Token Extensions - Permanent Delegate (Anchor) Keep a permanent delegate with transfer rights over all token accounts for the mint. diff --git a/tokens/token-extensions/permanent-delegate/anchor/migrations/deploy.ts b/tokens/token-extensions/permanent-delegate/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/permanent-delegate/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/permanent-delegate/quasar/README.md b/tokens/token-extensions/permanent-delegate/quasar/README.md index 6c518f6b..40774b47 100644 --- a/tokens/token-extensions/permanent-delegate/quasar/README.md +++ b/tokens/token-extensions/permanent-delegate/quasar/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Permanent Delegate (Quasar) +# Token Extensions - Permanent Delegate (Quasar) Permanent delegate retains transfer rights. diff --git a/tokens/token-extensions/permanent-delegate/quasar/src/lib.rs b/tokens/token-extensions/permanent-delegate/quasar/src/lib.rs index a57b3b1d..e5f3e06b 100644 --- a/tokens/token-extensions/permanent-delegate/quasar/src/lib.rs +++ b/tokens/token-extensions/permanent-delegate/quasar/src/lib.rs @@ -19,7 +19,7 @@ impl Id for Token2022Program { ]); } -/// Creates a mint with the PermanentDelegate extension โ€” a delegate that +/// Creates a mint with the PermanentDelegate extension - a delegate that /// can transfer or burn any tokens from any account of this mint. #[program] mod quasar_permanent_delegate { diff --git a/tokens/token-extensions/transfer-fee/anchor/Anchor.toml b/tokens/token-extensions/transfer-fee/anchor/Anchor.toml index f7e31c87..71da0c08 100644 --- a/tokens/token-extensions/transfer-fee/anchor/Anchor.toml +++ b/tokens/token-extensions/transfer-fee/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] transfer_fee = "4evptdGtALCNT8uTxJhbWBRZpBE8w5oNtmgfSyfQu7td" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/transfer-fee/anchor/README.md b/tokens/token-extensions/transfer-fee/anchor/README.md index 7252f581..1e4b0b78 100644 --- a/tokens/token-extensions/transfer-fee/anchor/README.md +++ b/tokens/token-extensions/transfer-fee/anchor/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Transfer Fee (Anchor) +# Token Extensions - Transfer Fee (Anchor) Charge a fee on each transfer configured at the mint level. diff --git a/tokens/token-extensions/transfer-fee/anchor/migrations/deploy.ts b/tokens/token-extensions/transfer-fee/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/transfer-fee/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/transfer-fee/native/program/tests/test.rs b/tokens/token-extensions/transfer-fee/native/program/tests/test.rs index ff75cf1d..3c5a9262 100644 --- a/tokens/token-extensions/transfer-fee/native/program/tests/test.rs +++ b/tokens/token-extensions/transfer-fee/native/program/tests/test.rs @@ -24,7 +24,7 @@ fn test_create_token_with_transfer_fee() { let program_bytes = include_bytes!("../../tests/fixtures/token_2022_transfer_fees_program.so"); svm.add_program(program_id, program_bytes).unwrap(); - // litesvm bundles the SPL Token-2022 program by default. + // litesvm bundles the Token Extensions program by default. let token_program_id = spl_token_2022_interface::id(); let payer = Keypair::new(); @@ -60,7 +60,7 @@ fn test_create_token_with_transfer_fee() { svm.send_transaction(tx).unwrap(); - // The mint should be owned by Token-2022 and carry the TransferFeeConfig + // The mint should be owned by Token Extensions and carry the TransferFeeConfig // extension. The program initializes a 1% fee, then sets the newer fee to // 10% (1000 bps) with a max fee of 5 tokens. let mint_account = svm.get_account(&mint.pubkey()).unwrap(); diff --git a/tokens/token-extensions/transfer-fee/quasar/README.md b/tokens/token-extensions/transfer-fee/quasar/README.md index 7c51c8c2..5c552f3b 100644 --- a/tokens/token-extensions/transfer-fee/quasar/README.md +++ b/tokens/token-extensions/transfer-fee/quasar/README.md @@ -1,4 +1,4 @@ -# Token Extensions โ€” Transfer Fee (Quasar) +# Token Extensions - Transfer Fee (Quasar) Fee charged on each transfer at the mint. diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/Anchor.toml b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/Anchor.toml index a91ae7b8..7823a01c 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/Anchor.toml +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] transfer_hook = "1qahDxKHeCLZhbBU2NyMU6vQCQmEUmdeSEBrG5drffK" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/README.md b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/README.md index e6af5c16..4a19404b 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/README.md @@ -80,7 +80,7 @@ pub struct InitializeExtraAccountMetaList<'info> { } ``` -The counter account also has to appear on the `TransferHook` struct โ€” the [program](https://solana.com/docs/terminology#program) needs to know about every account passed in by the runtime: +The counter account also has to appear on the `TransferHook` struct - the [program](https://solana.com/docs/terminology#program) needs to know about every account passed in by the runtime: ```rust #[derive(Accounts)] @@ -126,4 +126,4 @@ const [counterPDA] = PublicKey.findProgramAddressSync( ); ``` -Note: the counter account must exist before a transfer, since the hook reads/writes it. In this example we initialize it alongside the extra-account-metas, so there's only ever one counter โ€” the one for the wallet that initialized the metas. If you want a counter per holder, you'd need to expose an opt-in handler to create it (a "sign up for counter" button in your dapp, for example). +Note: the counter account must exist before a transfer, since the hook reads/writes it. In this example we initialize it alongside the extra-account-metas, so there's only ever one counter - the one for the wallet that initialized the metas. If you want a counter per holder, you'd need to expose an opt-in handler to create it (a "sign up for counter" button in your dapp, for example). diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/migrations/deploy.ts b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs index 23dd3148..508f16ab 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -19,7 +19,7 @@ pub struct InitializeExtraAccountMetaList<'info> { init, seeds = [b"extra-account-metas", mint.key().as_ref()], bump, - // size_of returns Result with spl's ProgramError โ€” unwrap is safe for known-good input + // size_of returns Result with spl's ProgramError - unwrap is safe for known-good input space = ExtraAccountMetaList::size_of( handle_extra_account_metas_count() ).unwrap(), @@ -39,7 +39,7 @@ pub fn handler(mut context: Context) -> Result<( // initialize ExtraAccountMetaList account with extra accounts // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x - // while anchor-lang 1.0 uses 3.x โ€” structurally identical but different semver types + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types ExtraAccountMetaList::init::( &mut context.accounts.extra_account_meta_list.try_borrow_mut_data()?, &extra_account_metas, diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/lib.rs index 0b905b54..96ff0eed 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/lib.rs @@ -48,7 +48,7 @@ pub fn check_is_transferring(context: &Context) -> Result<()> { let source_token_info = context.accounts.source_token.to_account_info(); let mut account_data_ref: RefMut<&mut [u8]> = source_token_info.try_borrow_mut_data()?; // .map_err() needed because spl-token-2022 uses solana-program-error 2.x - // while anchor-lang 1.0 uses 3.x โ€” structurally identical but different semver types + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types let mut account = PodStateWithExtensionsMut::::unpack(*account_data_ref) .map_err(|_| ProgramError::InvalidAccountData)?; let account_extension = account.get_extension_mut::() @@ -64,7 +64,7 @@ pub fn check_is_transferring(context: &Context) -> Result<()> { // Define extra account metas to store on extra_account_meta_list account pub fn handle_extra_account_metas() -> Result> { // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x - // while anchor-lang 1.0 uses 3.x โ€” structurally identical but different semver types + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types Ok(vec![ExtraAccountMeta::new_with_seeds( &[ Seed::Literal { diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/tests/test_transfer_hook.rs index 4bcf15b1..06e21ea9 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/tests/test_transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/tests/test_transfer_hook.rs @@ -132,7 +132,7 @@ fn test_transfer_hook_account_data_as_seed() { ).unwrap(); svm.expire_blockhash(); - // Step 5: Try calling transfer_hook directly (should fail โ€” not transferring) + // Step 5: Try calling transfer_hook directly (should fail - not transferring) let direct_hook_ix = Instruction::new_with_bytes( program_id, &transfer_hook::instruction::TransferHook { amount: 1 }.data(), diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/README.md b/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/README.md index 8e4fdb29..870c0c45 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/README.md +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/README.md @@ -1,4 +1,4 @@ -# Transfer Hook โ€” Account Data as Seed (Quasar) +# Transfer Hook - Account Data as Seed (Quasar) Derive extra accounts from token account data in a transfer hook. diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/src/lib.rs index ade35702..28628d16 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/src/lib.rs @@ -17,7 +17,7 @@ const EXECUTE_DISCRIMINATOR: [u8; 8] = [105, 37, 101, 197, 75, 251, 102, 26]; /// Transfer hook that uses account data as a PDA seed. The counter PDA is /// seeded by ["counter", owner_pubkey] where the owner pubkey is read from -/// the source token account data at runtime by the Token-2022 program. +/// the source token account data at runtime by the Token Extensions program. #[program] mod quasar_transfer_hook_account_data_as_seed { use super::*; @@ -33,7 +33,7 @@ mod quasar_transfer_hook_account_data_as_seed { handle_initialize_extra_account_meta_list(&mut ctx.accounts) } - /// Transfer hook handler โ€” increments a per-owner counter on each transfer. + /// Transfer hook handler - increments a per-owner counter on each transfer. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { @@ -174,7 +174,7 @@ pub struct TransferHook { pub destination_token: UncheckedAccount, pub owner: UncheckedAccount, pub extra_account_meta_list: UncheckedAccount, - /// Counter PDA resolved by Token-2022 using account data seeds + /// Counter PDA resolved by Token Extensions using account data seeds #[account(mut)] pub counter_account: UncheckedAccount, } diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/README.md b/tokens/token-extensions/transfer-hook/allow-block-list-token/README.md index d7888ab1..ac83f8aa 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/README.md +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/README.md @@ -2,7 +2,7 @@ A [Token Extensions](https://solana.com/docs/terminology#token-extensions-program) example that gates transfers through an allow/block list managed by a separate authority. The list is consumed by a transfer hook. -One list authority can manage lists for many [mints](https://solana.com/docs/terminology#token-mint) โ€” useful when an issuer wants a third-party-managed list or wants to share a single list across a set of assets. +One list authority can manage lists for many [mints](https://solana.com/docs/terminology#token-mint) - useful when an issuer wants a third-party-managed list or wants to share a single list across a set of assets. ## Features diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/Anchor.toml b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/Anchor.toml index ee3b3cfa..daa8bea4 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/Anchor.toml +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] abl-token = "EYBRvArz4kb5YLtzjD4TW6DbWhS8qjcMYqBU4wHLW3qj" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/README.md b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/README.md index 46df51ee..9504a5d1 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/README.md @@ -1,4 +1,4 @@ -# Transfer Hook โ€” Allow/Block List (Anchor) +# Transfer Hook - Allow/Block List (Anchor) Restrict transfers using an onchain allow/block list enforced by a transfer hook program. diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/Cargo.toml b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/Cargo.toml index 545ce549..7b9b29b9 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/Cargo.toml +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/Cargo.toml @@ -13,7 +13,7 @@ check-cfg = ['cfg(target_os, values("solana"))'] crate-type = ["cdylib", "lib"] [features] -# Removed `alloc` feature โ€” the upstream `quasar-lang` master no longer +# Removed `alloc` feature - the upstream `quasar-lang` master no longer # exposes it, and nothing in this crate depends on alloc. client = [] debug = [] diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/README.md b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/README.md index 3c829adb..6d4e0d5d 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/README.md +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/README.md @@ -1,4 +1,4 @@ -# Transfer Hook โ€” Allow/Block List (Quasar) +# Transfer Hook - Allow/Block List (Quasar) Allow/block list enforced by a transfer hook program. diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/constants.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/constants.rs index 4874f49c..a8eacdf0 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/constants.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/constants.rs @@ -10,5 +10,5 @@ pub const MAX_NAME: usize = 32; pub const MAX_SYMBOL: usize = 10; pub const MAX_URI: usize = 128; -/// Maximum buffer size for Token-2022 metadata CPI instructions. +/// Maximum buffer size for Token Extensions metadata CPI instructions. pub const MAX_META_IX: usize = 512; diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/change_mode.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/change_mode.rs index 01b980a3..ea4bc719 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/change_mode.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/change_mode.rs @@ -118,7 +118,7 @@ fn has_threshold_in_metadata(ctx: &ChangeMode) -> Result { } if ext_type == 18 { - // TokenMetadata โ€” parse additional_metadata + // TokenMetadata - parse additional_metadata let md = &data[pos..pos + ext_len]; let mut mpos = 64; // skip update_authority + mint diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_mint.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_mint.rs index ae5b2f38..33ab4f65 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_mint.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_mint.rs @@ -188,7 +188,7 @@ pub fn handle_init_mint( Ok(()) } -/// Emit a Token-2022 TokenMetadataUpdateField CPI. +/// Emit a Token Extensions TokenMetadataUpdateField CPI. /// Opcode 44, sub-opcode 1, followed by Field::Key (discriminator 2, then borsh /// string for key, then borsh string for value). fn emit_update_field_cpi(ctx: &InitMint, key: &[u8], value: &[u8]) -> Result<(), ProgramError> { diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/tx_hook.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/tx_hook.rs index 4a5362b4..b3f89ee8 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/tx_hook.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/tx_hook.rs @@ -3,7 +3,7 @@ use quasar_lang::prelude::*; use crate::errors; use crate::state::{read_wallet_allowed, MODE_ALLOW, MODE_BLOCK, MODE_MIXED, AB_WALLET_SIZE}; -/// Transfer hook handler. Called by Token-2022 during transfers. +/// Transfer hook handler. Called by Token Extensions during transfers. /// /// Account layout (fixed by the SPL transfer hook interface): /// [0] source_token_account @@ -11,7 +11,7 @@ use crate::state::{read_wallet_allowed, MODE_ALLOW, MODE_BLOCK, MODE_MIXED, AB_W /// [2] destination_token_account /// [3] owner_delegate /// [4] extra_account_meta_list -/// [5] ab_wallet โ€” resolved from extra account metas (PDA for destination owner) +/// [5] ab_wallet - resolved from extra account metas (PDA for destination owner) #[derive(Accounts)] pub struct TxHook { pub source_token_account: UncheckedAccount, @@ -82,11 +82,11 @@ enum DecodedWalletMode { None, } -/// Parse Token-2022 mint account data to extract the mode from embedded +/// Parse Token Extensions mint account data to extract the mode from embedded /// metadata. The metadata is stored as a TLV extension within the mint /// account. /// -/// Token-2022 mint layout: +/// Token Extensions mint layout: /// [0..82] base Mint state /// [82..164] padding (copy of base) /// [164] AccountType (2 = Mint) diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/lib.rs index 0ad2df70..2278d4e5 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/lib.rs @@ -15,14 +15,14 @@ mod tests; declare_id!("3ku1ZEGvBEEfhaYsAzBZuecTPEa58ZRhoVqHVGpGxVGi"); -/// Allow/Block List Token โ€” a transfer hook program that enforces allow/block -/// lists on Token-2022 transfers using per-wallet PDA entries and mint +/// Allow/Block List Token - a transfer hook program that enforces allow/block +/// lists on Token Extensions transfers using per-wallet PDA entries and mint /// metadata to control modes (Allow, Block, Mixed/Threshold). #[program] mod quasar_abl_token { use super::*; - /// Create a Token-2022 mint with transfer hook, permanent delegate, + /// Create a Token Extensions mint with transfer hook, permanent delegate, /// metadata pointer, and embedded metadata (including AB mode). /// Also initialises the ExtraAccountMetaList PDA. /// @@ -85,7 +85,7 @@ mod quasar_abl_token { instructions::handle_attach_to_mint(&mut ctx.accounts) } - /// SPL Transfer Hook execute handler. Called by Token-2022 during + /// SPL Transfer Hook execute handler. Called by Token Extensions during /// transfers to enforce allow/block/threshold rules. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/state.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/state.rs index 83c1889d..a2f65e8c 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/state.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/state.rs @@ -8,7 +8,7 @@ pub const AB_WALLET_SIZE: u64 = 33; /// Total = 33 bytes. pub const CONFIG_SIZE: u64 = 33; -/// Mode discriminator values stored in Token-2022 metadata. +/// Mode discriminator values stored in Token Extensions metadata. pub const MODE_ALLOW: &[u8] = b"Allow"; pub const MODE_BLOCK: &[u8] = b"Block"; pub const MODE_MIXED: &[u8] = b"Mixed"; diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/Cargo.toml b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/Cargo.toml index d621b754..0d7907bf 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/Cargo.toml +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" crate-type = ["lib", "cdylib"] name = "block_list" -# pinocchio 0.9.3 โ€” 0.8.x's `nostd_panic_handler!` macro emits `#[no_mangle]` +# pinocchio 0.9.3 - 0.8.x's `nostd_panic_handler!` macro emits `#[no_mangle]` # on a lang item, which rustc 1.89 (current platform-tools v1.52) rejects. # 0.9 fixes that without breaking the surface used here. 0.10 renamed # `Pubkey` โ†’ `Address`, which would require porting the rest of the code. diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/state/config.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/state/config.rs index 8a71faa3..16daa969 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/state/config.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/state/config.rs @@ -3,7 +3,7 @@ use pinocchio::pubkey::Pubkey; use super::{Discriminator, Transmutable}; -// `#[repr(C, packed)]` keeps the on-chain layout exactly 41 bytes wide. +// `#[repr(C, packed)]` keeps the onchain layout exactly 41 bytes wide. // With plain `#[repr(C)]` the u64 field gets 7 bytes of alignment padding // inserted after the 33-byte (u8 + Pubkey) prefix, making the struct 48 bytes // while `LEN = 41`. The program would then read 7 bytes past the end of the diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/token_extensions_utils.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/token_extensions_utils.rs index bb55d39d..f30b2c4a 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/token_extensions_utils.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/token_extensions_utils.rs @@ -78,7 +78,7 @@ pub fn is_token_extensions_mint(mint: &AccountInfo) -> bool { // Order of checks matters: read the type byte ONLY after we have proven // the buffer is long enough. The previous implementation indexed first // and length-checked second, which faulted (out-of-bounds) on any account - // shorter than 166 bytes โ€” every mint that isn't a Token Extensions mint hits this. + // shorter than 166 bytes - every mint that isn't a Token Extensions mint hits this. if !mint.is_owned_by(&TOKEN_EXTENSIONS_PROGRAM_ID) { return false; } diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/test.spec.ts b/tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/test.spec.ts index df297f13..cf0fc13b 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/test.spec.ts +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/test.spec.ts @@ -24,7 +24,7 @@ import { assert } from "chai"; import { FailedTransactionMetadata, LiteSVM, type TransactionMetadata } from "litesvm"; import { before, describe, it } from "mocha"; -// Program ID baked into the on-chain program (`declare_id!` in program/src/lib.rs). +// Program ID baked into the onchain program (`declare_id!` in program/src/lib.rs). const BLOCK_LIST_PROGRAM_ID = new PublicKey("BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf"); const PROGRAM_SO_PATH = path.resolve(__dirname, "fixtures/block_list.so"); @@ -398,7 +398,7 @@ describe("block-list pinocchio transfer-hook", () => { // Re-issue the transfer with the (now-closed) wallet_block PDA still in // the extra metas. After unblock the wallet_block account no longer - // exists on-chain (lamports drained, data zeroed), so `data_is_empty()` is + // exists onchain (lamports drained, data zeroed), so `data_is_empty()` is // true in the hook and the transfer is no longer blocked. const transferTx = new Transaction().add( ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }), diff --git a/tokens/token-extensions/transfer-hook/block-list/readme.md b/tokens/token-extensions/transfer-hook/block-list/readme.md index 2106810e..cc0686cb 100644 --- a/tokens/token-extensions/transfer-hook/block-list/readme.md +++ b/tokens/token-extensions/transfer-hook/block-list/readme.md @@ -2,15 +2,15 @@ A block-list [program](https://solana.com/docs/terminology#program) that implements the [Token Extensions](https://solana.com/docs/terminology#token-extensions-program) transfer-hook `execute` [instruction](https://solana.com/docs/terminology#instruction). -A central authority maintains a block list โ€” a collection of blocked wallets. Token issuers (transfer-hook extension authorities) can wire this program in as their hook and choose an operation mode: filter the source wallet only, or both source and destination. +A central authority maintains a block list - a collection of blocked wallets. Token issuers (transfer-hook extension authorities) can wire this program in as their hook and choose an operation mode: filter the source wallet only, or both source and destination. ## Operation modes The mode depends on whether the block list is empty, plus the issuer's choice. Each mode corresponds to a different `extra-account-metas` [account](https://solana.com/docs/terminology#account) built for the [mint](https://solana.com/docs/terminology#token-mint) (see `setup_extra_metas` below). When the list goes from empty to non-empty, the issuer must call `setup_extra_metas` again. -- **Empty extra metas** โ€” default when the config counter is 0. -- **Check source** โ€” default when the config counter is > 0. -- **Check both source and destination** โ€” optional behavior when the counter is > 0. +- **Empty extra metas** - default when the config counter is 0. +- **Check source** - default when the config counter is > 0. +- **Check both source and destination** - optional behavior when the counter is > 0. ## Accounts @@ -136,7 +136,7 @@ target/debug/block-list-cli setup-extra-metas --check-both-wallets { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs index 6b89d263..6d482bb6 100644 --- a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs +++ b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -19,7 +19,7 @@ pub struct InitializeExtraAccountMetaList<'info> { init, seeds = [b"extra-account-metas", mint.key().as_ref()], bump, - // size_of returns Result with spl's ProgramError โ€” unwrap is safe for known-good input + // size_of returns Result with spl's ProgramError - unwrap is safe for known-good input space = ExtraAccountMetaList::size_of( handle_extra_account_metas_count() ).unwrap(), @@ -39,7 +39,7 @@ pub fn handler(mut context: Context) -> Result<( // initialize ExtraAccountMetaList account with extra accounts // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x - // while anchor-lang 1.0 uses 3.x โ€” structurally identical but different semver types + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types ExtraAccountMetaList::init::( &mut context.accounts.extra_account_meta_list.try_borrow_mut_data()?, &extra_account_metas, diff --git a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/lib.rs index 7935a683..bdef0b88 100644 --- a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/lib.rs @@ -60,7 +60,7 @@ pub fn check_is_transferring(context: &Context) -> Result<()> { // Define extra account metas to store on extra_account_meta_list account pub fn handle_extra_account_metas() -> Result> { // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x - // while anchor-lang 1.0 uses 3.x โ€” structurally identical but different semver types + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types Ok(vec![ExtraAccountMeta::new_with_seeds( &[Seed::Literal { bytes: b"counter".to_vec(), diff --git a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/tests/test_transfer_hook_counter.rs b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/tests/test_transfer_hook_counter.rs index 3a921956..4769edac 100644 --- a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/tests/test_transfer_hook_counter.rs +++ b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/tests/test_transfer_hook_counter.rs @@ -132,7 +132,7 @@ fn test_transfer_hook_counter() { ).unwrap(); svm.expire_blockhash(); - // Step 5: Try calling transfer_hook directly (should fail โ€” not transferring) + // Step 5: Try calling transfer_hook directly (should fail - not transferring) let direct_hook_ix = Instruction::new_with_bytes( program_id, &transfer_hook::instruction::TransferHook { amount: 1 }.data(), diff --git a/tokens/token-extensions/transfer-hook/counter/quasar/README.md b/tokens/token-extensions/transfer-hook/counter/quasar/README.md index 11c23c10..c5da6ae7 100644 --- a/tokens/token-extensions/transfer-hook/counter/quasar/README.md +++ b/tokens/token-extensions/transfer-hook/counter/quasar/README.md @@ -1,4 +1,4 @@ -# Transfer Hook โ€” Counter (Quasar) +# Transfer Hook - Counter (Quasar) Count transfers in hook-side state. diff --git a/tokens/token-extensions/transfer-hook/counter/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/counter/quasar/src/lib.rs index 225a873b..b0465c61 100644 --- a/tokens/token-extensions/transfer-hook/counter/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/counter/quasar/src/lib.rs @@ -32,7 +32,7 @@ mod quasar_transfer_hook_counter { handle_initialize_extra_account_meta_list(&mut ctx.accounts) } - /// Transfer hook handler โ€” increments the counter on each transfer. + /// Transfer hook handler - increments the counter on each transfer. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { @@ -175,7 +175,7 @@ pub struct TransferHook { pub owner: UncheckedAccount, /// ExtraAccountMetaList PDA pub extra_account_meta_list: UncheckedAccount, - /// Counter PDA (extra account resolved by Token-2022) + /// Counter PDA (extra account resolved by Token Extensions) #[account(mut)] pub counter_account: UncheckedAccount, } diff --git a/tokens/token-extensions/transfer-hook/counter/quasar/src/tests.rs b/tokens/token-extensions/transfer-hook/counter/quasar/src/tests.rs index b468cfe5..fc012c1a 100644 --- a/tokens/token-extensions/transfer-hook/counter/quasar/src/tests.rs +++ b/tokens/token-extensions/transfer-hook/counter/quasar/src/tests.rs @@ -139,7 +139,7 @@ fn test_transfer_hook_increments_counter() { data: hook_data, }; - // Don't pass counter_pda or meta_list_pda โ€” they were committed by the init instruction + // Don't pass counter_pda or meta_list_pda - they were committed by the init instruction let result = svm.process_instruction( &hook_ix, &[ diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor/Anchor.toml b/tokens/token-extensions/transfer-hook/hello-world/anchor/Anchor.toml index 2ce4e066..09d8c89c 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/anchor/Anchor.toml +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] transfer_hook = "jY5DfVksJT8Le38LCaQhz5USeiGu4rUeVSS8QRAMoba" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" @@ -18,6 +16,6 @@ wallet = "~/.config/solana/id.json" test = "cargo test" # Transfer-hook tests use the real local validator (not bankrun). -# No external program clones needed โ€” this project doesn't use Metaplex. +# No external program clones needed - this project doesn't use Metaplex. # The previous [[test.validator.clone]] of metaplex was unnecessary and # caused 5-minute timeouts in CI trying to fetch from devnet. diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor/README.md b/tokens/token-extensions/transfer-hook/hello-world/anchor/README.md index e9cf4acd..32abbd60 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor/README.md @@ -1,4 +1,4 @@ -# Transfer Hook โ€” Hello World (Anchor) +# Transfer Hook - Hello World (Anchor) Minimal transfer hook that runs custom logic on every token transfer. diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor/migrations/deploy.ts b/tokens/token-extensions/transfer-hook/hello-world/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/transfer-hook/hello-world/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize.rs index 0fea6dfb..c29921f5 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize.rs +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize.rs @@ -41,7 +41,7 @@ fn handle_check_mint_data(accounts: &mut Initialize) -> Result<()> { let mint = &accounts.mint_account.to_account_info(); let mint_data = mint.data.borrow(); // .map_err() needed because spl-token-2022 uses solana-program-error 2.x - // while anchor-lang 1.0 uses 3.x โ€” structurally identical but different semver types + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types let mint_with_extension = StateWithExtensions::::unpack(&mint_data) .map_err(|_| ProgramError::InvalidAccountData)?; let extension_data = mint_with_extension.get_extension::() diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs index f8351695..ecb51bdf 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -18,7 +18,7 @@ pub struct InitializeExtraAccountMetaList<'info> { init, seeds = [b"extra-account-metas", mint.key().as_ref()], bump, - // size_of returns Result with spl's ProgramError โ€” unwrap is safe for known-good input + // size_of returns Result with spl's ProgramError - unwrap is safe for known-good input space = ExtraAccountMetaList::size_of( handle_extra_account_metas_count() ).unwrap(), @@ -36,7 +36,7 @@ pub fn handler(mut context: Context) -> Result<( // initialize ExtraAccountMetaList account with extra accounts // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x - // while anchor-lang 1.0 uses 3.x โ€” structurally identical but different semver types + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types ExtraAccountMetaList::init::( &mut context.accounts.extra_account_meta_list.try_borrow_mut_data()?, &extra_account_metas, diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/lib.rs index a51ba39e..52ef665b 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/lib.rs @@ -50,7 +50,7 @@ pub fn check_is_transferring(context: &Context) -> Result<()> { let source_token_info = context.accounts.source_token.to_account_info(); let mut account_data_ref: RefMut<&mut [u8]> = source_token_info.try_borrow_mut_data()?; // .map_err() needed because spl-token-2022 uses solana-program-error 2.x - // while anchor-lang 1.0 uses 3.x โ€” structurally identical but different semver types + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types let mut account = PodStateWithExtensionsMut::::unpack(*account_data_ref) .map_err(|_| ProgramError::InvalidAccountData)?; let account_extension = account.get_extension_mut::() diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/tests/test_transfer_hook.rs index 590bafdd..f6ff45ed 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/tests/test_transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/tests/test_transfer_hook.rs @@ -133,7 +133,7 @@ fn test_transfer_hook_hello_world() { ).unwrap(); svm.expire_blockhash(); - // Step 5: Try calling transfer_hook directly (should fail โ€” not transferring) + // Step 5: Try calling transfer_hook directly (should fail - not transferring) let direct_hook_ix = Instruction::new_with_bytes( program_id, &transfer_hook::instruction::TransferHook { amount: 1 }.data(), diff --git a/tokens/token-extensions/transfer-hook/hello-world/quasar/README.md b/tokens/token-extensions/transfer-hook/hello-world/quasar/README.md index c0341cae..ba7725bc 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/quasar/README.md +++ b/tokens/token-extensions/transfer-hook/hello-world/quasar/README.md @@ -1,4 +1,4 @@ -# Transfer Hook โ€” Hello World (Quasar) +# Transfer Hook - Hello World (Quasar) Minimal transfer hook executed on each transfer. diff --git a/tokens/token-extensions/transfer-hook/hello-world/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/hello-world/quasar/src/lib.rs index f2c366e3..a5102e2e 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/hello-world/quasar/src/lib.rs @@ -40,7 +40,7 @@ mod quasar_transfer_hook_hello_world { handle_initialize(&mut ctx.accounts, decimals) } - /// Create the ExtraAccountMetaList PDA (empty โ€” no extra accounts). + /// Create the ExtraAccountMetaList PDA (empty - no extra accounts). /// Discriminator = sha256("spl-transfer-hook-interface:initialize-extra-account-metas")[:8] #[instruction(discriminator = [43, 34, 13, 49, 167, 88, 235, 235])] pub fn initialize_extra_account_meta_list( @@ -49,7 +49,7 @@ mod quasar_transfer_hook_hello_world { handle_initialize_extra_account_meta_list(&mut ctx.accounts) } - /// Transfer hook handler โ€” called automatically by Token-2022 during transfers. + /// Transfer hook handler - called automatically by Token Extensions during transfers. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { @@ -78,7 +78,7 @@ fn handle_initialize(accounts: &mut Initialize, decimals: u8) -> Result<(), Prog let mint_size: u64 = 234; let lamports = Rent::get()?.try_minimum_balance(mint_size as usize)?; - // 1. Create account owned by Token-2022 + // 1. Create account owned by Token Extensions accounts.system_program .create_account( &accounts.payer, @@ -228,7 +228,7 @@ pub struct TransferHook { #[inline(always)] fn handle_transfer_hook(_accounts: &mut TransferHook) -> Result<(), ProgramError> { // In production, verify the source token's TransferHookAccount.transferring - // flag is set. The Token-2022 program sets this before invoking the hook + // flag is set. The Token Extensions program sets this before invoking the hook // and clears it after, preventing standalone invocation. // // For this hello-world example, we simply log a message. diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/Anchor.toml b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/Anchor.toml index 1843d9c7..62b79b75 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/Anchor.toml +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] transfer_hook = "FjcHckEgXcBhFmSGai3FRpDLiT6hbpV893n8iTxVd81g" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/README.md b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/README.md index 426d26d2..76b2157c 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/README.md @@ -1,4 +1,4 @@ -# Transfer Hook โ€” Transfer Cost (Anchor) +# Transfer Hook - Transfer Cost (Anchor) Charge an additional fee on each transfer via hook logic. diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/migrations/deploy.ts b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/Cargo.toml b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/Cargo.toml index 457b2d33..ac507718 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/Cargo.toml +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/Cargo.toml @@ -22,7 +22,7 @@ custom-panic = [] [dependencies] anchor-lang = "1.0.0" anchor-spl = "1.0.0" -# SPL crates v3.x-compatible โ€” uses solana-program-error 3.x matching anchor-lang 1.0 +# SPL crates v3.x-compatible - uses solana-program-error 3.x matching anchor-lang 1.0 spl-discriminator = "0.5.2" spl-tlv-account-resolution = "0.11.1" spl-transfer-hook-interface = "2.1.0" diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs index e1887b76..6edf615e 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -15,7 +15,7 @@ pub struct InitializeExtraAccountMetaList<'info> { init, seeds = [b"extra-account-metas", mint.key().as_ref()], bump, - // size_of returns Result with spl's ProgramError โ€” unwrap is safe for known-good input + // size_of returns Result with spl's ProgramError - unwrap is safe for known-good input space = ExtraAccountMetaList::size_of( handle_extra_account_metas_count() ).unwrap(), diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs index 324c79a6..744634f6 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs @@ -15,7 +15,7 @@ use crate::{check_is_transferring, CounterAccount, TransferError}; // Box used for source_token, destination_token, wsol_mint, // delegate_wsol_token_account, and sender_wsol_token_account to avoid exceeding // the 4096-byte BPF stack frame limit in try_accounts deserialization. -// This struct has 12 accounts โ€” without Box, the generated code uses ~4160 bytes of stack. +// This struct has 12 accounts - without Box, the generated code uses ~4160 bytes of stack. #[derive(Accounts)] pub struct TransferHook<'info> { #[account(token::mint = mint, token::authority = owner)] diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/quasar/README.md b/tokens/token-extensions/transfer-hook/transfer-cost/quasar/README.md index 54bee20d..138a5556 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/quasar/README.md +++ b/tokens/token-extensions/transfer-hook/transfer-cost/quasar/README.md @@ -1,4 +1,4 @@ -# Transfer Hook โ€” Transfer Cost (Quasar) +# Transfer Hook - Transfer Cost (Quasar) Additional fee on each transfer via the hook. diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/transfer-cost/quasar/src/lib.rs index 024ca33c..1e33e6ef 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/transfer-cost/quasar/src/lib.rs @@ -36,7 +36,7 @@ mod quasar_transfer_hook_cost { handle_initialize_extra_account_meta_list(&mut ctx.accounts) } - /// Transfer hook handler โ€” validates the amount and increments the counter. + /// Transfer hook handler - validates the amount and increments the counter. /// In the full version, this would also charge a WSOL fee via delegate. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/Anchor.toml b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/Anchor.toml index 85b30e5b..29078013 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/Anchor.toml +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] transfer_switch = "FjcHckEgXcBhFmSGai3FRpDLiT6hbpV893n8iTxVd81g" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/README.md b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/README.md index a9362235..28fe75c0 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/README.md @@ -1,4 +1,4 @@ -# Transfer Hook โ€” Transfer Switch (Anchor) +# Transfer Hook - Transfer Switch (Anchor) Enable or disable transfers globally with onchain switch state. diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/initialise_extra_account_metas_list.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/initialise_extra_account_metas_list.rs index 1cd5901e..f880d302 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/initialise_extra_account_metas_list.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/initialise_extra_account_metas_list.rs @@ -31,7 +31,7 @@ pub struct InitializeExtraAccountMetas<'info> { pub fn handle_initialize_extra_account_metas_list(accounts: &mut InitializeExtraAccountMetas, bumps: InitializeExtraAccountMetasBumps) -> Result<()> { // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x - // while anchor-lang 1.0 uses 3.x โ€” structurally identical but different semver types + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types let account_metas = vec![ // 5 - wallet (sender) config account ExtraAccountMeta::new_with_seeds( diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/switch.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/switch.rs index 4cd633af..77f59256 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/switch.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/switch.rs @@ -45,7 +45,7 @@ pub fn handle_switch(accounts: &mut Switch, on: bool, bump: u8) -> Result<()> { Ok(()) } -// admin_config is validated via `seeds=[b"admin-config"], bump` โ€” Anchor +// admin_config is validated via `seeds=[b"admin-config"], bump` - Anchor // re-derives it and fails if it doesn't match, so storing AdminConfig.bump // isn't strictly needed to validate `admin_config` inside `Switch` (the // bump field on AdminConfig is still populated on creation to satisfy the diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/transfer_hook.rs index 1e8c060a..050056fd 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/transfer_hook.rs @@ -57,7 +57,7 @@ pub fn handle_assert_is_transferring(accounts: &mut TransferHook) -> Result<()> let source_token_info = accounts.source_token_account.to_account_info(); let mut account_data_ref = source_token_info.try_borrow_mut_data()?; // .map_err() needed because spl-token-2022 uses solana-program-error 2.x - // while anchor-lang 1.0 uses 3.x โ€” structurally identical but different semver types + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types let mut account = PodStateWithExtensionsMut::::unpack(*account_data_ref) .map_err(|_| ProgramError::InvalidAccountData)?; let account_extension = account.get_extension_mut::() diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/tests/test_transfer_switch.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/tests/test_transfer_switch.rs index a861d913..1dea69a1 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/tests/test_transfer_switch.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/tests/test_transfer_switch.rs @@ -133,7 +133,7 @@ fn test_transfer_switch() { send_transaction_from_instructions(&mut svm, vec![switch_off_ix], &[&payer], &payer.pubkey()).unwrap(); svm.expire_blockhash(); - // Step 6: Try transfer โ€” should FAIL (switch is off) + // Step 6: Try transfer - should FAIL (switch is off) let transfer_amount: u64 = 1 * 10u64.pow(decimals as u32); let extra_accounts = build_hook_accounts( &mint, @@ -176,7 +176,7 @@ fn test_transfer_switch() { send_transaction_from_instructions(&mut svm, vec![switch_on_ix], &[&payer], &payer.pubkey()).unwrap(); svm.expire_blockhash(); - // Step 8: Transfer โ€” should SUCCEED (switch is on) + // Step 8: Transfer - should SUCCEED (switch is on) transfer_checked_token_extensions( &mut svm, &source_ata, diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/quasar/README.md b/tokens/token-extensions/transfer-hook/transfer-switch/quasar/README.md index 7f33b4d7..c2ff7813 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/quasar/README.md +++ b/tokens/token-extensions/transfer-hook/transfer-switch/quasar/README.md @@ -1,4 +1,4 @@ -# Transfer Hook โ€” Transfer Switch (Quasar) +# Transfer Hook - Transfer Switch (Quasar) Globally enable or disable transfers. diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/lib.rs index 250156ea..a768c9f3 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/lib.rs @@ -43,7 +43,7 @@ mod quasar_transfer_hook_switch { handle_switch(&mut ctx.accounts, on != 0) } - /// Transfer hook handler โ€” checks the sender's switch is on. + /// Transfer hook handler - checks the sender's switch is on. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { @@ -170,7 +170,7 @@ fn handle_initialize_extra_account_metas_list( data[8..12].copy_from_slice(&39u32.to_le_bytes()); data[12..16].copy_from_slice(&1u32.to_le_bytes()); - // ExtraAccountMeta: PDA seeded by [AccountKey(index=3)] โ€” the sender/owner + // ExtraAccountMeta: PDA seeded by [AccountKey(index=3)] - the sender/owner data[16] = 1; // PDA from seeds let mut config = [0u8; 32]; config[0] = 1; // 1 seed @@ -259,7 +259,7 @@ pub struct TransferHook { pub receiver_token_account: UncheckedAccount, pub wallet: UncheckedAccount, pub extra_account_metas_list: UncheckedAccount, - /// Wallet switch PDA resolved by Token-2022 + /// Wallet switch PDA resolved by Token Extensions pub wallet_switch: UncheckedAccount, } @@ -269,7 +269,7 @@ fn handle_transfer_hook(accounts: &mut TransferHook) -> Result<(), ProgramError> let data = switch_view.try_borrow()?; if data.len() < 33 { - log("Switch not initialized โ€” transfers disabled by default"); + log("Switch not initialized - transfers disabled by default"); return Err(ProgramError::UninitializedAccount); } @@ -278,6 +278,6 @@ fn handle_transfer_hook(accounts: &mut TransferHook) -> Result<(), ProgramError> return Err(ProgramError::InvalidArgument); } - log("Transfer switch is ON โ€” transfer allowed"); + log("Transfer switch is ON - transfer allowed"); Ok(()) } diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/tests.rs b/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/tests.rs index d489b371..61f3f881 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/tests.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/tests.rs @@ -95,7 +95,7 @@ fn test_transfer_switch_flow() { assert!(result.is_ok(), "switch on failed: {:?}", result.raw_result); println!(" SWITCH ON CU: {}", result.compute_units_consumed); - // 4. Transfer hook with switch ON โ€” should succeed + // 4. Transfer hook with switch ON - should succeed let source_token = Pubkey::new_unique(); let dest_token = Pubkey::new_unique(); @@ -141,7 +141,7 @@ fn test_transfer_switch_flow() { result.print_logs(); assert!(result.is_ok(), "switch off failed: {:?}", result.raw_result); - // 6. Transfer hook with switch OFF โ€” should fail + // 6. Transfer hook with switch OFF - should fail let hook_ix2 = Instruction { program_id: crate::ID, accounts: vec![ diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor/Anchor.toml b/tokens/token-extensions/transfer-hook/whitelist/anchor/Anchor.toml index b8d16639..a9dfe972 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/anchor/Anchor.toml +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] transfer_hook = "DrWbQtYJGtsoRwzKqAbHKHKsCJJfpysudF39GBVFSxub" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" @@ -18,6 +16,6 @@ wallet = "~/.config/solana/id.json" test = "cargo test" # Transfer-hook tests use the real local validator (not bankrun). -# No external program clones needed โ€” this project doesn't use Metaplex. +# No external program clones needed - this project doesn't use Metaplex. # The previous [[test.validator.clone]] of metaplex was unnecessary and # caused 5-minute timeouts in CI trying to fetch from devnet. diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor/README.md b/tokens/token-extensions/transfer-hook/whitelist/anchor/README.md index 98a50dba..36946b19 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor/README.md @@ -1,5 +1,5 @@ -# Transfer Hook โ€” Whitelist (Anchor) +# Transfer Hook - Whitelist (Anchor) A whitelist enforced by a [Token Extensions](https://solana.com/docs/terminology#token-extensions-program) transfer hook. The whitelist is stored inline on a single [account](https://solana.com/docs/terminology#account). -This approach doesn't scale: the whitelist eventually runs out of account space. For larger lists, store entries in external [PDAs](https://solana.com/docs/terminology#program-derived-address-pda) (one PDA per whitelisted wallet) โ€” see the [`block-list`](../../block-list/) example for that pattern. +This approach doesn't scale: the whitelist eventually runs out of account space. For larger lists, store entries in external [PDAs](https://solana.com/docs/terminology#program-derived-address-pda) (one PDA per whitelisted wallet) - see the [`block-list`](../../block-list/) example for that pattern. diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor/migrations/deploy.ts b/tokens/token-extensions/transfer-hook/whitelist/anchor/migrations/deploy.ts deleted file mode 100644 index 81b3ef43..00000000 --- a/tokens/token-extensions/transfer-hook/whitelist/anchor/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@anchor-lang/core"); - -module.exports = async (provider) => { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs index 6b9d7367..d496ede1 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -15,7 +15,7 @@ pub struct InitializeExtraAccountMetaList<'info> { init, seeds = [b"extra-account-metas", mint.key().as_ref()], bump, - // size_of returns Result with spl's ProgramError โ€” unwrap is safe for known-good input + // size_of returns Result with spl's ProgramError - unwrap is safe for known-good input space = ExtraAccountMetaList::size_of( handle_extra_account_metas_count() ).unwrap(), @@ -37,7 +37,7 @@ pub fn handler(mut context: Context) -> Result<( // initialize ExtraAccountMetaList account with extra accounts // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x - // while anchor-lang 1.0 uses 3.x โ€” structurally identical but different semver types + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types ExtraAccountMetaList::init::( &mut context.accounts.extra_account_meta_list.try_borrow_mut_data()?, &extra_account_metas, diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/lib.rs index 0645fd1f..5409ea43 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/lib.rs @@ -50,7 +50,7 @@ pub fn check_is_transferring(context: &Context) -> Result<()> { let source_token_info = context.accounts.source_token.to_account_info(); let mut account_data_ref: RefMut<&mut [u8]> = source_token_info.try_borrow_mut_data()?; // .map_err() needed because spl-token-2022 uses solana-program-error 2.x - // while anchor-lang 1.0 uses 3.x โ€” structurally identical but different semver types + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types let mut account = PodStateWithExtensionsMut::::unpack(*account_data_ref) .map_err(|_| ProgramError::InvalidAccountData)?; let account_extension = account.get_extension_mut::() @@ -66,7 +66,7 @@ pub fn check_is_transferring(context: &Context) -> Result<()> { // Define extra account metas to store on extra_account_meta_list account pub fn handle_extra_account_metas() -> Result> { // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x - // while anchor-lang 1.0 uses 3.x โ€” structurally identical but different semver types + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types Ok(vec![ExtraAccountMeta::new_with_seeds( &[Seed::Literal { bytes: "white_list".as_bytes().to_vec(), diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/tests/test_transfer_hook.rs index 35152fa7..ace2f529 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/tests/test_transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/tests/test_transfer_hook.rs @@ -114,7 +114,7 @@ fn test_whitelist_transfer_hook() { send_transaction_from_instructions(&mut svm, vec![add_to_whitelist_ix], &[&payer], &payer.pubkey()).unwrap(); svm.expire_blockhash(); - // Step 5: Transfer โ€” should succeed (destination is whitelisted) + // Step 5: Transfer - should succeed (destination is whitelisted) let transfer_amount: u64 = 1 * 10u64.pow(decimals as u32); let extra_accounts = build_hook_accounts( &mint, diff --git a/tokens/token-extensions/transfer-hook/whitelist/quasar/README.md b/tokens/token-extensions/transfer-hook/whitelist/quasar/README.md index cbc37121..8ad529b9 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/quasar/README.md +++ b/tokens/token-extensions/transfer-hook/whitelist/quasar/README.md @@ -1,4 +1,4 @@ -# Transfer Hook โ€” Whitelist (Quasar) +# Transfer Hook - Whitelist (Quasar) Only whitelisted accounts may receive tokens. diff --git a/tokens/token-extensions/transfer-hook/whitelist/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/whitelist/quasar/src/lib.rs index 690ff185..003ef6f5 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/whitelist/quasar/src/lib.rs @@ -30,7 +30,7 @@ mod quasar_transfer_hook_whitelist { handle_initialize(&mut ctx.accounts) } - /// Transfer hook handler โ€” checks if the destination is in the whitelist. + /// Transfer hook handler - checks if the destination is in the whitelist. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { diff --git a/tokens/token-extensions/transfer-hook/whitelist/quasar/src/tests.rs b/tokens/token-extensions/transfer-hook/whitelist/quasar/src/tests.rs index c214f41e..1f1f1d4c 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/quasar/src/tests.rs +++ b/tokens/token-extensions/transfer-hook/whitelist/quasar/src/tests.rs @@ -79,7 +79,7 @@ fn test_whitelist_flow() { result.print_logs(); assert!(result.is_ok(), "add_to_whitelist failed: {:?}", result.raw_result); - // 3. Transfer hook with whitelisted destination โ€” should succeed + // 3. Transfer hook with whitelisted destination - should succeed let source_token = Pubkey::new_unique(); let owner = Pubkey::new_unique(); @@ -107,7 +107,7 @@ fn test_whitelist_flow() { assert!(result.is_ok(), "transfer_hook (whitelisted) failed: {:?}", result.raw_result); println!(" TRANSFER_HOOK (allowed) CU: {}", result.compute_units_consumed); - // 4. Transfer hook with non-whitelisted destination โ€” should fail + // 4. Transfer hook with non-whitelisted destination - should fail let bad_dest = Pubkey::new_unique(); let mut hook_data2 = vec![105, 37, 101, 197, 75, 251, 102, 26]; hook_data2.extend_from_slice(&100u64.to_le_bytes()); diff --git a/tokens/token-minter/anchor/Anchor.toml b/tokens/token-minter/anchor/Anchor.toml index ff3b0862..21553a00 100644 --- a/tokens/token-minter/anchor/Anchor.toml +++ b/tokens/token-minter/anchor/Anchor.toml @@ -8,14 +8,12 @@ skip-lint = false [programs.localnet] token_minter = "3of89Z9jwek9zrFgpCWc9jZvQvitpVMxpZNsrAD2vQUD" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests โ€” the validator tests (test.ts) need Metaplex Token +# Only run bankrun tests - the validator tests (test.ts) need Metaplex Token # Metadata cloned from mainnet which is too slow/unreliable in CI. # bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). test = "cargo test" diff --git a/tokens/token-minter/quasar/Cargo.toml b/tokens/token-minter/quasar/Cargo.toml index a1443e71..e0c9be17 100644 --- a/tokens/token-minter/quasar/Cargo.toml +++ b/tokens/token-minter/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-token-minter" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] @@ -23,7 +23,7 @@ debug = [] [dependencies] # All quasar deps share one source-id (branch = "master") so trait-impls -# resolve consistently โ€” mixing `{ git = ... }` with `{ git = ..., branch = "master" }` +# resolve consistently - mixing `{ git = ... }` with `{ git = ..., branch = "master" }` # was treated by Cargo as two distinct sources of the same crate. # quasar pin rationale: master HEAD currently fails to compile because zeropod 0.3.x # auto-generates accessor methods that conflict with hand-written ones in quasar-spl diff --git a/tokens/token-minter/quasar/src/instructions/create.rs b/tokens/token-minter/quasar/src/instructions/create.rs index 86bf735c..55d25c3f 100644 --- a/tokens/token-minter/quasar/src/instructions/create.rs +++ b/tokens/token-minter/quasar/src/instructions/create.rs @@ -27,7 +27,7 @@ pub struct CreateToken { ), )] pub mint_account: Account, - /// The metadata PDA โ€” will be initialised by the Metaplex program. + /// The metadata PDA - will be initialised by the Metaplex program. #[account(mut)] pub metadata_account: UncheckedAccount, pub token_program: Program, diff --git a/tokens/token-minter/quasar/src/lib.rs b/tokens/token-minter/quasar/src/lib.rs index 6a3b061f..1c004ee1 100644 --- a/tokens/token-minter/quasar/src/lib.rs +++ b/tokens/token-minter/quasar/src/lib.rs @@ -12,15 +12,15 @@ declare_id!("22222222222222222222222222222222222222222222"); /// Token minter with Metaplex metadata. /// /// Two instructions: -/// - `create_token` โ€” creates a mint and associated Metaplex metadata account -/// - `mint_token` โ€” mints tokens to a recipient's associated token account +/// - `create_token` - creates a mint and associated Metaplex metadata account +/// - `mint_token` - mints tokens to a recipient's associated token account #[program] mod quasar_token_minter { use super::*; // String capacities follow Metaplex Token Metadata limits: // name โ‰ค 32, symbol โ‰ค 10, uri โ‰ค 200. PodString requires an explicit - // capacity since PR #195 โ€” `String` (no ) is no longer accepted. + // capacity - bare `String` (no ) is not accepted. #[instruction(discriminator = 0)] pub fn create_token( ctx: Ctx, diff --git a/tokens/transfer-tokens/anchor/Anchor.toml b/tokens/transfer-tokens/anchor/Anchor.toml index 4a333d0d..a5a49fb9 100644 --- a/tokens/transfer-tokens/anchor/Anchor.toml +++ b/tokens/transfer-tokens/anchor/Anchor.toml @@ -8,14 +8,12 @@ skip-lint = false [programs.localnet] transfer_tokens = "nHi9DdNjuupjQ3c8AJU9sChB5gLbZvTLsJQouY4hU67" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests โ€” the validator tests (test.ts) need Metaplex Token +# Only run bankrun tests - the validator tests (test.ts) need Metaplex Token # Metadata cloned from mainnet which is too slow/unreliable in CI. # bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). test = "cargo test" diff --git a/tokens/transfer-tokens/anchor/programs/transfer-tokens/tests/test_transfer_tokens.rs b/tokens/transfer-tokens/anchor/programs/transfer-tokens/tests/test_transfer_tokens.rs index 5a58fa9a..b660ed47 100644 --- a/tokens/transfer-tokens/anchor/programs/transfer-tokens/tests/test_transfer_tokens.rs +++ b/tokens/transfer-tokens/anchor/programs/transfer-tokens/tests/test_transfer_tokens.rs @@ -135,7 +135,7 @@ fn test_create_mint_and_transfer() { ) .unwrap(); - // Verify tokens minted โ€” 100 * 10^9 = 100_000_000_000 (9 decimals) + // Verify tokens minted - 100 * 10^9 = 100_000_000_000 (9 decimals) assert_eq!( get_token_account_balance(&svm, &sender_ata).unwrap(), 100_000_000_000 diff --git a/tokens/transfer-tokens/quasar/Cargo.toml b/tokens/transfer-tokens/quasar/Cargo.toml index e1b2fabd..2846741d 100644 --- a/tokens/transfer-tokens/quasar/Cargo.toml +++ b/tokens/transfer-tokens/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-transfer-tokens" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] diff --git a/tools/shank-and-codama/native/README.md b/tools/shank-and-codama/native/README.md index 9071c123..9cfbbd08 100644 --- a/tools/shank-and-codama/native/README.md +++ b/tools/shank-and-codama/native/README.md @@ -9,14 +9,9 @@ in the language of your choice. This example is a small "car rental service" program. It is annotated with Shank macros, Shank extracts the IDL, and Codama renders a TypeScript client (`@solana/kit`-based) from that IDL. An in-process [LiteSVM](https://github.com/litesvm/litesvm) -test then drives the program through the generated client โ€” no validator or +test then drives the program through the generated client - no validator or devnet required, so it runs in CI. -> This example used to use [Solita](https://github.com/metaplex-foundation/solita) -> to generate the client. Solita is unmaintained and does not work on the current -> toolchain, so it has been replaced with Codama. The Shank half of the lesson is -> unchanged. - ## Shank [Shank](https://github.com/metaplex-foundation/shank) is a set of Rust derive @@ -63,17 +58,16 @@ pnpm generate-idl # runs: shank idl --crate-root ./program --out-dir ./program The IDL lands in `program/idl/car_rental_service.json` (committed to the repo so the client can be regenerated without the Rust CLI). Its `metadata.origin` is `"shank"`, and each instruction carries an explicit single-byte (`u8`) -`discriminant` โ€” this is what distinguishes a Shank IDL from an Anchor IDL. +`discriminant` - this is what distinguishes a Shank IDL from an Anchor IDL. ### A note on PDAs and `#[seeds(...)]` -Shank 0.0.x used a `#[seeds(...)]` attribute on a `ShankAccount` to *generate* -`shank_pda` / `shank_seeds_with_bump` helper methods. As of Shank 0.4.x that PDA +Shank's `#[seeds(...)]` attribute is not used here: on Shank 0.4.x its PDA code-generation produces unparsable tokens and fails to compile, and the seeds -are not emitted into the IDL either. So this example keeps PDA derivation -explicit in `program/src/state/mod.rs` (`Car::find_pda`, `RentalOrder::find_pda`) -and no longer uses the `#[seeds(...)]` attribute. `ShankAccount` is still used โ€” -it is what tells Shank to include the account layout in the IDL. +are not emitted into the IDL either. This example instead keeps PDA derivation +explicit in `program/src/state/mod.rs` (`Car::find_pda`, `RentalOrder::find_pda`). +`ShankAccount` is still used - it is what tells Shank to include the account +layout in the IDL. ## Codama @@ -103,7 +97,7 @@ await codama.accept(renderVisitor(outDir, { deleteFolderBeforeRendering: true }) ``` > Codama also ships `@codama/renderers-rust` if you want a Rust client instead of -> a TypeScript one โ€” swap `renderVisitor` from `@codama/renderers-js` for the Rust +> a TypeScript one - swap `renderVisitor` from `@codama/renderers-js` for the Rust > renderer. Generate the client: @@ -125,4 +119,4 @@ pnpm build-and-test # build, regenerate the client, then run the LiteSVM test The test ([`tests/test.ts`](./tests/test.ts)) loads the compiled `.so` into a [LiteSVM](https://github.com/litesvm/litesvm) instance and exercises `add_car`, `book_rental`, and `pick_up_car` through the generated client, asserting on the -resulting on-chain account state. +resulting onchain account state. diff --git a/tools/shank-and-codama/native/tests/test.ts b/tools/shank-and-codama/native/tests/test.ts index e74f8368..bbf03fbd 100644 --- a/tools/shank-and-codama/native/tests/test.ts +++ b/tools/shank-and-codama/native/tests/test.ts @@ -3,7 +3,7 @@ // Runs entirely in CI with no network: the program `.so` is loaded into a // LiteSVM instance and exercised through the Codama-generated client // (tests/generated). It creates a car (add_car), books a rental -// (book_rental) and picks it up (pick_up_car), asserting on-chain account +// (book_rental) and picks it up (pick_up_car), asserting onchain account // state after each step. import assert from "node:assert/strict"; From 1ff38c53e763055346358ebbf4b86ed862994181 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:10:45 +0000 Subject: [PATCH 049/138] order-book: ceil taker fee in the protocol's favour, move withdraw_fees under instructions/admin - fee = ceil(gross * fee_bps / 10_000): flooring leaked up to 1 minor unit of quote per fill to the maker, which many tiny fills could industrialise. Add a rounding-edge regression test (gross = 501 at 10 bps must charge 1, not 0) and update the README walkthrough numbers - fix pre-existing settle_funds test assertions that compared raw token balances against lot counts (failed at HEAD; CI path filters hid it) - correct the order_book::remove comment that claimed an O(log N) tree lookup above what is actually a linear arena scan https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- finance/order-book/anchor/README.md | 42 ++++----- .../order-book/src/instructions/admin/mod.rs | 3 + .../instructions/{ => admin}/withdraw_fees.rs | 0 .../order-book/src/instructions/mod.rs | 4 +- .../src/instructions/place_order.rs | 7 +- .../order-book/src/state/order_book.rs | 5 +- .../order-book/tests/test_order_book.rs | 90 ++++++++++++++++--- 7 files changed, 112 insertions(+), 39 deletions(-) create mode 100644 finance/order-book/anchor/programs/order-book/src/instructions/admin/mod.rs rename finance/order-book/anchor/programs/order-book/src/instructions/{ => admin}/withdraw_fees.rs (100%) diff --git a/finance/order-book/anchor/README.md b/finance/order-book/anchor/README.md index b06ee15a..49be1f29 100644 --- a/finance/order-book/anchor/README.md +++ b/finance/order-book/anchor/README.md @@ -167,7 +167,7 @@ tokens still sit in the market's vaults. `settle_funds` moves them to the user's own token accounts and zeroes the counters. **Fee vault.** A separate token account (quote mint) owned by the -Market PDA. Every taker fee - `gross * fee_bps / 10_000` per fill - +Market PDA. Every taker fee - `ceil(gross * fee_bps / 10_000)` per fill - moves here in one batched CPI at the end of `place_order`. **Remaining accounts.** Solana lets the caller pass a tail of extra @@ -312,8 +312,8 @@ carol_nvdax_ata --[3 NVDAx]--> base_vault | Line item | Calculation | Result | |---|---|---| | Gross quote exchanged | 950 ร— 3 | 2 850 USDC | -| Taker fee (25 bps) | 2 850 ร— 25 / 10 000 | 7 USDC | -| Carol's net proceeds | 2 850 โˆ’ 7 | 2 843 USDC โ†’ `carol.MarketUser.unsettled_quote` | +| Taker fee (25 bps) | ceil(2 850 ร— 25 / 10 000) = ceil(7.125) | 8 USDC | +| Carol's net proceeds | 2 850 โˆ’ 8 | 2 842 USDC โ†’ `carol.MarketUser.unsettled_quote` | | Alice's base received | 3 NVDAx | โ†’ `alice.MarketUser.unsettled_base` | **Accounts changed:** @@ -321,11 +321,11 @@ carol_nvdax_ata --[3 NVDAx]--> base_vault | Account | Change | |---|---| | `base_vault` | +3 NVDAx (Carol's lock) | -| `fee_vault` | +7 USDC (fee CPI from quote_vault) | +| `fee_vault` | +8 USDC (fee CPI from quote_vault) | | Alice's `Order` PDA (id=2) | `filled_quantity=3`, `status=PartiallyFilled` | | Alice's `MarketUser.unsettled_base` | +3 NVDAx | | Alice's `MarketUser.open_orders` | `[2]` (still open - 2 of 5 NVDAx remain) | -| Carol's `MarketUser.unsettled_quote` | +2 843 USDC | +| Carol's `MarketUser.unsettled_quote` | +2 842 USDC | | New Carol's `Order` PDA (id=3) | `side=Ask, price=945, qty=3, status=Filled` | | `OrderBook.bids` | Alice's leaf quantity: 5 โ†’ 2 | @@ -351,7 +351,7 @@ base_vault --[3 NVDAx]--> alice_nvdax_ata **Carol calls `settle_funds`:** ``` -quote_vault --[2 843 USDC]--> carol_usdc_ata +quote_vault --[2 842 USDC]--> carol_usdc_ata ``` `carol.MarketUser.unsettled_quote = 0` @@ -361,7 +361,7 @@ quote_vault --[2 843 USDC]--> carol_usdc_ata **Maria calls `withdraw_fees`:** ``` -fee_vault --[7 USDC]--> maria_usdc_ata +fee_vault --[8 USDC]--> maria_usdc_ata ``` `fee_vault.balance = 0` @@ -372,9 +372,9 @@ fee_vault --[7 USDC]--> maria_usdc_ata | Participant | Paid / locked | Received | Outcome | |---|---|---|---| | **Alice** | 4 750 USDC (for 5 NVDAx) | 3 NVDAx + 1 900 USDC still in `quote_vault` (2-NVDAx bid resting at 950) | Thesis running; waiting for a seller at 950 to fill the rest | -| **Carol** | 3 NVDAx (cost 800 each) | 2 843 USDC | Locked in โ‰ˆ 148 USDC/NVDAx profit net of fee | +| **Carol** | 3 NVDAx (cost 800 each) | 2 842 USDC | Locked in โ‰ˆ 147 USDC/NVDAx profit net of fee | | **Bob** | 10 NVDAx locked | Nothing yet - ask at 965 unfilled | Earns the spread when a buyer at 965 arrives | -| **Maria** | - | 7 USDC | Fee revenue | +| **Maria** | - | 8 USDC | Fee revenue | Alice's remaining 2-NVDAx [bid](https://www.investopedia.com/terms/b/bid.asp) stays on the book. The next seller willing to part with NVDAx at 950 or below will fill it automatically. A **TSLAx/USDC** market runs the same seven steps with different mint addresses. @@ -942,7 +942,7 @@ Per-fill quantities: ``` gross = fill_price * fill_qty (quote tokens) -fee = gross * fee_bps / 10_000 (quote tokens) +fee = ceil(gross * fee_bps / 10_000) (quote tokens) net_to_maker = gross - fee (quote tokens) locked = bp * fill_qty (quote tokens the taker had locked for this fill) rebate = locked - gross (quote the taker locked but doesn't need to spend) @@ -975,7 +975,7 @@ resting **bid** at `bp โ‰ฅ ap`: fill_qty = min(taker_remaining, bp_remaining) fill_price = bp gross = bp * fill_qty -fee = gross * fee_bps / 10_000 +fee = ceil(gross * fee_bps / 10_000) net_to_taker = gross - fee Token flows: @@ -1017,9 +1017,9 @@ Start with an empty book. Fees 10 bps (0.1%). Tick size 1. Step C - apply fills: For Fill 0 (Dan): - - gross = 900 * 5 = 4500; fee = 4500 * 10 / 10 000 = 4; - net_to_maker = 4496. - - `dan_market_user.unsettled_quote += 4496` + - gross = 900 * 5 = 4500; fee = ceil(4500 * 10 / 10 000) = ceil(4.5) = 5; + net_to_maker = 4495. + - `dan_market_user.unsettled_quote += 4495` - `faye_market_user.unsettled_base += 5` - Faye's rebate = 1000*5 โˆ’ 4500 = 500. `faye_market_user.unsettled_quote += 500` @@ -1027,8 +1027,8 @@ Start with an empty book. Fees 10 bps (0.1%). Tick size 1. remove from `dan_market_user.open_orders`. For Fill 1 (Erin): - - gross = 950 * 2 = 1900; fee = 1; net_to_maker = 1899. - - `erin_market_user.unsettled_quote += 1899` + - gross = 950 * 2 = 1900; fee = ceil(1.9) = 2; net_to_maker = 1898. + - `erin_market_user.unsettled_quote += 1898` - `faye_market_user.unsettled_base += 2` - Faye's rebate = 1000*2 โˆ’ 1900 = 100. `faye_market_user.unsettled_quote += 100` @@ -1043,9 +1043,9 @@ Start with an empty book. Fees 10 bps (0.1%). Tick size 1. The next taker who wants to hit Erin's ask will pass `order_2` as a maker and see `leaf.quantity = 3`. - Step E - pay the fee. `total_fee_quote = 4 + 1 = 5`. One CPI: + Step E - pay the fee. `total_fee_quote = 5 + 2 = 7`. One CPI: ``` - quote_vault --[5 quote]--> fee_vault + quote_vault --[7 quote]--> fee_vault ``` Step F - apply Faye's deltas. `faye_market_user.unsettled_base = @@ -1057,13 +1057,13 @@ Start with an empty book. Fees 10 bps (0.1%). Tick size 1. 4. Later, each user calls `settle_funds`: - Dan's settle: `base_vault` loses 0 base; `quote_vault` loses - 4496 quote โ†’ Dan's quote ATA gains 4496. - - Erin's settle: 1899 quote to Erin's ATA. + 4495 quote โ†’ Dan's quote ATA gains 4495. + - Erin's settle: 1898 quote to Erin's ATA. - Faye's settle: 7 base to Faye's base ATA; 600 quote refund to Faye's quote ATA (unused from her 7000 lock). 5. At some point the market authority calls `withdraw_fees`: - `fee_vault.balance = 5` โ†’ drained to authority's quote ATA. + `fee_vault.balance = 7` โ†’ drained to authority's quote ATA. **Post-settlement invariant check**: - `base_vault.balance` should equal sum of remaining ask quantities = diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/admin/mod.rs b/finance/order-book/anchor/programs/order-book/src/instructions/admin/mod.rs new file mode 100644 index 00000000..ef5bf86c --- /dev/null +++ b/finance/order-book/anchor/programs/order-book/src/instructions/admin/mod.rs @@ -0,0 +1,3 @@ +pub mod withdraw_fees; + +pub use withdraw_fees::*; diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/withdraw_fees.rs b/finance/order-book/anchor/programs/order-book/src/instructions/admin/withdraw_fees.rs similarity index 100% rename from finance/order-book/anchor/programs/order-book/src/instructions/withdraw_fees.rs rename to finance/order-book/anchor/programs/order-book/src/instructions/admin/withdraw_fees.rs diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/mod.rs b/finance/order-book/anchor/programs/order-book/src/instructions/mod.rs index 0b80b8b3..aa1118af 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/mod.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/mod.rs @@ -1,13 +1,13 @@ +pub mod admin; pub mod cancel_order; pub mod create_market_user; pub mod initialize_market; pub mod place_order; pub mod settle_funds; -pub mod withdraw_fees; +pub use admin::*; pub use cancel_order::*; pub use create_market_user::*; pub use initialize_market::*; pub use place_order::*; pub use settle_funds::*; -pub use withdraw_fees::*; diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/place_order.rs b/finance/order-book/anchor/programs/order-book/src/instructions/place_order.rs index 203266d6..3c63baea 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/place_order.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/place_order.rs @@ -178,7 +178,7 @@ pub fn handle_place_order<'info>( // Fee model (simple, maker-funded, no extra taker deposit): // // gross = fill_price * fill_quantity (quote tokens per fill) - // fee = gross * fee_bps / 10_000 (rounded down) + // fee = gross * fee_bps / 10_000 (rounded up) // maker gets gross - fee, // fee_vault gets fee, // taker pays 'gross' net (out of their pre-locked quote). @@ -201,9 +201,14 @@ pub fn handle_place_order<'info>( .try_into() .map_err(|_| error!(ErrorCode::NumericalOverflow))?; + // Ceiling division: round the fee in the protocol's favour. Flooring + // would leak up to 1 minor unit of quote per fill to the maker, which + // an attacker could industrialise with many tiny fills. let fee_quote: u64 = (gross_quote as u128) .checked_mul(market.fee_basis_points as u128) .ok_or(ErrorCode::NumericalOverflow)? + .checked_add(BASIS_POINTS_DENOMINATOR - 1) + .ok_or(ErrorCode::NumericalOverflow)? .checked_div(BASIS_POINTS_DENOMINATOR) .ok_or(ErrorCode::NumericalOverflow)? .try_into() diff --git a/finance/order-book/anchor/programs/order-book/src/state/order_book.rs b/finance/order-book/anchor/programs/order-book/src/state/order_book.rs index db4bf82c..1786d5ac 100644 --- a/finance/order-book/anchor/programs/order-book/src/state/order_book.rs +++ b/finance/order-book/anchor/programs/order-book/src/state/order_book.rs @@ -130,8 +130,9 @@ impl OrderBook { /// and removed on either side. pub fn remove(&mut self, order_id: u64) -> bool { // We don't know which side the order is on without scanning, so try - // both. Tree lookup is O(log N) - much cheaper than the linear Vec - // scan the previous implementation did. + // both. Each side does a linear scan over its node arena to find the + // full key (price is not known at cancellation time), then removes + // by key - see `remove_from`. if self.remove_from(OrderSide::Bid, order_id).is_some() { return true; } diff --git a/finance/order-book/anchor/programs/order-book/tests/test_order_book.rs b/finance/order-book/anchor/programs/order-book/tests/test_order_book.rs index 82624f3f..4d6ebdb5 100644 --- a/finance/order-book/anchor/programs/order-book/tests/test_order_book.rs +++ b/finance/order-book/anchor/programs/order-book/tests/test_order_book.rs @@ -54,6 +54,12 @@ const QUOTE_DECIMALS: u8 = 6; // USDC // raw_quote = price ร— quantity ร— 1 (= human USDC/share ร— lots) // tick_size = 1 โ†’ $1.00 minimum price increment const FEE_BASIS_POINTS: u16 = 10; + +// Mirror of the program's fee rounding: ceiling division so the fee rounds +// in the protocol's favour (flooring would leak dust to the maker per fill). +const fn fee_ceil(gross: u64) -> u64 { + ((gross as u128 * FEE_BASIS_POINTS as u128 + 9_999) / 10_000) as u64 +} const TICK_SIZE: u64 = 1; const BASE_LOT_SIZE: u64 = 100; const QUOTE_LOT_SIZE: u64 = 1; @@ -1649,8 +1655,8 @@ fn taker_crosses_multiple_resting_orders_best_price_first() { // Seller's net unsettled_quote = sum of (fill_price * fill_qty * quote_lot_size - fee). let gross_one: u64 = BEST_ASK_PRICE * BEST_ASK_QUANTITY * QUOTE_LOT_SIZE; let gross_two: u64 = SECOND_ASK_PRICE * SECOND_ASK_QUANTITY * QUOTE_LOT_SIZE; - let fee_one: u64 = gross_one * FEE_BASIS_POINTS as u64 / 10_000; - let fee_two: u64 = gross_two * FEE_BASIS_POINTS as u64 / 10_000; + let fee_one: u64 = fee_ceil(gross_one); + let fee_two: u64 = fee_ceil(gross_two); let expected_seller_quote = (gross_one - fee_one) + (gross_two - fee_two); let (_, seller_quote) = read_user_unsettled(&sc.svm, &sc.seller_market_user); assert_eq!(seller_quote, expected_seller_quote); @@ -1807,7 +1813,7 @@ fn taker_bid_gets_price_improvement_from_resting_ask() { // Maker got 900-per-unit (minus fee), not 1000. let gross_to_maker: u64 = MAKER_ASK_PRICE * QUANTITY * QUOTE_LOT_SIZE; - let fee: u64 = gross_to_maker * FEE_BASIS_POINTS as u64 / 10_000; + let fee: u64 = fee_ceil(gross_to_maker); let expected_net_to_maker: u64 = gross_to_maker - fee; let (_, seller_quote) = read_user_unsettled(&sc.svm, &sc.seller_market_user); assert_eq!(seller_quote, expected_net_to_maker); @@ -1820,10 +1826,67 @@ fn taker_bid_gets_price_improvement_from_resting_ask() { assert_eq!(buyer_quote, expected_rebate); } +#[test] +fn fee_rounds_up_when_gross_is_not_a_bps_multiple() { + // Rounding regression: with fee_bps = 10, a gross of 501 quote tokens + // gives 501 * 10 / 10_000 = 0.501, which must round UP to 1 (protocol- + // favouring ceiling), not down to 0. A floor here would let makers + // fill fee-free with many small orders. + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + const MAKER_ASK_ID: u64 = 1; + const PRICE: u64 = 501; + const QUANTITY: u64 = 1; + const GROSS: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; + const EXPECTED_FEE: u64 = fee_ceil(GROSS); + // Prove this case actually exercises the rounding edge. + assert!(GROSS * FEE_BASIS_POINTS as u64 % 10_000 != 0); + assert_eq!(EXPECTED_FEE, GROSS * FEE_BASIS_POINTS as u64 / 10_000 + 1); + + let maker_ix = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + MAKER_ASK_ID, + PRICE, + QUANTITY, + ); + send_transaction_from_instructions(&mut sc.svm, vec![maker_ix], &[&sc.seller], + &sc.seller.pubkey()).unwrap(); + + const TAKER_BID_ID: u64 = 2; + let taker_ix = build_place_order_with_makers_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + TAKER_BID_ID, + PRICE, + QUANTITY, + &[(MAKER_ASK_ID, sc.seller_market_user)], + ); + send_transaction_from_instructions(&mut sc.svm, vec![taker_ix], &[&sc.buyer], + &sc.buyer.pubkey()).unwrap(); + + assert_eq!( + get_token_account_balance(&sc.svm, &sc.fee_vault.pubkey()).unwrap(), + EXPECTED_FEE + ); + // Maker's unsettled quote is gross minus the rounded-up fee. + let (_, seller_quote) = read_user_unsettled(&sc.svm, &sc.seller_market_user); + assert_eq!(seller_quote, GROSS - EXPECTED_FEE); +} + #[test] fn fee_vault_receives_exactly_bps_of_taker_gross() { // Simpler standalone check of the fee maths: fee_vault must equal - // (taker gross quote) * fee_bps / 10_000 after a single fill. + // ceil((taker gross quote) * fee_bps / 10_000) after a single fill. let mut sc = full_setup(); initialize_market_and_users(&mut sc); @@ -1831,7 +1894,7 @@ fn fee_vault_receives_exactly_bps_of_taker_gross() { const PRICE: u64 = 500; const QUANTITY: u64 = 200; const GROSS: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; - const EXPECTED_FEE: u64 = GROSS * FEE_BASIS_POINTS as u64 / 10_000; + const EXPECTED_FEE: u64 = fee_ceil(GROSS); let __ix5 = build_place_order_ix( &sc, @@ -1888,7 +1951,7 @@ fn authority_can_withdraw_fees_after_match() { const PRICE: u64 = 2000; const QUANTITY: u64 = 50; const GROSS: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; - const EXPECTED_FEE: u64 = GROSS * FEE_BASIS_POINTS as u64 / 10_000; + const EXPECTED_FEE: u64 = fee_ceil(GROSS); let __ix7 = build_place_order_ix( &sc, @@ -1957,7 +2020,7 @@ fn settle_funds_after_match_pays_out_both_unsettled_balances() { const PRICE: u64 = 1000; const QUANTITY: u64 = 100; const GROSS: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; - const EXPECTED_FEE: u64 = GROSS * FEE_BASIS_POINTS as u64 / 10_000; + const EXPECTED_FEE: u64 = fee_ceil(GROSS); const EXPECTED_NET_QUOTE_TO_SELLER: u64 = GROSS - EXPECTED_FEE; // Maker posts and taker crosses. @@ -2010,23 +2073,24 @@ fn settle_funds_after_match_pays_out_both_unsettled_balances() { send_transaction_from_instructions(&mut sc.svm, vec![__ix12], &[&sc.seller], &sc.seller.pubkey()).unwrap(); - // Buyer should now hold `QUANTITY` extra base tokens and have paid the - // gross quote (starting balance minus gross). No price improvement - // here, so nothing else to refund. + // Buyer should now hold `QUANTITY` lots of extra base tokens + // (QUANTITY * BASE_LOT_SIZE raw minor units) and have paid the gross + // quote (starting balance minus gross). No price improvement here, so + // nothing else to refund. assert_eq!( get_token_account_balance(&sc.svm, &sc.buyer_base_ata).unwrap(), - QUANTITY + QUANTITY * BASE_LOT_SIZE ); assert_eq!( get_token_account_balance(&sc.svm, &sc.buyer_quote_ata).unwrap(), TRADER_STARTING_BALANCE - GROSS ); - // Seller should now hold (starting - QUANTITY) base and + // Seller should now hold (starting - QUANTITY lots) base and // EXPECTED_NET_QUOTE_TO_SELLER quote. assert_eq!( get_token_account_balance(&sc.svm, &sc.seller_base_ata).unwrap(), - TRADER_STARTING_BALANCE - QUANTITY + TRADER_STARTING_BALANCE - QUANTITY * BASE_LOT_SIZE ); assert_eq!( get_token_account_balance(&sc.svm, &sc.seller_quote_ata).unwrap(), From 22b28d078ad64fb91762cc100fa8779cce978421 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:11:18 +0000 Subject: [PATCH 050/138] token-fundraiser: fix inverted lifecycle windows, drainable refund, and unit-scaling bugs in both variants Anchor variant: - contribution window was inverted (contributions only allowed AFTER the deadline); refund window was inverted the other way. Tests hid both by using duration 0. Windows now read: contribute while elapsed < duration, refund once elapsed >= duration and the target was not met - one major unit is 10^decimals minor units: minimum contribution used 1^decimals (always 1) and the minimum target used 3^decimals - all balance arithmetic is checked_*; state updates before transfer CPIs - migrated to token_interface types and transfer_checked throughout - checker now compares the state-tracked current_amount (a direct vault donation can no longer trigger early release) and closes the vault token account so its rent is recovered - tests rewritten with nonzero duration and Clock warping on both sides of every deadline boundary; account structs renamed *AccountConstraints Quasar variant: - refund's contributor_account was not bound to the signer: anyone could pass a victim's Contributor record with their own token account and drain the vault. It is now PDA-bound to (fundraiser, contributor) - contribute's fundraiser/contributor_account/vault were unconstrained and unlinked; now has_one(vault), has_one(maker), and PDA-derived addresses - no instruction ever created a Contributor account (the program was unusable onchain); contribute now init(idempotent)s it - time_started was stored as 0 and duration never read; real Clock-based window logic added, plus the missing target-not-met check on refund - named error enum replaces bare ProgramError::Custom values - tests rewritten to drive the real initialize -> contribute -> refund / check_contributions flows through the generated client with clock warping, including decoy-vault and cross-contributor attack regressions https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- finance/token-fundraiser/anchor/Anchor.toml | 2 - finance/token-fundraiser/anchor/README.md | 119 ++- .../anchor/programs/fundraiser/Cargo.toml | 6 + .../anchor/programs/fundraiser/src/error.rs | 8 +- .../fundraiser/src/instructions/checker.rs | 114 +-- .../fundraiser/src/instructions/contribute.rs | 176 +++-- .../fundraiser/src/instructions/initialize.rs | 79 +- .../fundraiser/src/instructions/refund.rs | 134 ++-- .../anchor/programs/fundraiser/src/lib.rs | 17 +- .../fundraiser/tests/test_fundraiser.rs | 746 ++++++++++++------ finance/token-fundraiser/quasar/Cargo.toml | 5 +- finance/token-fundraiser/quasar/README.md | 29 +- finance/token-fundraiser/quasar/src/error.rs | 25 + .../src/instructions/check_contributions.rs | 43 +- .../quasar/src/instructions/contribute.rs | 90 ++- .../quasar/src/instructions/initialize.rs | 23 +- .../quasar/src/instructions/refund.rs | 73 +- finance/token-fundraiser/quasar/src/lib.rs | 9 +- finance/token-fundraiser/quasar/src/state.rs | 33 +- finance/token-fundraiser/quasar/src/tests.rs | 657 ++++++++++----- 20 files changed, 1553 insertions(+), 835 deletions(-) create mode 100644 finance/token-fundraiser/quasar/src/error.rs diff --git a/finance/token-fundraiser/anchor/Anchor.toml b/finance/token-fundraiser/anchor/Anchor.toml index af7c2798..04138348 100644 --- a/finance/token-fundraiser/anchor/Anchor.toml +++ b/finance/token-fundraiser/anchor/Anchor.toml @@ -11,8 +11,6 @@ fundraiser = "Eoiuq1dXvHxh6dLx3wh9gj8kSAUpga11krTrbfF5XYsC" [programs.devnet] fundraiser = "Eoiuq1dXvHxh6dLx3wh9gj8kSAUpga11krTrbfF5XYsC" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "Localnet" wallet = "~/.config/solana/id.json" diff --git a/finance/token-fundraiser/anchor/README.md b/finance/token-fundraiser/anchor/README.md index 73c17984..cdb82130 100644 --- a/finance/token-fundraiser/anchor/README.md +++ b/finance/token-fundraiser/anchor/README.md @@ -1,6 +1,6 @@ # Token Fundraiser -Create a fundraiser that collects tokens. A user creates a fundraiser [account](https://solana.com/docs/terminology#account), specifies the [mint](https://solana.com/docs/terminology#token-mint) they want to receive, the target amount, and a duration. Other users contribute. If the target is reached, the maker can claim the funds; if it isn't reached within the duration, contributors can refund. +Create a fundraiser that collects tokens. A **maker** creates a fundraiser [account](https://solana.com/docs/terminology#account), specifies the [mint](https://solana.com/docs/terminology#token-mint) they want to receive, the target amount, and a duration in days. **Contributors** contribute while the window is open. If the target is reached, the maker claims the funds; if it is not reached by the deadline, contributors can refund. ## Architecture @@ -22,13 +22,13 @@ pub struct Fundraiser { Fields: -- `maker` โ€” the person starting the fundraiser. -- `mint_to_raise` โ€” the mint the maker wants to receive. -- `amount_to_raise` โ€” the target amount. -- `current_amount` โ€” total amount currently contributed. -- `time_started` โ€” when the fundraiser was created. -- `duration` โ€” fundraising window in days. -- `bump` โ€” canonical bump for the Fundraiser [PDA](https://solana.com/docs/terminology#program-derived-address-pda). +- `maker` - the person starting the fundraiser. +- `mint_to_raise` - the mint the maker wants to receive. +- `amount_to_raise` - the target amount, in minor units. +- `current_amount` - total amount contributed through the `contribute` handler. This tracked total, not the vault balance, is what `check_contributions` and `refund` compare against the target, so tokens sent directly to the vault cannot trigger an early release or block refunds. +- `time_started` - when the fundraiser was created. +- `duration` - fundraising window in days. +- `bump` - canonical bump for the Fundraiser [PDA](https://solana.com/docs/terminology#program-derived-address-pda). The `InitSpace` derive macro implements the `Space` trait, which calculates the size of the account (not counting the [Anchor](https://solana.com/docs/terminology#anchor) discriminator). @@ -43,8 +43,8 @@ pub struct Contributor { } ``` -- `amount` โ€” total amount contributed by this contributor. -- `bump` โ€” canonical bump for the Contributor PDA. +- `amount` - total amount contributed by this contributor. +- `bump` - canonical bump for the Contributor PDA. The Contributor PDA uses `init_if_needed`, which only runs the init branch on first call. The handler stores `bumps.contributor_account` into `bump` on first init (when `bump == 0`); see [`instructions/contribute.rs`](programs/fundraiser/src/instructions/contribute.rs). @@ -59,90 +59,75 @@ pub const MAX_CONTRIBUTION_PERCENTAGE: u64 = 10; pub const PERCENTAGE_SCALER: u64 = 100; ``` -`MAX_CONTRIBUTION_PERCENTAGE / PERCENTAGE_SCALER` = 10%, the per-contributor cap. +`MAX_CONTRIBUTION_PERCENTAGE / PERCENTAGE_SCALER` = 10%, the per-contributor cap. `MIN_AMOUNT_TO_RAISE` is the minimum target in major units. ### Code layout -Each [instruction handler](https://solana.com/docs/terminology#instruction-handler) is a free function (`pub fn handle_(accounts: &mut , ...)`) called from the `#[program]` module in `lib.rs`. Account-validation structs sit in the same file as the handler. +Each [instruction handler](https://solana.com/docs/terminology#instruction-handler) is a free function (`pub fn handle_(accounts: &mut , ...)`) called from the `#[program]` module in `lib.rs`. The matching `#[derive(Accounts)]` struct (named `AccountConstraints`) sits in the same file as the handler. -## Instruction handlers +### Token program compatibility -### `initialize` +All token accounts use `anchor_spl::token_interface` types (`InterfaceAccount`, `InterfaceAccount`, `Interface`), and every token movement uses `transfer_checked`, which carries the mint and decimals through the [CPI](https://solana.com/docs/terminology#cross-program-invocation-cpi). The same code works against the Classic Token Program and the Token Extensions Program. -[`programs/fundraiser/src/instructions/initialize.rs`](programs/fundraiser/src/instructions/initialize.rs). +### Onchain math -```rust -#[derive(Accounts)] -pub struct Initialize<'info> { - #[account(mut)] - pub maker: Signer<'info>, - pub mint_to_raise: Account<'info, Mint>, - #[account( - init, - payer = maker, - seeds = [b"fundraiser", maker.key().as_ref()], - bump, - space = Fundraiser::DISCRIMINATOR.len() + Fundraiser::INIT_SPACE, - )] - pub fundraiser: Account<'info, Fundraiser>, - #[account( - init, - payer = maker, - associated_token::mint = mint_to_raise, - associated_token::authority = fundraiser, - )] - pub vault: Account<'info, TokenAccount>, - pub system_program: Program<'info, System>, - pub token_program: Program<'info, Token>, - pub associated_token_program: Program<'info, AssociatedToken>, -} -``` +All balance arithmetic uses `checked_*` operations and returns `FundraiserError::MathOverflow` on overflow. The per-contributor cap is computed in `u128` so the percentage product cannot overflow `u64`. Both handlers that move tokens out of the vault update program state before issuing the transfer CPI (checks-effects-interactions). + +## Lifecycle -Account breakdown: +### `initialize` -- `maker` โ€” the person starting the fundraiser. Signs; mutable so we can deduct [lamports](https://solana.com/docs/terminology#lamport). -- `mint_to_raise` โ€” the mint the maker wants to receive. -- `fundraiser` โ€” the state account. Derived from `b"fundraiser"` and the maker's public key; Anchor calculates the canonical bump and stores it in the struct. -- `vault` โ€” the [ATA](https://solana.com/docs/terminology#associated-token-account-ata) that receives contributions, owned by the Fundraiser PDA. -- `system_program`, `token_program`, `associated_token_program` โ€” needed to initialize the new accounts. +[`programs/fundraiser/src/instructions/initialize.rs`](programs/fundraiser/src/instructions/initialize.rs), account constraints `InitializeAccountConstraints`. -The handler requires `amount >= MIN_AMOUNT_TO_RAISE.pow(mint.decimals)` and initializes the Fundraiser state. +The maker signs and pays for two new accounts: + +- `fundraiser` - the state account, derived from `b"fundraiser"` and the maker's public key. Anchor calculates the canonical bump and the handler stores it. +- `vault` - the [ATA](https://solana.com/docs/terminology#associated-token-account-ata) that receives contributions, owned by the Fundraiser PDA. + +The handler requires `amount >= MIN_AMOUNT_TO_RAISE * 10^decimals` (the target must be at least 3 major units of the mint, expressed in minor units), then initializes the Fundraiser state with `current_amount = 0` and `time_started` from the `Clock` sysvar. A target below the minimum fails with `InvalidAmount`. ### `contribute` -[`programs/fundraiser/src/instructions/contribute.rs`](programs/fundraiser/src/instructions/contribute.rs). +[`programs/fundraiser/src/instructions/contribute.rs`](programs/fundraiser/src/instructions/contribute.rs), account constraints `ContributeAccountConstraints`. -Account-validation struct: see source. The handler performs four `require!` checks in order: +A contributor signs and the handler performs four checks in order: -1. `amount >= 1_u64.pow(mint.decimals)` โ€” minimum contribution (this is `1`, since `1.pow(n) == 1`; effectively contributions just need to be non-zero). -2. `amount <= amount_to_raise * MAX_CONTRIBUTION_PERCENTAGE / PERCENTAGE_SCALER` โ€” per-call cap of 10% of the target. -3. `fundraiser.duration <= (current_time - time_started) / SECONDS_TO_DAYS` โ€” see the [duration semantics note](#duration-check-semantics) below. -4. Cumulative contributor cap: this contributor's running total (existing + new) must not exceed 10% of the target. +1. Minimum contribution: `amount >= 10^decimals` (one major unit of the mint), else `ContributionTooSmall`. +2. Per-call cap: `amount <= amount_to_raise * MAX_CONTRIBUTION_PERCENTAGE / PERCENTAGE_SCALER` (10% of the target), else `ContributionTooBig`. +3. Time window: contributions are allowed while `elapsed_days < duration`, where `elapsed_days = (now - time_started) / SECONDS_TO_DAYS`. Once `elapsed_days` reaches `duration` the handler fails with `FundraiserEnded`. +4. Cumulative cap: the contributor's running total (existing + new) must not exceed the same 10% cap, else `MaximumContributionsReached`. -If all four checks pass, tokens are transferred from `contributor_ata` to `vault` via a [CPI](https://solana.com/docs/terminology#cross-program-invocation-cpi) to the [Classic Token Program](https://solana.com/docs/terminology#token-program), and both `Fundraiser.current_amount` and `Contributor.amount` are updated. +If all checks pass, `Fundraiser.current_amount` and `Contributor.amount` are updated, then `amount` is transferred from `contributor_ata` to `vault` with `transfer_checked`. ### `check_contributions` -[`programs/fundraiser/src/instructions/checker.rs`](programs/fundraiser/src/instructions/checker.rs). +[`programs/fundraiser/src/instructions/checker.rs`](programs/fundraiser/src/instructions/checker.rs), account constraints `CheckContributionsAccountConstraints`. + +Lets the maker claim the funds once the target is met. Requires `fundraiser.current_amount >= amount_to_raise` (the state-tracked total, so direct donations to the vault cannot unlock the claim early), else `TargetNotMet`. The handler then, signing both CPIs with the Fundraiser PDA's seeds: -Lets the maker claim the funds. Requires `vault.amount >= amount_to_raise`. The CPI uses `new_with_signer` with the Fundraiser PDA's seeds because the vault is owned by the PDA. The Fundraiser account is closed (via the `close = maker` constraint) and its [rent](https://solana.com/docs/terminology#rent) is refunded to the maker. +1. Transfers the entire vault balance (including any direct donations) to `maker_ata` with `transfer_checked`. +2. Closes the empty vault token account with `close_account`, returning its rent to the maker. + +The Fundraiser state account is closed via the `close = maker` constraint, so the maker also recovers that [rent](https://solana.com/docs/terminology#rent). ### `refund` -[`programs/fundraiser/src/instructions/refund.rs`](programs/fundraiser/src/instructions/refund.rs). +[`programs/fundraiser/src/instructions/refund.rs`](programs/fundraiser/src/instructions/refund.rs), account constraints `RefundAccountConstraints`. -Lets a contributor reclaim their contribution if the target wasn't met. Two checks: +Lets a contributor reclaim their contribution after a failed fundraiser. Two checks: -1. `fundraiser.duration >= (current_time - time_started) / SECONDS_TO_DAYS` โ€” see the [duration semantics note](#duration-check-semantics) below. -2. `vault.amount < amount_to_raise` โ€” target not met. +1. Refunds are allowed only after the fundraiser has ended: `elapsed_days >= duration`, else `FundraiserNotEnded`. +2. The target was not met: `fundraiser.current_amount < amount_to_raise` (again the state-tracked total, so donated tokens cannot block refunds), else `TargetMet`. -Then the vault's tokens are transferred back to the contributor's ATA (CPI with PDA signer seeds) and the Contributor account is closed (via `close = contributor`), refunding its rent to the contributor. +The handler subtracts the contributor's recorded amount from `current_amount` and zeroes the Contributor record before the transfer CPI, then sends the tokens from the vault back to `contributor_ata` with `transfer_checked` (PDA signer). The Contributor account is closed via `close = contributor`, refunding its rent to the contributor. -## Duration check semantics +## Testing -The `contribute` and `refund` handlers compare `fundraiser.duration` (a `u16` in *days*) against elapsed days since `time_started`. The two checks use opposite comparison operators, which is worth reading carefully: +The tests are Rust integration tests using [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) and [solana-kite](https://crates.io/crates/solana-kite), in [`programs/fundraiser/tests/test_fundraiser.rs`](programs/fundraiser/tests/test_fundraiser.rs). They load the compiled program with `include_bytes!`, so build the program first and rebuild after every program change: -- `contribute`: `require!(duration <= elapsed_days, FundraiserEnded)` โ€” fails (with `FundraiserEnded`) when `elapsed_days < duration`. -- `refund`: `require!(duration >= elapsed_days, FundraiserNotEnded)` โ€” fails (with `FundraiserNotEnded`) when `elapsed_days > duration`. +```sh +cargo build-sbf +cargo test +``` -> โš ๏ธ Both comparisons look inverted relative to their error names. If you adapt this code, audit the duration logic carefully before relying on it. +The suite uses a nonzero duration and warps the LiteSVM `Clock` sysvar to exercise both sides of every deadline: contributing inside the window succeeds, contributing after the deadline fails, refunding before the deadline fails, and refunding after the deadline succeeds when the target was not met. It also verifies that the claim pays the maker and closes the vault, that direct vault donations do not unlock the claim, and asserts token balances and decoded account state rather than just transaction success. diff --git a/finance/token-fundraiser/anchor/programs/fundraiser/Cargo.toml b/finance/token-fundraiser/anchor/programs/fundraiser/Cargo.toml index de7b3bf0..47145c5f 100644 --- a/finance/token-fundraiser/anchor/programs/fundraiser/Cargo.toml +++ b/finance/token-fundraiser/anchor/programs/fundraiser/Cargo.toml @@ -29,6 +29,12 @@ solana-signer = "3.0.0" solana-keypair = "3.0.1" solana-kite = "0.3.0" borsh = "1.6.1" +# solana-kite depends on these SPL program crates without "no-entrypoint", +# so the host test binary would link their `entrypoint` symbols alongside +# this program's and fail with a duplicate-symbol error. Enabling +# "no-entrypoint" here removes theirs via feature unification. +spl-token = { version = "9.0.0", features = ["no-entrypoint"] } +spl-associated-token-account = { version = "8.0.0", features = ["no-entrypoint"] } [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/token-fundraiser/anchor/programs/fundraiser/src/error.rs b/finance/token-fundraiser/anchor/programs/fundraiser/src/error.rs index 0c7ee948..9a13092f 100644 --- a/finance/token-fundraiser/anchor/programs/fundraiser/src/error.rs +++ b/finance/token-fundraiser/anchor/programs/fundraiser/src/error.rs @@ -16,6 +16,8 @@ pub enum FundraiserError { FundraiserNotEnded, #[msg("The fundraiser has ended")] FundraiserEnded, - #[msg("Invalid total amount. i should be bigger than 3")] - InvalidAmount -} \ No newline at end of file + #[msg("The amount to raise is below the minimum of 3 major units")] + InvalidAmount, + #[msg("Arithmetic overflow")] + MathOverflow, +} diff --git a/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/checker.rs b/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/checker.rs index a0549585..333bae49 100644 --- a/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/checker.rs +++ b/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/checker.rs @@ -1,25 +1,21 @@ use anchor_lang::prelude::*; use anchor_spl::{ - associated_token::AssociatedToken, - token::{ - transfer, - Mint, - Token, - TokenAccount, - Transfer - } + associated_token::AssociatedToken, + token_interface::{ + close_account, transfer_checked, CloseAccount, Mint, TokenAccount, TokenInterface, + TransferChecked, + }, }; -use crate::{ - state::Fundraiser, - FundraiserError -}; +use crate::{state::Fundraiser, FundraiserError}; #[derive(Accounts)] -pub struct CheckContributions<'info> { +pub struct CheckContributionsAccountConstraints<'info> { #[account(mut)] pub maker: Signer<'info>, - pub mint_to_raise: Account<'info, Mint>, + + pub mint_to_raise: InterfaceAccount<'info, Mint>, + #[account( mut, seeds = [b"fundraiser".as_ref(), maker.key().as_ref()], @@ -27,55 +23,79 @@ pub struct CheckContributions<'info> { close = maker, )] pub fundraiser: Account<'info, Fundraiser>, + #[account( mut, associated_token::mint = mint_to_raise, associated_token::authority = fundraiser, + associated_token::token_program = token_program, )] - pub vault: Account<'info, TokenAccount>, + pub vault: InterfaceAccount<'info, TokenAccount>, + #[account( init_if_needed, payer = maker, associated_token::mint = mint_to_raise, associated_token::authority = maker, + associated_token::token_program = token_program, )] - pub maker_ata: Account<'info, TokenAccount>, - pub token_program: Program<'info, Token>, + pub maker_ata: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, + pub associated_token_program: Program<'info, AssociatedToken>, } -pub fn handle_check_contributions(accounts: &mut CheckContributions) -> Result<()> { - - // Check if the target amount has been met - require!( - accounts.vault.amount >= accounts.fundraiser.amount_to_raise, - FundraiserError::TargetNotMet - ); - - // Transfer the funds to the maker - // CPI to the token program to transfer the funds - let cpi_program = accounts.token_program.key(); +pub fn handle_check_contributions( + accounts: &mut CheckContributionsAccountConstraints, +) -> Result<()> { + // Compare the state-tracked total, not the vault balance, so tokens + // donated directly to the vault cannot trigger an early release. + require!( + accounts.fundraiser.current_amount >= accounts.fundraiser.amount_to_raise, + FundraiserError::TargetNotMet + ); - // Transfer the funds from the vault to the maker - let cpi_accounts = Transfer { - from: accounts.vault.to_account_info(), - to: accounts.maker_ata.to_account_info(), - authority: accounts.fundraiser.to_account_info(), - }; + // The vault is owned by the fundraiser PDA, so both CPIs are signed with + // its seeds. + let signer_seeds: [&[&[u8]]; 1] = [&[ + b"fundraiser".as_ref(), + accounts.maker.to_account_info().key.as_ref(), + &[accounts.fundraiser.bump], + ]]; - // Signer seeds to sign the CPI on behalf of the fundraiser account - let signer_seeds: [&[&[u8]]; 1] = [&[ - b"fundraiser".as_ref(), - accounts.maker.to_account_info().key.as_ref(), - &[accounts.fundraiser.bump], - ]]; + // Drain the whole vault (including any direct donations) to the maker. + let transfer_accounts = TransferChecked { + from: accounts.vault.to_account_info(), + mint: accounts.mint_to_raise.to_account_info(), + to: accounts.maker_ata.to_account_info(), + authority: accounts.fundraiser.to_account_info(), + }; + let transfer_context = CpiContext::new_with_signer( + accounts.token_program.key(), + transfer_accounts, + &signer_seeds, + ); + transfer_checked( + transfer_context, + accounts.vault.amount, + accounts.mint_to_raise.decimals, + )?; - // CPI context with signer since the fundraiser account is a PDA - let cpi_ctx = CpiContext::new_with_signer(cpi_program, cpi_accounts, &signer_seeds); + // Close the empty vault so its rent goes back to the maker. + let close_accounts = CloseAccount { + account: accounts.vault.to_account_info(), + destination: accounts.maker.to_account_info(), + authority: accounts.fundraiser.to_account_info(), + }; + let close_context = CpiContext::new_with_signer( + accounts.token_program.key(), + close_accounts, + &signer_seeds, + ); + close_account(close_context)?; - // Transfer the funds from the vault to the maker - transfer(cpi_ctx, accounts.vault.amount)?; - - Ok(()) - } + Ok(()) +} diff --git a/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/contribute.rs b/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/contribute.rs index e26c94e9..67e73d2f 100644 --- a/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/contribute.rs +++ b/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/contribute.rs @@ -1,26 +1,20 @@ use anchor_lang::prelude::*; -use anchor_spl::token::{ - Mint, - transfer, - Token, - TokenAccount, - Transfer +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, }; use crate::{ - state::{ - Contributor, - Fundraiser - }, FundraiserError, - MAX_CONTRIBUTION_PERCENTAGE, - PERCENTAGE_SCALER, SECONDS_TO_DAYS + state::{Contributor, Fundraiser}, + FundraiserError, MAX_CONTRIBUTION_PERCENTAGE, PERCENTAGE_SCALER, SECONDS_TO_DAYS, }; #[derive(Accounts)] -pub struct Contribute<'info> { +pub struct ContributeAccountConstraints<'info> { #[account(mut)] pub contributor: Signer<'info>, - pub mint_to_raise: Account<'info, Mint>, + + pub mint_to_raise: InterfaceAccount<'info, Mint>, + #[account( mut, has_one = mint_to_raise, @@ -28,6 +22,7 @@ pub struct Contribute<'info> { bump = fundraiser.bump, )] pub fundraiser: Account<'info, Fundraiser>, + #[account( init_if_needed, payer = contributor, @@ -36,77 +31,106 @@ pub struct Contribute<'info> { space = Contributor::DISCRIMINATOR.len() + Contributor::INIT_SPACE, )] pub contributor_account: Account<'info, Contributor>, + #[account( mut, associated_token::mint = mint_to_raise, - associated_token::authority = contributor + associated_token::authority = contributor, + associated_token::token_program = token_program, )] - pub contributor_ata: Account<'info, TokenAccount>, + pub contributor_ata: InterfaceAccount<'info, TokenAccount>, + #[account( mut, associated_token::mint = fundraiser.mint_to_raise, - associated_token::authority = fundraiser + associated_token::authority = fundraiser, + associated_token::token_program = token_program, )] - pub vault: Account<'info, TokenAccount>, - pub token_program: Program<'info, Token>, + pub vault: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, } -pub fn handle_contribute(accounts: &mut Contribute, amount: u64, bumps: &ContributeBumps) -> Result<()> { - - // Check if the amount to contribute meets the minimum amount required - require!( - amount >= 1_u64.pow(accounts.mint_to_raise.decimals as u32), - FundraiserError::ContributionTooSmall - ); - - // Check if the amount to contribute is less than the maximum allowed contribution - require!( - amount <= (accounts.fundraiser.amount_to_raise * MAX_CONTRIBUTION_PERCENTAGE) / PERCENTAGE_SCALER, - FundraiserError::ContributionTooBig - ); - - // Check if the fundraising duration has been reached - let current_time = Clock::get()?.unix_timestamp; - require!( - accounts.fundraiser.duration <= ((current_time - accounts.fundraiser.time_started) / SECONDS_TO_DAYS) as u16, - crate::FundraiserError::FundraiserEnded - ); - - // Check if the maximum contributions per contributor have been reached - require!( - (accounts.contributor_account.amount <= (accounts.fundraiser.amount_to_raise * MAX_CONTRIBUTION_PERCENTAGE) / PERCENTAGE_SCALER) - && (accounts.contributor_account.amount + amount <= (accounts.fundraiser.amount_to_raise * MAX_CONTRIBUTION_PERCENTAGE) / PERCENTAGE_SCALER), - FundraiserError::MaximumContributionsReached - ); - - // Transfer the funds to the vault - // CPI to the token program to transfer the funds - let cpi_program = accounts.token_program.key(); - - // Transfer the funds from the contributor to the vault - let cpi_accounts = Transfer { - from: accounts.contributor_ata.to_account_info(), - to: accounts.vault.to_account_info(), - authority: accounts.contributor.to_account_info(), - }; - - // Crete a CPI context - let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); - - // Transfer the funds from the contributor to the vault - transfer(cpi_ctx, amount)?; - - // Update the fundraiser and contributor accounts with the new amounts - accounts.fundraiser.current_amount += amount; - - accounts.contributor_account.amount += amount; - - // Save the contributor PDA bump on first init (init_if_needed only - // runs the init branch once; stored bump is zero until set). - if accounts.contributor_account.bump == 0 { - accounts.contributor_account.bump = bumps.contributor_account; - } - - Ok(()) +/// Caps a single contributor at MAX_CONTRIBUTION_PERCENTAGE percent of the +/// target. Multiplies in u128 so the product cannot overflow u64. +fn calculate_max_contribution(amount_to_raise: u64) -> Result { + (amount_to_raise as u128) + .checked_mul(MAX_CONTRIBUTION_PERCENTAGE as u128) + .ok_or(FundraiserError::MathOverflow)? + .checked_div(PERCENTAGE_SCALER as u128) + .ok_or(FundraiserError::MathOverflow)? + .try_into() + .map_err(|_| error!(FundraiserError::MathOverflow)) +} + +pub fn handle_contribute( + accounts: &mut ContributeAccountConstraints, + amount: u64, + bumps: &ContributeAccountConstraintsBumps, +) -> Result<()> { + // The minimum contribution is one major unit, which is 10^decimals minor units. + let one_major_unit = 10_u64 + .checked_pow(accounts.mint_to_raise.decimals as u32) + .ok_or(FundraiserError::MathOverflow)?; + require!( + amount >= one_major_unit, + FundraiserError::ContributionTooSmall + ); + + let max_contribution = calculate_max_contribution(accounts.fundraiser.amount_to_raise)?; + require!( + amount <= max_contribution, + FundraiserError::ContributionTooBig + ); + + // Contributions are allowed while elapsed_days < duration. + let current_time = Clock::get()?.unix_timestamp; + let elapsed_days = current_time + .checked_sub(accounts.fundraiser.time_started) + .ok_or(FundraiserError::MathOverflow)? + .checked_div(SECONDS_TO_DAYS) + .ok_or(FundraiserError::MathOverflow)?; + require!( + elapsed_days < accounts.fundraiser.duration as i64, + FundraiserError::FundraiserEnded + ); + + // The contributor's cumulative total must also stay within the cap. + let cumulative_contribution = accounts + .contributor_account + .amount + .checked_add(amount) + .ok_or(FundraiserError::MathOverflow)?; + require!( + cumulative_contribution <= max_contribution, + FundraiserError::MaximumContributionsReached + ); + + // Checks-effects-interactions: update state before the transfer CPI. + accounts.fundraiser.current_amount = accounts + .fundraiser + .current_amount + .checked_add(amount) + .ok_or(FundraiserError::MathOverflow)?; + accounts.contributor_account.amount = cumulative_contribution; + + // Save the contributor PDA bump on first init (init_if_needed only + // runs the init branch once; stored bump is zero until set). + if accounts.contributor_account.bump == 0 { + accounts.contributor_account.bump = bumps.contributor_account; } + + // Transfer the funds from the contributor to the vault. + let cpi_accounts = TransferChecked { + from: accounts.contributor_ata.to_account_info(), + mint: accounts.mint_to_raise.to_account_info(), + to: accounts.vault.to_account_info(), + authority: accounts.contributor.to_account_info(), + }; + let cpi_context = CpiContext::new(accounts.token_program.key(), cpi_accounts); + transfer_checked(cpi_context, amount, accounts.mint_to_raise.decimals)?; + + Ok(()) +} diff --git a/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/initialize.rs b/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/initialize.rs index f91dec4b..63d126d2 100644 --- a/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/initialize.rs +++ b/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/initialize.rs @@ -1,22 +1,18 @@ use anchor_lang::prelude::*; use anchor_spl::{ - associated_token::AssociatedToken, - token::{ - Mint, - Token, - TokenAccount - } + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, }; -use crate::{ - state::Fundraiser, FundraiserError, MIN_AMOUNT_TO_RAISE -}; +use crate::{state::Fundraiser, FundraiserError, MIN_AMOUNT_TO_RAISE}; #[derive(Accounts)] -pub struct Initialize<'info> { +pub struct InitializeAccountConstraints<'info> { #[account(mut)] pub maker: Signer<'info>, - pub mint_to_raise: Account<'info, Mint>, + + pub mint_to_raise: InterfaceAccount<'info, Mint>, + #[account( init, payer = maker, @@ -25,36 +21,51 @@ pub struct Initialize<'info> { space = Fundraiser::DISCRIMINATOR.len() + Fundraiser::INIT_SPACE, )] pub fundraiser: Account<'info, Fundraiser>, + #[account( init, payer = maker, associated_token::mint = mint_to_raise, associated_token::authority = fundraiser, + associated_token::token_program = token_program, )] - pub vault: Account<'info, TokenAccount>, + pub vault: InterfaceAccount<'info, TokenAccount>, + pub system_program: Program<'info, System>, - pub token_program: Program<'info, Token>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, } -pub fn handle_initialize(accounts: &mut Initialize, amount: u64, duration: u16, bumps: &InitializeBumps) -> Result<()> { - - // Check if the amount to raise meets the minimum amount required - require!( - amount >= MIN_AMOUNT_TO_RAISE.pow(accounts.mint_to_raise.decimals as u32), - FundraiserError::InvalidAmount - ); - - // Initialize the fundraiser account - accounts.fundraiser.set_inner(Fundraiser { - maker: accounts.maker.key(), - mint_to_raise: accounts.mint_to_raise.key(), - amount_to_raise: amount, - current_amount: 0, - time_started: Clock::get()?.unix_timestamp, - duration, - bump: bumps.fundraiser - }); - - Ok(()) - } +pub fn handle_initialize( + accounts: &mut InitializeAccountConstraints, + amount: u64, + duration: u16, + bumps: &InitializeAccountConstraintsBumps, +) -> Result<()> { + // The target must be at least MIN_AMOUNT_TO_RAISE major units, expressed + // in minor units: MIN_AMOUNT_TO_RAISE * 10^decimals. + let one_major_unit = 10_u64 + .checked_pow(accounts.mint_to_raise.decimals as u32) + .ok_or(FundraiserError::MathOverflow)?; + let minimum_amount_to_raise = MIN_AMOUNT_TO_RAISE + .checked_mul(one_major_unit) + .ok_or(FundraiserError::MathOverflow)?; + require!( + amount >= minimum_amount_to_raise, + FundraiserError::InvalidAmount + ); + + accounts.fundraiser.set_inner(Fundraiser { + maker: accounts.maker.key(), + mint_to_raise: accounts.mint_to_raise.key(), + amount_to_raise: amount, + current_amount: 0, + time_started: Clock::get()?.unix_timestamp, + duration, + bump: bumps.fundraiser, + }); + + Ok(()) +} diff --git a/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/refund.rs b/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/refund.rs index 7bd69728..61fb2bab 100644 --- a/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/refund.rs +++ b/finance/token-fundraiser/anchor/programs/fundraiser/src/instructions/refund.rs @@ -1,26 +1,22 @@ use anchor_lang::prelude::*; -use anchor_spl::token::{ - transfer, - Mint, - Token, - TokenAccount, - Transfer +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, }; use crate::{ - state::{ - Contributor, - Fundraiser - }, - SECONDS_TO_DAYS + state::{Contributor, Fundraiser}, + FundraiserError, SECONDS_TO_DAYS, }; #[derive(Accounts)] -pub struct Refund<'info> { +pub struct RefundAccountConstraints<'info> { #[account(mut)] pub contributor: Signer<'info>, + pub maker: SystemAccount<'info>, - pub mint_to_raise: Account<'info, Mint>, + + pub mint_to_raise: InterfaceAccount<'info, Mint>, + #[account( mut, has_one = mint_to_raise, @@ -28,70 +24,90 @@ pub struct Refund<'info> { bump = fundraiser.bump, )] pub fundraiser: Account<'info, Fundraiser>, + #[account( mut, seeds = [b"contributor", fundraiser.key().as_ref(), contributor.key().as_ref()], - bump, + bump = contributor_account.bump, close = contributor, )] pub contributor_account: Account<'info, Contributor>, + #[account( mut, associated_token::mint = mint_to_raise, - associated_token::authority = contributor + associated_token::authority = contributor, + associated_token::token_program = token_program, )] - pub contributor_ata: Account<'info, TokenAccount>, + pub contributor_ata: InterfaceAccount<'info, TokenAccount>, + #[account( mut, associated_token::mint = mint_to_raise, - associated_token::authority = fundraiser + associated_token::authority = fundraiser, + associated_token::token_program = token_program, )] - pub vault: Account<'info, TokenAccount>, - pub token_program: Program<'info, Token>, - pub system_program: Program<'info, System>, -} - -pub fn handle_refund(accounts: &mut Refund) -> Result<()> { - - // Check if the fundraising duration has been reached - let current_time = Clock::get()?.unix_timestamp; - - require!( - accounts.fundraiser.duration >= ((current_time - accounts.fundraiser.time_started) / SECONDS_TO_DAYS) as u16, - crate::FundraiserError::FundraiserNotEnded - ); - - require!( - accounts.vault.amount < accounts.fundraiser.amount_to_raise, - crate::FundraiserError::TargetMet - ); + pub vault: InterfaceAccount<'info, TokenAccount>, - // Transfer the funds back to the contributor - // CPI to the token program to transfer the funds - let cpi_program = accounts.token_program.key(); + pub token_program: Interface<'info, TokenInterface>, - // Transfer the funds from the vault to the contributor - let cpi_accounts = Transfer { - from: accounts.vault.to_account_info(), - to: accounts.contributor_ata.to_account_info(), - authority: accounts.fundraiser.to_account_info(), - }; + pub system_program: Program<'info, System>, +} - // Signer seeds to sign the CPI on behalf of the fundraiser account - let signer_seeds: [&[&[u8]]; 1] = [&[ - b"fundraiser".as_ref(), - accounts.maker.to_account_info().key.as_ref(), - &[accounts.fundraiser.bump], - ]]; +pub fn handle_refund(accounts: &mut RefundAccountConstraints) -> Result<()> { + // Refunds are allowed only after the fundraiser has ended: + // elapsed_days >= duration. + let current_time = Clock::get()?.unix_timestamp; + let elapsed_days = current_time + .checked_sub(accounts.fundraiser.time_started) + .ok_or(FundraiserError::MathOverflow)? + .checked_div(SECONDS_TO_DAYS) + .ok_or(FundraiserError::MathOverflow)?; + require!( + elapsed_days >= accounts.fundraiser.duration as i64, + FundraiserError::FundraiserNotEnded + ); - // CPI context with signer since the fundraiser account is a PDA - let cpi_ctx = CpiContext::new_with_signer(cpi_program, cpi_accounts, &signer_seeds); + // Refunds are allowed only when the target was not met. Compare the + // state-tracked total, not the vault balance, so tokens donated directly + // to the vault cannot block refunds. + require!( + accounts.fundraiser.current_amount < accounts.fundraiser.amount_to_raise, + FundraiserError::TargetMet + ); - // Transfer the funds from the vault to the contributor - transfer(cpi_ctx, accounts.contributor_account.amount)?; + // Checks-effects-interactions: update state before the transfer CPI. + let refund_amount = accounts.contributor_account.amount; + accounts.fundraiser.current_amount = accounts + .fundraiser + .current_amount + .checked_sub(refund_amount) + .ok_or(FundraiserError::MathOverflow)?; + accounts.contributor_account.amount = 0; - // Update the fundraiser state by reducing the amount contributed - accounts.fundraiser.current_amount -= accounts.contributor_account.amount; + // Transfer the funds from the vault back to the contributor. The vault is + // owned by the fundraiser PDA, so the CPI is signed with its seeds. + let cpi_accounts = TransferChecked { + from: accounts.vault.to_account_info(), + mint: accounts.mint_to_raise.to_account_info(), + to: accounts.contributor_ata.to_account_info(), + authority: accounts.fundraiser.to_account_info(), + }; + let signer_seeds: [&[&[u8]]; 1] = [&[ + b"fundraiser".as_ref(), + accounts.maker.to_account_info().key.as_ref(), + &[accounts.fundraiser.bump], + ]]; + let cpi_context = CpiContext::new_with_signer( + accounts.token_program.key(), + cpi_accounts, + &signer_seeds, + ); + transfer_checked( + cpi_context, + refund_amount, + accounts.mint_to_raise.decimals, + )?; - Ok(()) - } + Ok(()) +} diff --git a/finance/token-fundraiser/anchor/programs/fundraiser/src/lib.rs b/finance/token-fundraiser/anchor/programs/fundraiser/src/lib.rs index 4eff6823..6da075ec 100644 --- a/finance/token-fundraiser/anchor/programs/fundraiser/src/lib.rs +++ b/finance/token-fundraiser/anchor/programs/fundraiser/src/lib.rs @@ -15,25 +15,34 @@ use instructions::*; pub mod fundraiser { use super::*; - pub fn initialize(mut context: Context, amount: u64, duration: u16) -> Result<()> { + pub fn initialize( + mut context: Context, + amount: u64, + duration: u16, + ) -> Result<()> { handle_initialize(&mut context.accounts, amount, duration, &context.bumps)?; Ok(()) } - pub fn contribute(mut context: Context, amount: u64) -> Result<()> { + pub fn contribute( + mut context: Context, + amount: u64, + ) -> Result<()> { handle_contribute(&mut context.accounts, amount, &context.bumps)?; Ok(()) } - pub fn check_contributions(mut context: Context) -> Result<()> { + pub fn check_contributions( + mut context: Context, + ) -> Result<()> { handle_check_contributions(&mut context.accounts)?; Ok(()) } - pub fn refund(mut context: Context) -> Result<()> { + pub fn refund(mut context: Context) -> Result<()> { handle_refund(&mut context.accounts)?; Ok(()) diff --git a/finance/token-fundraiser/anchor/programs/fundraiser/tests/test_fundraiser.rs b/finance/token-fundraiser/anchor/programs/fundraiser/tests/test_fundraiser.rs index c17869de..679eb976 100644 --- a/finance/token-fundraiser/anchor/programs/fundraiser/tests/test_fundraiser.rs +++ b/finance/token-fundraiser/anchor/programs/fundraiser/tests/test_fundraiser.rs @@ -1,8 +1,10 @@ use { anchor_lang::{ - solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + solana_program::{clock::Clock, instruction::Instruction, pubkey::Pubkey, system_program}, InstructionData, ToAccountMetas, }, + borsh::BorshDeserialize, + fundraiser::SECONDS_TO_DAYS, litesvm::LiteSVM, solana_keypair::Keypair, solana_kite::{ @@ -12,6 +14,16 @@ use { solana_signer::Signer, }; +const MINT_DECIMALS: u8 = 6; +/// One major unit of the test mint in minor units (10^MINT_DECIMALS). +const ONE_TOKEN: u64 = 1_000_000; +/// Comfortably above the program's 3-major-unit minimum target. +const AMOUNT_TO_RAISE: u64 = 30 * ONE_TOKEN; +/// The per-contributor cap is 10% of the target. +const MAX_CONTRIBUTION: u64 = AMOUNT_TO_RAISE / 10; +const DURATION_DAYS: u16 = 7; +const CONTRIBUTOR_STARTING_BALANCE: u64 = 10 * ONE_TOKEN; + fn token_program_id() -> Pubkey { "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" .parse() @@ -32,15 +44,43 @@ fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { ata } -fn setup() -> (LiteSVM, Pubkey, Keypair) { - let program_id = fundraiser::id(); - let mut svm = LiteSVM::new(); +/// Mirror of the onchain Fundraiser struct for borsh-decoding account data +/// in tests. Pubkeys are read as raw 32-byte arrays. +#[derive(BorshDeserialize)] +struct FundraiserState { + _maker: [u8; 32], + _mint_to_raise: [u8; 32], + amount_to_raise: u64, + current_amount: u64, + _time_started: i64, + duration: u16, + _bump: u8, +} - let program_bytes = include_bytes!("../../../target/deploy/fundraiser.so"); - svm.add_program(program_id, program_bytes).unwrap(); +/// Mirror of the onchain Contributor struct. +#[derive(BorshDeserialize)] +struct ContributorState { + amount: u64, + _bump: u8, +} - let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); - (svm, program_id, payer) +const ANCHOR_DISCRIMINATOR_LENGTH: usize = 8; + +fn read_fundraiser_state(svm: &LiteSVM, fundraiser_pda: &Pubkey) -> FundraiserState { + let account = svm.get_account(fundraiser_pda).unwrap(); + FundraiserState::try_from_slice(&account.data[ANCHOR_DISCRIMINATOR_LENGTH..]).unwrap() +} + +fn read_contributor_state(svm: &LiteSVM, contributor_pda: &Pubkey) -> ContributorState { + let account = svm.get_account(contributor_pda).unwrap(); + ContributorState::try_from_slice(&account.data[ANCHOR_DISCRIMINATOR_LENGTH..]).unwrap() +} + +/// Moves the LiteSVM clock forward by the given number of days. +fn warp_days_forward(svm: &mut LiteSVM, days: i64) { + let mut clock: Clock = svm.get_sysvar(); + clock.unix_timestamp += days * SECONDS_TO_DAYS; + svm.set_sysvar(&clock); } struct FundraiserSetup { @@ -54,20 +94,22 @@ struct FundraiserSetup { } fn full_setup() -> FundraiserSetup { - let (mut svm, program_id, payer) = setup(); + let program_id = fundraiser::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/fundraiser.so"); + svm.add_program(program_id, program_bytes).unwrap(); + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); let maker = create_wallet(&mut svm, 10_000_000_000).unwrap(); - // Create mint (6 decimals) โ€” payer is mint authority - let mint = create_token_mint(&mut svm, &payer, 6, None).unwrap(); + // The payer is the mint authority. + let mint = create_token_mint(&mut svm, &payer, MINT_DECIMALS, None).unwrap(); - // Derive the fundraiser PDA - let (fundraiser_pda, _bump) = Pubkey::find_program_address( - &[b"fundraiser", maker.pubkey().as_ref()], - &program_id, - ); + let (fundraiser_pda, _bump) = + Pubkey::find_program_address(&[b"fundraiser", maker.pubkey().as_ref()], &program_id); - // Vault is the ATA of the fundraiser PDA for the mint + // The vault is the ATA of the fundraiser PDA for the mint. let vault = derive_ata(&fundraiser_pda, &mint); FundraiserSetup { @@ -81,344 +123,524 @@ fn full_setup() -> FundraiserSetup { } } -#[test] -fn test_initialize_fundraiser() { - let mut fs = full_setup(); - - let amount_to_raise: u64 = 30_000_000; - let duration: u16 = 0; - - let init_ix = Instruction::new_with_bytes( - fs.program_id, - &fundraiser::instruction::Initialize { - amount: amount_to_raise, - duration, - } - .data(), - fundraiser::accounts::Initialize { - maker: fs.maker.pubkey(), - mint_to_raise: fs.mint, - fundraiser: fs.fundraiser_pda, - vault: fs.vault, +fn initialize_fundraiser(setup: &mut FundraiserSetup, amount: u64, duration: u16) { + let initialize_instruction = Instruction::new_with_bytes( + setup.program_id, + &fundraiser::instruction::Initialize { amount, duration }.data(), + fundraiser::accounts::InitializeAccountConstraints { + maker: setup.maker.pubkey(), + mint_to_raise: setup.mint, + fundraiser: setup.fundraiser_pda, + vault: setup.vault, system_program: system_program::id(), token_program: token_program_id(), associated_token_program: ata_program_id(), } .to_account_metas(None), ); - send_transaction_from_instructions( - &mut fs.svm, - vec![init_ix], - &[&fs.maker], - &fs.maker.pubkey(), + &mut setup.svm, + vec![initialize_instruction], + &[&setup.maker], + &setup.maker.pubkey(), ) .unwrap(); +} - // Verify fundraiser account exists - let fundraiser_data = fs - .svm - .get_account(&fs.fundraiser_pda) - .expect("Fundraiser account should exist"); - assert!(!fundraiser_data.data.is_empty()); +/// Creates a contributor wallet with a funded ATA and returns +/// (contributor keypair, contributor ATA, contributor account PDA). +fn create_funded_contributor(setup: &mut FundraiserSetup) -> (Keypair, Pubkey, Pubkey) { + let contributor = create_wallet(&mut setup.svm, 10_000_000_000).unwrap(); - // Verify vault exists with zero balance - assert_eq!(get_token_account_balance(&fs.svm, &fs.vault).unwrap(), 0); -} + let contributor_ata = create_associated_token_account( + &mut setup.svm, + &contributor.pubkey(), + &setup.mint, + &setup.payer, + ) + .unwrap(); -#[test] -fn test_contribute_and_refund() { - let mut fs = full_setup(); + mint_tokens_to_token_account( + &mut setup.svm, + &setup.mint, + &contributor_ata, + CONTRIBUTOR_STARTING_BALANCE, + &setup.payer, + ) + .unwrap(); - let amount_to_raise: u64 = 30_000_000; - let duration: u16 = 0; + let (contributor_account_pda, _bump) = Pubkey::find_program_address( + &[ + b"contributor", + setup.fundraiser_pda.as_ref(), + contributor.pubkey().as_ref(), + ], + &setup.program_id, + ); - // Initialize fundraiser - let init_ix = Instruction::new_with_bytes( - fs.program_id, - &fundraiser::instruction::Initialize { - amount: amount_to_raise, - duration, + (contributor, contributor_ata, contributor_account_pda) +} + +fn build_contribute_instruction( + setup: &FundraiserSetup, + contributor: &Pubkey, + contributor_ata: &Pubkey, + contributor_account_pda: &Pubkey, + amount: u64, +) -> Instruction { + Instruction::new_with_bytes( + setup.program_id, + &fundraiser::instruction::Contribute { amount }.data(), + fundraiser::accounts::ContributeAccountConstraints { + contributor: *contributor, + mint_to_raise: setup.mint, + fundraiser: setup.fundraiser_pda, + contributor_account: *contributor_account_pda, + contributor_ata: *contributor_ata, + vault: setup.vault, + token_program: token_program_id(), + system_program: system_program::id(), } - .data(), - fundraiser::accounts::Initialize { - maker: fs.maker.pubkey(), - mint_to_raise: fs.mint, - fundraiser: fs.fundraiser_pda, - vault: fs.vault, + .to_account_metas(None), + ) +} + +fn build_refund_instruction( + setup: &FundraiserSetup, + contributor: &Pubkey, + contributor_ata: &Pubkey, + contributor_account_pda: &Pubkey, +) -> Instruction { + Instruction::new_with_bytes( + setup.program_id, + &fundraiser::instruction::Refund {}.data(), + fundraiser::accounts::RefundAccountConstraints { + contributor: *contributor, + maker: setup.maker.pubkey(), + mint_to_raise: setup.mint, + fundraiser: setup.fundraiser_pda, + contributor_account: *contributor_account_pda, + contributor_ata: *contributor_ata, + vault: setup.vault, + token_program: token_program_id(), system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn build_check_contributions_instruction( + setup: &FundraiserSetup, + maker_ata: &Pubkey, +) -> Instruction { + Instruction::new_with_bytes( + setup.program_id, + &fundraiser::instruction::CheckContributions {}.data(), + fundraiser::accounts::CheckContributionsAccountConstraints { + maker: setup.maker.pubkey(), + mint_to_raise: setup.mint, + fundraiser: setup.fundraiser_pda, + vault: setup.vault, + maker_ata: *maker_ata, token_program: token_program_id(), + system_program: system_program::id(), associated_token_program: ata_program_id(), } .to_account_metas(None), - ); - send_transaction_from_instructions( - &mut fs.svm, - vec![init_ix], - &[&fs.maker], - &fs.maker.pubkey(), ) - .unwrap(); +} - // Setup contributor using Kite - let contributor = create_wallet(&mut fs.svm, 10_000_000_000).unwrap(); +#[test] +fn test_initialize_fundraiser() { + let mut setup = full_setup(); - let contributor_ata = - create_associated_token_account(&mut fs.svm, &contributor.pubkey(), &fs.mint, &fs.payer) - .unwrap(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); - let mint_amount: u64 = 10_000_000; - mint_tokens_to_token_account(&mut fs.svm, &fs.mint, &contributor_ata, mint_amount, &fs.payer) - .unwrap(); + let fundraiser_state = read_fundraiser_state(&setup.svm, &setup.fundraiser_pda); + assert_eq!(fundraiser_state.amount_to_raise, AMOUNT_TO_RAISE); + assert_eq!(fundraiser_state.current_amount, 0); + assert_eq!(fundraiser_state.duration, DURATION_DAYS); - // Derive contributor account PDA - let (contributor_account_pda, _bump) = Pubkey::find_program_address( - &[ - b"contributor", - fs.fundraiser_pda.as_ref(), - contributor.pubkey().as_ref(), - ], - &fs.program_id, - ); + assert_eq!(get_token_account_balance(&setup.svm, &setup.vault).unwrap(), 0); +} - // Contribute 1_000_000 - let contribute_amount: u64 = 1_000_000; - let contribute_ix = Instruction::new_with_bytes( - fs.program_id, - &fundraiser::instruction::Contribute { - amount: contribute_amount, +#[test] +fn test_initialize_below_minimum_target_fails() { + let mut setup = full_setup(); + + // 3 major units is the minimum; one minor unit below it must fail. + let below_minimum_target = 3 * ONE_TOKEN - 1; + let initialize_instruction = Instruction::new_with_bytes( + setup.program_id, + &fundraiser::instruction::Initialize { + amount: below_minimum_target, + duration: DURATION_DAYS, } .data(), - fundraiser::accounts::Contribute { - contributor: contributor.pubkey(), - mint_to_raise: fs.mint, - fundraiser: fs.fundraiser_pda, - contributor_account: contributor_account_pda, - contributor_ata, - vault: fs.vault, - token_program: token_program_id(), + fundraiser::accounts::InitializeAccountConstraints { + maker: setup.maker.pubkey(), + mint_to_raise: setup.mint, + fundraiser: setup.fundraiser_pda, + vault: setup.vault, system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), } .to_account_metas(None), ); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![initialize_instruction], + &[&setup.maker], + &setup.maker.pubkey(), + ); + assert!(result.is_err(), "Target below 3 major units must be rejected"); + assert!( + setup.svm.get_account(&setup.fundraiser_pda).is_none(), + "Fundraiser account must not exist after a failed initialize" + ); +} + +#[test] +fn test_contribute_inside_window_succeeds() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + + // One day in: well inside the 7-day window. + warp_days_forward(&mut setup.svm, 1); + + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + MAX_CONTRIBUTION, + ); send_transaction_from_instructions( - &mut fs.svm, - vec![contribute_ix], + &mut setup.svm, + vec![contribute_instruction], &[&contributor], &contributor.pubkey(), ) .unwrap(); - // Verify vault balance assert_eq!( - get_token_account_balance(&fs.svm, &fs.vault).unwrap(), - contribute_amount + get_token_account_balance(&setup.svm, &setup.vault).unwrap(), + MAX_CONTRIBUTION + ); + assert_eq!( + get_token_account_balance(&setup.svm, &contributor_ata).unwrap(), + CONTRIBUTOR_STARTING_BALANCE - MAX_CONTRIBUTION ); - // Expire blockhash to avoid AlreadyProcessed error (same accounts, same amount = same tx hash) - fs.svm.expire_blockhash(); + let fundraiser_state = read_fundraiser_state(&setup.svm, &setup.fundraiser_pda); + assert_eq!(fundraiser_state.current_amount, MAX_CONTRIBUTION); - // Contribute again - let contribute_ix2 = Instruction::new_with_bytes( - fs.program_id, - &fundraiser::instruction::Contribute { - amount: contribute_amount, - } - .data(), - fundraiser::accounts::Contribute { - contributor: contributor.pubkey(), - mint_to_raise: fs.mint, - fundraiser: fs.fundraiser_pda, - contributor_account: contributor_account_pda, - contributor_ata, - vault: fs.vault, - token_program: token_program_id(), - system_program: system_program::id(), - } - .to_account_metas(None), + let contributor_state = read_contributor_state(&setup.svm, &contributor_account_pda); + assert_eq!(contributor_state.amount, MAX_CONTRIBUTION); +} + +#[test] +fn test_contribute_after_deadline_fails() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + + // One day past the deadline. + warp_days_forward(&mut setup.svm, DURATION_DAYS as i64 + 1); + + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + ONE_TOKEN, ); - send_transaction_from_instructions( - &mut fs.svm, - vec![contribute_ix2], + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], &[&contributor], &contributor.pubkey(), - ) - .unwrap(); + ); + assert!(result.is_err(), "Contributing after the deadline must fail"); - // Verify vault balance is now 2_000_000 + assert_eq!(get_token_account_balance(&setup.svm, &setup.vault).unwrap(), 0); assert_eq!( - get_token_account_balance(&fs.svm, &fs.vault).unwrap(), - contribute_amount * 2 + get_token_account_balance(&setup.svm, &contributor_ata).unwrap(), + CONTRIBUTOR_STARTING_BALANCE ); +} - fs.svm.expire_blockhash(); +#[test] +fn test_contribute_below_one_major_unit_fails() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); - // Refund - let refund_ix = Instruction::new_with_bytes( - fs.program_id, - &fundraiser::instruction::Refund {}.data(), - fundraiser::accounts::Refund { - contributor: contributor.pubkey(), - maker: fs.maker.pubkey(), - mint_to_raise: fs.mint, - fundraiser: fs.fundraiser_pda, - contributor_account: contributor_account_pda, - contributor_ata, - vault: fs.vault, - token_program: token_program_id(), - system_program: system_program::id(), - } - .to_account_metas(None), + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + ONE_TOKEN - 1, + ); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], + &contributor.pubkey(), + ); + assert!( + result.is_err(), + "Contributions below one major unit must fail" + ); + assert_eq!(get_token_account_balance(&setup.svm, &setup.vault).unwrap(), 0); +} + +#[test] +fn test_refund_before_deadline_fails() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + ONE_TOKEN, ); send_transaction_from_instructions( - &mut fs.svm, - vec![refund_ix], + &mut setup.svm, + vec![contribute_instruction], &[&contributor], &contributor.pubkey(), ) .unwrap(); - // Verify vault is empty after refund - assert_eq!(get_token_account_balance(&fs.svm, &fs.vault).unwrap(), 0); - - // Verify contributor got tokens back - assert_eq!( - get_token_account_balance(&fs.svm, &contributor_ata).unwrap(), - mint_amount + // Still inside the window: refund must fail with FundraiserNotEnded. + let refund_instruction = build_refund_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + ); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![refund_instruction], + &[&contributor], + &contributor.pubkey(), ); + assert!(result.is_err(), "Refunding before the deadline must fail"); - // Contributor account PDA should be closed - assert!( - fs.svm.get_account(&contributor_account_pda).is_none(), - "Contributor account should be closed after refund" + assert_eq!( + get_token_account_balance(&setup.svm, &setup.vault).unwrap(), + ONE_TOKEN ); + let fundraiser_state = read_fundraiser_state(&setup.svm, &setup.fundraiser_pda); + assert_eq!(fundraiser_state.current_amount, ONE_TOKEN); } #[test] -fn test_check_contributions_success() { - let mut fs = full_setup(); +fn test_refund_after_deadline_target_not_met_succeeds() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); - let amount_to_raise: u64 = 1_000; - let duration: u16 = 0; + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); - // Initialize fundraiser - let init_ix = Instruction::new_with_bytes( - fs.program_id, - &fundraiser::instruction::Initialize { - amount: amount_to_raise, - duration, - } - .data(), - fundraiser::accounts::Initialize { - maker: fs.maker.pubkey(), - mint_to_raise: fs.mint, - fundraiser: fs.fundraiser_pda, - vault: fs.vault, - system_program: system_program::id(), - token_program: token_program_id(), - associated_token_program: ata_program_id(), - } - .to_account_metas(None), + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + MAX_CONTRIBUTION, ); send_transaction_from_instructions( - &mut fs.svm, - vec![init_ix], - &[&fs.maker], - &fs.maker.pubkey(), + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], + &contributor.pubkey(), ) .unwrap(); - // Need 10 contributors each contributing 100 (10% of 1000) to reach goal - for _ in 0..10 { - let contributor = create_wallet(&mut fs.svm, 10_000_000_000).unwrap(); + // Past the deadline, target not met: refund must succeed. + warp_days_forward(&mut setup.svm, DURATION_DAYS as i64 + 1); - let contributor_ata = create_associated_token_account( - &mut fs.svm, + let refund_instruction = build_refund_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![refund_instruction], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + + assert_eq!(get_token_account_balance(&setup.svm, &setup.vault).unwrap(), 0); + assert_eq!( + get_token_account_balance(&setup.svm, &contributor_ata).unwrap(), + CONTRIBUTOR_STARTING_BALANCE + ); + + let fundraiser_state = read_fundraiser_state(&setup.svm, &setup.fundraiser_pda); + assert_eq!(fundraiser_state.current_amount, 0); + + assert!( + setup.svm.get_account(&contributor_account_pda).is_none(), + "Contributor account must be closed after refund" + ); +} + +#[test] +fn test_refund_when_target_met_fails() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + // 10 contributors at the 10% cap reach the target exactly. + let mut contributors = Vec::new(); + for _ in 0..10 { + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + MAX_CONTRIBUTION, + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], &contributor.pubkey(), - &fs.mint, - &fs.payer, ) .unwrap(); + contributors.push((contributor, contributor_ata, contributor_account_pda)); + } - mint_tokens_to_token_account(&mut fs.svm, &fs.mint, &contributor_ata, 10_000, &fs.payer) - .unwrap(); + warp_days_forward(&mut setup.svm, DURATION_DAYS as i64 + 1); - let (contributor_pda, _) = Pubkey::find_program_address( - &[ - b"contributor", - fs.fundraiser_pda.as_ref(), - contributor.pubkey().as_ref(), - ], - &fs.program_id, - ); + let (contributor, contributor_ata, contributor_account_pda) = &contributors[0]; + let refund_instruction = build_refund_instruction( + &setup, + &contributor.pubkey(), + contributor_ata, + contributor_account_pda, + ); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![refund_instruction], + &[contributor], + &contributor.pubkey(), + ); + assert!( + result.is_err(), + "Refunding must fail once the target has been met" + ); + assert_eq!( + get_token_account_balance(&setup.svm, &setup.vault).unwrap(), + AMOUNT_TO_RAISE + ); +} + +#[test] +fn test_check_contributions_success_pays_maker_and_closes_vault() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); - let contribute_ix = Instruction::new_with_bytes( - fs.program_id, - &fundraiser::instruction::Contribute { amount: 100 }.data(), - fundraiser::accounts::Contribute { - contributor: contributor.pubkey(), - mint_to_raise: fs.mint, - fundraiser: fs.fundraiser_pda, - contributor_account: contributor_pda, - contributor_ata, - vault: fs.vault, - token_program: token_program_id(), - system_program: system_program::id(), - } - .to_account_metas(None), + // 10 contributors at the 10% cap reach the target exactly. + for _ in 0..10 { + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + MAX_CONTRIBUTION, ); send_transaction_from_instructions( - &mut fs.svm, - vec![contribute_ix], + &mut setup.svm, + vec![contribute_instruction], &[&contributor], &contributor.pubkey(), ) .unwrap(); - - // Check if we've hit the goal - let current = get_token_account_balance(&fs.svm, &fs.vault).unwrap(); - if current >= amount_to_raise { - break; - } } - // Verify vault has enough - assert!(get_token_account_balance(&fs.svm, &fs.vault).unwrap() >= amount_to_raise); - - // Check contributions (maker claims the funds) - let maker_ata = derive_ata(&fs.maker.pubkey(), &fs.mint); - - let check_ix = Instruction::new_with_bytes( - fs.program_id, - &fundraiser::instruction::CheckContributions {}.data(), - fundraiser::accounts::CheckContributions { - maker: fs.maker.pubkey(), - mint_to_raise: fs.mint, - fundraiser: fs.fundraiser_pda, - vault: fs.vault, - maker_ata, - token_program: token_program_id(), - system_program: system_program::id(), - associated_token_program: ata_program_id(), - } - .to_account_metas(None), + assert_eq!( + get_token_account_balance(&setup.svm, &setup.vault).unwrap(), + AMOUNT_TO_RAISE ); + + let maker_ata = derive_ata(&setup.maker.pubkey(), &setup.mint); + let check_instruction = build_check_contributions_instruction(&setup, &maker_ata); send_transaction_from_instructions( - &mut fs.svm, - vec![check_ix], - &[&fs.maker], - &fs.maker.pubkey(), + &mut setup.svm, + vec![check_instruction], + &[&setup.maker], + &setup.maker.pubkey(), ) .unwrap(); - // Verify maker received the funds + assert_eq!( + get_token_account_balance(&setup.svm, &maker_ata).unwrap(), + AMOUNT_TO_RAISE + ); assert!( - get_token_account_balance(&fs.svm, &maker_ata).unwrap() >= amount_to_raise + setup.svm.get_account(&setup.vault).is_none(), + "Vault token account must be closed after a successful claim" ); + assert!( + setup.svm.get_account(&setup.fundraiser_pda).is_none(), + "Fundraiser account must be closed after a successful claim" + ); +} - // Fundraiser account should be closed +#[test] +fn test_check_contributions_ignores_direct_vault_donations() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + // Mint the full target straight into the vault, bypassing contribute. + // The state-tracked current_amount stays 0, so the claim must fail. + mint_tokens_to_token_account( + &mut setup.svm, + &setup.mint, + &setup.vault, + AMOUNT_TO_RAISE, + &setup.payer, + ) + .unwrap(); + + let maker_ata = derive_ata(&setup.maker.pubkey(), &setup.mint); + let check_instruction = build_check_contributions_instruction(&setup, &maker_ata); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![check_instruction], + &[&setup.maker], + &setup.maker.pubkey(), + ); + assert!( + result.is_err(), + "Direct donations to the vault must not unlock the claim" + ); assert!( - fs.svm.get_account(&fs.fundraiser_pda).is_none(), - "Fundraiser account should be closed after check_contributions" + setup.svm.get_account(&setup.fundraiser_pda).is_some(), + "Fundraiser account must stay open after a failed claim" ); } diff --git a/finance/token-fundraiser/quasar/Cargo.toml b/finance/token-fundraiser/quasar/Cargo.toml index 3053b856..69ed0eca 100644 --- a/finance/token-fundraiser/quasar/Cargo.toml +++ b/finance/token-fundraiser/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-token-fundraiser" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace - not part of the root program-examples workspace. [workspace] [lints.rust.unexpected_cfgs] @@ -32,6 +32,9 @@ quasar-spl = { git = "https://github.com/blueshift-gg/quasar", rev = "623bb70" } solana-instruction = { version = "3.2.0" } [dev-dependencies] +# Generated by `quasar build` (see [clients] in Quasar.toml); gives tests +# typed *Instruction builders instead of hand-built account metas. +quasar-token-fundraiser-client = { path = "target/client/rust/quasar-token-fundraiser-client" } quasar-svm = { git = "https://github.com/blueshift-gg/quasar-svm" } spl-token-interface = { version = "2.0.0" } solana-program-pack = { version = "3.1.0" } diff --git a/finance/token-fundraiser/quasar/README.md b/finance/token-fundraiser/quasar/README.md index c0d47666..03116dad 100644 --- a/finance/token-fundraiser/quasar/README.md +++ b/finance/token-fundraiser/quasar/README.md @@ -1,13 +1,24 @@ # Token Fundraiser (Quasar) -Onchain crowdfunding toward a target amount in a chosen token. +Onchain crowdfunding toward a target amount in a chosen token, written with [Quasar](https://quasar-lang.com/docs). A **maker** opens a fundraiser with a target amount and a deadline; **contributors** deposit tokens into a program-controlled vault. If the target is met the maker withdraws everything; if the deadline passes without the target being met, each contributor reclaims exactly what they put in. -See also: the [repository catalog](../../../README.md). +See also: the [repository catalog](../../../README.md) and the [Anchor variant](../anchor/) of the same program. ## Major concepts -- Fundraiser PDA -- Contributor deposits +- The **Fundraiser** account is a PDA at `["fundraiser", maker]`. It stores the maker, the token's mint, the vault address, the target (`amount_to_raise`), the running total (`current_amount`), the Clock timestamp captured at creation (`time_started`), the window length in days (`duration`), and the PDA bump. Storing the vault address lets every later instruction bind the passed vault to this fundraiser with a `has_one(vault)` constraint. +- A **Contributor** account is a PDA at `["contributor", fundraiser, contributor]`. It records how much that signer has given to that fundraiser, plus its bump. The seeds bind the record to one (fundraiser, contributor) pair, so one contributor's record can never be spent by another signer or against another fundraiser. +- The **vault** is a token account whose authority is the Fundraiser PDA. All deposits, the maker payout, and refunds flow through it, with the PDA signing outbound transfers via its seeds. +- The **fundraising window** runs from `time_started` for `duration` days. Contributions are allowed while `now < time_started + duration`; refunds are allowed once `now >= time_started + duration` and only if the target was not met. `now` is the Clock sysvar's unix timestamp. + +## Lifecycle + +- `initialize` (maker signs): rejects a zero target (`InvalidAmount`) or zero duration (`InvalidDuration`), creates the Fundraiser PDA and the vault, and records the current Clock time as `time_started`. +- `contribute` (contributor signs): rejects a zero amount and, after the deadline, fails with `FundraiserEnded`. Creates the contributor's Contributor PDA on first use (idempotent init, contributor pays the rent), adds the amount to both `current_amount` and the contributor's record with checked arithmetic, transfers tokens from the contributor's token account into the vault, then verifies the vault gained exactly the contributed amount (`BalanceMismatch` otherwise). +- `check_contributions` (maker signs): fails with `TargetNotMet` unless `current_amount >= amount_to_raise`. Transfers the whole vault balance to the maker's token account with the Fundraiser PDA signing, then closes the vault and the Fundraiser account, returning their rent to the maker. +- `refund` (contributor signs): fails with `FundraiserNotEnded` before the deadline and with `TargetMet` if the fundraiser succeeded. Pays the contributor's recorded amount back from the vault with the PDA signing, subtracts it from `current_amount`, verifies the vault lost exactly that amount, and closes the Contributor account back to the contributor. + +Errors are defined in `src/error.rs` as a `#[error_code]` enum starting at code 6000. ## Setup @@ -19,16 +30,14 @@ quasar build Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://docs.anza.xyz/) toolchain (see `Quasar.toml`). +`quasar build` also regenerates the Rust client crate under `target/client/rust/`, which the tests use for typed instruction builders. + ## Testing In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): ```bash -cargo test +quasar test ``` -Tests invoke instruction handlers and assert onchain state. No local validator. - -## Usage - -Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. +The tests in `src/tests.rs` drive the real instruction handlers end to end (initialize, contribute, check_contributions, refund), assert vault and contributor token balances plus account state after every step, and use `QuasarSvm::warp_to_timestamp` to test both sides of the deadline. They also cover the rejection paths: contributing after the deadline, refunding early or after a successful raise, paying out below target, passing a vault not bound to the fundraiser, and refunding against another contributor's record. No local validator is needed. diff --git a/finance/token-fundraiser/quasar/src/error.rs b/finance/token-fundraiser/quasar/src/error.rs new file mode 100644 index 00000000..1599b5ba --- /dev/null +++ b/finance/token-fundraiser/quasar/src/error.rs @@ -0,0 +1,25 @@ +use quasar_lang::prelude::*; + +#[error_code] +pub enum FundraiserError { + /// The target amount has not been raised, so the maker cannot withdraw. + // 6000 is the conventional Anchor-compatible starting offset for + // program-specific error codes (Quasar's #[error_code] starts at 0 + // unless told otherwise; framework errors occupy 3000+). + TargetNotMet = 6000, + /// The target amount was raised, so contributors cannot claim refunds. + TargetMet, + /// The fundraising window has closed, so contributions are rejected. + FundraiserEnded, + /// The fundraising window is still open, so refunds are rejected. + FundraiserNotEnded, + /// An amount argument was zero or otherwise unusable. + InvalidAmount, + /// A duration argument was zero, which would create a fundraiser that + /// could never accept contributions. + InvalidDuration, + /// Checked arithmetic overflowed or underflowed. + MathOverflow, + /// A token balance after a transfer did not match the expected value. + BalanceMismatch, +} diff --git a/finance/token-fundraiser/quasar/src/instructions/check_contributions.rs b/finance/token-fundraiser/quasar/src/instructions/check_contributions.rs index 61e1bee7..01febbf9 100644 --- a/finance/token-fundraiser/quasar/src/instructions/check_contributions.rs +++ b/finance/token-fundraiser/quasar/src/instructions/check_contributions.rs @@ -1,5 +1,5 @@ use { - crate::state::Fundraiser, + crate::{error::FundraiserError, state::Fundraiser}, quasar_lang::prelude::*, quasar_spl::prelude::*, }; @@ -8,31 +8,38 @@ use { pub struct CheckContributions { #[account(mut)] pub maker: Signer, + #[account( mut, has_one(maker), + has_one(vault), close(dest = maker), address = Fundraiser::seeds(maker.address()), )] pub fundraiser: Account, + #[account(mut)] pub vault: Account, + #[account(mut)] pub maker_ta: Account, + pub token_program: Program, } #[inline(always)] -pub fn handle_check_contributions(accounts: &mut CheckContributions, bumps: &CheckContributionsBumps) -> Result<(), ProgramError> { - // Verify the target was met +pub fn handle_check_contributions( + accounts: &mut CheckContributions, + bumps: &CheckContributionsBumps, +) -> Result<(), ProgramError> { + let current_amount: u64 = accounts.fundraiser.current_amount.into(); + let amount_to_raise: u64 = accounts.fundraiser.amount_to_raise.into(); require!( - accounts.fundraiser.current_amount >= accounts.fundraiser.amount_to_raise, - ProgramError::Custom(0) // TargetNotMet + current_amount >= amount_to_raise, + FundraiserError::TargetNotMet ); - // Build PDA signer seeds for the fundraiser: - // ["fundraiser", maker, bump]. Inline rather than via a helper because - // post-PR-#195 the derive no longer emits a `_seeds()` method. + // Fundraiser PDA signer seeds: ["fundraiser", maker, bump]. let bump = [bumps.fundraiser]; let seeds = [ Seed::from(b"fundraiser" as &[u8]), @@ -40,14 +47,24 @@ pub fn handle_check_contributions(accounts: &mut CheckContributions, bumps: &Che Seed::from(bump.as_ref()), ]; - // Transfer all vault funds to the maker + // Transfer all vault funds to the maker. let vault_amount = accounts.vault.amount(); - accounts.token_program - .transfer(&accounts.vault, &accounts.maker_ta, &accounts.fundraiser, vault_amount) + accounts + .token_program + .transfer( + &accounts.vault, + &accounts.maker_ta, + &accounts.fundraiser, + vault_amount, + ) .invoke_signed(&seeds)?; - // Close the vault token account - accounts.token_program + // Token conservation: the vault was fully drained. + require!(accounts.vault.amount() == 0, FundraiserError::BalanceMismatch); + + // Close the vault token account, returning its rent to the maker. + accounts + .token_program .close_account(&accounts.vault, &accounts.maker, &accounts.fundraiser) .invoke_signed(&seeds)?; diff --git a/finance/token-fundraiser/quasar/src/instructions/contribute.rs b/finance/token-fundraiser/quasar/src/instructions/contribute.rs index 8fcc0218..9b78bd82 100644 --- a/finance/token-fundraiser/quasar/src/instructions/contribute.rs +++ b/finance/token-fundraiser/quasar/src/instructions/contribute.rs @@ -1,6 +1,9 @@ use { - crate::state::{Contributor, Fundraiser}, - quasar_lang::prelude::*, + crate::{ + error::FundraiserError, + state::{fundraiser_deadline, Contributor, Fundraiser}, + }, + quasar_lang::{prelude::*, sysvars::Sysvar as _}, quasar_spl::prelude::*, }; @@ -8,33 +11,88 @@ use { pub struct Contribute { #[account(mut)] pub contributor: Signer, - #[account(mut)] + + pub maker: UncheckedAccount, + + #[account( + mut, + has_one(maker), + has_one(vault), + address = Fundraiser::seeds(maker.address()), + )] pub fundraiser: Account, - #[account(mut)] + + #[account( + mut, + init(idempotent), + payer = contributor, + address = Contributor::seeds(fundraiser.address(), contributor.address()), + )] pub contributor_account: Account, + #[account(mut)] pub contributor_ta: Account, + #[account(mut)] pub vault: Account, + pub token_program: Program, + + pub system_program: Program, } #[inline(always)] -pub fn handle_contribute(accounts: &mut Contribute, amount: u64) -> Result<(), ProgramError> { - require!(amount > 0, ProgramError::InvalidArgument); +pub fn handle_contribute( + accounts: &mut Contribute, + amount: u64, + bumps: &ContributeBumps, +) -> Result<(), ProgramError> { + require!(amount > 0, FundraiserError::InvalidAmount); - // Transfer tokens from contributor to vault - accounts.token_program - .transfer(&accounts.contributor_ta, &accounts.vault, &accounts.contributor, amount) - .invoke()?; + // Contributions are allowed while now < start + duration. + let now: i64 = Clock::get()?.unix_timestamp.into(); + let deadline = fundraiser_deadline( + accounts.fundraiser.time_started.into(), + accounts.fundraiser.duration.into(), + )?; + require!(now < deadline, FundraiserError::FundraiserEnded); + + // Update state before the transfer CPI (checks-effects-interactions). + let current_amount: u64 = accounts.fundraiser.current_amount.into(); + accounts.fundraiser.current_amount = PodU64::from( + current_amount + .checked_add(amount) + .ok_or(FundraiserError::MathOverflow)?, + ); - // Update fundraiser state - accounts.fundraiser.current_amount = accounts.fundraiser.current_amount.checked_add(amount) - .ok_or(ProgramError::ArithmeticOverflow)?; + let contributed_so_far: u64 = accounts.contributor_account.amount.into(); + accounts.contributor_account.amount = PodU64::from( + contributed_so_far + .checked_add(amount) + .ok_or(FundraiserError::MathOverflow)?, + ); + accounts.contributor_account.bump = bumps.contributor_account; + + let vault_balance_before = accounts.vault.amount(); + + accounts + .token_program + .transfer( + &accounts.contributor_ta, + &accounts.vault, + &accounts.contributor, + amount, + ) + .invoke()?; - // Update contributor tracking - accounts.contributor_account.amount = accounts.contributor_account.amount.checked_add(amount) - .ok_or(ProgramError::ArithmeticOverflow)?; + // Token conservation: the vault gained exactly the contributed amount. + let expected_vault_balance = vault_balance_before + .checked_add(amount) + .ok_or(FundraiserError::MathOverflow)?; + require!( + accounts.vault.amount() == expected_vault_balance, + FundraiserError::BalanceMismatch + ); Ok(()) } diff --git a/finance/token-fundraiser/quasar/src/instructions/initialize.rs b/finance/token-fundraiser/quasar/src/instructions/initialize.rs index 4c7d0bc4..a9205673 100644 --- a/finance/token-fundraiser/quasar/src/instructions/initialize.rs +++ b/finance/token-fundraiser/quasar/src/instructions/initialize.rs @@ -1,6 +1,9 @@ use { - crate::state::{Fundraiser, FundraiserInner}, - quasar_lang::prelude::*, + crate::{ + error::FundraiserError, + state::{Fundraiser, FundraiserInner}, + }, + quasar_lang::{prelude::*, sysvars::Sysvar as _}, quasar_spl::prelude::*, }; @@ -8,9 +11,12 @@ use { pub struct Initialize { #[account(mut)] pub maker: Signer, + pub mint_to_raise: Account, + #[account(mut, init, payer = maker, address = Fundraiser::seeds(maker.address()))] pub fundraiser: Account, + #[account( mut, init(idempotent), @@ -18,8 +24,11 @@ pub struct Initialize { token(mint = mint_to_raise, authority = fundraiser, token_program = token_program), )] pub vault: Account, + pub rent: Sysvar, + pub token_program: Program, + pub system_program: Program, } @@ -30,15 +39,19 @@ pub fn handle_initialize( duration: u16, bump: u8, ) -> Result<(), ProgramError> { - // Validate minimum raise amount - require!(amount_to_raise > 0, ProgramError::InvalidArgument); + require!(amount_to_raise > 0, FundraiserError::InvalidAmount); + // A zero-day window would close before any contribution could land. + require!(duration > 0, FundraiserError::InvalidDuration); + + let time_started: i64 = Clock::get()?.unix_timestamp.into(); accounts.fundraiser.set_inner(FundraiserInner { maker: *accounts.maker.address(), mint_to_raise: *accounts.mint_to_raise.address(), + vault: *accounts.vault.address(), amount_to_raise, current_amount: 0, - time_started: 0, + time_started, duration, bump, }); diff --git a/finance/token-fundraiser/quasar/src/instructions/refund.rs b/finance/token-fundraiser/quasar/src/instructions/refund.rs index c6e000ad..e117ca84 100644 --- a/finance/token-fundraiser/quasar/src/instructions/refund.rs +++ b/finance/token-fundraiser/quasar/src/instructions/refund.rs @@ -1,6 +1,9 @@ use { - crate::state::{Contributor, ContributorInner, Fundraiser}, - quasar_lang::prelude::*, + crate::{ + error::FundraiserError, + state::{fundraiser_deadline, Contributor, Fundraiser}, + }, + quasar_lang::{prelude::*, sysvars::Sysvar as _}, quasar_spl::prelude::*, }; @@ -8,28 +11,60 @@ use { pub struct Refund { #[account(mut)] pub contributor: Signer, + pub maker: UncheckedAccount, + #[account( mut, has_one(maker), + has_one(vault), address = Fundraiser::seeds(maker.address()), )] pub fundraiser: Account, - #[account(mut)] + + #[account( + mut, + close(dest = contributor), + address = Contributor::seeds(fundraiser.address(), contributor.address()), + )] pub contributor_account: Account, + #[account(mut)] pub contributor_ta: Account, + #[account(mut)] pub vault: Account, + pub token_program: Program, } #[inline(always)] pub fn handle_refund(accounts: &mut Refund, bumps: &RefundBumps) -> Result<(), ProgramError> { - let refund_amount = accounts.contributor_account.amount; + // Refunds are allowed only after the deadline (now >= start + duration). + let now: i64 = Clock::get()?.unix_timestamp.into(); + let deadline = fundraiser_deadline( + accounts.fundraiser.time_started.into(), + accounts.fundraiser.duration.into(), + )?; + require!(now >= deadline, FundraiserError::FundraiserNotEnded); + + // Refunds are allowed only when the target was not met. A successful + // fundraiser pays out to the maker via check_contributions instead. + let current_amount: u64 = accounts.fundraiser.current_amount.into(); + let amount_to_raise: u64 = accounts.fundraiser.amount_to_raise.into(); + require!(current_amount < amount_to_raise, FundraiserError::TargetMet); + + let refund_amount: u64 = accounts.contributor_account.amount.into(); - // Build PDA signer seeds inline; see comment in check_contributions.rs - // for why we no longer use a struct helper method. + // Update state before the transfer CPI (checks-effects-interactions). + accounts.fundraiser.current_amount = PodU64::from( + current_amount + .checked_sub(refund_amount) + .ok_or(FundraiserError::MathOverflow)?, + ); + accounts.contributor_account.amount = PodU64::from(0); + + // Fundraiser PDA signer seeds: ["fundraiser", maker, bump]. let bump = [bumps.fundraiser]; let seeds = [ Seed::from(b"fundraiser" as &[u8]), @@ -37,18 +72,26 @@ pub fn handle_refund(accounts: &mut Refund, bumps: &RefundBumps) -> Result<(), P Seed::from(bump.as_ref()), ]; - // Transfer contributor's tokens back from vault - accounts.token_program - .transfer(&accounts.vault, &accounts.contributor_ta, &accounts.fundraiser, refund_amount) + let vault_balance_before = accounts.vault.amount(); + + accounts + .token_program + .transfer( + &accounts.vault, + &accounts.contributor_ta, + &accounts.fundraiser, + refund_amount, + ) .invoke_signed(&seeds)?; - // Update fundraiser state - accounts.fundraiser.current_amount = accounts.fundraiser.current_amount + // Token conservation: the vault lost exactly the refunded amount. + let expected_vault_balance = vault_balance_before .checked_sub(refund_amount) - .ok_or(ProgramError::ArithmeticOverflow)?; - - // Zero out contributor amount - accounts.contributor_account.set_inner(ContributorInner { amount: 0 }); + .ok_or(FundraiserError::MathOverflow)?; + require!( + accounts.vault.amount() == expected_vault_balance, + FundraiserError::BalanceMismatch + ); Ok(()) } diff --git a/finance/token-fundraiser/quasar/src/lib.rs b/finance/token-fundraiser/quasar/src/lib.rs index cb00e6c1..84472bdb 100644 --- a/finance/token-fundraiser/quasar/src/lib.rs +++ b/finance/token-fundraiser/quasar/src/lib.rs @@ -2,6 +2,7 @@ use quasar_lang::prelude::*; +mod error; mod instructions; use instructions::*; mod state; @@ -27,10 +28,11 @@ mod quasar_token_fundraiser { instructions::handle_initialize(&mut ctx.accounts, amount_to_raise, duration, ctx.bumps.fundraiser) } - /// Contribute tokens to the fundraiser. + /// Contribute tokens to the fundraiser while its window is open. Creates + /// the contributor's tracking account on first contribution. #[instruction(discriminator = 1)] pub fn contribute(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { - instructions::handle_contribute(&mut ctx.accounts, amount) + instructions::handle_contribute(&mut ctx.accounts, amount, &ctx.bumps) } /// Maker withdraws all funds once the target is met. @@ -39,7 +41,8 @@ mod quasar_token_fundraiser { instructions::handle_check_contributions(&mut ctx.accounts, &ctx.bumps) } - /// Contributors reclaim their tokens if the fundraiser fails. + /// Contributors reclaim their tokens after the deadline if the target + /// was not met. #[instruction(discriminator = 3)] pub fn refund(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_refund(&mut ctx.accounts, &ctx.bumps) diff --git a/finance/token-fundraiser/quasar/src/state.rs b/finance/token-fundraiser/quasar/src/state.rs index 9bbe003d..e3724cf0 100644 --- a/finance/token-fundraiser/quasar/src/state.rs +++ b/finance/token-fundraiser/quasar/src/state.rs @@ -1,20 +1,47 @@ -use quasar_lang::prelude::*; +use {crate::error::FundraiserError, quasar_lang::prelude::*}; -/// State for the fundraiser: records the maker, target mint, amounts, and timing. +/// Number of seconds in one day. `Fundraiser::duration` is denominated in +/// days; deadline math converts it to seconds with this factor. +pub const SECONDS_PER_DAY: i64 = 86_400; + +/// State for the fundraiser: records the maker, target mint, vault, amounts, +/// and timing. #[account(discriminator = 1, set_inner)] #[seeds(b"fundraiser", maker: Address)] pub struct Fundraiser { pub maker: Address, pub mint_to_raise: Address, + /// The token account holding contributions. Stored so every later + /// instruction can bind the passed vault to this fundraiser via + /// `has_one(vault)`. + pub vault: Address, pub amount_to_raise: u64, pub current_amount: u64, + /// Clock unix timestamp captured when the fundraiser was created. pub time_started: i64, + /// Fundraising window length in days, counted from `time_started`. pub duration: u16, pub bump: u8, } -/// Tracks how much a specific contributor has given. +/// Tracks how much a specific contributor has given to a specific fundraiser. +/// The seeds bind this record to one (fundraiser, contributor) pair, so it +/// can never be spent by another signer or against another fundraiser. #[account(discriminator = 2, set_inner)] +#[seeds(b"contributor", fundraiser: Address, contributor: Address)] pub struct Contributor { pub amount: u64, + pub bump: u8, +} + +/// The unix timestamp at which the fundraising window closes. Contributions +/// are allowed while `now < deadline`; refunds are allowed once +/// `now >= deadline`. +pub fn fundraiser_deadline(time_started: i64, duration_days: u16) -> Result { + let window_seconds = (duration_days as i64) + .checked_mul(SECONDS_PER_DAY) + .ok_or(FundraiserError::MathOverflow)?; + Ok(time_started + .checked_add(window_seconds) + .ok_or(FundraiserError::MathOverflow)?) } diff --git a/finance/token-fundraiser/quasar/src/tests.rs b/finance/token-fundraiser/quasar/src/tests.rs index e68f8dba..6e489c67 100644 --- a/finance/token-fundraiser/quasar/src/tests.rs +++ b/finance/token-fundraiser/quasar/src/tests.rs @@ -1,17 +1,38 @@ extern crate std; use { - alloc::vec, - alloc::vec::Vec, - quasar_svm::{Account, Instruction, Pubkey, QuasarSvm}, + crate::state::SECONDS_PER_DAY, + quasar_lang::error::QuasarError, + quasar_svm::{Account, Instruction, ProgramError, Pubkey, QuasarSvm}, + quasar_token_fundraiser_client::{ + CheckContributionsInstruction, ContributeInstruction, InitializeInstruction, + QuasarTokenFundraiserError, RefundInstruction, + }, + solana_program_pack::Pack, spl_token_interface::state::{Account as TokenAccount, AccountState, Mint}, - std::println, + std::{vec, vec::Vec}, }; +/// Fundraising target in minor units of the raised token. +const TARGET_AMOUNT: u64 = 10_000; +/// Fundraising window length in days. +const DURATION_DAYS: u16 = 30; +/// Arbitrary fixed unix timestamp the SVM clock is warped to before +/// initialize, so deadline math in tests is deterministic. +const START_TIME: i64 = 1_750_000_000; +/// First timestamp at which the fundraising window is closed. +const DEADLINE: i64 = START_TIME + DURATION_DAYS as i64 * SECONDS_PER_DAY; +/// Token balance each contributor's token account starts with. +const CONTRIBUTOR_STARTING_BALANCE: u64 = 100_000; +/// A contribution below the target, used by the refund-path tests. +const PARTIAL_CONTRIBUTION: u64 = 500; + fn setup() -> QuasarSvm { let elf = std::fs::read("target/deploy/quasar_token_fundraiser.so").unwrap(); - QuasarSvm::new() + let mut svm = QuasarSvm::new() .with_program(&crate::ID, &elf) - .with_token_program() + .with_token_program(); + svm.warp_to_timestamp(START_TIME); + svm } fn signer(address: Pubkey) -> Account { @@ -54,277 +75,483 @@ fn token(address: Pubkey, mint: Pubkey, owner: Pubkey, amount: u64) -> Account { ) } -/// Build Fundraiser account data. -/// Layout: [disc:1] [maker:32] [mint_to_raise:32] [amount_to_raise:8] -/// [current_amount:8] [time_started:8] [duration:2] [bump:1] -fn fundraiser_data( +fn token_balance(svm: &QuasarSvm, address: &Pubkey) -> u64 { + let account = svm.get_account(address).unwrap(); + TokenAccount::unpack(&account.data).unwrap().amount +} + +fn find_fundraiser(maker: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address(&[b"fundraiser", maker.as_ref()], &crate::ID) +} + +fn find_contributor_account(fundraiser: &Pubkey, contributor: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[b"contributor", fundraiser.as_ref(), contributor.as_ref()], + &crate::ID, + ) +} + +/// Deserialized Fundraiser account state, parsed from the zero-copy layout: +/// [disc:1] [maker:32] [mint_to_raise:32] [vault:32] [amount_to_raise:8] +/// [current_amount:8] [time_started:8] [duration:2] [bump:1] +struct FundraiserState { maker: Pubkey, mint_to_raise: Pubkey, + vault: Pubkey, amount_to_raise: u64, current_amount: u64, time_started: i64, duration: u16, bump: u8, -) -> Vec { - let mut data = Vec::with_capacity(92); - data.push(1u8); // discriminator - data.extend_from_slice(maker.as_ref()); - data.extend_from_slice(mint_to_raise.as_ref()); - data.extend_from_slice(&amount_to_raise.to_le_bytes()); - data.extend_from_slice(¤t_amount.to_le_bytes()); - data.extend_from_slice(&time_started.to_le_bytes()); - data.extend_from_slice(&duration.to_le_bytes()); - data.push(bump); - data -} - -fn fundraiser_account( - address: Pubkey, - maker: Pubkey, - mint_to_raise: Pubkey, - amount_to_raise: u64, - current_amount: u64, +} + +fn parse_fundraiser(data: &[u8]) -> FundraiserState { + assert_eq!(data[0], 1, "Fundraiser discriminator"); + let mut cursor = Cursor { + data, + offset: 1usize, + }; + FundraiserState { + maker: Pubkey::new_from_array(cursor.take()), + mint_to_raise: Pubkey::new_from_array(cursor.take()), + vault: Pubkey::new_from_array(cursor.take()), + amount_to_raise: u64::from_le_bytes(cursor.take()), + current_amount: u64::from_le_bytes(cursor.take()), + time_started: i64::from_le_bytes(cursor.take()), + duration: u16::from_le_bytes(cursor.take()), + bump: cursor.take::<1>()[0], + } +} + +/// Deserialized Contributor account state, parsed from the zero-copy layout: +/// [disc:1] [amount:8] [bump:1] +struct ContributorState { + amount: u64, bump: u8, -) -> Account { - Account { - address, - lamports: 2_000_000, - data: fundraiser_data(maker, mint_to_raise, amount_to_raise, current_amount, 0, 30, bump), - owner: crate::ID, - executable: false, +} + +fn parse_contributor(data: &[u8]) -> ContributorState { + assert_eq!(data[0], 2, "Contributor discriminator"); + let mut cursor = Cursor { + data, + offset: 1usize, + }; + ContributorState { + amount: u64::from_le_bytes(cursor.take()), + bump: cursor.take::<1>()[0], } } -/// Build Contributor account data. -/// Layout: [disc:1=2] [amount:8] -fn contributor_data(amount: u64) -> Vec { - let mut data = Vec::with_capacity(9); - data.push(2u8); // discriminator - data.extend_from_slice(&amount.to_le_bytes()); - data +struct Cursor<'a> { + data: &'a [u8], + offset: usize, } -fn contributor_account(address: Pubkey, amount: u64) -> Account { - Account { - address, - lamports: 1_000_000, - data: contributor_data(amount), - owner: crate::ID, - executable: false, +impl Cursor<'_> { + fn take(&mut self) -> [u8; N] { + let bytes: [u8; N] = self.data[self.offset..self.offset + N].try_into().unwrap(); + self.offset += N; + bytes + } +} + +/// Addresses for one fundraiser plus one contributor, shared by every test. +struct Fixture { + maker: Pubkey, + mint: Pubkey, + fundraiser: Pubkey, + vault: Pubkey, + contributor: Pubkey, + contributor_ta: Pubkey, + contributor_account: Pubkey, +} + +fn fixture() -> Fixture { + let maker = Pubkey::new_unique(); + let contributor = Pubkey::new_unique(); + let (fundraiser, _) = find_fundraiser(&maker); + let (contributor_account, _) = find_contributor_account(&fundraiser, &contributor); + Fixture { + maker, + mint: Pubkey::new_unique(), + fundraiser, + vault: Pubkey::new_unique(), + contributor, + contributor_ta: Pubkey::new_unique(), + contributor_account, + } +} + +fn initialize_instruction(fixture: &Fixture, amount_to_raise: u64, duration: u16) -> Instruction { + let mut instruction: Instruction = InitializeInstruction { + maker: fixture.maker, + mint_to_raise: fixture.mint, + fundraiser: fixture.fundraiser, + vault: fixture.vault, + rent: quasar_svm::solana_sdk_ids::sysvar::rent::ID, + token_program: quasar_svm::SPL_TOKEN_PROGRAM_ID, + system_program: quasar_svm::system_program::ID, + amount_to_raise, + duration, } + .into(); + // The vault is a fresh keypair account, so it must sign its own + // system-program creation inside the init CPI. + instruction.accounts[3].is_signer = true; + instruction } -/// Build initialize instruction data. -/// Wire format: [disc: u8 = 0] [amount_to_raise: u64 LE] [duration: u16 LE] -fn build_init_data(amount_to_raise: u64, duration: u16) -> Vec { - let mut data = vec![0u8]; - data.extend_from_slice(&amount_to_raise.to_le_bytes()); - data.extend_from_slice(&duration.to_le_bytes()); - data +fn initialize_accounts(fixture: &Fixture) -> Vec { + vec![ + signer(fixture.maker), + mint(fixture.mint, fixture.maker), + empty(fixture.fundraiser), + empty(fixture.vault), + ] +} + +/// Run initialize through the program and assert it succeeded. +fn initialize_fundraiser(svm: &mut QuasarSvm, fixture: &Fixture) { + let result = svm.process_instruction( + &initialize_instruction(fixture, TARGET_AMOUNT, DURATION_DAYS), + &initialize_accounts(fixture), + ); + result.assert_success(); } -/// Build contribute instruction data. -/// Wire format: [disc: u8 = 1] [amount: u64 LE] -fn build_contribute_data(amount: u64) -> Vec { - let mut data = vec![1u8]; - data.extend_from_slice(&amount.to_le_bytes()); - data +fn contribute_instruction(fixture: &Fixture, amount: u64) -> Instruction { + ContributeInstruction { + contributor: fixture.contributor, + maker: fixture.maker, + fundraiser: fixture.fundraiser, + contributor_account: fixture.contributor_account, + contributor_ta: fixture.contributor_ta, + vault: fixture.vault, + token_program: quasar_svm::SPL_TOKEN_PROGRAM_ID, + system_program: quasar_svm::system_program::ID, + amount, + } + .into() } -/// Build check_contributions instruction data. -/// Wire format: [disc: u8 = 2] -fn build_check_data() -> Vec { - vec![2u8] +/// Accounts a first-time contributor brings to contribute. The fundraiser +/// and vault already live in the SVM's database after initialize. +fn first_contribution_accounts(fixture: &Fixture) -> Vec { + vec![ + signer(fixture.contributor), + empty(fixture.contributor_account), + token( + fixture.contributor_ta, + fixture.mint, + fixture.contributor, + CONTRIBUTOR_STARTING_BALANCE, + ), + ] } -/// Build refund instruction data. -/// Wire format: [disc: u8 = 3] -fn build_refund_data() -> Vec { - vec![3u8] +/// Run contribute through the program and assert it succeeded. +fn contribute(svm: &mut QuasarSvm, fixture: &Fixture, amount: u64) { + let result = svm.process_instruction( + &contribute_instruction(fixture, amount), + &first_contribution_accounts(fixture), + ); + result.assert_success(); } -fn with_signers(mut ix: Instruction, indices: &[usize]) -> Instruction { - for &i in indices { - ix.accounts[i].is_signer = true; +fn refund_instruction(fixture: &Fixture) -> Instruction { + RefundInstruction { + contributor: fixture.contributor, + maker: fixture.maker, + fundraiser: fixture.fundraiser, + contributor_account: fixture.contributor_account, + contributor_ta: fixture.contributor_ta, + vault: fixture.vault, + token_program: quasar_svm::SPL_TOKEN_PROGRAM_ID, } - ix + .into() +} + +fn fundraiser_error(error: QuasarTokenFundraiserError) -> ProgramError { + ProgramError::Custom(error as u32) +} + +fn framework_error(error: QuasarError) -> ProgramError { + ProgramError::Custom(error as u32) } #[test] -fn test_initialize() { +fn test_initialize_records_state_and_clock_time() { let mut svm = setup(); + let fixture = fixture(); + + initialize_fundraiser(&mut svm, &fixture); + + let state = parse_fundraiser(&svm.get_account(&fixture.fundraiser).unwrap().data); + assert_eq!(state.maker, fixture.maker); + assert_eq!(state.mint_to_raise, fixture.mint); + assert_eq!(state.vault, fixture.vault); + assert_eq!(state.amount_to_raise, TARGET_AMOUNT); + assert_eq!(state.current_amount, 0); + assert_eq!(state.time_started, START_TIME); + assert_eq!(state.duration, DURATION_DAYS); + let (_, expected_bump) = find_fundraiser(&fixture.maker); + assert_eq!(state.bump, expected_bump); + + assert_eq!(token_balance(&svm, &fixture.vault), 0); +} - let maker = Pubkey::new_unique(); - let mint_addr = Pubkey::new_unique(); - let vault = Pubkey::new_unique(); - let (fundraiser_pda, _) = - Pubkey::find_program_address(&[b"fundraiser", maker.as_ref()], &crate::ID); - let token_program = quasar_svm::SPL_TOKEN_PROGRAM_ID; - let system_program = quasar_svm::system_program::ID; - let rent = quasar_svm::solana_sdk_ids::sysvar::rent::ID; - - let data = build_init_data(10_000, 30); - - let instruction = with_signers( - Instruction { - program_id: crate::ID, - accounts: vec![ - solana_instruction::AccountMeta::new(maker.into(), true), - solana_instruction::AccountMeta::new_readonly(mint_addr.into(), false), - solana_instruction::AccountMeta::new(fundraiser_pda.into(), false), - solana_instruction::AccountMeta::new(vault.into(), false), - solana_instruction::AccountMeta::new_readonly(rent.into(), false), - solana_instruction::AccountMeta::new_readonly(token_program.into(), false), - solana_instruction::AccountMeta::new_readonly(system_program.into(), false), - ], - data, - }, - &[3], // vault as signer for create_account CPI +#[test] +fn test_initialize_rejects_zero_amount() { + let mut svm = setup(); + let fixture = fixture(); + + let result = svm.process_instruction( + &initialize_instruction(&fixture, 0, DURATION_DAYS), + &initialize_accounts(&fixture), ); + result.assert_error(fundraiser_error(QuasarTokenFundraiserError::InvalidAmount)); +} + +#[test] +fn test_initialize_rejects_zero_duration() { + let mut svm = setup(); + let fixture = fixture(); let result = svm.process_instruction( - &instruction, - &[ - signer(maker), - mint(mint_addr, maker), - empty(fundraiser_pda), - empty(vault), - ], + &initialize_instruction(&fixture, TARGET_AMOUNT, 0), + &initialize_accounts(&fixture), ); + result.assert_error(fundraiser_error( + QuasarTokenFundraiserError::InvalidDuration, + )); +} + +#[test] +fn test_contribute_creates_contributor_account_and_moves_tokens() { + let mut svm = setup(); + let fixture = fixture(); + initialize_fundraiser(&mut svm, &fixture); + + contribute(&mut svm, &fixture, PARTIAL_CONTRIBUTION); - assert!(result.is_ok(), "initialize failed: {:?}", result.raw_result); - println!(" INITIALIZE CU: {}", result.compute_units_consumed); + assert_eq!(token_balance(&svm, &fixture.vault), PARTIAL_CONTRIBUTION); + assert_eq!( + token_balance(&svm, &fixture.contributor_ta), + CONTRIBUTOR_STARTING_BALANCE - PARTIAL_CONTRIBUTION + ); + + let fundraiser_state = parse_fundraiser(&svm.get_account(&fixture.fundraiser).unwrap().data); + assert_eq!(fundraiser_state.current_amount, PARTIAL_CONTRIBUTION); + + let contributor_state = + parse_contributor(&svm.get_account(&fixture.contributor_account).unwrap().data); + assert_eq!(contributor_state.amount, PARTIAL_CONTRIBUTION); + let (_, expected_bump) = find_contributor_account(&fixture.fundraiser, &fixture.contributor); + assert_eq!(contributor_state.bump, expected_bump); } #[test] -fn test_contribute() { +fn test_contribute_accumulates_across_calls() { let mut svm = setup(); + let fixture = fixture(); + initialize_fundraiser(&mut svm, &fixture); + contribute(&mut svm, &fixture, PARTIAL_CONTRIBUTION); + + // Second contribution reuses the contributor account created by the + // first; everything already lives in the SVM database. + let result = + svm.process_instruction(&contribute_instruction(&fixture, PARTIAL_CONTRIBUTION), &[]); + result.assert_success(); + + let expected_total = PARTIAL_CONTRIBUTION * 2; + assert_eq!(token_balance(&svm, &fixture.vault), expected_total); + let contributor_state = + parse_contributor(&svm.get_account(&fixture.contributor_account).unwrap().data); + assert_eq!(contributor_state.amount, expected_total); + let fundraiser_state = parse_fundraiser(&svm.get_account(&fixture.fundraiser).unwrap().data); + assert_eq!(fundraiser_state.current_amount, expected_total); +} - let contributor = Pubkey::new_unique(); - let maker = Pubkey::new_unique(); - let mint_addr = Pubkey::new_unique(); - let contributor_ta = Pubkey::new_unique(); - let vault_ta = Pubkey::new_unique(); - let contributor_acct = Pubkey::new_unique(); - let (fundraiser_pda, fundraiser_bump) = - Pubkey::find_program_address(&[b"fundraiser", maker.as_ref()], &crate::ID); - let token_program = quasar_svm::SPL_TOKEN_PROGRAM_ID; - - let amount = 500u64; - let data = build_contribute_data(amount); - - let instruction = Instruction { - program_id: crate::ID, - accounts: vec![ - solana_instruction::AccountMeta::new(contributor.into(), true), - solana_instruction::AccountMeta::new(fundraiser_pda.into(), false), - solana_instruction::AccountMeta::new(contributor_acct.into(), false), - solana_instruction::AccountMeta::new(contributor_ta.into(), false), - solana_instruction::AccountMeta::new(vault_ta.into(), false), - solana_instruction::AccountMeta::new_readonly(token_program.into(), false), - ], - data, - }; +#[test] +fn test_contribute_rejected_after_deadline() { + let mut svm = setup(); + let fixture = fixture(); + initialize_fundraiser(&mut svm, &fixture); + + svm.warp_to_timestamp(DEADLINE); let result = svm.process_instruction( - &instruction, - &[ - signer(contributor), - fundraiser_account(fundraiser_pda, maker, mint_addr, 10_000, 0, fundraiser_bump), - contributor_account(contributor_acct, 0), - token(contributor_ta, mint_addr, contributor, 100_000), - token(vault_ta, mint_addr, fundraiser_pda, 0), - ], + &contribute_instruction(&fixture, PARTIAL_CONTRIBUTION), + &first_contribution_accounts(&fixture), ); + result.assert_error(fundraiser_error( + QuasarTokenFundraiserError::FundraiserEnded, + )); +} - assert!(result.is_ok(), "contribute failed: {:?}", result.raw_result); - println!(" CONTRIBUTE CU: {}", result.compute_units_consumed); +#[test] +fn test_contribute_allowed_just_before_deadline() { + let mut svm = setup(); + let fixture = fixture(); + initialize_fundraiser(&mut svm, &fixture); + + svm.warp_to_timestamp(DEADLINE - 1); + + contribute(&mut svm, &fixture, PARTIAL_CONTRIBUTION); + assert_eq!(token_balance(&svm, &fixture.vault), PARTIAL_CONTRIBUTION); } #[test] -fn test_check_contributions() { +fn test_contribute_rejects_vault_not_bound_to_fundraiser() { let mut svm = setup(); + let fixture = fixture(); + initialize_fundraiser(&mut svm, &fixture); - let maker = Pubkey::new_unique(); - let mint_addr = Pubkey::new_unique(); - let vault_ta = Pubkey::new_unique(); - let maker_ta = Pubkey::new_unique(); - let (fundraiser_pda, fundraiser_bump) = - Pubkey::find_program_address(&[b"fundraiser", maker.as_ref()], &crate::ID); - let token_program = quasar_svm::SPL_TOKEN_PROGRAM_ID; - - let data = build_check_data(); - - let instruction = Instruction { - program_id: crate::ID, - accounts: vec![ - solana_instruction::AccountMeta::new(maker.into(), true), - solana_instruction::AccountMeta::new(fundraiser_pda.into(), false), - solana_instruction::AccountMeta::new(vault_ta.into(), false), - solana_instruction::AccountMeta::new(maker_ta.into(), false), - solana_instruction::AccountMeta::new_readonly(token_program.into(), false), - ], - data, - }; + // The attacker tries to credit the fundraiser while depositing into a + // decoy token account instead of the fundraiser's stored vault. + let decoy_vault = Pubkey::new_unique(); + let mut accounts = first_contribution_accounts(&fixture); + accounts.push(token(decoy_vault, fixture.mint, fixture.fundraiser, 0)); - // Target was 10_000, current is 10_000 โ€” should succeed - let result = svm.process_instruction( - &instruction, - &[ - signer(maker), - fundraiser_account(fundraiser_pda, maker, mint_addr, 10_000, 10_000, fundraiser_bump), - token(vault_ta, mint_addr, fundraiser_pda, 10_000), - token(maker_ta, mint_addr, maker, 0), - ], + let mut instruction = contribute_instruction(&fixture, PARTIAL_CONTRIBUTION); + // Account index 5 is the vault (see ContributeInstruction ordering). + instruction.accounts[5].pubkey = decoy_vault; + + let result = svm.process_instruction(&instruction, &accounts); + result.assert_error(framework_error(QuasarError::HasOneMismatch)); +} + +#[test] +fn test_refund_returns_tokens_after_failed_fundraiser() { + let mut svm = setup(); + let fixture = fixture(); + initialize_fundraiser(&mut svm, &fixture); + contribute(&mut svm, &fixture, PARTIAL_CONTRIBUTION); + + svm.warp_to_timestamp(DEADLINE); + + let result = svm.process_instruction(&refund_instruction(&fixture), &[]); + result.assert_success(); + + assert_eq!(token_balance(&svm, &fixture.vault), 0); + assert_eq!( + token_balance(&svm, &fixture.contributor_ta), + CONTRIBUTOR_STARTING_BALANCE ); + let fundraiser_state = parse_fundraiser(&svm.get_account(&fixture.fundraiser).unwrap().data); + assert_eq!(fundraiser_state.current_amount, 0); - assert!(result.is_ok(), "check_contributions failed: {:?}", result.raw_result); - println!(" CHECK CONTRIBUTIONS CU: {}", result.compute_units_consumed); + // The contributor account was closed and its rent returned. + let closed = svm.get_account(&fixture.contributor_account).unwrap(); + assert_eq!(closed.lamports, 0, "contributor account rent reclaimed"); } #[test] -fn test_refund() { +fn test_refund_rejected_before_deadline() { let mut svm = setup(); + let fixture = fixture(); + initialize_fundraiser(&mut svm, &fixture); + contribute(&mut svm, &fixture, PARTIAL_CONTRIBUTION); - let contributor = Pubkey::new_unique(); - let maker = Pubkey::new_unique(); - let mint_addr = Pubkey::new_unique(); - let contributor_ta = Pubkey::new_unique(); - let vault_ta = Pubkey::new_unique(); - let contributor_acct = Pubkey::new_unique(); - let (fundraiser_pda, fundraiser_bump) = - Pubkey::find_program_address(&[b"fundraiser", maker.as_ref()], &crate::ID); - let token_program = quasar_svm::SPL_TOKEN_PROGRAM_ID; - - let refund_amount = 500u64; - let data = build_refund_data(); - - let instruction = Instruction { - program_id: crate::ID, - accounts: vec![ - solana_instruction::AccountMeta::new(contributor.into(), true), - solana_instruction::AccountMeta::new_readonly(maker.into(), false), - solana_instruction::AccountMeta::new(fundraiser_pda.into(), false), - solana_instruction::AccountMeta::new(contributor_acct.into(), false), - solana_instruction::AccountMeta::new(contributor_ta.into(), false), - solana_instruction::AccountMeta::new(vault_ta.into(), false), - solana_instruction::AccountMeta::new_readonly(token_program.into(), false), - ], - data, - }; + svm.warp_to_timestamp(DEADLINE - 1); + + let result = svm.process_instruction(&refund_instruction(&fixture), &[]); + result.assert_error(fundraiser_error( + QuasarTokenFundraiserError::FundraiserNotEnded, + )); +} + +#[test] +fn test_refund_rejected_when_target_met() { + let mut svm = setup(); + let fixture = fixture(); + initialize_fundraiser(&mut svm, &fixture); + contribute(&mut svm, &fixture, TARGET_AMOUNT); + + svm.warp_to_timestamp(DEADLINE); + + let result = svm.process_instruction(&refund_instruction(&fixture), &[]); + result.assert_error(fundraiser_error(QuasarTokenFundraiserError::TargetMet)); +} + +#[test] +fn test_refund_rejects_another_contributors_account() { + let mut svm = setup(); + let fixture = fixture(); + initialize_fundraiser(&mut svm, &fixture); + contribute(&mut svm, &fixture, PARTIAL_CONTRIBUTION); + + svm.warp_to_timestamp(DEADLINE); + + // The attacker signs as themselves but passes the victim's contributor + // record and their own token account, trying to drain the vault. + let attacker = Pubkey::new_unique(); + let attacker_ta = Pubkey::new_unique(); + let mut instruction = refund_instruction(&fixture); + // Account indices follow RefundInstruction ordering: + // 0 contributor (signer), 3 contributor_account, 4 contributor_ta. + instruction.accounts[0].pubkey = attacker; + instruction.accounts[4].pubkey = attacker_ta; let result = svm.process_instruction( &instruction, &[ - signer(contributor), - signer(maker), - fundraiser_account(fundraiser_pda, maker, mint_addr, 10_000, refund_amount, fundraiser_bump), - contributor_account(contributor_acct, refund_amount), - token(contributor_ta, mint_addr, contributor, 0), - token(vault_ta, mint_addr, fundraiser_pda, refund_amount), + signer(attacker), + token(attacker_ta, fixture.mint, attacker, 0), ], ); + // The contributor_account PDA check derives ["contributor", fundraiser, + // attacker], which does not match the victim's record. + result.assert_error(framework_error(QuasarError::InvalidPda)); + // The vault still holds the victim's contribution. + assert_eq!(token_balance(&svm, &fixture.vault), PARTIAL_CONTRIBUTION); +} + +#[test] +fn test_check_contributions_pays_maker_when_target_met() { + let mut svm = setup(); + let fixture = fixture(); + initialize_fundraiser(&mut svm, &fixture); + contribute(&mut svm, &fixture, TARGET_AMOUNT); + + let maker_ta = Pubkey::new_unique(); + let instruction: Instruction = CheckContributionsInstruction { + maker: fixture.maker, + fundraiser: fixture.fundraiser, + vault: fixture.vault, + maker_ta, + token_program: quasar_svm::SPL_TOKEN_PROGRAM_ID, + } + .into(); + + let result = + svm.process_instruction(&instruction, &[token(maker_ta, fixture.mint, fixture.maker, 0)]); + result.assert_success(); + + assert_eq!(token_balance(&svm, &maker_ta), TARGET_AMOUNT); + // The vault and fundraiser accounts were closed. + assert_eq!(svm.get_account(&fixture.vault).unwrap().lamports, 0); + assert_eq!(svm.get_account(&fixture.fundraiser).unwrap().lamports, 0); +} + +#[test] +fn test_check_contributions_rejected_below_target() { + let mut svm = setup(); + let fixture = fixture(); + initialize_fundraiser(&mut svm, &fixture); + contribute(&mut svm, &fixture, PARTIAL_CONTRIBUTION); + + let maker_ta = Pubkey::new_unique(); + let instruction: Instruction = CheckContributionsInstruction { + maker: fixture.maker, + fundraiser: fixture.fundraiser, + vault: fixture.vault, + maker_ta, + token_program: quasar_svm::SPL_TOKEN_PROGRAM_ID, + } + .into(); - assert!(result.is_ok(), "refund failed: {:?}", result.raw_result); - println!(" REFUND CU: {}", result.compute_units_consumed); + let result = + svm.process_instruction(&instruction, &[token(maker_ta, fixture.mint, fixture.maker, 0)]); + result.assert_error(fundraiser_error(QuasarTokenFundraiserError::TargetNotMet)); } From e8061d23659e71b37be2c33599f1cddfceb6a84e Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:14:08 +0000 Subject: [PATCH 051/138] vault-strategy: bind strategy mints and router, cap fee_bps, revive orphaned test suite - deposit/withdraw accepted arbitrary mints despite the Strategy storing usdc_mint/asset_mint_a/asset_mint_b: junk mints with empty vaults understated NAV and minted inflated shares. has_one on all three mints in both structs, and on usdc_mint in invest/rebalance - fee_bps now capped at MAX_FEE_BPS at init per the config-validation rule - strategy.swap_router was stored but never checked; invest/rebalance now require the passed router program to match it - the test file sat at anchor/tests/ where no cargo package compiles it, so cargo test ran nothing; moved into programs/vault-strategy/tests/, fixed three latent bugs that had never compiled, and added negative tests for wrong mints, excessive fee, and unregistered router - boxed large accounts in constraint structs to clear build-sbf stack overflow warnings https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- finance/vault-strategy/anchor/README.md | 31 +- .../programs/vault-strategy/src/error.rs | 6 + .../src/instructions/deposit.rs | 23 +- .../src/instructions/initialize_strategy.rs | 8 + .../vault-strategy/src/instructions/invest.rs | 14 +- .../src/instructions/rebalance.rs | 18 +- .../src/instructions/withdraw.rs | 27 +- .../vault-strategy/tests/vault_strategy.rs | 388 +++++++++++++++++- 8 files changed, 456 insertions(+), 59 deletions(-) diff --git a/finance/vault-strategy/anchor/README.md b/finance/vault-strategy/anchor/README.md index d97fcc03..d99e88b1 100644 --- a/finance/vault-strategy/anchor/README.md +++ b/finance/vault-strategy/anchor/README.md @@ -83,11 +83,13 @@ Alice's `manager` key can be a [Squads](https://squads.so/) multisig address โ€” **Instruction:** `initialize_strategy(weight_bps_a=4000, weight_bps_b=6000, fee_bps=100, swap_router, price_feed_a, price_feed_b)` +The weights must sum to 10,000 bps, and `fee_bps` must not exceed `MAX_FEE_BPS` (1,000 bps = 10% per year). Because `collect_fees` mints shares to the manager and dilutes every depositor, an uncapped fee would let a manager drain the vault by configuration, so unsafe fees are rejected at creation time (`FeeTooHigh`). + **Accounts created:** | Account | Seeds / Derivation | What it stores | |---------|--------------------|----------------| -| `Strategy` [PDA](https://solana.com/docs/terminology#program-derived-address-pda) | `["strategy", alice_pubkey]` | manager, mint addresses, weights, fee, total shares, fee timestamp, Pyth feed pubkeys | +| `Strategy` [PDA](https://solana.com/docs/terminology#program-derived-address-pda) | `["strategy", alice_pubkey]` | manager, mint addresses, weights, fee, total shares, fee timestamp, swap router program pubkey, Pyth feed pubkeys | | `share_mint` PDA | `["share_mint", strategy_pubkey]` | The SPL mint for vault shares. Strategy PDA is mint authority. | | `vault_usdc` ATA | Associated token account of strategy PDA for USDC | Holds deposited USDC | | `vault_asset_a` ATA | Associated token account of strategy PDA for TSLAx | Holds TSLAx after investing | @@ -270,10 +272,24 @@ The `mock-swap-router` exists only for testing. It: - `swap_usdc_for_asset`: receives USDC into its treasury, mints basket tokens to caller - `swap_asset_for_usdc`: burns basket tokens from caller, releases USDC from its treasury +The `Strategy` account stores the router's program pubkey (`swap_router`) at creation time, and `invest` and `rebalance` require the swap router program account they are given to match it (`InvalidSwapRouter`). A manager cannot route vault funds through a program the strategy did not register. + In production, replace the router CPIs in `invest` and `rebalance` with [Jupiter](https://jup.ag) CPI calls. The strategy PDA still signs; only the target program ID and account list change. --- +## Account Validation + +Every account a caller passes is checked against state the program controls, never trusted: + +- **Mints are bound to the strategy.** `deposit` and `withdraw` enforce `has_one` on `usdc_mint`, `asset_mint_a`, and `asset_mint_b` against the pubkeys stored in the `Strategy` account (`InvalidUsdcMint` / `InvalidAssetMint`). Without this, a caller could pass an unregistered mint whose strategy-owned vault is empty, understating NAV to mint inflated shares on deposit or skewing the proportional payout on withdraw. `invest` and `rebalance` enforce `has_one` on `usdc_mint` and require their asset mints to be one of the two registered basket mints. +- **Vault token accounts are derived, not supplied.** Each vault account must be the associated token account of the strategy PDA for the corresponding bound mint. +- **Price feeds are bound to the strategy.** The Pyth accounts passed to `deposit` must equal the feed pubkeys stored at creation (`InvalidPriceFeed`). +- **The swap router is bound to the strategy.** `invest` and `rebalance` require the router program account to equal the stored `swap_router` (`InvalidSwapRouter`). +- **Config is validated at creation.** Weights must sum to 10,000 bps and the fee is capped at `MAX_FEE_BPS`. + +--- + ## Custody and Trust This is a **manager-custodial** vault. The strategy [PDA](https://solana.com/docs/terminology#program-derived-address-pda) holds all assets; the manager controls `invest` and `rebalance` with no onchain constraint that they follow the stated allocation. Depositors trust the manager to act in their interest. @@ -296,11 +312,16 @@ The `manager` field is a plain `Pubkey`. It can be a [Squads](https://squads.so/ ## Build and Test ```bash -# Build both programs (requires anchor-cli and solana toolchain) -anchor build +# Build the vault (requires the Solana toolchain). This also compiles the +# router, but with the vault's `cpi` feature enabled, which strips the +# router's entrypoint and leaves a stub .so: +cargo build-sbf + +# So build the router again on its own to get a deployable .so: +cargo build-sbf --manifest-path programs/mock-swap-router/Cargo.toml -# Run tests (LiteSVM โ€” no local validator needed) +# Run tests (LiteSVM, no local validator needed) cargo test ``` -Tests use [LiteSVM](https://github.com/LiteSVM/litesvm) for fast, self-contained program simulation. Both `.so` files are loaded from `target/deploy/`. The test suite covers all eight instructions including slippage rejection and time-based fee accrual. +Tests live in `programs/vault-strategy/tests/vault_strategy.rs` and use [LiteSVM](https://github.com/LiteSVM/litesvm) for fast, self-contained program simulation. Both `.so` files are loaded from `target/deploy/`, so build before testing. The suite exercises all six instruction handlers and the rejection paths: slippage limits, unregistered mints on deposit and withdraw, an over-cap management fee, and an unregistered swap router on invest and rebalance. diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/src/error.rs b/finance/vault-strategy/anchor/programs/vault-strategy/src/error.rs index e30ee13e..86224cba 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/src/error.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/src/error.rs @@ -32,4 +32,10 @@ pub enum VaultError { StalePriceFeed, #[msg("Sell and buy mints must be different")] SameMint, + #[msg("USDC mint does not match the strategy's registered USDC mint")] + InvalidUsdcMint, + #[msg("Swap router program does not match the strategy's registered swap router")] + InvalidSwapRouter, + #[msg("Management fee exceeds the maximum allowed")] + FeeTooHigh, } diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/deposit.rs b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/deposit.rs index 7659238b..9a92777c 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/deposit.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/deposit.rs @@ -40,23 +40,26 @@ pub struct DepositAccountConstraints<'info> { #[account( mut, + has_one = usdc_mint @ VaultError::InvalidUsdcMint, + has_one = asset_mint_a @ VaultError::InvalidAssetMint, + has_one = asset_mint_b @ VaultError::InvalidAssetMint, seeds = [b"strategy", strategy.manager.as_ref()], bump = strategy.bump )] - pub strategy: Account<'info, Strategy>, + pub strategy: Box>, #[account( mut, seeds = [b"share_mint", strategy.key().as_ref()], bump )] - pub share_mint: InterfaceAccount<'info, Mint>, + pub share_mint: Box>, - pub usdc_mint: InterfaceAccount<'info, Mint>, + pub usdc_mint: Box>, - pub asset_mint_a: InterfaceAccount<'info, Mint>, + pub asset_mint_a: Box>, - pub asset_mint_b: InterfaceAccount<'info, Mint>, + pub asset_mint_b: Box>, #[account( mut, @@ -64,7 +67,7 @@ pub struct DepositAccountConstraints<'info> { associated_token::authority = depositor, associated_token::token_program = token_program )] - pub depositor_usdc_account: InterfaceAccount<'info, TokenAccount>, + pub depositor_usdc_account: Box>, #[account( init_if_needed, @@ -73,7 +76,7 @@ pub struct DepositAccountConstraints<'info> { associated_token::authority = depositor, associated_token::token_program = token_program )] - pub depositor_share_account: InterfaceAccount<'info, TokenAccount>, + pub depositor_share_account: Box>, #[account( mut, @@ -81,21 +84,21 @@ pub struct DepositAccountConstraints<'info> { associated_token::authority = strategy, associated_token::token_program = token_program )] - pub vault_usdc: InterfaceAccount<'info, TokenAccount>, + pub vault_usdc: Box>, #[account( associated_token::mint = asset_mint_a, associated_token::authority = strategy, associated_token::token_program = token_program )] - pub vault_asset_a: InterfaceAccount<'info, TokenAccount>, + pub vault_asset_a: Box>, #[account( associated_token::mint = asset_mint_b, associated_token::authority = strategy, associated_token::token_program = token_program )] - pub vault_asset_b: InterfaceAccount<'info, TokenAccount>, + pub vault_asset_b: Box>, /// CHECK: Pyth PriceUpdateV2 for asset_a โ€” key validated against strategy.price_feed_a #[account( diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/initialize_strategy.rs b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/initialize_strategy.rs index 9726d584..32cbfa28 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/initialize_strategy.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/initialize_strategy.rs @@ -7,6 +7,12 @@ use anchor_spl::{ use crate::error::VaultError; use crate::state::Strategy; +/// Highest annual management fee a manager may set, in basis points (10%). +/// `collect_fees` mints shares to the manager and dilutes every depositor, +/// so an uncapped fee would let a manager drain the vault by configuration; +/// 10% per year is already far above typical fund management fees. +pub const MAX_FEE_BPS: u16 = 1_000; + #[derive(Accounts)] pub struct InitializeStrategyAccountConstraints<'info> { #[account(mut)] @@ -91,6 +97,8 @@ pub fn handle_initialize_strategy( VaultError::InvalidWeights ); + require!(fee_bps <= MAX_FEE_BPS, VaultError::FeeTooHigh); + let clock = Clock::get()?; context.accounts.strategy.set_inner(Strategy { diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/invest.rs b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/invest.rs index 8893ade0..4112368a 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/invest.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/invest.rs @@ -18,16 +18,17 @@ pub struct InvestAccountConstraints<'info> { #[account( mut, has_one = manager, + has_one = usdc_mint @ VaultError::InvalidUsdcMint, seeds = [b"strategy", strategy.manager.as_ref()], bump = strategy.bump )] - pub strategy: Account<'info, Strategy>, + pub strategy: Box>, - pub usdc_mint: InterfaceAccount<'info, Mint>, + pub usdc_mint: Box>, /// The asset mint to buy โ€” must be asset_mint_a or asset_mint_b #[account(mut)] - pub asset_mint: InterfaceAccount<'info, Mint>, + pub asset_mint: Box>, #[account( mut, @@ -35,7 +36,7 @@ pub struct InvestAccountConstraints<'info> { associated_token::authority = strategy, associated_token::token_program = token_program )] - pub vault_usdc: InterfaceAccount<'info, TokenAccount>, + pub vault_usdc: Box>, /// Vault's asset token account for the asset being bought #[account( @@ -44,7 +45,7 @@ pub struct InvestAccountConstraints<'info> { associated_token::authority = strategy, associated_token::token_program = token_program )] - pub vault_asset: InterfaceAccount<'info, TokenAccount>, + pub vault_asset: Box>, pub asset_rate: Account<'info, AssetRate>, @@ -60,6 +61,9 @@ pub struct InvestAccountConstraints<'info> { #[account(mut)] pub router_authority: UncheckedAccount<'info>, + #[account( + constraint = swap_router_program.key() == strategy.swap_router @ VaultError::InvalidSwapRouter + )] pub swap_router_program: Program<'info, mock_swap_router::program::MockSwapRouter>, pub associated_token_program: Program<'info, AssociatedToken>, diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/rebalance.rs b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/rebalance.rs index 619c7d50..ef087342 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/rebalance.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/rebalance.rs @@ -18,20 +18,21 @@ pub struct RebalanceAccountConstraints<'info> { #[account( mut, has_one = manager, + has_one = usdc_mint @ VaultError::InvalidUsdcMint, seeds = [b"strategy", strategy.manager.as_ref()], bump = strategy.bump )] - pub strategy: Account<'info, Strategy>, + pub strategy: Box>, - pub usdc_mint: InterfaceAccount<'info, Mint>, + pub usdc_mint: Box>, /// The basket token being sold #[account(mut)] - pub sell_mint: InterfaceAccount<'info, Mint>, + pub sell_mint: Box>, /// The basket token being bought #[account(mut)] - pub buy_mint: InterfaceAccount<'info, Mint>, + pub buy_mint: Box>, /// Vault's token account for the asset being sold #[account( @@ -40,7 +41,7 @@ pub struct RebalanceAccountConstraints<'info> { associated_token::authority = strategy, associated_token::token_program = token_program )] - pub vault_sell: InterfaceAccount<'info, TokenAccount>, + pub vault_sell: Box>, /// Vault's token account for the asset being bought #[account( @@ -49,7 +50,7 @@ pub struct RebalanceAccountConstraints<'info> { associated_token::authority = strategy, associated_token::token_program = token_program )] - pub vault_buy: InterfaceAccount<'info, TokenAccount>, + pub vault_buy: Box>, #[account( mut, @@ -57,7 +58,7 @@ pub struct RebalanceAccountConstraints<'info> { associated_token::authority = strategy, associated_token::token_program = token_program )] - pub vault_usdc: InterfaceAccount<'info, TokenAccount>, + pub vault_usdc: Box>, pub sell_rate: Account<'info, AssetRate>, @@ -75,6 +76,9 @@ pub struct RebalanceAccountConstraints<'info> { #[account(mut)] pub router_authority: UncheckedAccount<'info>, + #[account( + constraint = swap_router_program.key() == strategy.swap_router @ VaultError::InvalidSwapRouter + )] pub swap_router_program: Program<'info, mock_swap_router::program::MockSwapRouter>, pub associated_token_program: Program<'info, AssociatedToken>, diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/withdraw.rs b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/withdraw.rs index 0338a7b7..8d187dce 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/withdraw.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/withdraw.rs @@ -16,23 +16,26 @@ pub struct WithdrawAccountConstraints<'info> { #[account( mut, + has_one = usdc_mint @ VaultError::InvalidUsdcMint, + has_one = asset_mint_a @ VaultError::InvalidAssetMint, + has_one = asset_mint_b @ VaultError::InvalidAssetMint, seeds = [b"strategy", strategy.manager.as_ref()], bump = strategy.bump )] - pub strategy: Account<'info, Strategy>, + pub strategy: Box>, #[account( mut, seeds = [b"share_mint", strategy.key().as_ref()], bump )] - pub share_mint: InterfaceAccount<'info, Mint>, + pub share_mint: Box>, - pub usdc_mint: InterfaceAccount<'info, Mint>, + pub usdc_mint: Box>, - pub asset_mint_a: InterfaceAccount<'info, Mint>, + pub asset_mint_a: Box>, - pub asset_mint_b: InterfaceAccount<'info, Mint>, + pub asset_mint_b: Box>, #[account( mut, @@ -40,7 +43,7 @@ pub struct WithdrawAccountConstraints<'info> { associated_token::authority = user, associated_token::token_program = token_program )] - pub user_share_account: InterfaceAccount<'info, TokenAccount>, + pub user_share_account: Box>, #[account( init_if_needed, @@ -49,7 +52,7 @@ pub struct WithdrawAccountConstraints<'info> { associated_token::authority = user, associated_token::token_program = token_program )] - pub user_usdc_account: InterfaceAccount<'info, TokenAccount>, + pub user_usdc_account: Box>, #[account( init_if_needed, @@ -58,7 +61,7 @@ pub struct WithdrawAccountConstraints<'info> { associated_token::authority = user, associated_token::token_program = token_program )] - pub user_asset_a_account: InterfaceAccount<'info, TokenAccount>, + pub user_asset_a_account: Box>, #[account( init_if_needed, @@ -67,7 +70,7 @@ pub struct WithdrawAccountConstraints<'info> { associated_token::authority = user, associated_token::token_program = token_program )] - pub user_asset_b_account: InterfaceAccount<'info, TokenAccount>, + pub user_asset_b_account: Box>, #[account( mut, @@ -75,7 +78,7 @@ pub struct WithdrawAccountConstraints<'info> { associated_token::authority = strategy, associated_token::token_program = token_program )] - pub vault_usdc: InterfaceAccount<'info, TokenAccount>, + pub vault_usdc: Box>, #[account( mut, @@ -83,7 +86,7 @@ pub struct WithdrawAccountConstraints<'info> { associated_token::authority = strategy, associated_token::token_program = token_program )] - pub vault_asset_a: InterfaceAccount<'info, TokenAccount>, + pub vault_asset_a: Box>, #[account( mut, @@ -91,7 +94,7 @@ pub struct WithdrawAccountConstraints<'info> { associated_token::authority = strategy, associated_token::token_program = token_program )] - pub vault_asset_b: InterfaceAccount<'info, TokenAccount>, + pub vault_asset_b: Box>, pub associated_token_program: Program<'info, AssociatedToken>, pub token_program: Interface<'info, TokenInterface>, diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs b/finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs index 128c039d..97431461 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs @@ -3,6 +3,7 @@ use { solana_program::{clock::Clock, instruction::Instruction, pubkey::Pubkey, system_program}, InstructionData, ToAccountMetas, }, + anchor_spl::token::spl_token, litesvm::LiteSVM, solana_account::Account as SolanaAccount, solana_keypair::Keypair, @@ -74,6 +75,9 @@ fn build_mock_price_update_account(price: i64, exponent: i32, publish_time: i64) /// Fixed publish time matching the test clock const PUBLISH_TIME: i64 = 1_700_000_000; +/// All test mints (USDC and the basket assets) use 6 decimals, matching real USDC. +const TOKEN_DECIMALS: u8 = 6; + struct TestContext { svm: LiteSVM, vault_program_id: Pubkey, @@ -121,20 +125,34 @@ fn setup_full() -> TestContext { let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); let manager = create_wallet(&mut svm, 10_000_000_000).unwrap(); - let decimals: u8 = 6; - - // Create mints โ€” payer is initial mint authority (we'll transfer TSLAx/NVDAx to router_authority) - let usdc_mint = create_token_mint(&mut svm, &payer, decimals, None).unwrap(); + // Create mints with payer as the initial mint authority for all three + let usdc_mint = create_token_mint(&mut svm, &payer, TOKEN_DECIMALS, None).unwrap(); + let tsla_mint = create_token_mint(&mut svm, &payer, TOKEN_DECIMALS, None).unwrap(); + let nvda_mint = create_token_mint(&mut svm, &payer, TOKEN_DECIMALS, None).unwrap(); - // Derive router_authority PDA before creating mints let (router_authority_pda, _) = Pubkey::find_program_address(&[b"router_authority"], &router_program_id); - // TSLAx and NVDAx have router_authority as mint authority - let tsla_mint = - create_token_mint(&mut svm, &payer, decimals, Some(&router_authority_pda)).unwrap(); - let nvda_mint = - create_token_mint(&mut svm, &payer, decimals, Some(&router_authority_pda)).unwrap(); + // The router pays out swap_usdc_for_asset by minting, so the basket asset + // mints must have router_authority as their mint authority + for basket_mint in [&tsla_mint, &nvda_mint] { + let set_authority_instruction = spl_token::instruction::set_authority( + &spl_token::ID, + basket_mint, + Some(&router_authority_pda), + spl_token::instruction::AuthorityType::MintTokens, + &payer.pubkey(), + &[], + ) + .unwrap(); + send_transaction_from_instructions( + &mut svm, + vec![set_authority_instruction], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + } // Derive PDAs let (strategy_pda, _) = Pubkey::find_program_address( @@ -313,14 +331,18 @@ fn setup_full() -> TestContext { } } -fn initialize_strategy(ctx: &mut TestContext) { - let init_strategy_ix = Instruction::new_with_bytes( +fn build_initialize_strategy_instruction( + ctx: &TestContext, + fee_bps: u16, + swap_router: Pubkey, +) -> Instruction { + Instruction::new_with_bytes( ctx.vault_program_id, &vault_strategy::instruction::InitializeStrategy { weight_bps_a: 4000, weight_bps_b: 6000, - fee_bps: 100, - swap_router: ctx.router_program_id, + fee_bps, + swap_router, price_feed_a: ctx.price_feed_tsla, price_feed_b: ctx.price_feed_nvda, } @@ -340,7 +362,20 @@ fn initialize_strategy(ctx: &mut TestContext) { system_program: system_program::id(), } .to_account_metas(None), - ); + ) +} + +/// Annual management fee used by the happy-path tests: 100 bps = 1%. +const TEST_FEE_BPS: u16 = 100; + +fn initialize_strategy(ctx: &mut TestContext) { + initialize_strategy_with_router(ctx, ctx.router_program_id); +} + +/// Initialize the strategy with an arbitrary stored swap router, so tests can +/// prove that invest/rebalance reject a router program the strategy did not register. +fn initialize_strategy_with_router(ctx: &mut TestContext, swap_router: Pubkey) { + let init_strategy_ix = build_initialize_strategy_instruction(ctx, TEST_FEE_BPS, swap_router); send_transaction_from_instructions( &mut ctx.svm, vec![init_strategy_ix], @@ -937,11 +972,12 @@ fn test_rebalance() { let tsla_before = get_token_account_balance(&ctx.svm, &ctx.vault_tsla).unwrap(); let nvda_before = get_token_account_balance(&ctx.svm, &ctx.vault_nvda).unwrap(); - // Rebalance: sell 800_000 TSLAx โ†’ receive 200_000_000 USDC (800_000 * 250) - // then buy NVDAx with 200_000_000 USDC โ†’ 1_111_111 NVDAx (200_000_000 / 180) - let sell_amount: u64 = 800_000; - let usdc_from_sell: u64 = sell_amount * 250; // 200_000_000 - let nvda_bought: u64 = usdc_from_sell / 180; // 1_111_111 + // Rebalance: sell 100_000 TSLAx (vault holds 160_000) โ†’ receive + // 25_000_000 USDC (100_000 * 250), then buy NVDAx with that USDC + // โ†’ 138_888 NVDAx (25_000_000 / 180, floor) + let sell_amount: u64 = 100_000; + let usdc_from_sell: u64 = sell_amount * 250; // 25_000_000 + let nvda_bought: u64 = usdc_from_sell / 180; // 138_888 let rebalance_ix = Instruction::new_with_bytes( ctx.vault_program_id, @@ -988,3 +1024,315 @@ fn test_rebalance() { assert_eq!(tsla_after, tsla_before - sell_amount, "TSLAx balance should decrease by sell_amount"); assert_eq!(nvda_after, nvda_before + nvda_bought, "NVDAx balance should increase by nvda_bought"); } + +fn assert_transaction_fails_with( + result: Result<(), solana_kite::SolanaKiteError>, + expected_error_name: &str, +) { + let error = result.expect_err("transaction should fail"); + let error_text = format!("{error:?}"); + assert!( + error_text.contains(expected_error_name), + "expected failure with {expected_error_name}, got: {error_text}" + ); +} + +#[test] +fn test_initialize_rejects_excessive_fee() { + let mut ctx = setup_full(); + + let excessive_fee_bps = vault_strategy::MAX_FEE_BPS + 1; + let init_strategy_ix = + build_initialize_strategy_instruction(&ctx, excessive_fee_bps, ctx.router_program_id); + let result = send_transaction_from_instructions( + &mut ctx.svm, + vec![init_strategy_ix], + &[&ctx.payer, &ctx.manager], + &ctx.payer.pubkey(), + ); + assert_transaction_fails_with(result, "FeeTooHigh"); + + assert!( + ctx.svm.get_account(&ctx.strategy_pda).is_none(), + "Strategy PDA must not be created when fee_bps exceeds MAX_FEE_BPS" + ); +} + +#[test] +fn test_deposit_rejects_wrong_usdc_mint() { + let mut ctx = setup_full(); + initialize_strategy(&mut ctx); + + // A real but unregistered mint: its strategy-owned vault is empty, so + // accepting it would understate NAV and mint inflated shares. + let junk_mint = create_token_mint(&mut ctx.svm, &ctx.payer, TOKEN_DECIMALS, None).unwrap(); + let junk_vault = + create_associated_token_account(&mut ctx.svm, &ctx.strategy_pda, &junk_mint, &ctx.payer) + .unwrap(); + + let user = create_wallet(&mut ctx.svm, 10_000_000_000).unwrap(); + let deposit_amount: u64 = 1_000_000; + let user_junk = + create_associated_token_account(&mut ctx.svm, &user.pubkey(), &junk_mint, &ctx.payer) + .unwrap(); + mint_tokens_to_token_account(&mut ctx.svm, &junk_mint, &user_junk, deposit_amount, &ctx.payer) + .unwrap(); + let user_share = derive_ata(&user.pubkey(), &ctx.share_mint_pda); + + let deposit_ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::Deposit { + usdc_amount: deposit_amount, + minimum_shares: 0, + } + .data(), + vault_strategy::accounts::DepositAccountConstraints { + depositor: user.pubkey(), + strategy: ctx.strategy_pda, + share_mint: ctx.share_mint_pda, + usdc_mint: junk_mint, + asset_mint_a: ctx.tsla_mint, + asset_mint_b: ctx.nvda_mint, + depositor_usdc_account: user_junk, + depositor_share_account: user_share, + vault_usdc: junk_vault, + vault_asset_a: ctx.vault_tsla, + vault_asset_b: ctx.vault_nvda, + price_feed_a: ctx.price_feed_tsla, + price_feed_b: ctx.price_feed_nvda, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + let result = send_transaction_from_instructions( + &mut ctx.svm, + vec![deposit_ix], + &[&ctx.payer, &user], + &ctx.payer.pubkey(), + ); + assert_transaction_fails_with(result, "InvalidUsdcMint"); +} + +#[test] +fn test_deposit_rejects_wrong_asset_mint() { + let mut ctx = setup_full(); + initialize_strategy(&mut ctx); + + // An unregistered mint passed as asset_mint_a: its empty strategy-owned + // vault would hide the real TSLAx holdings from the NAV calculation. + let junk_mint = create_token_mint(&mut ctx.svm, &ctx.payer, TOKEN_DECIMALS, None).unwrap(); + let junk_vault = + create_associated_token_account(&mut ctx.svm, &ctx.strategy_pda, &junk_mint, &ctx.payer) + .unwrap(); + + let user = create_wallet(&mut ctx.svm, 10_000_000_000).unwrap(); + let deposit_amount: u64 = 1_000_000; + let user_usdc = + create_associated_token_account(&mut ctx.svm, &user.pubkey(), &ctx.usdc_mint, &ctx.payer) + .unwrap(); + mint_tokens_to_token_account(&mut ctx.svm, &ctx.usdc_mint, &user_usdc, deposit_amount, &ctx.payer) + .unwrap(); + let user_share = derive_ata(&user.pubkey(), &ctx.share_mint_pda); + + let deposit_ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::Deposit { + usdc_amount: deposit_amount, + minimum_shares: 0, + } + .data(), + vault_strategy::accounts::DepositAccountConstraints { + depositor: user.pubkey(), + strategy: ctx.strategy_pda, + share_mint: ctx.share_mint_pda, + usdc_mint: ctx.usdc_mint, + asset_mint_a: junk_mint, + asset_mint_b: ctx.nvda_mint, + depositor_usdc_account: user_usdc, + depositor_share_account: user_share, + vault_usdc: ctx.vault_usdc, + vault_asset_a: junk_vault, + vault_asset_b: ctx.vault_nvda, + price_feed_a: ctx.price_feed_tsla, + price_feed_b: ctx.price_feed_nvda, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + let result = send_transaction_from_instructions( + &mut ctx.svm, + vec![deposit_ix], + &[&ctx.payer, &user], + &ctx.payer.pubkey(), + ); + assert_transaction_fails_with(result, "InvalidAssetMint"); + + // The deposit must not have moved funds or minted shares + let vault_usdc_balance = get_token_account_balance(&ctx.svm, &ctx.vault_usdc).unwrap(); + assert_eq!(vault_usdc_balance, 0, "Vault USDC must be untouched"); +} + +#[test] +fn test_withdraw_rejects_wrong_asset_mint() { + let mut ctx = setup_full(); + initialize_strategy(&mut ctx); + + // Deposit normally so the user holds shares + let user = create_wallet(&mut ctx.svm, 10_000_000_000).unwrap(); + let deposit_amount: u64 = 10_000_000; + let user_usdc = + create_associated_token_account(&mut ctx.svm, &user.pubkey(), &ctx.usdc_mint, &ctx.payer) + .unwrap(); + mint_tokens_to_token_account(&mut ctx.svm, &ctx.usdc_mint, &user_usdc, deposit_amount, &ctx.payer) + .unwrap(); + let user_share = do_deposit(&mut ctx, &user, deposit_amount); + + // An unregistered mint passed as asset_mint_a on withdraw: the empty junk + // vault would replace the real TSLAx vault in the proportional payout. + let junk_mint = create_token_mint(&mut ctx.svm, &ctx.payer, TOKEN_DECIMALS, None).unwrap(); + let junk_vault = + create_associated_token_account(&mut ctx.svm, &ctx.strategy_pda, &junk_mint, &ctx.payer) + .unwrap(); + let user_junk = derive_ata(&user.pubkey(), &junk_mint); + let user_nvda = derive_ata(&user.pubkey(), &ctx.nvda_mint); + + let withdraw_ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::Withdraw { + shares_to_burn: deposit_amount, + min_usdc_out: 0, + min_asset_a_out: 0, + min_asset_b_out: 0, + } + .data(), + vault_strategy::accounts::WithdrawAccountConstraints { + user: user.pubkey(), + strategy: ctx.strategy_pda, + share_mint: ctx.share_mint_pda, + usdc_mint: ctx.usdc_mint, + asset_mint_a: junk_mint, + asset_mint_b: ctx.nvda_mint, + user_share_account: user_share, + user_usdc_account: user_usdc, + user_asset_a_account: user_junk, + user_asset_b_account: user_nvda, + vault_usdc: ctx.vault_usdc, + vault_asset_a: junk_vault, + vault_asset_b: ctx.vault_nvda, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + let result = send_transaction_from_instructions( + &mut ctx.svm, + vec![withdraw_ix], + &[&ctx.payer, &user], + &ctx.payer.pubkey(), + ); + assert_transaction_fails_with(result, "InvalidAssetMint"); + + // Shares must not have been burned and the vault must still hold the USDC + let shares_after = get_token_account_balance(&ctx.svm, &user_share).unwrap(); + assert_eq!(shares_after, deposit_amount, "Shares must be untouched"); + let vault_usdc_balance = get_token_account_balance(&ctx.svm, &ctx.vault_usdc).unwrap(); + assert_eq!(vault_usdc_balance, deposit_amount, "Vault USDC must be untouched"); +} + +#[test] +fn test_invest_rejects_unregistered_router() { + let mut ctx = setup_full(); + + // Strategy registers a router that is NOT the deployed mock-swap-router + let registered_router = Pubkey::new_unique(); + initialize_strategy_with_router(&mut ctx, registered_router); + + let invest_ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::Invest { + usdc_amount: 1_000_000, + minimum_asset_out: 0, + } + .data(), + vault_strategy::accounts::InvestAccountConstraints { + manager: ctx.manager.pubkey(), + strategy: ctx.strategy_pda, + usdc_mint: ctx.usdc_mint, + asset_mint: ctx.tsla_mint, + vault_usdc: ctx.vault_usdc, + vault_asset: ctx.vault_tsla, + asset_rate: ctx.tsla_rate_pda, + router_config: ctx.router_config_pda, + router_usdc_treasury: ctx.router_usdc_treasury, + router_authority: ctx.router_authority_pda, + swap_router_program: ctx.router_program_id, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + let result = send_transaction_from_instructions( + &mut ctx.svm, + vec![invest_ix], + &[&ctx.payer, &ctx.manager], + &ctx.payer.pubkey(), + ); + assert_transaction_fails_with(result, "InvalidSwapRouter"); +} + +#[test] +fn test_rebalance_rejects_unregistered_router() { + let mut ctx = setup_full(); + + let registered_router = Pubkey::new_unique(); + initialize_strategy_with_router(&mut ctx, registered_router); + + let rebalance_ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::Rebalance { + sell_amount: 1, + minimum_usdc_from_sell: 0, + usdc_to_invest: 0, + minimum_buy_amount: 0, + } + .data(), + vault_strategy::accounts::RebalanceAccountConstraints { + manager: ctx.manager.pubkey(), + strategy: ctx.strategy_pda, + usdc_mint: ctx.usdc_mint, + sell_mint: ctx.tsla_mint, + buy_mint: ctx.nvda_mint, + vault_sell: ctx.vault_tsla, + vault_buy: ctx.vault_nvda, + vault_usdc: ctx.vault_usdc, + sell_rate: ctx.tsla_rate_pda, + buy_rate: ctx.nvda_rate_pda, + router_config: ctx.router_config_pda, + router_usdc_treasury: ctx.router_usdc_treasury, + router_authority: ctx.router_authority_pda, + swap_router_program: ctx.router_program_id, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + let result = send_transaction_from_instructions( + &mut ctx.svm, + vec![rebalance_ix], + &[&ctx.payer, &ctx.manager], + &ctx.payer.pubkey(), + ); + assert_transaction_fails_with(result, "InvalidSwapRouter"); +} From 1da4e5591945c5a2738177d2712409d3d3b880c2 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:16:27 +0000 Subject: [PATCH 052/138] external-delegate-token-master: close signature replay hole, add missing authority check - the Ethereum-signature authorization signed an arbitrary client-supplied 32-byte message committing to nothing: one valid signature over anything authorized unlimited transfers of any amount to any destination, forever. The message is now reconstructed onchain as keccak256(program id || user account || amount || recipient || stored nonce), verified against the stored Ethereum address, and the nonce increments on success so each signature executes exactly once - quasar variant never compared the transaction authority to user_account.authority; the Solana-side authority check now accompanies the signature check in both variants - anchor variant hashed pubkey.to_bytes()[1..] (63 bytes) but Secp256k1Pubkey::to_bytes() is already the prefix-less 64-byte key, so it derived a wrong Ethereum address; now hashes all 64 bytes - migrated to token_interface + transfer_checked; named error enum in the quasar variant; *AccountConstraints struct names - transfer_tokens previously had zero test coverage; both variants now test valid transfer + nonce increment, replay rejection, wrong-amount, wrong-recipient, and wrong-authority failures with a fixed secp256k1 key - new root README documenting the signed-message format and nonce semantics https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- .../external-delegate-token-master/README.md | 45 ++ .../anchor/Anchor.toml | 2 - .../anchor/README.md | 22 +- .../external-delegate-token-master/Cargo.toml | 3 + .../src/instructions/authority_transfer.rs | 31 +- .../src/instructions/initialize.rs | 12 +- .../src/instructions/set_ethereum_address.rs | 5 +- .../src/instructions/transfer_tokens.rs | 63 +- .../external-delegate-token-master/src/lib.rs | 45 +- .../tests/test_external_delegate.rs | 549 +++++++++++++---- .../quasar/Cargo.toml | 5 +- .../quasar/README.md | 19 +- .../quasar/src/lib.rs | 152 +++-- .../quasar/src/tests.rs | 576 +++++++++++++++++- 14 files changed, 1285 insertions(+), 244 deletions(-) create mode 100644 tokens/external-delegate-token-master/README.md diff --git a/tokens/external-delegate-token-master/README.md b/tokens/external-delegate-token-master/README.md new file mode 100644 index 00000000..d24ba6d8 --- /dev/null +++ b/tokens/external-delegate-token-master/README.md @@ -0,0 +1,45 @@ +# External Delegate Token Master + +A program that lets an **external delegate**, identified by an Ethereum address, authorize token transfers out of a program-controlled vault using a secp256k1 signature, without that delegate ever holding a Solana keypair. + +Two builds of the same program live here: [anchor/](anchor/) and [quasar/](quasar/). They share the same state layout semantics, the same signed-message format, and the same checks, so a client written against one works against the other. + +## How it works + +Each user creates a **user account** (`initialize` instruction handler) storing three fields: + +- `authority`: the Solana wallet that owns the user account. Every instruction requires this wallet as a signer. +- `ethereum_address`: a 20-byte Ethereum address set later via `set_ethereum_address`. The delegate's secp256k1 key hashes to this address. +- `nonce`: a strictly increasing counter, starting at zero, consumed by each signature-authorized transfer. + +Tokens sit in a token account owned by a **user PDA** derived from the user account's address. The program signs transfer CPIs with this PDA. There are two ways to move tokens, both using `transfer_checked` so the mint and decimals are verified in the CPI: + +- `authority_transfer`: the Solana authority signs the transaction directly. +- `transfer_tokens`: the Solana authority signs the transaction AND presents a 65-byte recoverable secp256k1 signature from the delegate. The signature supplements the authority check, it does not replace it. + +## Signed message format + +The program reconstructs the signed message onchain. The delegate signs the keccak256 hash of this 112-byte preimage: + +- program id (32 bytes) +- user account address (32 bytes) +- amount in minor units (8 bytes, little-endian u64) +- recipient token account address (32 bytes) +- nonce (8 bytes, little-endian u64) + +The signature is `r || s || recovery id` (65 bytes), over the 32-byte keccak hash directly. + +## Nonce semantics + +The hash commits to the user account's current `nonce`. On every successful `transfer_tokens` the program increments the stored nonce before invoking the transfer CPI, so: + +- each signature authorizes exactly one execution; replaying it fails because the reconstructed message changes, +- a signature over a different amount or recipient fails verification, +- signatures cannot be transplanted between user accounts or programs, because the user account address and program id are part of the hash. + +## Testing + +Each variant has in-process SVM tests that initialize a user account with a fixed secp256k1 test key, sign real transfer authorizations, send transactions, and assert token balances and nonce state, including the replay, wrong-amount, wrong-recipient, and wrong-authority failure paths. + +- Anchor variant: from [anchor/](anchor/), run `cargo build-sbf` then `cargo test` (LiteSVM). +- Quasar variant: from [quasar/](quasar/), run `quasar build` then `quasar test` (QuasarSVM). diff --git a/tokens/external-delegate-token-master/anchor/Anchor.toml b/tokens/external-delegate-token-master/anchor/Anchor.toml index b0562260..daef46fa 100644 --- a/tokens/external-delegate-token-master/anchor/Anchor.toml +++ b/tokens/external-delegate-token-master/anchor/Anchor.toml @@ -8,8 +8,6 @@ skip-lint = false [programs.localnet] external_delegate_token_master = "FYPkt5VWMvtyWZDMGCwoKFkE3wXTzphicTpnNGuHWVbD" -# [registry] section removed โ€” no longer used in Anchor 1.0 - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/tokens/external-delegate-token-master/anchor/README.md b/tokens/external-delegate-token-master/anchor/README.md index 326b2ae5..2fb02923 100644 --- a/tokens/external-delegate-token-master/anchor/README.md +++ b/tokens/external-delegate-token-master/anchor/README.md @@ -2,34 +2,36 @@ Authorize token transfers using an external secp256k1 delegate signature. -See also: the [repository catalog](../../../README.md). +See the [example overview](../README.md) for the signed-message format and nonce semantics shared with the [Quasar variant](../quasar/), and the [repository catalog](../../../README.md). ## Major concepts -- Delegate approval flow -- Signature verification onchain +- `UserAccount` state: the Solana `authority`, the delegate's 20-byte `ethereum_address`, and a `nonce` consumed by each signature-authorized transfer. +- `transfer_tokens` rebuilds the authorized message onchain as keccak256(program id || user account || amount LE || recipient token account || nonce LE), recovers the signer with the secp256k1 syscall, compares the recovered Ethereum address to the stored one, and increments the nonce before the transfer CPI. The `authority` must also sign the transaction; the Ethereum signature supplements that check. +- `authority_transfer` moves tokens with only the Solana authority's signature. +- Both transfer handlers use `transfer_checked` through `anchor_spl::token_interface`, so the program works against the Classic Token Program and the Token Extensions Program. +- Tokens are held by a token account owned by a PDA derived from the user account's address; the program signs the CPI with that PDA. ## Setup From this directory (`tokens/external-delegate-token-master/anchor/`): ```bash -pnpm install -anchor build +cargo build-sbf ``` -Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs), and `pnpm`. +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`) and [Anchor](https://www.anchor-lang.com/docs). ## Testing -Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. Build first so `target/deploy/external_delegate_token_master.so` exists, then: ```bash -pnpm test +cargo test ``` -This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. +The tests sign real transfer authorizations with a fixed secp256k1 key, send transactions, and assert token balances and nonce state, including the replay, wrong-amount, wrong-recipient, and wrong-authority failure paths. ## Usage -Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. +Read the program source under `programs/` and `Anchor.toml` for the program ID. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/Cargo.toml b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/Cargo.toml index d9d1f08f..ac8b99ac 100644 --- a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/Cargo.toml +++ b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/Cargo.toml @@ -26,6 +26,9 @@ sha3 = "0.10.8" solana-secp256k1-recover = "2.0.0" [dev-dependencies] +# Signs test transfer authorizations with a fixed secp256k1 key so tests can +# exercise the Ethereum-signature path end to end. +libsecp256k1 = "0.7.2" litesvm = "0.11.0" solana-signer = "3.0.0" solana-keypair = "3.0.1" diff --git a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/authority_transfer.rs b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/authority_transfer.rs index 060399ba..9fc507ee 100644 --- a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/authority_transfer.rs +++ b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/authority_transfer.rs @@ -1,44 +1,53 @@ use anchor_lang::prelude::*; -use anchor_spl::token; -use anchor_spl::token::{Token, TokenAccount, Transfer}; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; use crate::UserAccount; #[derive(Accounts)] -pub struct AuthorityTransfer<'info> { +pub struct AuthorityTransferAccountConstraints<'info> { #[account(has_one = authority)] pub user_account: Account<'info, UserAccount>, + pub authority: Signer<'info>, + + pub mint: InterfaceAccount<'info, Mint>, + #[account(mut)] - pub user_token_account: Account<'info, TokenAccount>, + pub user_token_account: InterfaceAccount<'info, TokenAccount>, + #[account(mut)] - pub recipient_token_account: Account<'info, TokenAccount>, + pub recipient_token_account: InterfaceAccount<'info, TokenAccount>, + #[account( seeds = [user_account.key().as_ref()], bump, )] pub user_pda: SystemAccount<'info>, - pub token_program: Program<'info, Token>, + + pub token_program: Interface<'info, TokenInterface>, } -pub fn handler(context: Context, amount: u64) -> Result<()> { - // Transfer tokens - let transfer_instruction = Transfer { +pub fn handler(context: Context, amount: u64) -> Result<()> { + let transfer_accounts = TransferChecked { from: context.accounts.user_token_account.to_account_info(), + mint: context.accounts.mint.to_account_info(), to: context.accounts.recipient_token_account.to_account_info(), authority: context.accounts.user_pda.to_account_info(), }; - token::transfer( + transfer_checked( CpiContext::new_with_signer( context.accounts.token_program.key(), - transfer_instruction, + transfer_accounts, &[&[ context.accounts.user_account.key().as_ref(), &[context.bumps.user_pda], ]], ), amount, + context.accounts.mint.decimals, )?; Ok(()) diff --git a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/initialize.rs b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/initialize.rs index 708a0335..12890e6e 100644 --- a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/initialize.rs +++ b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/initialize.rs @@ -3,22 +3,24 @@ use anchor_lang::prelude::*; use crate::UserAccount; #[derive(Accounts)] -pub struct Initialize<'info> { +pub struct InitializeAccountConstraints<'info> { #[account( init, payer = authority, space = UserAccount::DISCRIMINATOR.len() + UserAccount::INIT_SPACE, )] - // Ensure this is only for user_account pub user_account: Account<'info, UserAccount>, + #[account(mut)] - pub authority: Signer<'info>, // This should remain as a signer - pub system_program: Program<'info, System>, // Required for initialization + pub authority: Signer<'info>, + + pub system_program: Program<'info, System>, } -pub fn handler(mut context: Context) -> Result<()> { +pub fn handler(context: Context) -> Result<()> { let user_account = &mut context.accounts.user_account; user_account.authority = context.accounts.authority.key(); user_account.ethereum_address = [0; 20]; + user_account.nonce = 0; Ok(()) } diff --git a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/set_ethereum_address.rs b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/set_ethereum_address.rs index 3d14f42a..1967fc1b 100644 --- a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/set_ethereum_address.rs +++ b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/set_ethereum_address.rs @@ -3,14 +3,15 @@ use anchor_lang::prelude::*; use crate::UserAccount; #[derive(Accounts)] -pub struct SetEthereumAddress<'info> { +pub struct SetEthereumAddressAccountConstraints<'info> { #[account(mut, has_one = authority)] pub user_account: Account<'info, UserAccount>, + pub authority: Signer<'info>, } pub fn handler( - mut context: Context, + context: Context, ethereum_address: [u8; 20], ) -> Result<()> { let user_account = &mut context.accounts.user_account; diff --git a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/transfer_tokens.rs b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/transfer_tokens.rs index 7fe2cc69..4ab2c863 100644 --- a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/transfer_tokens.rs +++ b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/instructions/transfer_tokens.rs @@ -1,52 +1,79 @@ use anchor_lang::prelude::*; -use anchor_spl::token; -use anchor_spl::token::{Token, TokenAccount, Transfer}; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; -use crate::{verify_ethereum_signature, ErrorCode, UserAccount}; +use crate::{build_transfer_authorization_message, verify_ethereum_signature, ErrorCode, UserAccount}; #[derive(Accounts)] -pub struct TransferTokens<'info> { - #[account(has_one = authority)] +pub struct TransferTokensAccountConstraints<'info> { + #[account(mut, has_one = authority)] pub user_account: Account<'info, UserAccount>, + pub authority: Signer<'info>, + + pub mint: InterfaceAccount<'info, Mint>, + #[account(mut)] - pub user_token_account: Account<'info, TokenAccount>, + pub user_token_account: InterfaceAccount<'info, TokenAccount>, + #[account(mut)] - pub recipient_token_account: Account<'info, TokenAccount>, + pub recipient_token_account: InterfaceAccount<'info, TokenAccount>, + #[account( seeds = [user_account.key().as_ref()], bump, )] pub user_pda: SystemAccount<'info>, - pub token_program: Program<'info, Token>, + + pub token_program: Interface<'info, TokenInterface>, } pub fn handler( - context: Context, + context: Context, amount: u64, signature: [u8; 65], - message: [u8; 32], ) -> Result<()> { let user_account = &context.accounts.user_account; + let user_account_key = user_account.key(); + + // Rebuild the authorized message onchain so the signature commits to + // this exact transfer (amount, recipient, and the current nonce). + let message = build_transfer_authorization_message( + &user_account_key, + amount, + &context.accounts.recipient_token_account.key(), + user_account.nonce, + ); + + require!( + verify_ethereum_signature(&user_account.ethereum_address, &message, &signature), + ErrorCode::InvalidSignature + ); - if !verify_ethereum_signature(&user_account.ethereum_address, &message, &signature) { - return Err(ErrorCode::InvalidSignature.into()); - } + // Consume the nonce before the transfer CPI (checks-effects-interactions), + // so this signature can never authorize a second execution. + let user_account = &mut context.accounts.user_account; + user_account.nonce = user_account + .nonce + .checked_add(1) + .ok_or(ErrorCode::NonceOverflow)?; - // Transfer tokens - let transfer_instruction = Transfer { + let transfer_accounts = TransferChecked { from: context.accounts.user_token_account.to_account_info(), + mint: context.accounts.mint.to_account_info(), to: context.accounts.recipient_token_account.to_account_info(), authority: context.accounts.user_pda.to_account_info(), }; - token::transfer( + transfer_checked( CpiContext::new_with_signer( context.accounts.token_program.key(), - transfer_instruction, - &[&[user_account.key().as_ref(), &[context.bumps.user_pda]]], + transfer_accounts, + &[&[user_account_key.as_ref(), &[context.bumps.user_pda]]], ), amount, + context.accounts.mint.decimals, )?; Ok(()) diff --git a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/lib.rs b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/lib.rs index 8159d7c6..27aed7a1 100644 --- a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/lib.rs +++ b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/lib.rs @@ -11,27 +11,29 @@ declare_id!("FYPkt5VWMvtyWZDMGCwoKFkE3wXTzphicTpnNGuHWVbD"); pub mod external_delegate_token_master { use super::*; - pub fn initialize(context: Context) -> Result<()> { + pub fn initialize(context: Context) -> Result<()> { instructions::initialize::handler(context) } pub fn set_ethereum_address( - context: Context, + context: Context, ethereum_address: [u8; 20], ) -> Result<()> { instructions::set_ethereum_address::handler(context, ethereum_address) } pub fn transfer_tokens( - context: Context, + context: Context, amount: u64, signature: [u8; 65], - message: [u8; 32], ) -> Result<()> { - instructions::transfer_tokens::handler(context, amount, signature, message) + instructions::transfer_tokens::handler(context, amount, signature) } - pub fn authority_transfer(context: Context, amount: u64) -> Result<()> { + pub fn authority_transfer( + context: Context, + amount: u64, + ) -> Result<()> { instructions::authority_transfer::handler(context, amount) } } @@ -41,12 +43,38 @@ pub mod external_delegate_token_master { pub struct UserAccount { pub authority: Pubkey, pub ethereum_address: [u8; 20], + /// Strictly increasing counter committed into every signed transfer + /// authorization, so each Ethereum signature executes exactly once. + pub nonce: u64, } #[error_code] pub enum ErrorCode { #[msg("Invalid Ethereum signature")] InvalidSignature, + #[msg("Nonce overflow")] + NonceOverflow, +} + +/// Reconstructs the message a delegate must sign to authorize one transfer: +/// keccak256(program id || user account || amount LE || recipient token account || nonce LE). +/// +/// Because the hash commits to every transfer parameter plus the user +/// account's stored nonce, a signature is valid for exactly one +/// (amount, recipient, nonce) execution and cannot be replayed. +pub fn build_transfer_authorization_message( + user_account: &Pubkey, + amount: u64, + recipient_token_account: &Pubkey, + nonce: u64, +) -> [u8; 32] { + let mut hasher = Keccak256::new(); + hasher.update(ID.as_ref()); + hasher.update(user_account.as_ref()); + hasher.update(amount.to_le_bytes()); + hasher.update(recipient_token_account.as_ref()); + hasher.update(nonce.to_le_bytes()); + hasher.finalize().into() } pub fn verify_ethereum_signature( @@ -59,9 +87,12 @@ pub fn verify_ethereum_signature( sig.copy_from_slice(&signature[..64]); if let Ok(pubkey) = secp256k1_recover(message, recovery_id, &sig) { + // An Ethereum address is the last 20 bytes of the keccak256 hash of + // the 64-byte uncompressed public key (x || y, no 0x04 prefix byte). + // `secp256k1_recover` already returns exactly those 64 bytes. let pubkey_bytes = pubkey.to_bytes(); let mut recovered_address = [0u8; 20]; - recovered_address.copy_from_slice(&keccak256(&pubkey_bytes[1..])[12..]); + recovered_address.copy_from_slice(&keccak256(&pubkey_bytes)[12..]); recovered_address == *ethereum_address } else { false diff --git a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/tests/test_external_delegate.rs b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/tests/test_external_delegate.rs index edc4ae81..4b6d73bd 100644 --- a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/tests/test_external_delegate.rs +++ b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/tests/test_external_delegate.rs @@ -3,7 +3,9 @@ use { solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, InstructionData, ToAccountMetas, }, + borsh::BorshDeserialize, litesvm::LiteSVM, + sha3::{Digest, Keccak256}, solana_keypair::Keypair, solana_kite::{ create_associated_token_account, create_token_mint, create_wallet, @@ -12,21 +14,80 @@ use { solana_signer::Signer, }; +const WALLET_LAMPORTS: u64 = 10_000_000_000; +const MINT_DECIMALS: u8 = 6; +const MINT_AMOUNT: u64 = 1_000_000_000; +const TRANSFER_AMOUNT: u64 = 500_000_000; + +/// Fixed delegate key so tests are deterministic. Any nonzero scalar below +/// the secp256k1 curve order works. +const DELEGATE_SECP256K1_PRIVATE_KEY: [u8; 32] = [0x42; 32]; + fn token_program_id() -> Pubkey { "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" .parse() .unwrap() } -fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { - let ata_program: Pubkey = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" - .parse() - .unwrap(); - let (ata, _bump) = Pubkey::find_program_address( - &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], - &ata_program, - ); - ata +/// Mirror of the program's `UserAccount` for reading state in tests +/// (after the 8-byte Anchor discriminator). +#[derive(BorshDeserialize)] +struct UserAccountState { + authority: [u8; 32], + ethereum_address: [u8; 20], + nonce: u64, +} + +fn read_user_account(svm: &LiteSVM, address: &Pubkey) -> UserAccountState { + let account = svm.get_account(address).expect("user account should exist"); + let anchor_discriminator_len = 8; + UserAccountState::try_from_slice(&account.data[anchor_discriminator_len..]).unwrap() +} + +fn delegate_secret_key() -> libsecp256k1::SecretKey { + libsecp256k1::SecretKey::parse(&DELEGATE_SECP256K1_PRIVATE_KEY).unwrap() +} + +/// Ethereum address = last 20 bytes of keccak256 of the 64-byte uncompressed +/// public key (0x04 prefix dropped). +fn ethereum_address_of(secret_key: &libsecp256k1::SecretKey) -> [u8; 20] { + let public_key = libsecp256k1::PublicKey::from_secret_key(secret_key); + let uncompressed = public_key.serialize(); + let hash = Keccak256::digest(&uncompressed[1..]); + let mut address = [0u8; 20]; + address.copy_from_slice(&hash[12..]); + address +} + +/// Builds the exact preimage the program reconstructs onchain: +/// keccak256(program id || user account || amount LE || recipient token account || nonce LE). +fn build_transfer_authorization_message( + program_id: &Pubkey, + user_account: &Pubkey, + amount: u64, + recipient_token_account: &Pubkey, + nonce: u64, +) -> [u8; 32] { + let mut hasher = Keccak256::new(); + hasher.update(program_id.as_ref()); + hasher.update(user_account.as_ref()); + hasher.update(amount.to_le_bytes()); + hasher.update(recipient_token_account.as_ref()); + hasher.update(nonce.to_le_bytes()); + hasher.finalize().into() +} + +/// 65-byte recoverable signature: r || s || recovery id. +fn sign_transfer_authorization( + secret_key: &libsecp256k1::SecretKey, + message: &[u8; 32], +) -> [u8; 65] { + let (signature, recovery_id) = + libsecp256k1::sign(&libsecp256k1::Message::parse(message), secret_key); + let mut bytes = [0u8; 65]; + bytes[..64].copy_from_slice(&signature.serialize()); + bytes[64] = recovery_id.serialize(); + bytes } fn setup() -> (LiteSVM, Pubkey, Keypair) { @@ -36,189 +97,419 @@ fn setup() -> (LiteSVM, Pubkey, Keypair) { let program_bytes = include_bytes!("../../../target/deploy/external_delegate_token_master.so"); svm.add_program(program_id, program_bytes).unwrap(); - let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + let payer = create_wallet(&mut svm, WALLET_LAMPORTS).unwrap(); (svm, program_id, payer) } -#[test] -fn test_initialize_user_account() { - let (mut svm, program_id, authority) = setup(); - let user_account = Keypair::new(); - - let init_ix = Instruction::new_with_bytes( - program_id, +fn initialize_user_account( + svm: &mut LiteSVM, + program_id: &Pubkey, + authority: &Keypair, + user_account: &Keypair, +) { + let init_instruction = Instruction::new_with_bytes( + *program_id, &external_delegate_token_master::instruction::Initialize {}.data(), - external_delegate_token_master::accounts::Initialize { + external_delegate_token_master::accounts::InitializeAccountConstraints { user_account: user_account.pubkey(), authority: authority.pubkey(), system_program: system_program::id(), } .to_account_metas(None), ); + send_transaction_from_instructions( + svm, + vec![init_instruction], + &[authority, user_account], + &authority.pubkey(), + ) + .unwrap(); +} +fn set_ethereum_address( + svm: &mut LiteSVM, + program_id: &Pubkey, + authority: &Keypair, + user_account: &Pubkey, + ethereum_address: [u8; 20], +) { + let set_address_instruction = Instruction::new_with_bytes( + *program_id, + &external_delegate_token_master::instruction::SetEthereumAddress { ethereum_address } + .data(), + external_delegate_token_master::accounts::SetEthereumAddressAccountConstraints { + user_account: *user_account, + authority: authority.pubkey(), + } + .to_account_metas(None), + ); send_transaction_from_instructions( - &mut svm, - vec![init_ix], - &[&authority, &user_account], + svm, + vec![set_address_instruction], + &[authority], &authority.pubkey(), ) .unwrap(); +} + +/// Everything a transfer_tokens test needs: a user account linked to the +/// fixed delegate Ethereum key, a funded PDA-owned token account, and a +/// recipient token account. +struct TransferFixture { + svm: LiteSVM, + program_id: Pubkey, + authority: Keypair, + user_account: Pubkey, + user_pda: Pubkey, + mint: Pubkey, + user_pda_token_account: Pubkey, + recipient_token_account: Pubkey, +} + +fn setup_transfer_fixture() -> TransferFixture { + let (mut svm, program_id, authority) = setup(); + let user_account_keypair = Keypair::new(); + initialize_user_account(&mut svm, &program_id, &authority, &user_account_keypair); - // Verify the account was created - let account_data = svm - .get_account(&user_account.pubkey()) - .expect("User account should exist"); + let user_account = user_account_keypair.pubkey(); + set_ethereum_address( + &mut svm, + &program_id, + &authority, + &user_account, + ethereum_address_of(&delegate_secret_key()), + ); + + let (user_pda, _bump) = Pubkey::find_program_address(&[user_account.as_ref()], &program_id); + + let mint = create_token_mint(&mut svm, &authority, MINT_DECIMALS, None).unwrap(); + let user_pda_token_account = + create_associated_token_account(&mut svm, &user_pda, &mint, &authority).unwrap(); + mint_tokens_to_token_account(&mut svm, &mint, &user_pda_token_account, MINT_AMOUNT, &authority) + .unwrap(); + + let recipient = Keypair::new(); + let recipient_token_account = + create_associated_token_account(&mut svm, &recipient.pubkey(), &mint, &authority).unwrap(); + + TransferFixture { + svm, + program_id, + authority, + user_account, + user_pda, + mint, + user_pda_token_account, + recipient_token_account, + } +} - // Skip 8-byte discriminator - let data = &account_data.data[8..]; - let stored_authority = Pubkey::try_from(&data[0..32]).unwrap(); - assert_eq!(stored_authority, authority.pubkey()); +fn build_transfer_tokens_instruction( + fixture: &TransferFixture, + authority: &Pubkey, + recipient_token_account: &Pubkey, + amount: u64, + signature: [u8; 65], +) -> Instruction { + Instruction::new_with_bytes( + fixture.program_id, + &external_delegate_token_master::instruction::TransferTokens { amount, signature }.data(), + external_delegate_token_master::accounts::TransferTokensAccountConstraints { + user_account: fixture.user_account, + authority: *authority, + mint: fixture.mint, + user_token_account: fixture.user_pda_token_account, + recipient_token_account: *recipient_token_account, + user_pda: fixture.user_pda, + token_program: token_program_id(), + } + .to_account_metas(None), + ) +} + +#[test] +fn test_initialize_user_account() { + let (mut svm, program_id, authority) = setup(); + let user_account = Keypair::new(); + initialize_user_account(&mut svm, &program_id, &authority, &user_account); - // ethereum_address: [u8; 20] โ€” should be all zeros - let eth_addr = &data[32..52]; - assert_eq!(eth_addr, &[0u8; 20]); + let state = read_user_account(&svm, &user_account.pubkey()); + assert_eq!(state.authority, authority.pubkey().to_bytes()); + assert_eq!(state.ethereum_address, [0u8; 20]); + assert_eq!(state.nonce, 0); } #[test] fn test_set_ethereum_address() { let (mut svm, program_id, authority) = setup(); let user_account = Keypair::new(); + initialize_user_account(&mut svm, &program_id, &authority, &user_account); - // Initialize - let init_ix = Instruction::new_with_bytes( - program_id, - &external_delegate_token_master::instruction::Initialize {}.data(), - external_delegate_token_master::accounts::Initialize { - user_account: user_account.pubkey(), - authority: authority.pubkey(), - system_program: system_program::id(), - } - .to_account_metas(None), + let ethereum_address = ethereum_address_of(&delegate_secret_key()); + set_ethereum_address( + &mut svm, + &program_id, + &authority, + &user_account.pubkey(), + ethereum_address, + ); + + let state = read_user_account(&svm, &user_account.pubkey()); + assert_eq!(state.ethereum_address, ethereum_address); +} + +#[test] +fn test_transfer_tokens_with_valid_signature_moves_tokens_and_increments_nonce() { + let mut fixture = setup_transfer_fixture(); + + let message = build_transfer_authorization_message( + &fixture.program_id, + &fixture.user_account, + TRANSFER_AMOUNT, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let authority_pubkey = fixture.authority.pubkey(); + let transfer_instruction = build_transfer_tokens_instruction( + &fixture, + &authority_pubkey, + &fixture.recipient_token_account.clone(), + TRANSFER_AMOUNT, + signature, ); send_transaction_from_instructions( - &mut svm, - vec![init_ix], - &[&authority, &user_account], - &authority.pubkey(), + &mut fixture.svm, + vec![transfer_instruction], + &[&fixture.authority], + &authority_pubkey, ) .unwrap(); - // Set ethereum address - let ethereum_address: [u8; 20] = [ - 0x1C, 0x8c, 0xd0, 0xc3, 0x8F, 0x8D, 0xE3, 0x5d, 0x60, 0x56, 0xc7, 0xC7, 0xaB, 0xFa, - 0x7e, 0x65, 0xD2, 0x60, 0xE8, 0x16, - ]; + assert_eq!( + get_token_account_balance(&fixture.svm, &fixture.recipient_token_account).unwrap(), + TRANSFER_AMOUNT + ); + assert_eq!( + get_token_account_balance(&fixture.svm, &fixture.user_pda_token_account).unwrap(), + MINT_AMOUNT - TRANSFER_AMOUNT + ); + assert_eq!(read_user_account(&fixture.svm, &fixture.user_account).nonce, 1); +} - let set_eth_ix = Instruction::new_with_bytes( - program_id, - &external_delegate_token_master::instruction::SetEthereumAddress { - ethereum_address, - } - .data(), - external_delegate_token_master::accounts::SetEthereumAddress { - user_account: user_account.pubkey(), - authority: authority.pubkey(), - } - .to_account_metas(None), +#[test] +fn test_transfer_tokens_replayed_signature_fails() { + let mut fixture = setup_transfer_fixture(); + + let message = build_transfer_authorization_message( + &fixture.program_id, + &fixture.user_account, + TRANSFER_AMOUNT, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let authority_pubkey = fixture.authority.pubkey(); + let transfer_instruction = build_transfer_tokens_instruction( + &fixture, + &authority_pubkey, + &fixture.recipient_token_account.clone(), + TRANSFER_AMOUNT, + signature, ); send_transaction_from_instructions( - &mut svm, - vec![set_eth_ix], - &[&authority], - &authority.pubkey(), + &mut fixture.svm, + vec![transfer_instruction.clone()], + &[&fixture.authority], + &authority_pubkey, ) .unwrap(); - // Verify - let account_data = svm - .get_account(&user_account.pubkey()) - .expect("User account should exist"); - let data = &account_data.data[8..]; - let stored_eth_addr = &data[32..52]; - assert_eq!(stored_eth_addr, ðereum_address); + // Replay the identical instruction. The stored nonce is now 1, so the + // onchain reconstruction differs from the signed message. + fixture.svm.expire_blockhash(); + let replay_result = send_transaction_from_instructions( + &mut fixture.svm, + vec![transfer_instruction], + &[&fixture.authority], + &authority_pubkey, + ); + assert!(replay_result.is_err(), "replayed signature must be rejected"); + + // Exactly one transfer happened. + assert_eq!( + get_token_account_balance(&fixture.svm, &fixture.recipient_token_account).unwrap(), + TRANSFER_AMOUNT + ); + assert_eq!(read_user_account(&fixture.svm, &fixture.user_account).nonce, 1); } #[test] -fn test_authority_transfer() { - let (mut svm, program_id, authority) = setup(); - let user_account = Keypair::new(); +fn test_transfer_tokens_signature_over_different_amount_fails() { + let mut fixture = setup_transfer_fixture(); - // Initialize user account - let init_ix = Instruction::new_with_bytes( - program_id, - &external_delegate_token_master::instruction::Initialize {}.data(), - external_delegate_token_master::accounts::Initialize { - user_account: user_account.pubkey(), - authority: authority.pubkey(), - system_program: system_program::id(), - } - .to_account_metas(None), + let authorized_amount = TRANSFER_AMOUNT; + let attempted_amount = MINT_AMOUNT; + let message = build_transfer_authorization_message( + &fixture.program_id, + &fixture.user_account, + authorized_amount, + &fixture.recipient_token_account, + 0, ); - send_transaction_from_instructions( - &mut svm, - vec![init_ix], - &[&authority, &user_account], - &authority.pubkey(), + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let authority_pubkey = fixture.authority.pubkey(); + let transfer_instruction = build_transfer_tokens_instruction( + &fixture, + &authority_pubkey, + &fixture.recipient_token_account.clone(), + attempted_amount, + signature, + ); + let result = send_transaction_from_instructions( + &mut fixture.svm, + vec![transfer_instruction], + &[&fixture.authority], + &authority_pubkey, + ); + assert!( + result.is_err(), + "signature over a different amount must be rejected" + ); + assert_eq!( + get_token_account_balance(&fixture.svm, &fixture.recipient_token_account).unwrap(), + 0 + ); + assert_eq!(read_user_account(&fixture.svm, &fixture.user_account).nonce, 0); +} + +#[test] +fn test_transfer_tokens_signature_over_different_recipient_fails() { + let mut fixture = setup_transfer_fixture(); + + // Sign for the legitimate recipient, then try to redirect the transfer + // to an attacker-controlled token account. + let attacker = Keypair::new(); + let attacker_token_account = create_associated_token_account( + &mut fixture.svm, + &attacker.pubkey(), + &fixture.mint, + &fixture.authority, ) .unwrap(); - // user_pda is derived from user_account key - let (user_pda, _bump) = - Pubkey::find_program_address(&[user_account.pubkey().as_ref()], &program_id); + let message = build_transfer_authorization_message( + &fixture.program_id, + &fixture.user_account, + TRANSFER_AMOUNT, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let authority_pubkey = fixture.authority.pubkey(); + let transfer_instruction = build_transfer_tokens_instruction( + &fixture, + &authority_pubkey, + &attacker_token_account, + TRANSFER_AMOUNT, + signature, + ); + let result = send_transaction_from_instructions( + &mut fixture.svm, + vec![transfer_instruction], + &[&fixture.authority], + &authority_pubkey, + ); + assert!( + result.is_err(), + "signature over a different recipient must be rejected" + ); + assert_eq!( + get_token_account_balance(&fixture.svm, &attacker_token_account).unwrap(), + 0 + ); +} - // Create mint and token accounts using Kite - let mint_pubkey = create_token_mint(&mut svm, &authority, 6, None).unwrap(); +#[test] +fn test_transfer_tokens_wrong_solana_authority_fails() { + let mut fixture = setup_transfer_fixture(); - // Create ATA for the user_pda - let user_pda_ata = - create_associated_token_account(&mut svm, &user_pda, &mint_pubkey, &authority).unwrap(); + // A correctly signed Ethereum authorization must not bypass the + // Solana-side authority check. + let message = build_transfer_authorization_message( + &fixture.program_id, + &fixture.user_account, + TRANSFER_AMOUNT, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); - // Mint tokens to user_pda's ATA - let mint_amount: u64 = 1_000_000_000; - mint_tokens_to_token_account(&mut svm, &mint_pubkey, &user_pda_ata, mint_amount, &authority) - .unwrap(); + let mallory = create_wallet(&mut fixture.svm, WALLET_LAMPORTS).unwrap(); + let mallory_pubkey = mallory.pubkey(); + let transfer_instruction = build_transfer_tokens_instruction( + &fixture, + &mallory_pubkey, + &fixture.recipient_token_account.clone(), + TRANSFER_AMOUNT, + signature, + ); + let result = send_transaction_from_instructions( + &mut fixture.svm, + vec![transfer_instruction], + &[&mallory], + &mallory_pubkey, + ); + assert!( + result.is_err(), + "a signer other than user_account.authority must be rejected" + ); + assert_eq!( + get_token_account_balance(&fixture.svm, &fixture.recipient_token_account).unwrap(), + 0 + ); +} - // Create recipient ATA - let recipient = Keypair::new(); - let recipient_ata = - create_associated_token_account(&mut svm, &recipient.pubkey(), &mint_pubkey, &authority) - .unwrap(); +#[test] +fn test_authority_transfer() { + let fixture = setup_transfer_fixture(); + let mut svm = fixture.svm; - // Perform authority transfer - let transfer_amount: u64 = 500_000_000; - let authority_transfer_ix = Instruction::new_with_bytes( - program_id, + let authority_transfer_instruction = Instruction::new_with_bytes( + fixture.program_id, &external_delegate_token_master::instruction::AuthorityTransfer { - amount: transfer_amount, + amount: TRANSFER_AMOUNT, } .data(), - external_delegate_token_master::accounts::AuthorityTransfer { - user_account: user_account.pubkey(), - authority: authority.pubkey(), - user_token_account: user_pda_ata, - recipient_token_account: recipient_ata, - user_pda, + external_delegate_token_master::accounts::AuthorityTransferAccountConstraints { + user_account: fixture.user_account, + authority: fixture.authority.pubkey(), + mint: fixture.mint, + user_token_account: fixture.user_pda_token_account, + recipient_token_account: fixture.recipient_token_account, + user_pda: fixture.user_pda, token_program: token_program_id(), } .to_account_metas(None), ); send_transaction_from_instructions( &mut svm, - vec![authority_transfer_ix], - &[&authority], - &authority.pubkey(), + vec![authority_transfer_instruction], + &[&fixture.authority], + &fixture.authority.pubkey(), ) .unwrap(); - // Verify recipient received tokens assert_eq!( - get_token_account_balance(&svm, &recipient_ata).unwrap(), - transfer_amount + get_token_account_balance(&svm, &fixture.recipient_token_account).unwrap(), + TRANSFER_AMOUNT ); - - // Verify user_pda's balance decreased assert_eq!( - get_token_account_balance(&svm, &user_pda_ata).unwrap(), - mint_amount - transfer_amount + get_token_account_balance(&svm, &fixture.user_pda_token_account).unwrap(), + MINT_AMOUNT - TRANSFER_AMOUNT ); } diff --git a/tokens/external-delegate-token-master/quasar/Cargo.toml b/tokens/external-delegate-token-master/quasar/Cargo.toml index 09d9c638..9b548d45 100644 --- a/tokens/external-delegate-token-master/quasar/Cargo.toml +++ b/tokens/external-delegate-token-master/quasar/Cargo.toml @@ -3,7 +3,7 @@ name = "quasar-external-delegate-token-master" version = "0.1.0" edition = "2021" -# Standalone workspace โ€” not part of the root program-examples workspace. +# Standalone workspace, not part of the root program-examples workspace. # Quasar uses a different resolver and dependency tree. [workspace] @@ -37,6 +37,9 @@ solana-define-syscall = "4.0" solana-keccak-hasher = "3.1" [dev-dependencies] +# Signs test transfer authorizations with a fixed secp256k1 key so tests can +# exercise the Ethereum-signature path end to end. +libsecp256k1 = "0.7.2" quasar-svm = { git = "https://github.com/blueshift-gg/quasar-svm" } spl-token-interface = { version = "2.0.0" } solana-program-pack = { version = "3.1.0" } diff --git a/tokens/external-delegate-token-master/quasar/README.md b/tokens/external-delegate-token-master/quasar/README.md index 706dacb6..4408f4f7 100644 --- a/tokens/external-delegate-token-master/quasar/README.md +++ b/tokens/external-delegate-token-master/quasar/README.md @@ -1,13 +1,16 @@ # External Delegate Token Master (Quasar) -Token transfers authorized by an external secp256k1 signature. +Authorize token transfers using an external secp256k1 delegate signature. -See also: the [repository catalog](../../../README.md). +See the [example overview](../README.md) for the signed-message format and nonce semantics shared with the [Anchor variant](../anchor/), and the [repository catalog](../../../README.md). ## Major concepts -- Delegate approval -- Signature verification +- `UserAccount` state: the Solana `authority`, the delegate's 20-byte `ethereum_address`, and a `nonce` consumed by each signature-authorized transfer. +- `transfer_tokens` rebuilds the authorized message onchain as keccak256(program id || user account || amount LE || recipient token account || nonce LE), recovers the signer with the raw `sol_secp256k1_recover` syscall, compares the recovered Ethereum address to the stored one, and increments the nonce before the transfer CPI. The `authority` must also sign the transaction; the Ethereum signature supplements that check. +- `authority_transfer` moves tokens with only the Solana authority's signature. +- Both transfer handlers use the token program's `transfer_checked` CPI, which verifies the mint and decimals. +- Tokens are held by a token account owned by a PDA derived from the user account's address; the program signs the CPI with that PDA. ## Setup @@ -21,14 +24,14 @@ Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://do ## Testing -In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): +In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`). Build first so `target/deploy/quasar_external_delegate_token_master.so` exists, then: ```bash -cargo test +quasar test ``` -Tests invoke instruction handlers and assert onchain state. No local validator. +The tests sign real transfer authorizations with a fixed secp256k1 key, send instructions through the SVM, and assert token balances and nonce state, including the replay, wrong-amount, wrong-recipient, and wrong-authority failure paths. ## Usage -Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. +Read `src/` and `Quasar.toml`. The [Anchor variant](../anchor/) in the same example shares the message format and state layout semantics. diff --git a/tokens/external-delegate-token-master/quasar/src/lib.rs b/tokens/external-delegate-token-master/quasar/src/lib.rs index f49e1225..87be95cf 100644 --- a/tokens/external-delegate-token-master/quasar/src/lib.rs +++ b/tokens/external-delegate-token-master/quasar/src/lib.rs @@ -13,16 +13,25 @@ declare_id!("22222222222222222222222222222222222222222222"); pub struct UserAccount { pub authority: Address, pub ethereum_address: [u8; 20], + /// Strictly increasing counter committed into every signed transfer + /// authorization, so each Ethereum signature executes exactly once. + pub nonce: u64, } /// Marker carrying the seeds for the per-user PDA: just the user account -/// address (no string prefix). Required since PR #195 because inline -/// `seeds = [...]` is gone โ€” derivation now happens through a -/// `#[derive(Seeds)]` type referenced by `address = T::seeds(...)`. +/// address (no string prefix). Referenced through +/// `address = UserPda::seeds(...)` in the account constraints. #[derive(Seeds)] #[seeds(b"", user_account: Address)] pub struct UserPda; +#[error_code] +pub enum ExternalDelegateError { + /// Matches the Anchor variant's error codes, which start at 6000. + InvalidSignature = 6000, + NonceOverflow, +} + /// External delegate token master: allows transfers authorised either by /// the Solana authority or by an Ethereum signature (secp256k1). #[program] @@ -31,14 +40,14 @@ mod quasar_external_delegate_token_master { /// Initialize a user account with zero Ethereum address. #[instruction(discriminator = 0)] - pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { + pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { handle_initialize(&mut ctx.accounts) } /// Set the Ethereum address for signature verification. #[instruction(discriminator = 1)] pub fn set_ethereum_address( - ctx: Ctx, + ctx: Ctx, ethereum_address: [u8; 20], ) -> Result<(), ProgramError> { handle_set_ethereum_address(&mut ctx.accounts, ethereum_address) @@ -47,18 +56,17 @@ mod quasar_external_delegate_token_master { /// Transfer tokens using an Ethereum signature for authorisation. #[instruction(discriminator = 2)] pub fn transfer_tokens( - ctx: Ctx, + ctx: Ctx, amount: u64, signature: [u8; 65], - message: [u8; 32], ) -> Result<(), ProgramError> { - handle_transfer_tokens(&mut ctx.accounts, amount, &signature, &message, &ctx.bumps) + handle_transfer_tokens(&mut ctx.accounts, amount, &signature, &ctx.bumps) } /// Transfer tokens using the Solana authority directly. #[instruction(discriminator = 3)] pub fn authority_transfer( - ctx: Ctx, + ctx: Ctx, amount: u64, ) -> Result<(), ProgramError> { handle_authority_transfer(&mut ctx.accounts, amount, &ctx.bumps) @@ -70,7 +78,7 @@ mod quasar_external_delegate_token_master { // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct Initialize { +pub struct InitializeAccountConstraints { #[account(mut, init, payer = authority)] pub user_account: Account, #[account(mut)] @@ -79,24 +87,27 @@ pub struct Initialize { } #[inline(always)] -fn handle_initialize(accounts: &mut Initialize) -> Result<(), ProgramError> { - accounts.user_account - .set_inner(UserAccountInner { - authority: *accounts.authority.address(), - ethereum_address: [0u8; 20], - }); +fn handle_initialize(accounts: &mut InitializeAccountConstraints) -> Result<(), ProgramError> { + accounts.user_account.set_inner(UserAccountInner { + authority: *accounts.authority.address(), + ethereum_address: [0u8; 20], + nonce: 0, + }); Ok(()) } #[derive(Accounts)] -pub struct SetEthereumAddress { +pub struct SetEthereumAddressAccountConstraints { #[account(mut)] pub user_account: Account, pub authority: Signer, } #[inline(always)] -fn handle_set_ethereum_address(accounts: &mut SetEthereumAddress, ethereum_address: [u8; 20]) -> Result<(), ProgramError> { +fn handle_set_ethereum_address( + accounts: &mut SetEthereumAddressAccountConstraints, + ethereum_address: [u8; 20], +) -> Result<(), ProgramError> { require_keys_eq!( accounts.user_account.authority, *accounts.authority.address(), @@ -107,9 +118,11 @@ fn handle_set_ethereum_address(accounts: &mut SetEthereumAddress, ethereum_addre } #[derive(Accounts)] -pub struct TransferTokens { +pub struct TransferTokensAccountConstraints { + #[account(mut)] pub user_account: Account, pub authority: Signer, + pub mint: Account, #[account(mut)] pub user_token_account: Account, #[account(mut)] @@ -122,40 +135,64 @@ pub struct TransferTokens { #[inline(always)] fn handle_transfer_tokens( - accounts: &mut TransferTokens, + accounts: &mut TransferTokensAccountConstraints, amount: u64, signature: &[u8; 65], - message: &[u8; 32], - bumps: &TransferTokensBumps, + bumps: &TransferTokensAccountConstraintsBumps, ) -> Result<(), ProgramError> { - if !verify_ethereum_signature( - &accounts.user_account.ethereum_address, - message, - signature, - ) { - return Err(ProgramError::Custom(1)); // InvalidSignature + // The Ethereum signature supplements the Solana-side authority check; + // it does not replace it. + require_keys_eq!( + accounts.user_account.authority, + *accounts.authority.address(), + ProgramError::MissingRequiredSignature + ); + + // Rebuild the authorized message onchain so the signature commits to + // this exact transfer (amount, recipient, and the current nonce). + let nonce: u64 = accounts.user_account.nonce.into(); + let message = build_transfer_authorization_message( + accounts.user_account.address(), + amount, + accounts.recipient_token_account.address(), + nonce, + ); + + if !verify_ethereum_signature(&accounts.user_account.ethereum_address, &message, signature) { + return Err(ExternalDelegateError::InvalidSignature.into()); } + // Consume the nonce before the transfer CPI (checks-effects-interactions), + // so this signature can never authorize a second execution. + let next_nonce = nonce + .checked_add(1) + .ok_or(ExternalDelegateError::NonceOverflow)?; + accounts.user_account.nonce = PodU64::from(next_nonce); + let bump = [bumps.user_pda]; let seeds: &[Seed] = &[ Seed::from(accounts.user_account.address().as_ref()), Seed::from(&bump as &[u8]), ]; - accounts.token_program - .transfer( + accounts + .token_program + .transfer_checked( &accounts.user_token_account, + &accounts.mint, &accounts.recipient_token_account, &accounts.user_pda, amount, + accounts.mint.decimals, ) .invoke_signed(seeds) } #[derive(Accounts)] -pub struct AuthorityTransfer { +pub struct AuthorityTransferAccountConstraints { pub user_account: Account, pub authority: Signer, + pub mint: Account, #[account(mut)] pub user_token_account: Account, #[account(mut)] @@ -167,7 +204,11 @@ pub struct AuthorityTransfer { } #[inline(always)] -fn handle_authority_transfer(accounts: &mut AuthorityTransfer, amount: u64, bumps: &AuthorityTransferBumps) -> Result<(), ProgramError> { +fn handle_authority_transfer( + accounts: &mut AuthorityTransferAccountConstraints, + amount: u64, + bumps: &AuthorityTransferAccountConstraintsBumps, +) -> Result<(), ProgramError> { require_keys_eq!( accounts.user_account.authority, *accounts.authority.address(), @@ -180,16 +221,59 @@ fn handle_authority_transfer(accounts: &mut AuthorityTransfer, amount: u64, bump Seed::from(&bump as &[u8]), ]; - accounts.token_program - .transfer( + accounts + .token_program + .transfer_checked( &accounts.user_token_account, + &accounts.mint, &accounts.recipient_token_account, &accounts.user_pda, amount, + accounts.mint.decimals, ) .invoke_signed(seeds) } +// --------------------------------------------------------------------------- +// Transfer authorization message +// --------------------------------------------------------------------------- + +/// Byte length of the transfer authorization preimage: program id, user +/// account, amount, recipient token account, nonce. +const TRANSFER_AUTHORIZATION_PREIMAGE_LEN: usize = + core::mem::size_of::

() * 3 + core::mem::size_of::() * 2; + +/// Reconstructs the message a delegate must sign to authorize one transfer: +/// keccak256(program id || user account || amount LE || recipient token account || nonce LE). +/// +/// Because the hash commits to every transfer parameter plus the user +/// account's stored nonce, a signature is valid for exactly one +/// (amount, recipient, nonce) execution and cannot be replayed. +fn build_transfer_authorization_message( + user_account: &Address, + amount: u64, + recipient_token_account: &Address, + nonce: u64, +) -> [u8; 32] { + let amount_bytes = amount.to_le_bytes(); + let nonce_bytes = nonce.to_le_bytes(); + let parts: [&[u8]; 5] = [ + ID.as_ref(), + user_account.as_ref(), + &amount_bytes, + recipient_token_account.as_ref(), + &nonce_bytes, + ]; + + let mut preimage = [0u8; TRANSFER_AUTHORIZATION_PREIMAGE_LEN]; + let mut offset = 0usize; + for part in parts { + preimage[offset..offset + part.len()].copy_from_slice(part); + offset += part.len(); + } + keccak256(&preimage) +} + // --------------------------------------------------------------------------- // Ethereum signature verification using raw syscalls // --------------------------------------------------------------------------- diff --git a/tokens/external-delegate-token-master/quasar/src/tests.rs b/tokens/external-delegate-token-master/quasar/src/tests.rs index 91b48d16..a44f1a45 100644 --- a/tokens/external-delegate-token-master/quasar/src/tests.rs +++ b/tokens/external-delegate-token-master/quasar/src/tests.rs @@ -1,10 +1,21 @@ extern crate std; use { - alloc::vec, - quasar_svm::{Account, Instruction, Pubkey, QuasarSvm}, - std::println, + crate::ExternalDelegateError, + quasar_svm::{Account, Instruction, ProgramError, Pubkey, QuasarSvm}, + solana_program_pack::Pack, + spl_token_interface::state::{Account as TokenAccount, AccountState, Mint}, + std::{println, vec, vec::Vec}, }; +const SIGNER_LAMPORTS: u64 = 5_000_000_000; +const MINT_DECIMALS: u8 = 6; +const MINT_AMOUNT: u64 = 1_000_000_000; +const TRANSFER_AMOUNT: u64 = 500_000_000; + +/// Fixed delegate key so tests are deterministic. Any nonzero scalar below +/// the secp256k1 curve order works. +const DELEGATE_SECP256K1_PRIVATE_KEY: [u8; 32] = [0x42; 32]; + fn setup() -> QuasarSvm { let elf = std::fs::read("target/deploy/quasar_external_delegate_token_master.so").unwrap(); QuasarSvm::new() @@ -13,7 +24,7 @@ fn setup() -> QuasarSvm { } fn signer(address: Pubkey) -> Account { - quasar_svm::token::create_keyed_system_account(&address, 5_000_000_000) + quasar_svm::token::create_keyed_system_account(&address, SIGNER_LAMPORTS) } fn empty(address: Pubkey) -> Account { @@ -26,41 +37,572 @@ fn empty(address: Pubkey) -> Account { } } +fn mint(address: Pubkey, authority: Pubkey) -> Account { + quasar_svm::token::create_keyed_mint_account( + &address, + &Mint { + mint_authority: Some(authority).into(), + supply: MINT_AMOUNT, + decimals: MINT_DECIMALS, + is_initialized: true, + freeze_authority: None.into(), + }, + ) +} + +fn token(address: Pubkey, mint: Pubkey, owner: Pubkey, amount: u64) -> Account { + quasar_svm::token::create_keyed_token_account( + &address, + &TokenAccount { + mint, + owner, + amount, + state: AccountState::Initialized, + ..TokenAccount::default() + }, + ) +} + +fn token_balance(svm: &QuasarSvm, address: &Pubkey) -> u64 { + let account = svm.get_account(address).unwrap(); + TokenAccount::unpack(&account.data).unwrap().amount +} + +/// Deserialized UserAccount state, parsed from the zero-copy layout: +/// [disc:1] [authority:32] [ethereum_address:20] [nonce:8 LE] +struct UserAccountState { + authority: Pubkey, + ethereum_address: [u8; 20], + nonce: u64, +} + +fn parse_user_account(data: &[u8]) -> UserAccountState { + assert_eq!(data[0], 1, "UserAccount discriminator"); + let mut offset = 1usize; + let mut take = |len: usize| { + let bytes = &data[offset..offset + len]; + offset += len; + bytes + }; + UserAccountState { + authority: Pubkey::new_from_array(take(32).try_into().unwrap()), + ethereum_address: take(20).try_into().unwrap(), + nonce: u64::from_le_bytes(take(8).try_into().unwrap()), + } +} + +fn read_user_account(svm: &QuasarSvm, address: &Pubkey) -> UserAccountState { + parse_user_account(&svm.get_account(address).unwrap().data) +} + +fn delegate_secret_key() -> libsecp256k1::SecretKey { + libsecp256k1::SecretKey::parse(&DELEGATE_SECP256K1_PRIVATE_KEY).unwrap() +} + +/// Ethereum address = last 20 bytes of keccak256 of the 64-byte uncompressed +/// public key (0x04 prefix dropped). +fn ethereum_address_of(secret_key: &libsecp256k1::SecretKey) -> [u8; 20] { + let public_key = libsecp256k1::PublicKey::from_secret_key(secret_key); + let uncompressed = public_key.serialize(); + let hash = solana_keccak_hasher::hash(&uncompressed[1..]); + let mut address = [0u8; 20]; + address.copy_from_slice(&hash.as_ref()[12..]); + address +} + +/// Builds the exact preimage the program reconstructs onchain: +/// keccak256(program id || user account || amount LE || recipient token account || nonce LE). +fn build_transfer_authorization_message( + user_account: &Pubkey, + amount: u64, + recipient_token_account: &Pubkey, + nonce: u64, +) -> [u8; 32] { + let mut preimage = Vec::new(); + preimage.extend_from_slice(crate::ID.as_ref()); + preimage.extend_from_slice(user_account.as_ref()); + preimage.extend_from_slice(&amount.to_le_bytes()); + preimage.extend_from_slice(recipient_token_account.as_ref()); + preimage.extend_from_slice(&nonce.to_le_bytes()); + let hash = solana_keccak_hasher::hash(&preimage); + let mut message = [0u8; 32]; + message.copy_from_slice(hash.as_ref()); + message +} + +/// 65-byte recoverable signature: r || s || recovery id. +fn sign_transfer_authorization( + secret_key: &libsecp256k1::SecretKey, + message: &[u8; 32], +) -> [u8; 65] { + let (signature, recovery_id) = + libsecp256k1::sign(&libsecp256k1::Message::parse(message), secret_key); + let mut bytes = [0u8; 65]; + bytes[..64].copy_from_slice(&signature.serialize()); + bytes[64] = recovery_id.serialize(); + bytes +} + /// Build initialize instruction data. /// Wire format: [disc=0] fn build_initialize_data() -> Vec { vec![0u8] } +/// Build set_ethereum_address instruction data. +/// Wire format: [disc=1] [ethereum_address: 20 bytes] +fn build_set_ethereum_address_data(ethereum_address: [u8; 20]) -> Vec { + let mut data = vec![1u8]; + data.extend_from_slice(ðereum_address); + data +} + +/// Build transfer_tokens instruction data. +/// Wire format: [disc=2] [amount: u64 LE] [signature: 65 bytes] +fn build_transfer_tokens_data(amount: u64, signature: [u8; 65]) -> Vec { + let mut data = vec![2u8]; + data.extend_from_slice(&amount.to_le_bytes()); + data.extend_from_slice(&signature); + data +} + +/// Build authority_transfer instruction data. +/// Wire format: [disc=3] [amount: u64 LE] +fn build_authority_transfer_data(amount: u64) -> Vec { + let mut data = vec![3u8]; + data.extend_from_slice(&amount.to_le_bytes()); + data +} + +fn initialize_instruction(user_account: Pubkey, authority: Pubkey) -> Instruction { + Instruction { + program_id: crate::ID, + accounts: vec![ + solana_instruction::AccountMeta::new(user_account.into(), true), + solana_instruction::AccountMeta::new(authority.into(), true), + solana_instruction::AccountMeta::new_readonly( + quasar_svm::system_program::ID.into(), + false, + ), + ], + data: build_initialize_data(), + } +} + +fn set_ethereum_address_instruction( + user_account: Pubkey, + authority: Pubkey, + ethereum_address: [u8; 20], +) -> Instruction { + Instruction { + program_id: crate::ID, + accounts: vec![ + solana_instruction::AccountMeta::new(user_account.into(), false), + solana_instruction::AccountMeta::new_readonly(authority.into(), true), + ], + data: build_set_ethereum_address_data(ethereum_address), + } +} + +/// Addresses shared by every transfer test. +struct Fixture { + authority: Pubkey, + user_account: Pubkey, + user_pda: Pubkey, + mint: Pubkey, + user_token_account: Pubkey, + recipient_token_account: Pubkey, +} + +fn fixture() -> Fixture { + let user_account = Pubkey::new_unique(); + let (user_pda, _bump) = + Pubkey::find_program_address(&[user_account.as_ref()], &crate::ID); + Fixture { + authority: Pubkey::new_unique(), + user_account, + user_pda, + mint: Pubkey::new_unique(), + user_token_account: Pubkey::new_unique(), + recipient_token_account: Pubkey::new_unique(), + } +} + +fn transfer_tokens_instruction( + fixture: &Fixture, + authority: Pubkey, + recipient_token_account: Pubkey, + amount: u64, + signature: [u8; 65], +) -> Instruction { + Instruction { + program_id: crate::ID, + accounts: vec![ + solana_instruction::AccountMeta::new(fixture.user_account.into(), false), + solana_instruction::AccountMeta::new_readonly(authority.into(), true), + solana_instruction::AccountMeta::new_readonly(fixture.mint.into(), false), + solana_instruction::AccountMeta::new(fixture.user_token_account.into(), false), + solana_instruction::AccountMeta::new(recipient_token_account.into(), false), + solana_instruction::AccountMeta::new_readonly(fixture.user_pda.into(), false), + solana_instruction::AccountMeta::new_readonly( + quasar_svm::SPL_TOKEN_PROGRAM_ID.into(), + false, + ), + ], + data: build_transfer_tokens_data(amount, signature), + } +} + +/// Initializes the user account, links the fixed delegate Ethereum key, and +/// loads the PDA-owned token account plus an empty recipient token account. +fn setup_transfer_fixture() -> (QuasarSvm, Fixture) { + let mut svm = setup(); + let fixture = fixture(); + + svm.process_instruction( + &initialize_instruction(fixture.user_account, fixture.authority), + &[empty(fixture.user_account), signer(fixture.authority)], + ) + .assert_success(); + + svm.process_instruction( + &set_ethereum_address_instruction( + fixture.user_account, + fixture.authority, + ethereum_address_of(&delegate_secret_key()), + ), + &[], + ) + .assert_success(); + + // Load token state directly: a mint, the PDA-owned funded token account, + // the empty recipient token account, and the (data-less) PDA itself. + svm.set_account(mint(fixture.mint, fixture.authority)); + svm.set_account(token( + fixture.user_token_account, + fixture.mint, + fixture.user_pda, + MINT_AMOUNT, + )); + svm.set_account(token( + fixture.recipient_token_account, + fixture.mint, + fixture.authority, + 0, + )); + svm.set_account(empty(fixture.user_pda)); + + (svm, fixture) +} + +fn external_delegate_error(error: ExternalDelegateError) -> ProgramError { + ProgramError::Custom(error as u32) +} + #[test] fn test_initialize() { let mut svm = setup(); let authority = Pubkey::new_unique(); let user_account = Pubkey::new_unique(); - let system_program = quasar_svm::system_program::ID; - let data = build_initialize_data(); + let result = svm.process_instruction( + &initialize_instruction(user_account, authority), + &[empty(user_account), signer(authority)], + ); + result.assert_success(); + println!(" INITIALIZE CU: {}", result.compute_units_consumed); + + let state = read_user_account(&svm, &user_account); + assert_eq!(state.authority, authority); + assert_eq!(state.ethereum_address, [0u8; 20]); + assert_eq!(state.nonce, 0); +} + +#[test] +fn test_set_ethereum_address() { + let mut svm = setup(); + + let authority = Pubkey::new_unique(); + let user_account = Pubkey::new_unique(); + + svm.process_instruction( + &initialize_instruction(user_account, authority), + &[empty(user_account), signer(authority)], + ) + .assert_success(); + + let ethereum_address = ethereum_address_of(&delegate_secret_key()); + let result = svm.process_instruction( + &set_ethereum_address_instruction(user_account, authority, ethereum_address), + &[], + ); + result.assert_success(); + println!(" SET_ETHEREUM_ADDRESS CU: {}", result.compute_units_consumed); + + assert_eq!( + read_user_account(&svm, &user_account).ethereum_address, + ethereum_address + ); +} + +#[test] +fn test_set_ethereum_address_wrong_authority_fails() { + let mut svm = setup(); + + let authority = Pubkey::new_unique(); + let mallory = Pubkey::new_unique(); + let user_account = Pubkey::new_unique(); + + svm.process_instruction( + &initialize_instruction(user_account, authority), + &[empty(user_account), signer(authority)], + ) + .assert_success(); + + let result = svm.process_instruction( + &set_ethereum_address_instruction( + user_account, + mallory, + ethereum_address_of(&delegate_secret_key()), + ), + &[signer(mallory)], + ); + assert!( + !result.is_ok(), + "a signer other than user_account.authority must be rejected" + ); +} + +#[test] +fn test_transfer_tokens_with_valid_signature_moves_tokens_and_increments_nonce() { + let (mut svm, fixture) = setup_transfer_fixture(); + + let message = build_transfer_authorization_message( + &fixture.user_account, + TRANSFER_AMOUNT, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let result = svm.process_instruction( + &transfer_tokens_instruction( + &fixture, + fixture.authority, + fixture.recipient_token_account, + TRANSFER_AMOUNT, + signature, + ), + &[], + ); + result.assert_success(); + println!(" TRANSFER_TOKENS CU: {}", result.compute_units_consumed); + + assert_eq!( + token_balance(&svm, &fixture.recipient_token_account), + TRANSFER_AMOUNT + ); + assert_eq!( + token_balance(&svm, &fixture.user_token_account), + MINT_AMOUNT - TRANSFER_AMOUNT + ); + assert_eq!(read_user_account(&svm, &fixture.user_account).nonce, 1); +} + +#[test] +fn test_transfer_tokens_replayed_signature_fails() { + let (mut svm, fixture) = setup_transfer_fixture(); + + let message = build_transfer_authorization_message( + &fixture.user_account, + TRANSFER_AMOUNT, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let instruction = transfer_tokens_instruction( + &fixture, + fixture.authority, + fixture.recipient_token_account, + TRANSFER_AMOUNT, + signature, + ); + svm.process_instruction(&instruction, &[]).assert_success(); + + // Replay the identical instruction. The stored nonce is now 1, so the + // onchain reconstruction differs from the signed message. + let replay_result = svm.process_instruction(&instruction, &[]); + replay_result.assert_error(external_delegate_error( + ExternalDelegateError::InvalidSignature, + )); + + // Exactly one transfer happened. + assert_eq!( + token_balance(&svm, &fixture.recipient_token_account), + TRANSFER_AMOUNT + ); + assert_eq!(read_user_account(&svm, &fixture.user_account).nonce, 1); +} + +#[test] +fn test_transfer_tokens_signature_over_different_amount_fails() { + let (mut svm, fixture) = setup_transfer_fixture(); + + let authorized_amount = TRANSFER_AMOUNT; + let attempted_amount = MINT_AMOUNT; + let message = build_transfer_authorization_message( + &fixture.user_account, + authorized_amount, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let result = svm.process_instruction( + &transfer_tokens_instruction( + &fixture, + fixture.authority, + fixture.recipient_token_account, + attempted_amount, + signature, + ), + &[], + ); + result.assert_error(external_delegate_error( + ExternalDelegateError::InvalidSignature, + )); + assert_eq!(token_balance(&svm, &fixture.recipient_token_account), 0); + assert_eq!(read_user_account(&svm, &fixture.user_account).nonce, 0); +} + +#[test] +fn test_transfer_tokens_signature_over_different_recipient_fails() { + let (mut svm, fixture) = setup_transfer_fixture(); + + // Sign for the legitimate recipient, then try to redirect the transfer + // to an attacker-controlled token account. + let attacker = Pubkey::new_unique(); + let attacker_token_account = Pubkey::new_unique(); + svm.set_account(token(attacker_token_account, fixture.mint, attacker, 0)); + + let message = build_transfer_authorization_message( + &fixture.user_account, + TRANSFER_AMOUNT, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let result = svm.process_instruction( + &transfer_tokens_instruction( + &fixture, + fixture.authority, + attacker_token_account, + TRANSFER_AMOUNT, + signature, + ), + &[], + ); + result.assert_error(external_delegate_error( + ExternalDelegateError::InvalidSignature, + )); + assert_eq!(token_balance(&svm, &attacker_token_account), 0); +} + +#[test] +fn test_transfer_tokens_wrong_solana_authority_fails() { + let (mut svm, fixture) = setup_transfer_fixture(); + + // A correctly signed Ethereum authorization must not bypass the + // Solana-side authority check. + let mallory = Pubkey::new_unique(); + let message = build_transfer_authorization_message( + &fixture.user_account, + TRANSFER_AMOUNT, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let result = svm.process_instruction( + &transfer_tokens_instruction( + &fixture, + mallory, + fixture.recipient_token_account, + TRANSFER_AMOUNT, + signature, + ), + &[signer(mallory)], + ); + assert!( + !result.is_ok(), + "a signer other than user_account.authority must be rejected" + ); + assert_eq!(token_balance(&svm, &fixture.recipient_token_account), 0); + assert_eq!(read_user_account(&svm, &fixture.user_account).nonce, 0); +} + +#[test] +fn test_authority_transfer() { + let (mut svm, fixture) = setup_transfer_fixture(); let instruction = Instruction { program_id: crate::ID, accounts: vec![ - solana_instruction::AccountMeta::new(user_account.into(), true), - solana_instruction::AccountMeta::new(authority.into(), true), - solana_instruction::AccountMeta::new_readonly(system_program.into(), false), + solana_instruction::AccountMeta::new_readonly(fixture.user_account.into(), false), + solana_instruction::AccountMeta::new_readonly(fixture.authority.into(), true), + solana_instruction::AccountMeta::new_readonly(fixture.mint.into(), false), + solana_instruction::AccountMeta::new(fixture.user_token_account.into(), false), + solana_instruction::AccountMeta::new(fixture.recipient_token_account.into(), false), + solana_instruction::AccountMeta::new_readonly(fixture.user_pda.into(), false), + solana_instruction::AccountMeta::new_readonly( + quasar_svm::SPL_TOKEN_PROGRAM_ID.into(), + false, + ), ], - data, + data: build_authority_transfer_data(TRANSFER_AMOUNT), }; + let result = svm.process_instruction(&instruction, &[]); + result.assert_success(); + println!(" AUTHORITY_TRANSFER CU: {}", result.compute_units_consumed); - let result = svm.process_instruction( - &instruction, - &[empty(user_account), signer(authority)], + assert_eq!( + token_balance(&svm, &fixture.recipient_token_account), + TRANSFER_AMOUNT ); + assert_eq!( + token_balance(&svm, &fixture.user_token_account), + MINT_AMOUNT - TRANSFER_AMOUNT + ); +} +#[test] +fn test_authority_transfer_wrong_authority_fails() { + let (mut svm, fixture) = setup_transfer_fixture(); + + let mallory = Pubkey::new_unique(); + let instruction = Instruction { + program_id: crate::ID, + accounts: vec![ + solana_instruction::AccountMeta::new_readonly(fixture.user_account.into(), false), + solana_instruction::AccountMeta::new_readonly(mallory.into(), true), + solana_instruction::AccountMeta::new_readonly(fixture.mint.into(), false), + solana_instruction::AccountMeta::new(fixture.user_token_account.into(), false), + solana_instruction::AccountMeta::new(fixture.recipient_token_account.into(), false), + solana_instruction::AccountMeta::new_readonly(fixture.user_pda.into(), false), + solana_instruction::AccountMeta::new_readonly( + quasar_svm::SPL_TOKEN_PROGRAM_ID.into(), + false, + ), + ], + data: build_authority_transfer_data(TRANSFER_AMOUNT), + }; + let result = svm.process_instruction(&instruction, &[signer(mallory)]); assert!( - result.is_ok(), - "initialize failed: {:?}", - result.raw_result + !result.is_ok(), + "a signer other than user_account.authority must be rejected" ); - println!(" INITIALIZE CU: {}", result.compute_units_consumed); + assert_eq!(token_balance(&svm, &fixture.recipient_token_account), 0); } From f1b842b0bde3421ea4d5476f2690aa3f967ecc47 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:30:28 +0000 Subject: [PATCH 053/138] counter, program-derived-addresses: named overflow errors, AccountConstraints names, discriminator-based space - replace .checked_add(1).unwrap() with .ok_or(MathOverflow)? and a named error enum in all four variants (anchor + quasar of each example) - PageVisits::increment lived as a method on the account struct; the logic now sits in the instruction handler - space = 8 + INIT_SPACE replaced with DISCRIMINATOR.len() + INIT_SPACE (the one project in the repo still using the magic 8) - account-constraint structs renamed with the AccountConstraints suffix https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- .../counter_anchor/src/instructions/increment.rs | 13 +++++++++---- .../src/instructions/initialize_counter.rs | 4 ++-- .../anchor/programs/counter_anchor/src/lib.rs | 10 ++++++++-- .../programs/counter_anchor/tests/test_counter.rs | 10 +++++----- basics/counter/quasar/src/error.rs | 10 ++++++++++ basics/counter/quasar/src/instructions/increment.rs | 10 ++++++++-- basics/counter/quasar/src/lib.rs | 1 + .../src/instructions/create.rs | 6 +++--- .../src/instructions/increment.rs | 11 +++++++---- .../programs/anchor-program-example/src/lib.rs | 10 ++++++++-- .../anchor-program-example/src/state/page_visits.rs | 4 ---- .../tests/test_program_derived_addresses.rs | 6 +++--- .../program-derived-addresses/quasar/src/error.rs | 10 ++++++++++ .../quasar/src/instructions/increment.rs | 7 +++++-- basics/program-derived-addresses/quasar/src/lib.rs | 1 + 15 files changed, 80 insertions(+), 33 deletions(-) create mode 100644 basics/counter/quasar/src/error.rs create mode 100644 basics/program-derived-addresses/quasar/src/error.rs diff --git a/basics/counter/anchor/programs/counter_anchor/src/instructions/increment.rs b/basics/counter/anchor/programs/counter_anchor/src/instructions/increment.rs index cbfbd41e..fa2a6594 100644 --- a/basics/counter/anchor/programs/counter_anchor/src/instructions/increment.rs +++ b/basics/counter/anchor/programs/counter_anchor/src/instructions/increment.rs @@ -1,14 +1,19 @@ use anchor_lang::prelude::*; -use crate::Counter; +use crate::{Counter, CounterError}; #[derive(Accounts)] -pub struct Increment<'info> { +pub struct IncrementAccountConstraints<'info> { #[account(mut)] pub counter: Account<'info, Counter>, } -pub fn handler(context: Context) -> Result<()> { - context.accounts.counter.count = context.accounts.counter.count.checked_add(1).unwrap(); +pub fn handler(context: Context) -> Result<()> { + context.accounts.counter.count = context + .accounts + .counter + .count + .checked_add(1) + .ok_or(CounterError::MathOverflow)?; Ok(()) } diff --git a/basics/counter/anchor/programs/counter_anchor/src/instructions/initialize_counter.rs b/basics/counter/anchor/programs/counter_anchor/src/instructions/initialize_counter.rs index 9624dd09..fa17cfd5 100644 --- a/basics/counter/anchor/programs/counter_anchor/src/instructions/initialize_counter.rs +++ b/basics/counter/anchor/programs/counter_anchor/src/instructions/initialize_counter.rs @@ -3,7 +3,7 @@ use anchor_lang::prelude::*; use crate::Counter; #[derive(Accounts)] -pub struct InitializeCounter<'info> { +pub struct InitializeCounterAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -16,6 +16,6 @@ pub struct InitializeCounter<'info> { pub system_program: Program<'info, System>, } -pub fn handler(_context: Context) -> Result<()> { +pub fn handler(_context: Context) -> Result<()> { Ok(()) } diff --git a/basics/counter/anchor/programs/counter_anchor/src/lib.rs b/basics/counter/anchor/programs/counter_anchor/src/lib.rs index f9396ced..d6a48dfc 100644 --- a/basics/counter/anchor/programs/counter_anchor/src/lib.rs +++ b/basics/counter/anchor/programs/counter_anchor/src/lib.rs @@ -9,11 +9,11 @@ declare_id!("BmDHboaj1kBUoinJKKSRqKfMeRKJqQqEbUj1VgzeQe4A"); pub mod counter_anchor { use super::*; - pub fn initialize_counter(context: Context) -> Result<()> { + pub fn initialize_counter(context: Context) -> Result<()> { instructions::initialize_counter::handler(context) } - pub fn increment(context: Context) -> Result<()> { + pub fn increment(context: Context) -> Result<()> { instructions::increment::handler(context) } } @@ -23,3 +23,9 @@ pub mod counter_anchor { pub struct Counter { count: u64, } + +#[error_code] +pub enum CounterError { + #[msg("Counter overflowed u64::MAX")] + MathOverflow, +} diff --git a/basics/counter/anchor/programs/counter_anchor/tests/test_counter.rs b/basics/counter/anchor/programs/counter_anchor/tests/test_counter.rs index 8a0648b3..97a3d3c0 100644 --- a/basics/counter/anchor/programs/counter_anchor/tests/test_counter.rs +++ b/basics/counter/anchor/programs/counter_anchor/tests/test_counter.rs @@ -40,7 +40,7 @@ fn test_initialize_counter() { let instruction = Instruction::new_with_bytes( counter_anchor::id(), &counter_anchor::instruction::InitializeCounter {}.data(), - counter_anchor::accounts::InitializeCounter { + counter_anchor::accounts::InitializeCounterAccountConstraints { payer: payer.pubkey(), counter: counter_keypair.pubkey(), system_program: system_program::id(), @@ -69,7 +69,7 @@ fn test_increment_counter() { let init_ix = Instruction::new_with_bytes( counter_anchor::id(), &counter_anchor::instruction::InitializeCounter {}.data(), - counter_anchor::accounts::InitializeCounter { + counter_anchor::accounts::InitializeCounterAccountConstraints { payer: payer.pubkey(), counter: counter_keypair.pubkey(), system_program: system_program::id(), @@ -88,7 +88,7 @@ fn test_increment_counter() { let inc_ix = Instruction::new_with_bytes( counter_anchor::id(), &counter_anchor::instruction::Increment {}.data(), - counter_anchor::accounts::Increment { + counter_anchor::accounts::IncrementAccountConstraints { counter: counter_keypair.pubkey(), } .to_account_metas(None), @@ -108,7 +108,7 @@ fn test_increment_counter_again() { let init_ix = Instruction::new_with_bytes( counter_anchor::id(), &counter_anchor::instruction::InitializeCounter {}.data(), - counter_anchor::accounts::InitializeCounter { + counter_anchor::accounts::InitializeCounterAccountConstraints { payer: payer.pubkey(), counter: counter_keypair.pubkey(), system_program: system_program::id(), @@ -128,7 +128,7 @@ fn test_increment_counter_again() { let inc_ix = Instruction::new_with_bytes( counter_anchor::id(), &counter_anchor::instruction::Increment {}.data(), - counter_anchor::accounts::Increment { + counter_anchor::accounts::IncrementAccountConstraints { counter: counter_keypair.pubkey(), } .to_account_metas(None), diff --git a/basics/counter/quasar/src/error.rs b/basics/counter/quasar/src/error.rs new file mode 100644 index 00000000..765b098b --- /dev/null +++ b/basics/counter/quasar/src/error.rs @@ -0,0 +1,10 @@ +use quasar_lang::prelude::*; + +#[error_code] +pub enum CounterError { + /// The counter is at u64::MAX and cannot be incremented further. + // 6000 is the conventional Anchor-compatible starting offset for + // program-specific error codes (Quasar's #[error_code] starts at 0 + // unless told otherwise; framework errors occupy 3000+). + MathOverflow = 6000, +} diff --git a/basics/counter/quasar/src/instructions/increment.rs b/basics/counter/quasar/src/instructions/increment.rs index 0a6fc9b9..4a44065b 100644 --- a/basics/counter/quasar/src/instructions/increment.rs +++ b/basics/counter/quasar/src/instructions/increment.rs @@ -1,4 +1,7 @@ -use {crate::state::Counter, quasar_lang::prelude::*}; +use { + crate::{error::CounterError, state::Counter}, + quasar_lang::prelude::*, +}; /// Accounts for incrementing a counter. #[derive(Accounts)] @@ -10,6 +13,9 @@ pub struct Increment { #[inline(always)] pub fn handle_increment(accounts: &mut Increment) -> Result<(), ProgramError> { let current: u64 = accounts.counter.count.into(); - accounts.counter.count = PodU64::from(current.checked_add(1).unwrap()); + let next = current + .checked_add(1) + .ok_or(CounterError::MathOverflow)?; + accounts.counter.count = PodU64::from(next); Ok(()) } diff --git a/basics/counter/quasar/src/lib.rs b/basics/counter/quasar/src/lib.rs index b265456e..bbdb7a07 100644 --- a/basics/counter/quasar/src/lib.rs +++ b/basics/counter/quasar/src/lib.rs @@ -2,6 +2,7 @@ use quasar_lang::prelude::*; +mod error; mod instructions; use instructions::*; mod state; diff --git a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/create.rs b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/create.rs index a872c2fe..65e55fff 100644 --- a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/create.rs +++ b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/create.rs @@ -2,13 +2,13 @@ use crate::state::PageVisits; use anchor_lang::prelude::*; #[derive(Accounts)] -pub struct CreatePageVisits<'info> { +pub struct CreatePageVisitsAccountConstraints<'info> { #[account(mut)] payer: Signer<'info>, #[account( init, - space = 8 + PageVisits::INIT_SPACE, + space = PageVisits::DISCRIMINATOR.len() + PageVisits::INIT_SPACE, payer = payer, seeds = [ PageVisits::SEED_PREFIX, @@ -20,7 +20,7 @@ pub struct CreatePageVisits<'info> { system_program: Program<'info, System>, } -pub fn handle_create_page_visits(context: Context) -> Result<()> { +pub fn handle_create_page_visits(context: Context) -> Result<()> { *context.accounts.page_visits = PageVisits { page_visits: 0, bump: context.bumps.page_visits, diff --git a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/increment.rs b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/increment.rs index fe25bf02..f1b5e203 100644 --- a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/increment.rs +++ b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/increment.rs @@ -1,8 +1,8 @@ -use crate::state::PageVisits; +use crate::{state::PageVisits, PageVisitsError}; use anchor_lang::prelude::*; #[derive(Accounts)] -pub struct IncrementPageVisits<'info> { +pub struct IncrementPageVisitsAccountConstraints<'info> { user: SystemAccount<'info>, #[account( mut, @@ -15,8 +15,11 @@ pub struct IncrementPageVisits<'info> { page_visits: Account<'info, PageVisits>, } -pub fn handle_increment_page_visits(context: Context) -> Result<()> { +pub fn handle_increment_page_visits(context: Context) -> Result<()> { let page_visits = &mut context.accounts.page_visits; - page_visits.increment(); + page_visits.page_visits = page_visits + .page_visits + .checked_add(1) + .ok_or(PageVisitsError::MathOverflow)?; Ok(()) } diff --git a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/lib.rs b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/lib.rs index 5a688c48..feb49099 100644 --- a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/lib.rs +++ b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/lib.rs @@ -11,11 +11,17 @@ declare_id!("oCCQRZyAbVxujyd8m57MPmDzZDmy2FoKW4ULS7KofCE"); pub mod program_derived_addresses_program { use super::*; - pub fn create_page_visits(context: Context) -> Result<()> { + pub fn create_page_visits(context: Context) -> Result<()> { create::handle_create_page_visits(context) } - pub fn increment_page_visits(context: Context) -> Result<()> { + pub fn increment_page_visits(context: Context) -> Result<()> { increment::handle_increment_page_visits(context) } } + +#[error_code] +pub enum PageVisitsError { + #[msg("Page visit count overflowed u32::MAX")] + MathOverflow, +} diff --git a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/state/page_visits.rs b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/state/page_visits.rs index a2bfa65f..edb1fd71 100644 --- a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/state/page_visits.rs +++ b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/state/page_visits.rs @@ -9,8 +9,4 @@ pub struct PageVisits { impl PageVisits { pub const SEED_PREFIX: &'static [u8; 11] = b"page_visits"; - - pub fn increment(&mut self) { - self.page_visits = self.page_visits.checked_add(1).unwrap(); - } } diff --git a/basics/program-derived-addresses/anchor/programs/anchor-program-example/tests/test_program_derived_addresses.rs b/basics/program-derived-addresses/anchor/programs/anchor-program-example/tests/test_program_derived_addresses.rs index 173a4296..1ef8645b 100644 --- a/basics/program-derived-addresses/anchor/programs/anchor-program-example/tests/test_program_derived_addresses.rs +++ b/basics/program-derived-addresses/anchor/programs/anchor-program-example/tests/test_program_derived_addresses.rs @@ -37,7 +37,7 @@ fn test_create_and_increment_page_visits() { let create_ix = Instruction::new_with_bytes( program_id, &program_derived_addresses_program::instruction::CreatePageVisits {}.data(), - program_derived_addresses_program::accounts::CreatePageVisits { + program_derived_addresses_program::accounts::CreatePageVisitsAccountConstraints { payer: payer.pubkey(), page_visits: page_visits_pda, system_program: system_program::id(), @@ -58,7 +58,7 @@ fn test_create_and_increment_page_visits() { let increment_ix = Instruction::new_with_bytes( program_id, &program_derived_addresses_program::instruction::IncrementPageVisits {}.data(), - program_derived_addresses_program::accounts::IncrementPageVisits { + program_derived_addresses_program::accounts::IncrementPageVisitsAccountConstraints { user: payer.pubkey(), page_visits: page_visits_pda, } @@ -81,7 +81,7 @@ fn test_create_and_increment_page_visits() { let increment_ix2 = Instruction::new_with_bytes( program_id, &program_derived_addresses_program::instruction::IncrementPageVisits {}.data(), - program_derived_addresses_program::accounts::IncrementPageVisits { + program_derived_addresses_program::accounts::IncrementPageVisitsAccountConstraints { user: payer.pubkey(), page_visits: page_visits_pda, } diff --git a/basics/program-derived-addresses/quasar/src/error.rs b/basics/program-derived-addresses/quasar/src/error.rs new file mode 100644 index 00000000..feb9e0e1 --- /dev/null +++ b/basics/program-derived-addresses/quasar/src/error.rs @@ -0,0 +1,10 @@ +use quasar_lang::prelude::*; + +#[error_code] +pub enum PageVisitsError { + /// The visit count is at its maximum and cannot be incremented further. + // 6000 is the conventional Anchor-compatible starting offset for + // program-specific error codes (Quasar's #[error_code] starts at 0 + // unless told otherwise; framework errors occupy 3000+). + MathOverflow = 6000, +} diff --git a/basics/program-derived-addresses/quasar/src/instructions/increment.rs b/basics/program-derived-addresses/quasar/src/instructions/increment.rs index 04203838..0e81e1ec 100644 --- a/basics/program-derived-addresses/quasar/src/instructions/increment.rs +++ b/basics/program-derived-addresses/quasar/src/instructions/increment.rs @@ -1,5 +1,5 @@ use { - crate::state::PageVisits, + crate::{error::PageVisitsError, state::PageVisits}, quasar_lang::prelude::*, }; @@ -15,6 +15,9 @@ pub struct IncrementPageVisits { #[inline(always)] pub fn handle_increment_page_visits(accounts: &mut IncrementPageVisits) -> Result<(), ProgramError> { let current: u64 = accounts.page_visits.page_visits.into(); - accounts.page_visits.page_visits = PodU64::from(current.checked_add(1).unwrap()); + let next = current + .checked_add(1) + .ok_or(PageVisitsError::MathOverflow)?; + accounts.page_visits.page_visits = PodU64::from(next); Ok(()) } diff --git a/basics/program-derived-addresses/quasar/src/lib.rs b/basics/program-derived-addresses/quasar/src/lib.rs index 1f44e5fb..6546737f 100644 --- a/basics/program-derived-addresses/quasar/src/lib.rs +++ b/basics/program-derived-addresses/quasar/src/lib.rs @@ -2,6 +2,7 @@ use quasar_lang::prelude::*; +mod error; mod instructions; use instructions::*; mod state; From 8f4b3c7ea375ee010efebc1ff8b447a4c9a5d1a8 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:30:29 +0000 Subject: [PATCH 054/138] token-swap/quasar: fix ratio clamp scaling deposits up, add slippage floors, named errors - the deposit ratio clamp branched on reserve sizes instead of which user amount is binding, so it could scale a side UP past the user's stated amount (and past the balance check). Replaced with the try-A-then-B pattern used by the anchor variant; amounts now only ever scale down - all u128-to-u64 narrowings of money math use try_from with a named error instead of truncating 'as u64' casts - deposit gained minimum_lp_tokens_out, withdraw gained minimum_token_a_out and minimum_token_b_out, enforced before any CPI; swap's existing floor now reverts with the named SlippageExceeded - new AmmError enum (codes from 6000, matching the anchor variant) replaces ProgramError::Custom(4)/(5)/(6) and generic error reuse; claim_admin_fees gained the NothingToClaim guard for parity - tests assert exact clamp-down amounts on both sides, slippage rejections with untouched balances, and conservation in both swap directions against exact constant-product quotes https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- finance/token-swap/quasar/README.md | 22 ++ finance/token-swap/quasar/src/error.rs | 45 +++ .../src/instructions/claim_admin_fees.rs | 8 +- .../quasar/src/instructions/create_config.rs | 13 +- .../src/instructions/deposit_liquidity.rs | 113 ++++-- .../quasar/src/instructions/swap_tokens.rs | 68 ++-- .../src/instructions/withdraw_liquidity.rs | 36 +- finance/token-swap/quasar/src/lib.rs | 20 +- finance/token-swap/quasar/src/tests.rs | 373 ++++++++++++++++-- 9 files changed, 580 insertions(+), 118 deletions(-) create mode 100644 finance/token-swap/quasar/src/error.rs diff --git a/finance/token-swap/quasar/README.md b/finance/token-swap/quasar/README.md index 00936b0d..e1621f4e 100644 --- a/finance/token-swap/quasar/README.md +++ b/finance/token-swap/quasar/README.md @@ -9,6 +9,28 @@ See also: [Token Swap overview](../README.md) and the [repository catalog](../.. - Pool PDA and LP tokens - See [finance/token-swap/README.md](../token-swap/README.md) +## Slippage protection + +All three money-moving flows take a caller-supplied floor and revert with a +named `AmmError` if the floor is not met: + +- `deposit_liquidity(amount_a, amount_b, minimum_lp_tokens_out)` treats + `amount_a` / `amount_b` as upper bounds: one side is used in full and the + other is scaled down to the current pool ratio (never up). If the LP tokens + minted would fall below `minimum_lp_tokens_out`, the deposit reverts with + `DepositBelowMinimum`. +- `withdraw_liquidity(amount, minimum_token_a_out, minimum_token_b_out)` + reverts with `WithdrawalBelowMinimum` if either side of the proportional + payout falls below its floor. +- `swap_tokens(input_is_token_a, input_amount, min_output_amount)` reverts + with `SlippageExceeded` if the constant-product output falls below + `min_output_amount`. + +Requesting more than the caller's token balance fails fast with +`InsufficientBalance` rather than clamping, so the caller's slippage math +always refers to the amounts actually moved. Error codes live in +`src/error.rs` and start at 6000, matching the Anchor variant's offset. + ## Setup From `finance/token-swap/quasar/`: diff --git a/finance/token-swap/quasar/src/error.rs b/finance/token-swap/quasar/src/error.rs new file mode 100644 index 00000000..3f713d5c --- /dev/null +++ b/finance/token-swap/quasar/src/error.rs @@ -0,0 +1,45 @@ +use quasar_lang::prelude::*; + +#[error_code] +pub enum AmmError { + /// `create_config` was called with `fee >= 10_000` basis points (a fee of + /// 100% or more would consume the whole input). + // 6000 is the conventional Anchor-compatible starting offset for + // program-specific error codes (Quasar's #[error_code] starts at 0 + // unless told otherwise; framework errors occupy 3000+). + InvalidFee = 6000, + /// `create_config` was called with `admin_share_bps >= 10_000`. The admin + /// share is a basis-points fraction of the trading fee, so the admin + /// cannot take more than the whole fee. + AdminShareTooHigh, + /// The initial deposit's geometric mean is below `MINIMUM_LIQUIDITY`, or a + /// subsequent deposit is too small to mint any LP tokens. + DepositTooSmall, + /// Clamping the caller's amounts to the current pool ratio rounded one + /// side down to zero; the pool cannot issue meaningful LP shares. + DepositAmountTooSmall, + /// The swap output is below the trader's `min_output_amount`. This is the + /// trader's slippage guard against the pool shifting between quote and + /// landing. + SlippageExceeded, + /// One side of the proportional withdrawal fell below the LP's specified + /// minimum (`minimum_token_a_out` / `minimum_token_b_out`). + WithdrawalBelowMinimum, + /// The LP-token amount minted by a deposit fell below the depositor's + /// `minimum_lp_tokens_out`. This is the lower-bound slippage guard; the + /// ratio clamp is the upper-bound guard. + DepositBelowMinimum, + /// The constant-product invariant decreased across a swap. + InvariantViolated, + /// The caller asked to deposit or swap more tokens than they hold. The + /// program fails fast instead of clamping to the balance, because + /// clamping would invalidate the caller's slippage math. + InsufficientBalance, + /// `claim_admin_fees` was called while both fee accumulators are zero. + NothingToClaim, + /// A checked arithmetic operation overflowed or a u128 result did not fit + /// back into u64. + MathOverflow, + /// The signer of `claim_admin_fees` does not match `Config.admin`. + Unauthorized, +} diff --git a/finance/token-swap/quasar/src/instructions/claim_admin_fees.rs b/finance/token-swap/quasar/src/instructions/claim_admin_fees.rs index 5dd9f5dc..5df262f4 100644 --- a/finance/token-swap/quasar/src/instructions/claim_admin_fees.rs +++ b/finance/token-swap/quasar/src/instructions/claim_admin_fees.rs @@ -1,5 +1,6 @@ use { crate::{ + error::AmmError, state::{Config, PoolConfig, PoolConfigInner}, ConfigPda, PoolAuthorityPda, PoolPda, }, @@ -51,12 +52,17 @@ pub fn handle_claim_admin_fees( ) -> Result<(), ProgramError> { // Authorisation: only the address stored in `Config.admin` may call this. if *accounts.admin.address() != *accounts.config.admin() { - return Err(ProgramError::Custom(6)); // Unauthorized + return Err(AmmError::Unauthorized.into()); } let owed_a = accounts.pool_config.admin_fees_owed_a(); let owed_b = accounts.pool_config.admin_fees_owed_b(); + // Revert (rather than silently no-op) when there is nothing to sweep, so + // the admin gets a clear signal the call was wasted. Matches the Anchor + // variant's behaviour. + require!(owed_a > 0 || owed_b > 0, AmmError::NothingToClaim); + // Seed order matches PoolAuthorityPda: [b"authority", config, mint_a, mint_b, bump]. let bump = [bumps.pool_authority]; let seeds: &[Seed] = &[ diff --git a/finance/token-swap/quasar/src/instructions/create_config.rs b/finance/token-swap/quasar/src/instructions/create_config.rs index 32a333d0..a70afc8a 100644 --- a/finance/token-swap/quasar/src/instructions/create_config.rs +++ b/finance/token-swap/quasar/src/instructions/create_config.rs @@ -1,5 +1,5 @@ use { - crate::{state::{Config, ConfigInner}, ConfigPda, BASIS_POINTS_DIVISOR}, + crate::{error::AmmError, state::{Config, ConfigInner}, ConfigPda, BASIS_POINTS_DIVISOR}, quasar_lang::prelude::*, }; @@ -23,15 +23,14 @@ pub fn handle_create_config( fee: u16, admin_share_bps: u16, ) -> Result<(), ProgramError> { - if fee as u64 >= BASIS_POINTS_DIVISOR { - return Err(ProgramError::InvalidArgument); - } + require!((fee as u64) < BASIS_POINTS_DIVISOR, AmmError::InvalidFee); // `admin_share_bps` is the basis-points slice of the trading fee that // goes to the admin (rest goes to LPs). Anything >= 10_000 is nonsensical // (admin can't take more than the whole fee). - if admin_share_bps as u64 >= BASIS_POINTS_DIVISOR { - return Err(ProgramError::InvalidArgument); - } + require!( + (admin_share_bps as u64) < BASIS_POINTS_DIVISOR, + AmmError::AdminShareTooHigh + ); accounts.config.set_inner(ConfigInner { admin: *accounts.admin.address(), fee: fee.into(), diff --git a/finance/token-swap/quasar/src/instructions/deposit_liquidity.rs b/finance/token-swap/quasar/src/instructions/deposit_liquidity.rs index b476d2e3..5905f982 100644 --- a/finance/token-swap/quasar/src/instructions/deposit_liquidity.rs +++ b/finance/token-swap/quasar/src/instructions/deposit_liquidity.rs @@ -1,5 +1,6 @@ use { crate::{ + error::AmmError, state::{Config, PoolConfig}, ConfigPda, LiquidityMintPda, PoolAuthorityPda, PoolPda, }, @@ -57,8 +58,10 @@ pub struct DepositLiquidityAccounts { pub system_program: Program, } -/// Integer square root via Newton's method. -fn isqrt(n: u128) -> u64 { +/// Integer square root via Newton's method. Operates on and returns `u128`; +/// callers narrow with `try_from` so an out-of-range result is a named error +/// instead of a silent truncation. +fn isqrt(n: u128) -> u128 { if n == 0 { return 0; } @@ -68,7 +71,7 @@ fn isqrt(n: u128) -> u64 { x = y; y = (x + n / x) / 2; } - x as u64 + x } #[inline(always)] @@ -76,6 +79,7 @@ pub fn handle_deposit_liquidity( accounts: &mut DepositLiquidityAccounts, amount_a: u64, amount_b: u64, + minimum_lp_tokens_out: u64, bumps: &DepositLiquidityAccountsBumps, ) -> Result<(), ProgramError> { // Fail fast if the depositor lacks the requested balance. Never silently @@ -84,10 +88,8 @@ pub fn handle_deposit_liquidity( let depositor_a = accounts.token_a.amount(); let depositor_b = accounts.token_b.amount(); if amount_a > depositor_a || amount_b > depositor_b { - return Err(ProgramError::InsufficientFunds); + return Err(AmmError::InsufficientBalance.into()); } - let mut amount_a = amount_a; - let mut amount_b = amount_b; // LP curve runs on *effective* reserves (vault balance minus admin's // accumulated fee claim). The admin's owed slice is a fixed obligation, @@ -98,29 +100,65 @@ pub fn handle_deposit_liquidity( .pool_a .amount() .checked_sub(accounts.pool_config.admin_fees_owed_a()) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; let pool_b_amount = accounts .pool_b .amount() .checked_sub(accounts.pool_config.admin_fees_owed_b()) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; let pool_creation = pool_a_amount == 0 && pool_b_amount == 0; - if !pool_creation { - // Adjust amounts to maintain the pool ratio. - if pool_a_amount > pool_b_amount { - amount_a = (amount_b as u128) + // Clamp the caller's (amount_a, amount_b) to the current pool ratio. + // + // The caller's amounts are *upper bounds*: at most one side can be used in + // full, and the other is scaled DOWN to match the current price. This is + // Uniswap V2's `_addLiquidity` pattern: try the full `amount_a` first and + // compute the token B it requires; if that fits within the caller's + // `amount_b`, done - otherwise `amount_b` is the binding side, so use it + // in full and scale `amount_a` down. Branching on which USER amount is + // binding (never on reserve sizes) guarantees neither side is ever scaled + // UP past what the caller offered and the balance check above verified. + // + // All ratio math is u128 with checked arithmetic: `amount * reserve` can + // overflow u64, and the final narrowing uses try_from so an oversized + // result is a named error, not a truncation. + let (amount_a, amount_b) = if pool_creation { + // First deposit sets the initial price; both amounts are used as is. + (amount_a, amount_b) + } else { + // Round down: this can only ask the depositor for *less* of the other + // token than perfect-ratio, which favours the pool by a sub-minor-unit + // amount and matches Uniswap V2. + let amount_b_required = (amount_a as u128) + .checked_mul(pool_b_amount as u128) + .ok_or(AmmError::MathOverflow)? + .checked_div(pool_a_amount as u128) + .ok_or(AmmError::MathOverflow)?; + if amount_b_required <= amount_b as u128 { + // The caller's `amount_b` covers the ratio: use the full + // `amount_a` and clamp `amount_b` down. + let amount_b_required = + u64::try_from(amount_b_required).map_err(|_| AmmError::MathOverflow)?; + (amount_a, amount_b_required) + } else { + // `amount_b` is the binding side: use it in full and clamp + // `amount_a` down to what the ratio needs. + let amount_a_required = (amount_b as u128) .checked_mul(pool_a_amount as u128) - .ok_or(ProgramError::ArithmeticOverflow)? + .ok_or(AmmError::MathOverflow)? .checked_div(pool_b_amount as u128) - .ok_or(ProgramError::ArithmeticOverflow)? as u64; - } else { - amount_b = (amount_a as u128) - .checked_mul(pool_b_amount as u128) - .ok_or(ProgramError::ArithmeticOverflow)? - .checked_div(pool_a_amount as u128) - .ok_or(ProgramError::ArithmeticOverflow)? as u64; + .ok_or(AmmError::MathOverflow)?; + let amount_a_required = + u64::try_from(amount_a_required).map_err(|_| AmmError::MathOverflow)?; + (amount_a_required, amount_b) } + }; + + // After clamping, both sides must contribute something. If either side + // rounds to zero the deposit is too small to register at the current + // ratio. Fail rather than mint zero-priced LP shares. + if !pool_creation && (amount_a == 0 || amount_b == 0) { + return Err(AmmError::DepositAmountTooSmall.into()); } // LP-mint math, two branches: @@ -129,39 +167,50 @@ pub fn handle_deposit_liquidity( // forever to prevent the first depositor draining the pool later. // - Subsequent deposit: liquidity = min(a * supply / pool_a, // b * supply / pool_b), proportional to the depositor's share of each - // reserve. Using sqrt(a * b) for *every* deposit (the previous - // behaviour) breaks proportionality on subsequent deposits. + // reserve. The geometric mean must not be used here: it breaks + // proportionality once the pool has existing supply. let liquidity: u64 = if pool_creation { let product = (amount_a as u128) .checked_mul(amount_b as u128) - .ok_or(ProgramError::ArithmeticOverflow)?; - let sqrt = isqrt(product); + .ok_or(AmmError::MathOverflow)?; + let sqrt = u64::try_from(isqrt(product)).map_err(|_| AmmError::MathOverflow)?; if sqrt < crate::MINIMUM_LIQUIDITY { - return Err(ProgramError::InsufficientFunds); + return Err(AmmError::DepositTooSmall.into()); } sqrt.checked_sub(crate::MINIMUM_LIQUIDITY) - .ok_or(ProgramError::ArithmeticOverflow)? + .ok_or(AmmError::MathOverflow)? } else { let total_supply = accounts.liquidity_provider_mint.supply() as u128; let from_a = (amount_a as u128) .checked_mul(total_supply) - .ok_or(ProgramError::ArithmeticOverflow)? + .ok_or(AmmError::MathOverflow)? .checked_div(pool_a_amount as u128) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; let from_b = (amount_b as u128) .checked_mul(total_supply) - .ok_or(ProgramError::ArithmeticOverflow)? + .ok_or(AmmError::MathOverflow)? .checked_div(pool_b_amount as u128) - .ok_or(ProgramError::ArithmeticOverflow)?; - u64::try_from(from_a.min(from_b)).map_err(|_| ProgramError::ArithmeticOverflow)? + .ok_or(AmmError::MathOverflow)?; + u64::try_from(from_a.min(from_b)).map_err(|_| AmmError::MathOverflow)? }; // Reject deposits too small to mint any LP tokens (skill: never mint // zero-priced shares). if liquidity == 0 { - return Err(ProgramError::InsufficientFunds); + return Err(AmmError::DepositTooSmall.into()); } + // Depositor's slippage protection: the caller passes the lowest LP amount + // they will accept (computed offchain at quote time). If the pool ratio + // shifted between quoting and landing, the clamp above used smaller + // amounts and the LP mint drops; revert rather than mint fewer LP tokens + // than the caller expects. This is the lower-bound guard; the ratio clamp + // is the upper-bound guard (caps how much of each token can be spent). + require!( + liquidity >= minimum_lp_tokens_out, + AmmError::DepositBelowMinimum + ); + // Transfer token A to the pool. accounts.token_program .transfer(&accounts.token_a, &accounts.pool_a, &accounts.depositor, amount_a) diff --git a/finance/token-swap/quasar/src/instructions/swap_tokens.rs b/finance/token-swap/quasar/src/instructions/swap_tokens.rs index 897a9016..77e71c56 100644 --- a/finance/token-swap/quasar/src/instructions/swap_tokens.rs +++ b/finance/token-swap/quasar/src/instructions/swap_tokens.rs @@ -1,5 +1,6 @@ use { crate::{ + error::AmmError, state::{Config, PoolConfig, PoolConfigInner}, ConfigPda, PoolAuthorityPda, PoolPda, BASIS_POINTS_DIVISOR, }, @@ -66,7 +67,7 @@ pub fn handle_swap_tokens( accounts.token_b.amount() }; if input_amount > trader_balance { - return Err(ProgramError::InsufficientFunds); + return Err(AmmError::InsufficientBalance.into()); } let input = input_amount; @@ -81,19 +82,21 @@ pub fn handle_swap_tokens( // intermediate `input * fee` can overflow u64; multiply before divide. let fee = accounts.config.fee() as u128; let admin_share_bps = accounts.config.admin_share_bps() as u128; - let fee_amount = (input as u128) + let fee_amount_u128 = (input as u128) .checked_mul(fee) - .ok_or(ProgramError::ArithmeticOverflow)? + .ok_or(AmmError::MathOverflow)? .checked_div(BASIS_POINTS_DIVISOR as u128) - .ok_or(ProgramError::ArithmeticOverflow)? as u64; - let admin_portion = (fee_amount as u128) + .ok_or(AmmError::MathOverflow)?; + let fee_amount = u64::try_from(fee_amount_u128).map_err(|_| AmmError::MathOverflow)?; + let admin_portion_u128 = (fee_amount as u128) .checked_mul(admin_share_bps) - .ok_or(ProgramError::ArithmeticOverflow)? + .ok_or(AmmError::MathOverflow)? .checked_div(BASIS_POINTS_DIVISOR as u128) - .ok_or(ProgramError::ArithmeticOverflow)? as u64; + .ok_or(AmmError::MathOverflow)?; + let admin_portion = u64::try_from(admin_portion_u128).map_err(|_| AmmError::MathOverflow)?; let taxed_input = input .checked_sub(fee_amount) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; // Effective reserves = raw vault balance - admin's accumulated claim. // The constant-product curve runs on the LP-claimable portion only, so @@ -106,43 +109,44 @@ pub fn handle_swap_tokens( let owed_b = accounts.pool_config.admin_fees_owed_b(); let effective_pool_a = pool_a_raw .checked_sub(owed_a) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; let effective_pool_b = pool_b_raw .checked_sub(owed_b) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; - let output = if input_is_token_a { + let output_u128 = if input_is_token_a { (taxed_input as u128) .checked_mul(effective_pool_b as u128) - .ok_or(ProgramError::ArithmeticOverflow)? + .ok_or(AmmError::MathOverflow)? .checked_div( (effective_pool_a as u128) .checked_add(taxed_input as u128) - .ok_or(ProgramError::ArithmeticOverflow)?, + .ok_or(AmmError::MathOverflow)?, ) - .ok_or(ProgramError::ArithmeticOverflow)? as u64 + .ok_or(AmmError::MathOverflow)? } else { (taxed_input as u128) .checked_mul(effective_pool_a as u128) - .ok_or(ProgramError::ArithmeticOverflow)? + .ok_or(AmmError::MathOverflow)? .checked_div( (effective_pool_b as u128) .checked_add(taxed_input as u128) - .ok_or(ProgramError::ArithmeticOverflow)?, + .ok_or(AmmError::MathOverflow)?, ) - .ok_or(ProgramError::ArithmeticOverflow)? as u64 + .ok_or(AmmError::MathOverflow)? }; + let output = u64::try_from(output_u128).map_err(|_| AmmError::MathOverflow)?; - if output < min_output_amount { - return Err(ProgramError::Custom(4)); // OutputTooSmall - } + // Trader's slippage protection: revert if the pool moved between quote + // and landing and the output dropped below the trader's floor. + require!(output >= min_output_amount, AmmError::SlippageExceeded); // Record invariant on the *effective* reserves before the trade. Using // raw balances would let the admin's accumulated fees count toward LP // yield (wrong). let invariant = (effective_pool_a as u128) .checked_mul(effective_pool_b as u128) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; // Effects (Checks-Effects-Interactions): accumulate the admin's slice on // the *input* side before any transfer CPI. The fee always comes off the @@ -152,13 +156,13 @@ pub fn handle_swap_tokens( // transfer. let (new_owed_a, new_owed_b) = if input_is_token_a { ( - owed_a.checked_add(admin_portion).ok_or(ProgramError::ArithmeticOverflow)?, + owed_a.checked_add(admin_portion).ok_or(AmmError::MathOverflow)?, owed_b, ) } else { ( owed_a, - owed_b.checked_add(admin_portion).ok_or(ProgramError::ArithmeticOverflow)?, + owed_b.checked_add(admin_portion).ok_or(AmmError::MathOverflow)?, ) }; let config_addr = *accounts.pool_config.config(); @@ -207,27 +211,25 @@ pub fn handle_swap_tokens( // u128 + checked throughout - a raw `+`/`-` could wrap on extreme values. let new_pool_a_raw = (pool_a_raw as u128) .checked_add(if input_is_token_a { input as u128 } else { 0 }) - .ok_or(ProgramError::ArithmeticOverflow)? + .ok_or(AmmError::MathOverflow)? .checked_sub(if !input_is_token_a { output as u128 } else { 0 }) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; let new_pool_b_raw = (pool_b_raw as u128) .checked_add(if !input_is_token_a { input as u128 } else { 0 }) - .ok_or(ProgramError::ArithmeticOverflow)? + .ok_or(AmmError::MathOverflow)? .checked_sub(if input_is_token_a { output as u128 } else { 0 }) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; let new_effective_a = new_pool_a_raw .checked_sub(new_owed_a as u128) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; let new_effective_b = new_pool_b_raw .checked_sub(new_owed_b as u128) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; let new_invariant = new_effective_a .checked_mul(new_effective_b) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; - if new_invariant < invariant { - return Err(ProgramError::Custom(5)); // InvariantViolated - } + require!(new_invariant >= invariant, AmmError::InvariantViolated); Ok(()) } diff --git a/finance/token-swap/quasar/src/instructions/withdraw_liquidity.rs b/finance/token-swap/quasar/src/instructions/withdraw_liquidity.rs index c5354245..b98ca5e5 100644 --- a/finance/token-swap/quasar/src/instructions/withdraw_liquidity.rs +++ b/finance/token-swap/quasar/src/instructions/withdraw_liquidity.rs @@ -1,5 +1,6 @@ use { crate::{ + error::AmmError, state::{Config, PoolConfig}, ConfigPda, LiquidityMintPda, PoolAuthorityPda, PoolPda, }, @@ -60,6 +61,8 @@ pub struct WithdrawLiquidityAccounts { pub fn handle_withdraw_liquidity( accounts: &mut WithdrawLiquidityAccounts, amount: u64, + minimum_token_a_out: u64, + minimum_token_b_out: u64, bumps: &WithdrawLiquidityAccountsBumps, ) -> Result<(), ProgramError> { // Seed order matches PoolAuthorityPda: [b"authority", config, mint_a, mint_b, bump]. @@ -83,29 +86,44 @@ pub fn handle_withdraw_liquidity( .pool_a .amount() .checked_sub(accounts.pool_config.admin_fees_owed_a()) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; let effective_pool_b = accounts .pool_b .amount() .checked_sub(accounts.pool_config.admin_fees_owed_b()) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; let total_liquidity = accounts .liquidity_provider_mint .supply() .checked_add(crate::MINIMUM_LIQUIDITY) - .ok_or(ProgramError::ArithmeticOverflow)?; + .ok_or(AmmError::MathOverflow)?; - let amount_a = (amount as u128) + let amount_a_u128 = (amount as u128) .checked_mul(effective_pool_a as u128) - .ok_or(ProgramError::ArithmeticOverflow)? + .ok_or(AmmError::MathOverflow)? .checked_div(total_liquidity as u128) - .ok_or(ProgramError::ArithmeticOverflow)? as u64; + .ok_or(AmmError::MathOverflow)?; + let amount_a = u64::try_from(amount_a_u128).map_err(|_| AmmError::MathOverflow)?; - let amount_b = (amount as u128) + let amount_b_u128 = (amount as u128) .checked_mul(effective_pool_b as u128) - .ok_or(ProgramError::ArithmeticOverflow)? + .ok_or(AmmError::MathOverflow)? .checked_div(total_liquidity as u128) - .ok_or(ProgramError::ArithmeticOverflow)? as u64; + .ok_or(AmmError::MathOverflow)?; + let amount_b = u64::try_from(amount_b_u128).map_err(|_| AmmError::MathOverflow)?; + + // LP's slippage protection: if the pool ratio shifted between the LP + // quoting their exit and this transaction landing (e.g. a big swap + // drained one side), the proportional share comes back with a different + // mix than expected. Revert so the LP can requote. + require!( + amount_a >= minimum_token_a_out, + AmmError::WithdrawalBelowMinimum + ); + require!( + amount_b >= minimum_token_b_out, + AmmError::WithdrawalBelowMinimum + ); // Transfer token A from pool to depositor. accounts.token_program diff --git a/finance/token-swap/quasar/src/lib.rs b/finance/token-swap/quasar/src/lib.rs index 4403c418..49d72750 100644 --- a/finance/token-swap/quasar/src/lib.rs +++ b/finance/token-swap/quasar/src/lib.rs @@ -2,6 +2,7 @@ use quasar_lang::prelude::*; +pub mod error; mod instructions; use instructions::*; pub mod state; @@ -87,16 +88,31 @@ mod quasar_token_swap { ctx: Ctx, amount_a: u64, amount_b: u64, + minimum_lp_tokens_out: u64, ) -> Result<(), ProgramError> { - instructions::handle_deposit_liquidity(&mut ctx.accounts, amount_a, amount_b, &ctx.bumps) + instructions::handle_deposit_liquidity( + &mut ctx.accounts, + amount_a, + amount_b, + minimum_lp_tokens_out, + &ctx.bumps, + ) } #[instruction(discriminator = 3)] pub fn withdraw_liquidity( ctx: Ctx, amount: u64, + minimum_token_a_out: u64, + minimum_token_b_out: u64, ) -> Result<(), ProgramError> { - instructions::handle_withdraw_liquidity(&mut ctx.accounts, amount, &ctx.bumps) + instructions::handle_withdraw_liquidity( + &mut ctx.accounts, + amount, + minimum_token_a_out, + minimum_token_b_out, + &ctx.bumps, + ) } #[instruction(discriminator = 4)] diff --git a/finance/token-swap/quasar/src/tests.rs b/finance/token-swap/quasar/src/tests.rs index b821ce01..182926d7 100644 --- a/finance/token-swap/quasar/src/tests.rs +++ b/finance/token-swap/quasar/src/tests.rs @@ -1,13 +1,33 @@ extern crate std; use { + crate::error::AmmError, alloc::vec, quasar_svm::{ token::{create_keyed_associated_token_account, create_keyed_mint_account, Mint}, - Account, Instruction, Pubkey, QuasarSvm, SPL_TOKEN_PROGRAM_ID, + Account, Instruction, ProgramError, Pubkey, QuasarSvm, SPL_TOKEN_PROGRAM_ID, }, std::println, }; +/// Quasar reports program errors as `ProgramError::Custom(code)`; this maps a +/// named `AmmError` to that wire form for assertions. +fn amm_error(error: AmmError) -> ProgramError { + ProgramError::Custom(error as u32) +} + +/// `amount * numerator / denominator` in u128 with checked ops, narrowed back +/// to u64. Mirrors the program's ratio math for computing expected values. +fn mul_div(amount: u64, numerator: u64, denominator: u64) -> u64 { + u64::try_from( + (amount as u128) + .checked_mul(numerator as u128) + .expect("mul_div: product overflow") + .checked_div(denominator as u128) + .expect("mul_div: divide by zero"), + ) + .expect("mul_div: result exceeds u64") +} + // โ”€โ”€ SVM setup โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ fn setup() -> QuasarSvm { @@ -50,11 +70,6 @@ fn funded_ata(wallet: Pubkey, mint: Pubkey, amount: u64) -> Account { create_keyed_associated_token_account(&wallet, &mint, amount) } -/// ATA address derived from wallet + mint (same formula as SPL ATA program). -fn ata_addr(wallet: Pubkey, mint: Pubkey) -> Pubkey { - create_keyed_associated_token_account(&wallet, &mint, 0).address -} - /// Read the `amount` field (bytes 64โ€“72) from a packed token account. fn token_amount(account: &Account) -> u64 { u64::from_le_bytes(account.data[64..72].try_into().unwrap()) @@ -99,16 +114,19 @@ fn build_create_config_data(fee: u16, admin_share_bps: u16) -> Vec { data } -fn build_deposit_data(amount_a: u64, amount_b: u64) -> Vec { +fn build_deposit_data(amount_a: u64, amount_b: u64, minimum_lp_tokens_out: u64) -> Vec { let mut data = vec![2u8]; // discriminator = 2 data.extend_from_slice(&amount_a.to_le_bytes()); data.extend_from_slice(&amount_b.to_le_bytes()); + data.extend_from_slice(&minimum_lp_tokens_out.to_le_bytes()); data } -fn build_withdraw_data(amount: u64) -> Vec { +fn build_withdraw_data(amount: u64, minimum_token_a_out: u64, minimum_token_b_out: u64) -> Vec { let mut data = vec![3u8]; // discriminator = 3 data.extend_from_slice(&amount.to_le_bytes()); + data.extend_from_slice(&minimum_token_a_out.to_le_bytes()); + data.extend_from_slice(&minimum_token_b_out.to_le_bytes()); data } @@ -186,6 +204,7 @@ fn ix_deposit( payer: Pubkey, amount_a: u64, amount_b: u64, + minimum_lp_tokens_out: u64, ) -> Instruction { Instruction { program_id: crate::ID, @@ -208,7 +227,7 @@ fn ix_deposit( solana_instruction::AccountMeta::new_readonly(SPL_TOKEN_PROGRAM_ID, false), solana_instruction::AccountMeta::new_readonly(quasar_svm::system_program::ID.into(), false), ], - data: build_deposit_data(amount_a, amount_b), + data: build_deposit_data(amount_a, amount_b, minimum_lp_tokens_out), } } @@ -227,6 +246,8 @@ fn ix_withdraw( token_b: Pubkey, payer: Pubkey, amount: u64, + minimum_token_a_out: u64, + minimum_token_b_out: u64, ) -> Instruction { Instruction { program_id: crate::ID, @@ -249,7 +270,7 @@ fn ix_withdraw( solana_instruction::AccountMeta::new_readonly(SPL_TOKEN_PROGRAM_ID, false), solana_instruction::AccountMeta::new_readonly(quasar_svm::system_program::ID.into(), false), ], - data: build_withdraw_data(amount), + data: build_withdraw_data(amount, minimum_token_a_out, minimum_token_b_out), } } @@ -413,7 +434,8 @@ fn do_deposit(env: &mut PoolEnv, amount_a: u64, amount_b: u64) -> (Pubkey, Pubke env.config, env.pool_config, env.pool_authority, depositor, env.lp_mint, env.mint_a, env.mint_b, env.pool_a, env.pool_b, lp_token, token_a, token_b, env.payer, - amount_a, amount_b, + // Pool-setup helper, not a slippage test: no LP floor. + amount_a, amount_b, 0, ), &[signer(lp_token), signer(depositor)], ); @@ -584,14 +606,176 @@ fn test_deposit_insufficient_funds_rejected() { env.config, env.pool_config, env.pool_authority, depositor, env.lp_mint, env.mint_a, env.mint_b, env.pool_a, env.pool_b, lp_token, token_a, token_b, env.payer, - 1_000_000, 1_000_000, + 1_000_000, 1_000_000, 0, ), &[empty(lp_token), signer(depositor)], ); - assert!(!r.is_ok(), "deposit with insufficient funds should fail"); + r.assert_error(amm_error(AmmError::InsufficientBalance)); println!(" DEPOSIT insufficient funds correctly rejected"); } +/// Regression test for the ratio-clamp direction bug: with reserves at +/// pool_a > pool_b, logic that branches on RESERVE sizes (instead of which +/// USER amount is binding) scales `amount_a` UP to +/// `amount_b * pool_a / pool_b`, past both the user's stated amount and the +/// balance check. The correct try-A-then-B clamp scales token B DOWN instead. +#[test] +fn test_deposit_clamps_down_never_up() { + let mut env = setup_pool(); + + // Seed at a 4:1 ratio so pool_a > pool_b. + let (pool_seed_a, pool_seed_b) = (4_000_000u64, 1_000_000u64); + let (_, lp_seed_token) = do_deposit(&mut env, pool_seed_a, pool_seed_b); + let lp_supply = token_amount(&env.svm.get_account(&lp_seed_token).unwrap()); + + // Depositor offers 1_000_000 of each and holds exactly that much. The + // old logic would try to pull 4_000_000 token A (scaling A UP); the + // correct clamp uses all 1_000_000 A and scales B down to 250_000. + let depositor = Pubkey::new_unique(); + let (stated_a, stated_b) = (1_000_000u64, 1_000_000u64); + let ta = funded_ata(depositor, env.mint_a, stated_a); + let tb = funded_ata(depositor, env.mint_b, stated_b); + let (token_a, token_b) = (ta.address, tb.address); + env.svm.set_account(ta); + env.svm.set_account(tb); + let lp_token = Pubkey::new_unique(); + + let expected_b_pulled = mul_div(stated_a, pool_seed_b, pool_seed_a); + let expected_lp = mul_div(stated_a, lp_supply, pool_seed_a); + + let r = env.svm.process_instruction( + &ix_deposit( + env.config, env.pool_config, env.pool_authority, depositor, + env.lp_mint, env.mint_a, env.mint_b, env.pool_a, env.pool_b, + lp_token, token_a, token_b, env.payer, + stated_a, stated_b, expected_lp, + ), + &[signer(lp_token), signer(depositor)], + ); + assert!(r.is_ok(), "clamped deposit failed: {:?}", r.raw_result); + + // Exact amounts pulled: all of A, ratio-clamped B, nothing more. + let depositor_a = token_amount(&env.svm.get_account(&token_a).unwrap()); + let depositor_b = token_amount(&env.svm.get_account(&token_b).unwrap()); + assert_eq!(depositor_a, 0, "all stated token A must be pulled"); + assert_eq!( + depositor_b, + stated_b - expected_b_pulled, + "token B must be clamped down to the pool ratio" + ); + let pool_a_after = token_amount(&env.svm.get_account(&env.pool_a).unwrap()); + let pool_b_after = token_amount(&env.svm.get_account(&env.pool_b).unwrap()); + assert_eq!(pool_a_after, pool_seed_a + stated_a); + assert_eq!(pool_b_after, pool_seed_b + expected_b_pulled); + + let lp_minted = token_amount(&env.svm.get_account(&lp_token).unwrap()); + assert_eq!(lp_minted, expected_lp, "LP mint must be proportional"); + println!( + " DEPOSIT clamp: pulled_a={}, pulled_b={}, lp={}", + stated_a, expected_b_pulled, lp_minted + ); +} + +/// Mirror of `test_deposit_clamps_down_never_up` with the reserves reversed +/// (pool_b > pool_a), so the binding side is token A's counterpart: the full +/// `amount_b` is used and `amount_a` is the side that covers the ratio. +#[test] +fn test_deposit_clamps_down_other_side() { + let mut env = setup_pool(); + + // Seed at a 1:4 ratio so pool_b > pool_a. + let (pool_seed_a, pool_seed_b) = (1_000_000u64, 4_000_000u64); + let (_, lp_seed_token) = do_deposit(&mut env, pool_seed_a, pool_seed_b); + let lp_supply = token_amount(&env.svm.get_account(&lp_seed_token).unwrap()); + + let depositor = Pubkey::new_unique(); + let (stated_a, stated_b) = (1_000_000u64, 1_000_000u64); + let ta = funded_ata(depositor, env.mint_a, stated_a); + let tb = funded_ata(depositor, env.mint_b, stated_b); + let (token_a, token_b) = (ta.address, tb.address); + env.svm.set_account(ta); + env.svm.set_account(tb); + let lp_token = Pubkey::new_unique(); + + // amount_b_required for the full stated_a would be 4_000_000 > stated_b, + // so amount_b binds: all of B is used and A is clamped down. + let expected_a_pulled = mul_div(stated_b, pool_seed_a, pool_seed_b); + let expected_lp = mul_div(stated_b, lp_supply, pool_seed_b); + + let r = env.svm.process_instruction( + &ix_deposit( + env.config, env.pool_config, env.pool_authority, depositor, + env.lp_mint, env.mint_a, env.mint_b, env.pool_a, env.pool_b, + lp_token, token_a, token_b, env.payer, + stated_a, stated_b, expected_lp, + ), + &[signer(lp_token), signer(depositor)], + ); + assert!(r.is_ok(), "clamped deposit failed: {:?}", r.raw_result); + + let depositor_a = token_amount(&env.svm.get_account(&token_a).unwrap()); + let depositor_b = token_amount(&env.svm.get_account(&token_b).unwrap()); + assert_eq!( + depositor_a, + stated_a - expected_a_pulled, + "token A must be clamped down to the pool ratio" + ); + assert_eq!(depositor_b, 0, "all stated token B must be pulled"); + let pool_a_after = token_amount(&env.svm.get_account(&env.pool_a).unwrap()); + let pool_b_after = token_amount(&env.svm.get_account(&env.pool_b).unwrap()); + assert_eq!(pool_a_after, pool_seed_a + expected_a_pulled); + assert_eq!(pool_b_after, pool_seed_b + stated_b); + + let lp_minted = token_amount(&env.svm.get_account(&lp_token).unwrap()); + assert_eq!(lp_minted, expected_lp, "LP mint must be proportional"); + println!( + " DEPOSIT clamp (B binding): pulled_a={}, pulled_b={}, lp={}", + expected_a_pulled, stated_b, lp_minted + ); +} + +#[test] +fn test_deposit_slippage_rejected() { + let mut env = setup_pool(); + + let (pool_seed_a, pool_seed_b) = (1_000_000u64, 1_000_000u64); + let (_, lp_seed_token) = do_deposit(&mut env, pool_seed_a, pool_seed_b); + let lp_supply = token_amount(&env.svm.get_account(&lp_seed_token).unwrap()); + + let depositor = Pubkey::new_unique(); + let (stated_a, stated_b) = (500_000u64, 500_000u64); + let ta = funded_ata(depositor, env.mint_a, stated_a); + let tb = funded_ata(depositor, env.mint_b, stated_b); + let (token_a, token_b) = (ta.address, tb.address); + env.svm.set_account(ta); + env.svm.set_account(tb); + let lp_token = Pubkey::new_unique(); + + // The pool will mint exactly this much; ask for one more. + let exact_lp = mul_div(stated_a, lp_supply, pool_seed_a); + let r = env.svm.process_instruction( + &ix_deposit( + env.config, env.pool_config, env.pool_authority, depositor, + env.lp_mint, env.mint_a, env.mint_b, env.pool_a, env.pool_b, + lp_token, token_a, token_b, env.payer, + stated_a, stated_b, exact_lp + 1, + ), + &[signer(lp_token), signer(depositor)], + ); + r.assert_error(amm_error(AmmError::DepositBelowMinimum)); + + // Nothing moved: depositor balances and pool reserves are unchanged. + let depositor_a = token_amount(&env.svm.get_account(&token_a).unwrap()); + let depositor_b = token_amount(&env.svm.get_account(&token_b).unwrap()); + assert_eq!(depositor_a, stated_a, "token A must be untouched after revert"); + assert_eq!(depositor_b, stated_b, "token B must be untouched after revert"); + let pa = token_amount(&env.svm.get_account(&env.pool_a).unwrap()); + let pb = token_amount(&env.svm.get_account(&env.pool_b).unwrap()); + assert_eq!(pa, pool_seed_a, "pool_a must be untouched after revert"); + assert_eq!(pb, pool_seed_b, "pool_b must be untouched after revert"); + println!(" DEPOSIT slippage guard correctly rejected"); +} + // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• // Tests - withdraw_liquidity // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• @@ -609,6 +793,15 @@ fn test_withdraw_liquidity() { // Withdraw half the LP tokens. let withdraw_amount = lp_balance / 2; + // Expected proportional share, mirroring the program's formula: + // amount_out = lp_amount * reserve / (lp_supply + MINIMUM_LIQUIDITY) + // The depositor holds the entire LP supply, so supply == lp_balance. + let divisor = lp_balance + .checked_add(crate::MINIMUM_LIQUIDITY) + .expect("divisor overflow"); + let expected_a = mul_div(withdraw_amount, amount_a, divisor); + let expected_b = mul_div(withdraw_amount, amount_b, divisor); + // Output token accounts are created by init(idempotent) โ†’ pass as empty. let recv_a = Pubkey::new_unique(); let recv_b = Pubkey::new_unique(); @@ -618,18 +811,28 @@ fn test_withdraw_liquidity() { env.config, env.pool_config, env.pool_authority, depositor, env.lp_mint, env.mint_a, env.mint_b, env.pool_a, env.pool_b, lp_token, recv_a, recv_b, env.payer, - withdraw_amount, + // Pass the exact expected amounts as the slippage floors: the + // pool hasn't moved since the quote, so the floors must be met. + withdraw_amount, expected_a, expected_b, ), // recv_a / recv_b are non-PDA accounts init(idempotent) โ†’ signer required. &[signer(recv_a), signer(recv_b), signer(depositor)], ); assert!(r.is_ok(), "withdraw failed: {:?}", r.raw_result); - // Verify the depositor received tokens. + // Verify the depositor received exactly the proportional share. let ra = env.svm.get_account(&recv_a).expect("recv_a missing after withdraw"); let rb = env.svm.get_account(&recv_b).expect("recv_b missing after withdraw"); - assert!(token_amount(&ra) > 0, "recv_a should have tokens after withdraw"); - assert!(token_amount(&rb) > 0, "recv_b should have tokens after withdraw"); + assert_eq!(token_amount(&ra), expected_a, "token A withdrawal mismatch"); + assert_eq!(token_amount(&rb), expected_b, "token B withdrawal mismatch"); + + // LP tokens were burned. + let lp_after = token_amount(&env.svm.get_account(&lp_token).unwrap()); + assert_eq!( + lp_after, + lp_balance - withdraw_amount, + "LP balance should drop by the burned amount" + ); println!( " WITHDRAW: lp_burned={}, recv_a={}, recv_b={}", @@ -637,69 +840,161 @@ fn test_withdraw_liquidity() { ); } +#[test] +fn test_withdraw_slippage_rejected() { + let mut env = setup_pool(); + let (depositor, lp_token) = do_deposit(&mut env, 2_000_000, 2_000_000); + let lp_balance = token_amount(&env.svm.get_account(&lp_token).unwrap()); + + let withdraw_amount = lp_balance / 2; + let divisor = lp_balance + .checked_add(crate::MINIMUM_LIQUIDITY) + .expect("divisor overflow"); + let expected_a = mul_div(withdraw_amount, 2_000_000, divisor); + + let recv_a = Pubkey::new_unique(); + let recv_b = Pubkey::new_unique(); + + // Floor on token A set just above what the pool will pay out. + let r = env.svm.process_instruction( + &ix_withdraw( + env.config, env.pool_config, env.pool_authority, depositor, + env.lp_mint, env.mint_a, env.mint_b, env.pool_a, env.pool_b, + lp_token, recv_a, recv_b, env.payer, + withdraw_amount, expected_a + 1, 0, + ), + &[signer(recv_a), signer(recv_b), signer(depositor)], + ); + r.assert_error(amm_error(AmmError::WithdrawalBelowMinimum)); + + // Nothing moved: pool reserves and the LP balance are unchanged. + let pa = token_amount(&env.svm.get_account(&env.pool_a).unwrap()); + let pb = token_amount(&env.svm.get_account(&env.pool_b).unwrap()); + assert_eq!(pa, 2_000_000, "pool_a must be untouched after revert"); + assert_eq!(pb, 2_000_000, "pool_b must be untouched after revert"); + let lp_after = token_amount(&env.svm.get_account(&lp_token).unwrap()); + assert_eq!(lp_after, lp_balance, "LP balance must be untouched after revert"); + println!(" WITHDRAW slippage guard correctly rejected"); +} + // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• // Tests - swap_tokens // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• +/// Constant-product quote mirroring the program's swap math, on effective +/// reserves: output = taxed_input * pool_out / (pool_in + taxed_input), where +/// taxed_input = input - input * fee_bps / 10_000. All products in u128. +fn expected_swap_output(input: u64, fee_bps: u64, pool_in: u64, pool_out: u64) -> u64 { + let fee_amount = mul_div(input, fee_bps, crate::BASIS_POINTS_DIVISOR); + let taxed_input = input.checked_sub(fee_amount).expect("fee exceeds input"); + let divisor = pool_in.checked_add(taxed_input).expect("reserve overflow"); + mul_div(taxed_input, pool_out, divisor) +} + +/// Trading fee passed to `create_config` in `setup_pool`, in basis points. +const POOL_FEE_BPS: u64 = 30; + #[test] -fn test_swap_a_to_b() { +fn test_swap_a_to_b_conserves_balances() { let mut env = setup_pool(); // Seed the pool with liquidity first. - do_deposit(&mut env, 10_000_000, 10_000_000); + let (pool_seed_a, pool_seed_b) = (10_000_000u64, 10_000_000u64); + do_deposit(&mut env, pool_seed_a, pool_seed_b); // Trader swaps 100_000 token A for token B. let trader = Pubkey::new_unique(); - let ta = funded_ata(trader, env.mint_a, 1_000_000); + let trader_funding = 1_000_000u64; + let ta = funded_ata(trader, env.mint_a, trader_funding); let token_a = ta.address; let token_b_out = Pubkey::new_unique(); // created by init(idempotent) env.svm.set_account(ta); let input = 100_000u64; + let expected_output = expected_swap_output(input, POOL_FEE_BPS, pool_seed_a, pool_seed_b); let r = env.svm.process_instruction( &ix_swap( env.config, env.pool_config, env.pool_authority, trader, env.mint_a, env.mint_b, env.pool_a, env.pool_b, token_a, token_b_out, env.payer, - true, input, 1, // input_is_token_a=true, min_output=1 + true, input, expected_output, // floor = exact quote; pool hasn't moved ), // token_b_out is a new non-PDA account โ†’ signer required for init. &[signer(token_b_out), signer(trader)], ); assert!(r.is_ok(), "swap Aโ†’B failed: {:?}", r.raw_result); - let out_acct = env.svm.get_account(&token_b_out).expect("token_b_out missing after swap"); - let received = token_amount(&out_acct); - assert!(received > 0, "expected non-zero token B output"); + // Conservation: the trader pays exactly `input` and receives exactly what + // the pool sent; nothing is minted or lost in transit. + let trader_a_after = token_amount(&env.svm.get_account(&token_a).unwrap()); + let received = token_amount(&env.svm.get_account(&token_b_out).unwrap()); + let pool_a_after = token_amount(&env.svm.get_account(&env.pool_a).unwrap()); + let pool_b_after = token_amount(&env.svm.get_account(&env.pool_b).unwrap()); + assert_eq!( + trader_a_after, + trader_funding - input, + "trader must pay exactly the input amount" + ); + assert_eq!(received, expected_output, "trader output mismatch"); + assert_eq!( + pool_a_after, + pool_seed_a + input, + "pool_a must gain exactly the input" + ); + assert_eq!( + pool_b_after, + pool_seed_b - received, + "pool_b must lose exactly what the trader received" + ); println!(" SWAP Aโ†’B: input={}, output={}", input, received); } #[test] -fn test_swap_b_to_a() { +fn test_swap_b_to_a_conserves_balances() { let mut env = setup_pool(); - do_deposit(&mut env, 10_000_000, 10_000_000); + let (pool_seed_a, pool_seed_b) = (10_000_000u64, 10_000_000u64); + do_deposit(&mut env, pool_seed_a, pool_seed_b); let trader = Pubkey::new_unique(); - let tb = funded_ata(trader, env.mint_b, 1_000_000); + let trader_funding = 1_000_000u64; + let tb = funded_ata(trader, env.mint_b, trader_funding); let token_b = tb.address; let token_a_out = Pubkey::new_unique(); env.svm.set_account(tb); let input = 100_000u64; + let expected_output = expected_swap_output(input, POOL_FEE_BPS, pool_seed_b, pool_seed_a); let r = env.svm.process_instruction( &ix_swap( env.config, env.pool_config, env.pool_authority, trader, env.mint_a, env.mint_b, env.pool_a, env.pool_b, token_a_out, token_b, env.payer, - false, input, 1, // input_is_token_a=false + false, input, expected_output, // input_is_token_a=false ), &[signer(token_a_out), signer(trader)], ); assert!(r.is_ok(), "swap Bโ†’A failed: {:?}", r.raw_result); - let out_acct = env.svm.get_account(&token_a_out).expect("token_a_out missing"); - let received = token_amount(&out_acct); - assert!(received > 0, "expected non-zero token A output"); + let trader_b_after = token_amount(&env.svm.get_account(&token_b).unwrap()); + let received = token_amount(&env.svm.get_account(&token_a_out).unwrap()); + let pool_a_after = token_amount(&env.svm.get_account(&env.pool_a).unwrap()); + let pool_b_after = token_amount(&env.svm.get_account(&env.pool_b).unwrap()); + assert_eq!( + trader_b_after, + trader_funding - input, + "trader must pay exactly the input amount" + ); + assert_eq!(received, expected_output, "trader output mismatch"); + assert_eq!( + pool_b_after, + pool_seed_b + input, + "pool_b must gain exactly the input" + ); + assert_eq!( + pool_a_after, + pool_seed_a - received, + "pool_a must lose exactly what the trader received" + ); println!(" SWAP Bโ†’A: input={}, output={}", input, received); } @@ -714,17 +1009,27 @@ fn test_swap_slippage_rejected() { let token_b_out = Pubkey::new_unique(); env.svm.set_account(ta); - // min_output set absurdly high (more than pool can deliver). + // min_output set one above the exact quote, so the floor cannot be met. + let input = 100_000u64; + let quote = expected_swap_output(input, POOL_FEE_BPS, 10_000_000, 10_000_000); let r = env.svm.process_instruction( &ix_swap( env.config, env.pool_config, env.pool_authority, trader, env.mint_a, env.mint_b, env.pool_a, env.pool_b, token_a, token_b_out, env.payer, - true, 100_000, 999_999_999, + true, input, quote + 1, ), &[empty(token_b_out), signer(trader)], ); - assert!(!r.is_ok(), "swap with impossible slippage should fail"); + r.assert_error(amm_error(AmmError::SlippageExceeded)); + + // Nothing moved: the trader keeps their input and the pool is untouched. + let trader_a = token_amount(&env.svm.get_account(&token_a).unwrap()); + assert_eq!(trader_a, 1_000_000, "trader balance must be untouched after revert"); + let pa = token_amount(&env.svm.get_account(&env.pool_a).unwrap()); + let pb = token_amount(&env.svm.get_account(&env.pool_b).unwrap()); + assert_eq!(pa, 10_000_000, "pool_a must be untouched after revert"); + assert_eq!(pb, 10_000_000, "pool_b must be untouched after revert"); println!(" SWAP slippage guard correctly rejected"); } From 2bf39c4ef0b13778958f1baee5b3f2ef952f5c5f Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:38:57 +0000 Subject: [PATCH 055/138] vault-strategy: replace em-dashes in prose with regular dashes --- finance/vault-strategy/anchor/README.md | 48 +++++++++---------- .../programs/mock-swap-router/src/error.rs | 4 +- .../src/instructions/initialize_router.rs | 2 +- .../src/instructions/swap_asset_for_usdc.rs | 10 ++-- .../src/instructions/swap_usdc_for_asset.rs | 12 ++--- .../programs/vault-strategy/src/error.rs | 10 ++-- .../src/instructions/collect_fees.rs | 4 +- .../src/instructions/deposit.rs | 6 +-- .../src/instructions/initialize_strategy.rs | 6 +-- .../vault-strategy/src/instructions/invest.rs | 2 +- .../src/instructions/withdraw.rs | 2 +- .../vault-strategy/tests/vault_strategy.rs | 4 +- 12 files changed, 55 insertions(+), 55 deletions(-) diff --git a/finance/vault-strategy/anchor/README.md b/finance/vault-strategy/anchor/README.md index d99e88b1..436c8c3b 100644 --- a/finance/vault-strategy/anchor/README.md +++ b/finance/vault-strategy/anchor/README.md @@ -2,7 +2,7 @@ A manager-run investment vault on Solana. Users deposit [USDC](https://www.investopedia.com/terms/u/usd-coin-usdc.asp) and receive shares representing proportional ownership of a basket of assets. The manager allocates funds across the basket, earns a fee, and depositors withdraw their proportional slice when they choose. -The example uses two stocks as the basket assets: **TSLAx** (Tesla) and **NVDAx** (Nvidia) โ€” [xStocks](https://backed.fi/xstocks) issued on Solana by Backed Finance. In tests these are mock [tokens](https://solana.com/docs/terminology#token). +The example uses two stocks as the basket assets: **TSLAx** (Tesla) and **NVDAx** (Nvidia) - [xStocks](https://backed.fi/xstocks) issued on Solana by Backed Finance. In tests these are mock [tokens](https://solana.com/docs/terminology#token). --- @@ -27,21 +27,21 @@ NAV = vault_usdc_balance + vault_nvda_balance ร— nvda_price_in_usdc ``` -NAV answers: *"if we liquidated the entire vault at today's prices, how many USDC would we get?"* It is used to price new deposits fairly โ€” every depositor pays the same per-share price regardless of when they join. +NAV answers: *"if we liquidated the entire vault at today's prices, how many USDC would we get?"* It is used to price new deposits fairly - every depositor pays the same per-share price regardless of when they join. -Prices come from [Pyth Network](https://pyth.network/) oracle accounts (`PriceUpdateV2`). A staleness window of 60 seconds is enforced โ€” deposits fail if either price is older than that. +Prices come from [Pyth Network](https://pyth.network/) oracle accounts (`PriceUpdateV2`). A staleness window of 60 seconds is enforced - deposits fail if either price is older than that. ### Shares A [share](https://www.investopedia.com/terms/s/shares.asp) (also called an LP token or vault token) represents a fraction of the total vault. If you hold 1% of all shares, you own 1% of every asset in the vault. - **First deposit**: shares are issued 1:1 with USDC base units (sets an initial share price of 1 USDC). -- **Later deposits**: `shares_to_mint = deposit_usdc ร— total_shares / NAV`. If the vault has grown, each new USDC buys fewer shares โ€” correctly reflecting that the vault is worth more per share than when it started. +- **Later deposits**: `shares_to_mint = deposit_usdc ร— total_shares / NAV`. If the vault has grown, each new USDC buys fewer shares - correctly reflecting that the vault is worth more per share than when it started. - Shares are [SPL tokens](https://solana.com/docs/terminology#token) stored in the depositor's [associated token account (ATA)](https://solana.com/docs/terminology#associated-token-account). ### Management Fee -A [management fee](https://www.investopedia.com/terms/m/managementfee.asp) is charged annually as a percentage of assets under management. This vault uses [basis points](https://www.investopedia.com/terms/b/basispoint.asp) (bps) โ€” 100 bps = 1%. +A [management fee](https://www.investopedia.com/terms/m/managementfee.asp) is charged annually as a percentage of assets under management. This vault uses [basis points](https://www.investopedia.com/terms/b/basispoint.asp) (bps) - 100 bps = 1%. The fee is collected by *minting new shares to the manager*, which dilutes existing holders proportionally. This avoids the need to know the current price at fee-collection time: @@ -49,7 +49,7 @@ The fee is collected by *minting new shares to the manager*, which dilutes exist fee_shares = total_shares ร— fee_bps ร— elapsed_seconds / (10_000 ร— 31_536_000) ``` -Anyone can call `collect_fees` โ€” it is permissionless. +Anyone can call `collect_fees` - it is permissionless. ### Basket Allocation and Rebalancing @@ -57,11 +57,11 @@ A [basket](https://www.investopedia.com/terms/b/basket.asp) is a group of assets ### Slippage -[Slippage](https://www.investopedia.com/terms/s/slippage.asp) is the difference between the price you expected and the price you actually received. Every instruction that moves tokens accepts a `minimum_*` parameter โ€” the transaction reverts if the output would fall below that floor. +[Slippage](https://www.investopedia.com/terms/s/slippage.asp) is the difference between the price you expected and the price you actually received. Every instruction that moves tokens accepts a `minimum_*` parameter - the transaction reverts if the output would fall below that floor. ### In-Kind Withdrawal -An [in-kind distribution](https://www.investopedia.com/terms/i/in-kind.asp) means you receive the underlying assets themselves, not cash. When you withdraw from this vault you receive a proportional slice of whatever the vault holds at that moment โ€” some USDC, some TSLAx, some NVDAx โ€” rather than a forced conversion to USDC. You can then sell those assets on a DEX yourself. +An [in-kind distribution](https://www.investopedia.com/terms/i/in-kind.asp) means you receive the underlying assets themselves, not cash. When you withdraw from this vault you receive a proportional slice of whatever the vault holds at that moment - some USDC, some TSLAx, some NVDAx - rather than a forced conversion to USDC. You can then sell those assets on a DEX yourself. --- @@ -75,11 +75,11 @@ An [in-kind distribution](https://www.investopedia.com/terms/i/in-kind.asp) mean | **Bob** | Early depositor | Gain diversified exposure to TSLAx + NVDAx without managing individual positions | | **Carol** | Later depositor | Join the same strategy after it has been running for a while | -Alice's `manager` key can be a [Squads](https://squads.so/) multisig address โ€” the vault stores it as a plain `Pubkey` and checks only that the transaction is signed by it. No code change is needed to use a multisig. +Alice's `manager` key can be a [Squads](https://squads.so/) multisig address - the vault stores it as a plain `Pubkey` and checks only that the transaction is signed by it. No code change is needed to use a multisig. --- -### Step 1 โ€” Alice initialises the vault +### Step 1 - Alice initialises the vault **Instruction:** `initialize_strategy(weight_bps_a=4000, weight_bps_b=6000, fee_bps=100, swap_router, price_feed_a, price_feed_b)` @@ -97,7 +97,7 @@ The weights must sum to 10,000 bps, and `fee_bps` must not exceed `MAX_FEE_BPS` --- -### Step 2 โ€” Bob deposits 1,000 USDC +### Step 2 - Bob deposits 1,000 USDC **Instruction:** `deposit(usdc_amount=1_000_000_000, minimum_shares=990_000_000)` @@ -116,11 +116,11 @@ Bob now holds 100% of the vault. His motivation: rather than buying TSLAx and NV --- -### Step 3 โ€” Alice invests: USDC โ†’ TSLAx and NVDAx +### Step 3 - Alice invests: USDC โ†’ TSLAx and NVDAx Alice calls `invest` twice, once per asset, to deploy the deposited USDC into the basket according to the 40/60 target. -**Instruction (call 1):** `invest(usdc_amount=400_000_000, minimum_asset_out=1_550_000)` โ€” buys TSLAx at $250 +**Instruction (call 1):** `invest(usdc_amount=400_000_000, minimum_asset_out=1_550_000)` - buys TSLAx at $250 **Accounts modified (call 1):** @@ -130,7 +130,7 @@ Alice calls `invest` twice, once per asset, to deploy the deposited USDC into th | `vault_asset_a` (TSLAx) | +1,600,000 base units (1.6 TSLAx @ $250) | | `router_usdc_treasury` | +400 USDC | -**Instruction (call 2):** `invest(usdc_amount=600_000_000, minimum_asset_out=3_300_000)` โ€” buys NVDAx at $180 +**Instruction (call 2):** `invest(usdc_amount=600_000_000, minimum_asset_out=3_300_000)` - buys NVDAx at $180 **Accounts modified (call 2):** @@ -140,11 +140,11 @@ Alice calls `invest` twice, once per asset, to deploy the deposited USDC into th | `vault_asset_b` (NVDAx) | +3,333,333 base units (3.33 NVDAx @ $180) | | `router_usdc_treasury` | +600 USDC | -After both calls the vault holds: ~0 USDC, 1.6 TSLAx, 3.33 NVDAx โ€” all worth ~1,000 USDC at current prices. +After both calls the vault holds: ~0 USDC, 1.6 TSLAx, 3.33 NVDAx - all worth ~1,000 USDC at current prices. --- -### Step 4 โ€” Carol deposits 1,000 USDC (after investing) +### Step 4 - Carol deposits 1,000 USDC (after investing) **Instruction:** `deposit(usdc_amount=1_000_000_000, minimum_shares=990_000_000)` @@ -165,7 +165,7 @@ Bob and Carol now each own ~50% of the vault. --- -### Step 5 โ€” Alice rebalances (optional) +### Step 5 - Alice rebalances (optional) Suppose TSLAx has risen and the allocation has drifted to 45% TSLAx / 55% NVDAx. Alice calls `rebalance` to sell some TSLAx and buy more NVDAx, restoring the 40/60 target. @@ -184,11 +184,11 @@ Two CPI legs execute atomically: | `vault_asset_b` (NVDAx) | +1,111,111 base units | | `router_usdc_treasury` | net: +USDC from TSLAx sale, โˆ’USDC for NVDAx purchase | -If either slippage check fails, both legs revert โ€” no partial rebalance. +If either slippage check fails, both legs revert - no partial rebalance. --- -### Step 6 โ€” Alice collects fees +### Step 6 - Alice collects fees Six months have elapsed. Anyone calls `collect_fees` (it is permissionless). @@ -211,7 +211,7 @@ Bob and Carol are each diluted by ~0.5%. Alice now holds ~0.5% of the vault. --- -### Step 7 โ€” Bob withdraws +### Step 7 - Bob withdraws Bob burns all his shares and receives his proportional slice of the vault in-kind. @@ -241,7 +241,7 @@ Bob receives TSLAx and NVDAx directly in his own ATAs. He can sell them on a DEX | Instruction | Signer | Key Accounts Read | Key Accounts Written | |------------|--------|-------------------|----------------------| -| `initialize_strategy` | manager | โ€” | Strategy PDA, share_mint, vault_usdc, vault_asset_a, vault_asset_b | +| `initialize_strategy` | manager | - | Strategy PDA, share_mint, vault_usdc, vault_asset_a, vault_asset_b | | `deposit` | depositor | vault_usdc, vault_asset_a, vault_asset_b, price_feed_a, price_feed_b | vault_usdc (+), depositor_usdc_ata (โˆ’), depositor_share_ata (+), strategy.total_shares (+) | | `invest` | manager | strategy | vault_usdc (โˆ’), vault_asset (+), router_usdc_treasury (+) | | `rebalance` | manager | strategy | vault_sell (โˆ’), vault_buy (+), vault_usdc (net 0), router_usdc_treasury | @@ -294,16 +294,16 @@ Every account a caller passes is checked against state the program controls, nev This is a **manager-custodial** vault. The strategy [PDA](https://solana.com/docs/terminology#program-derived-address-pda) holds all assets; the manager controls `invest` and `rebalance` with no onchain constraint that they follow the stated allocation. Depositors trust the manager to act in their interest. -The `manager` field is a plain `Pubkey`. It can be a [Squads](https://squads.so/) multisig address โ€” the vault checks only that the transaction carries a valid signature from that key. Squads handles threshold approval before the transaction reaches the vault. No program changes are required. +The `manager` field is a plain `Pubkey`. It can be a [Squads](https://squads.so/) multisig address - the vault checks only that the transaction carries a valid signature from that key. Squads handles threshold approval before the transaction reaches the vault. No program changes are required. --- ## Financial Math Implementation -- No floating point โ€” integer arithmetic only throughout +- No floating point - integer arithmetic only throughout - All intermediate products use `u128` to prevent overflow (`u64 ร— u64` overflows at ~1.8 ร— 10ยนโน) - Multiply before divide to preserve precision -- All arithmetic uses `checked_*` methods โ€” raw `+ - * /` are never used on token amounts +- All arithmetic uses `checked_*` methods - raw `+ - * /` are never used on token amounts - The user always receives floor division; the protocol retains the rounding remainder - `transfer_checked` is used for all SPL token transfers (carries decimals through the CPI to catch wrong-mint errors) diff --git a/finance/vault-strategy/anchor/programs/mock-swap-router/src/error.rs b/finance/vault-strategy/anchor/programs/mock-swap-router/src/error.rs index a92f8c5a..c57935c6 100644 --- a/finance/vault-strategy/anchor/programs/mock-swap-router/src/error.rs +++ b/finance/vault-strategy/anchor/programs/mock-swap-router/src/error.rs @@ -2,9 +2,9 @@ use anchor_lang::prelude::*; #[error_code] pub enum RouterError { - #[msg("Rate is zero โ€” cannot compute swap")] + #[msg("Rate is zero - cannot compute swap")] ZeroRate, - #[msg("Output is below minimum โ€” slippage exceeded")] + #[msg("Output is below minimum - slippage exceeded")] SlippageExceeded, #[msg("Asset mint does not match rate record")] InvalidAssetMint, diff --git a/finance/vault-strategy/anchor/programs/mock-swap-router/src/instructions/initialize_router.rs b/finance/vault-strategy/anchor/programs/mock-swap-router/src/instructions/initialize_router.rs index 8583a450..125ea422 100644 --- a/finance/vault-strategy/anchor/programs/mock-swap-router/src/instructions/initialize_router.rs +++ b/finance/vault-strategy/anchor/programs/mock-swap-router/src/instructions/initialize_router.rs @@ -19,7 +19,7 @@ pub struct InitializeRouterAccountConstraints<'info> { )] pub router_config: Account<'info, RouterConfig>, - /// CHECK: PDA used as mint authority only โ€” no data stored + /// CHECK: PDA used as mint authority only - no data stored #[account( seeds = [b"router_authority"], bump diff --git a/finance/vault-strategy/anchor/programs/mock-swap-router/src/instructions/swap_asset_for_usdc.rs b/finance/vault-strategy/anchor/programs/mock-swap-router/src/instructions/swap_asset_for_usdc.rs index af3664e0..0fdcb429 100644 --- a/finance/vault-strategy/anchor/programs/mock-swap-router/src/instructions/swap_asset_for_usdc.rs +++ b/finance/vault-strategy/anchor/programs/mock-swap-router/src/instructions/swap_asset_for_usdc.rs @@ -30,7 +30,7 @@ pub struct SwapAssetForUsdcAccountConstraints<'info> { #[account(mut)] pub asset_mint: InterfaceAccount<'info, Mint>, - /// Caller's asset token account โ€” asset tokens are burned from here + /// Caller's asset token account - asset tokens are burned from here #[account( mut, associated_token::mint = asset_mint, @@ -39,7 +39,7 @@ pub struct SwapAssetForUsdcAccountConstraints<'info> { )] pub caller_asset_account: InterfaceAccount<'info, TokenAccount>, - /// Caller's USDC account โ€” receives the USDC + /// Caller's USDC account - receives the USDC #[account( mut, associated_token::mint = usdc_mint, @@ -48,7 +48,7 @@ pub struct SwapAssetForUsdcAccountConstraints<'info> { )] pub caller_usdc_account: InterfaceAccount<'info, TokenAccount>, - /// Router's USDC treasury โ€” sends the USDC + /// Router's USDC treasury - sends the USDC #[account( mut, associated_token::mint = usdc_mint, @@ -57,7 +57,7 @@ pub struct SwapAssetForUsdcAccountConstraints<'info> { )] pub router_usdc_treasury: InterfaceAccount<'info, TokenAccount>, - /// CHECK: PDA used as treasury authority โ€” validated by seeds constraint + /// CHECK: PDA used as treasury authority - validated by seeds constraint #[account( seeds = [b"router_authority"], bump @@ -96,7 +96,7 @@ pub fn handle_swap_asset_for_usdc( asset_amount_in, )?; - // Transfer USDC from router treasury to caller โ€” router_authority PDA signs + // Transfer USDC from router treasury to caller - router_authority PDA signs let router_authority_bump = context.bumps.router_authority; let signer_seeds: &[&[&[u8]]] = &[&[b"router_authority", &[router_authority_bump]]]; diff --git a/finance/vault-strategy/anchor/programs/mock-swap-router/src/instructions/swap_usdc_for_asset.rs b/finance/vault-strategy/anchor/programs/mock-swap-router/src/instructions/swap_usdc_for_asset.rs index a1da0640..54b0b78a 100644 --- a/finance/vault-strategy/anchor/programs/mock-swap-router/src/instructions/swap_usdc_for_asset.rs +++ b/finance/vault-strategy/anchor/programs/mock-swap-router/src/instructions/swap_usdc_for_asset.rs @@ -11,7 +11,7 @@ use crate::state::{AssetRate, RouterConfig}; #[derive(Accounts)] pub struct SwapUsdcForAssetAccountConstraints<'info> { - /// The caller โ€” e.g. the vault strategy PDA (can be a signer or a PDA signer via CPI) + /// The caller - e.g. the vault strategy PDA (can be a signer or a PDA signer via CPI) pub caller: Signer<'info>, #[account( @@ -30,7 +30,7 @@ pub struct SwapUsdcForAssetAccountConstraints<'info> { #[account(mut)] pub asset_mint: InterfaceAccount<'info, Mint>, - /// Caller's USDC token account โ€” USDC flows from here to the treasury + /// Caller's USDC token account - USDC flows from here to the treasury #[account( mut, associated_token::mint = usdc_mint, @@ -39,7 +39,7 @@ pub struct SwapUsdcForAssetAccountConstraints<'info> { )] pub caller_usdc_account: InterfaceAccount<'info, TokenAccount>, - /// Caller's asset token account โ€” minted asset tokens land here + /// Caller's asset token account - minted asset tokens land here #[account( mut, associated_token::mint = asset_mint, @@ -48,7 +48,7 @@ pub struct SwapUsdcForAssetAccountConstraints<'info> { )] pub caller_asset_account: InterfaceAccount<'info, TokenAccount>, - /// Router's USDC treasury โ€” receives the USDC payment + /// Router's USDC treasury - receives the USDC payment #[account( mut, associated_token::mint = usdc_mint, @@ -57,7 +57,7 @@ pub struct SwapUsdcForAssetAccountConstraints<'info> { )] pub router_usdc_treasury: InterfaceAccount<'info, TokenAccount>, - /// CHECK: PDA used as mint authority โ€” validated by seeds constraint + /// CHECK: PDA used as mint authority - validated by seeds constraint #[account( seeds = [b"router_authority"], bump @@ -99,7 +99,7 @@ pub fn handle_swap_usdc_for_asset( let cpi_ctx = CpiContext::new(context.accounts.token_program.key(), transfer_accounts); transfer_checked(cpi_ctx, usdc_amount_in, context.accounts.usdc_mint.decimals)?; - // Mint asset tokens to caller โ€” router_authority PDA signs + // Mint asset tokens to caller - router_authority PDA signs let router_authority_bump = context.bumps.router_authority; let signer_seeds: &[&[&[u8]]] = &[&[b"router_authority", &[router_authority_bump]]]; diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/src/error.rs b/finance/vault-strategy/anchor/programs/vault-strategy/src/error.rs index 86224cba..29a29739 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/src/error.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/src/error.rs @@ -4,13 +4,13 @@ use anchor_lang::prelude::*; pub enum VaultError { #[msg("Weights must sum to 10000 basis points")] InvalidWeights, - #[msg("Shares minted are below the minimum โ€” slippage exceeded")] + #[msg("Shares minted are below the minimum - slippage exceeded")] SlippageTooHigh, - #[msg("USDC out is below minimum โ€” slippage exceeded")] + #[msg("USDC out is below minimum - slippage exceeded")] UsdcSlippage, - #[msg("Asset A out is below minimum โ€” slippage exceeded")] + #[msg("Asset A out is below minimum - slippage exceeded")] AssetASlippage, - #[msg("Asset B out is below minimum โ€” slippage exceeded")] + #[msg("Asset B out is below minimum - slippage exceeded")] AssetBSlippage, #[msg("Asset mint is neither asset_a nor asset_b")] InvalidAssetMint, @@ -22,7 +22,7 @@ pub enum VaultError { ZeroShares, #[msg("Cannot deposit zero USDC")] ZeroDeposit, - #[msg("Total shares are zero โ€” cannot compute proportional withdraw")] + #[msg("Total shares are zero - cannot compute proportional withdraw")] ZeroTotalShares, #[msg("Price feed account does not match the strategy's registered feed")] InvalidPriceFeed, diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/collect_fees.rs b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/collect_fees.rs index 2c9708db..086decf8 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/collect_fees.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/collect_fees.rs @@ -29,7 +29,7 @@ pub struct CollectFeesAccountConstraints<'info> { )] pub share_mint: InterfaceAccount<'info, Mint>, - /// Manager's share token account โ€” receives fee shares + /// Manager's share token account - receives fee shares #[account( init_if_needed, payer = payer, @@ -85,7 +85,7 @@ pub fn handle_collect_fees(context: Context) -> R .checked_add(fee_shares) .ok_or(VaultError::MathOverflow)?; - // Mint fee shares to manager โ€” strategy PDA signs + // Mint fee shares to manager - strategy PDA signs let signer_seeds: &[&[&[u8]]] = &[&[b"strategy", manager_key.as_ref(), &[strategy_bump]]]; let mint_accounts = MintTo { diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/deposit.rs b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/deposit.rs index 9a92777c..b2de73e5 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/deposit.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/deposit.rs @@ -100,13 +100,13 @@ pub struct DepositAccountConstraints<'info> { )] pub vault_asset_b: Box>, - /// CHECK: Pyth PriceUpdateV2 for asset_a โ€” key validated against strategy.price_feed_a + /// CHECK: Pyth PriceUpdateV2 for asset_a - key validated against strategy.price_feed_a #[account( constraint = price_feed_a.key() == strategy.price_feed_a @ VaultError::InvalidPriceFeed )] pub price_feed_a: UncheckedAccount<'info>, - /// CHECK: Pyth PriceUpdateV2 for asset_b โ€” key validated against strategy.price_feed_b + /// CHECK: Pyth PriceUpdateV2 for asset_b - key validated against strategy.price_feed_b #[account( constraint = price_feed_b.key() == strategy.price_feed_b @ VaultError::InvalidPriceFeed )] @@ -227,7 +227,7 @@ pub fn handle_deposit( let cpi_ctx = CpiContext::new(context.accounts.token_program.key(), transfer_accounts); transfer_checked(cpi_ctx, usdc_amount, usdc_decimals)?; - // Mint shares to depositor โ€” strategy PDA signs + // Mint shares to depositor - strategy PDA signs let signer_seeds: &[&[&[u8]]] = &[&[b"strategy", manager_key.as_ref(), &[strategy_bump]]]; let mint_accounts = MintTo { diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/initialize_strategy.rs b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/initialize_strategy.rs index 32cbfa28..fd1b7072 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/initialize_strategy.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/initialize_strategy.rs @@ -45,7 +45,7 @@ pub struct InitializeStrategyAccountConstraints<'info> { )] pub share_mint: InterfaceAccount<'info, Mint>, - /// Vault's USDC token account โ€” strategy PDA is the authority + /// Vault's USDC token account - strategy PDA is the authority #[account( init, payer = manager, @@ -55,7 +55,7 @@ pub struct InitializeStrategyAccountConstraints<'info> { )] pub vault_usdc: InterfaceAccount<'info, TokenAccount>, - /// Vault's asset_a token account โ€” strategy PDA is the authority + /// Vault's asset_a token account - strategy PDA is the authority #[account( init, payer = manager, @@ -65,7 +65,7 @@ pub struct InitializeStrategyAccountConstraints<'info> { )] pub vault_asset_a: InterfaceAccount<'info, TokenAccount>, - /// Vault's asset_b token account โ€” strategy PDA is the authority + /// Vault's asset_b token account - strategy PDA is the authority #[account( init, payer = manager, diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/invest.rs b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/invest.rs index 4112368a..91a6ff33 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/invest.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/invest.rs @@ -26,7 +26,7 @@ pub struct InvestAccountConstraints<'info> { pub usdc_mint: Box>, - /// The asset mint to buy โ€” must be asset_mint_a or asset_mint_b + /// The asset mint to buy - must be asset_mint_a or asset_mint_b #[account(mut)] pub asset_mint: Box>, diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/withdraw.rs b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/withdraw.rs index 8d187dce..67c725e5 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/withdraw.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/src/instructions/withdraw.rs @@ -126,7 +126,7 @@ pub fn handle_withdraw( let shares_u128 = shares_to_burn as u128; let total_u128 = total_shares as u128; - // Proportional amounts โ€” floor division (user gets floor) + // Proportional amounts - floor division (user gets floor) let amount_usdc: u64 = (vault_usdc_amount as u128) .checked_mul(shares_u128) .ok_or(VaultError::MathOverflow)? diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs b/finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs index 97431461..4df400e9 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs @@ -469,7 +469,7 @@ fn test_deposit_first() { ) .unwrap(); - // First deposit is 1:1 โ€” shares == usdc_amount + // First deposit is 1:1 - shares == usdc_amount let share_balance = get_token_account_balance(&ctx.svm, &user_share).unwrap(); assert_eq!(share_balance, deposit_amount, "First deposit should be 1:1"); @@ -845,7 +845,7 @@ fn test_withdraw_rejects_slippage() { ctx.vault_program_id, &vault_strategy::instruction::Withdraw { shares_to_burn: shares, - min_usdc_out: deposit_amount + 1, // more than available โ€” should fail + min_usdc_out: deposit_amount + 1, // more than available - should fail min_asset_a_out: 0, min_asset_b_out: 0, } From 65f0645f7e422bea842ec7dd70fa1a544331dc74 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:40:08 +0000 Subject: [PATCH 056/138] escrow: stop the taker pocketing the maker's rent, add native cancel_offer, bind quasar accounts Native: - new cancel_offer instruction (maker-only): abandoned offers no longer lock the maker's tokens forever - take_offer sent vault rent to the taker and offer lamports to an unvalidated 'payer' account; both now close to the maker, moving all lamports with checked arithmetic - take_offer lazily created the MAKER's ATA with the TAKER paying rent; make_offer now creates it maker-paid, take_offer requires it to exist - conservation check compared the maker's token B balance against the TAKER's token A pre-balance (wrong variable) and used panicking assert_eq!; fixed variable, named errors instead of panics - new README Anchor: - take_offer closed the vault to the taker; now closes to the maker - README claimed 'pnpm test' with no package.json and carried a history section about removed TypeScript artifacts; now describes cargo test - touched account structs renamed *AccountConstraints Quasar: - offer and vault both closed to the taker; now close to the maker - offer's token_mint_a/token_mint_b/vault were never validated against offer state: has_one bindings added, vault recorded in state - seeds aligned with the anchor variant ([b"offer", maker, id]); the undocumented one-offer-per-maker divergence is gone - tests assert rent recovery, wrong-mint and wrong-vault rejection https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- finance/escrow/anchor/README.md | 67 +-- .../escrow/src/instructions/cancel_offer.rs | 4 +- .../escrow/src/instructions/make_offer.rs | 17 +- .../escrow/src/instructions/take_offer.rs | 16 +- .../escrow/anchor/programs/escrow/src/lib.rs | 6 +- .../programs/escrow/tests/test_escrow.rs | 49 +- finance/escrow/native/README.md | 46 ++ finance/escrow/native/program/src/error.rs | 15 + .../program/src/instructions/cancel_offer.rs | 133 ++++++ .../program/src/instructions/make_offer.rs | 87 ++-- .../native/program/src/instructions/mod.rs | 3 + .../program/src/instructions/take_offer.rs | 143 +++--- finance/escrow/native/program/src/lib.rs | 2 + finance/escrow/native/program/src/utils.rs | 24 +- finance/escrow/native/program/tests/test.rs | 268 +++++++++-- .../tests/fixtures/escrow_native_program.so | Bin 0 -> 109264 bytes finance/escrow/quasar/README.md | 6 +- .../quasar/src/instructions/cancel_offer.rs | 22 +- .../quasar/src/instructions/make_offer.rs | 29 +- .../quasar/src/instructions/take_offer.rs | 44 +- finance/escrow/quasar/src/lib.rs | 13 +- finance/escrow/quasar/src/state.rs | 8 +- finance/escrow/quasar/src/tests.rs | 444 ++++++++++++++---- 23 files changed, 1102 insertions(+), 344 deletions(-) create mode 100644 finance/escrow/native/README.md create mode 100644 finance/escrow/native/program/src/instructions/cancel_offer.rs create mode 100755 finance/escrow/native/tests/fixtures/escrow_native_program.so diff --git a/finance/escrow/anchor/README.md b/finance/escrow/anchor/README.md index 8564beca..04eca86f 100644 --- a/finance/escrow/anchor/README.md +++ b/finance/escrow/anchor/README.md @@ -1,43 +1,46 @@ # Anchor Escrow -## Introduction +This Solana [program](https://solana.com/docs/terminology#program) is an **escrow** - it lets a **maker** swap a specific amount of one token for a desired amount of another token with a **taker**, atomically and without either party having to trust the other. -This Solana [program](https://solana.com/docs/terminology#program) is an **escrow** - it lets a user swap a specific amount of one token for a desired amount of another token. +For example: Alice offers 10 USDC and wants 100 WIF in return. The program holds Alice's USDC in a vault until someone delivers the WIF, then releases both sides in a single transaction. Neither party can take the other's tokens and run, and there is no spread or middleman fee on the swap. -For example: Alice offers 10 USDC and wants 100 WIF in return. +See also the [native](../native/) and [Quasar](../quasar/) variants of the same program. -Without an escrow, users would have to swap tokens manually and trust each other. The escrow program acts as a trusted third party that only releases tokens to both sides when the swap can complete atomically. Neither party can take the other's tokens and run. +## Accounts and PDAs -Alice and Bob transact directly with each other through the program, so there's no spread or middleman fee taken on the swap. +- **Offer**: a [PDA](https://solana.com/docs/terminology#program-derived-address-pda) with seeds `["offer", maker, id]` storing the offer `id`, the `maker`, the two mints (`token_mint_a` is what the maker offers, `token_mint_b` is what the maker wants), the `token_b_wanted_amount`, and the PDA `bump`. The `id` lets one maker keep multiple offers open at once. +- **Vault**: the offer PDA's associated token account for token A. It holds the maker's offered tokens while the offer is open; only the offer PDA can sign transfers out of it. -## Usage +The maker pays the rent for the offer account and the vault, and every path that closes them (`take_offer`, `cancel_offer`) refunds that rent to the maker. -Run the tests with `pnpm test` (as configured in `Anchor.toml`). +## Lifecycle + +A maker opens an offer with `make_offer`, passing the `id`, `token_a_offered_amount`, and `token_b_wanted_amount`. The maker signs and pays all rent. The handler creates the offer PDA and the vault, creates the maker's token-B associated token account if needed (paid by the maker, so the eventual taker never funds a maker-owned account), moves the offered token A into the vault with `transfer_checked`, and records the offer state. + +A taker settles the offer with `take_offer`. The taker signs. Anchor's constraints bind every account to the stored offer state (`has_one` on the maker and both mints, associated-token constraints on the vault and all token accounts, and the PDA seeds on the offer itself). The handler sends the wanted token B from the taker to the maker, releases the vault's token A to the taker signed by the offer PDA, and closes both the vault and the offer account back to the maker, who paid their rent. The taker's own token-A account is created on the fly if needed, paid by the taker. + +A maker abandons an offer with `cancel_offer`. Only the maker can call it; without it, an unwanted offer would lock the maker's tokens in the vault forever. The handler returns the vault's token A to the maker and closes the vault and offer accounts, refunding both rents to the maker. + +## Setup + +Prerequisites: Rust, the [Agave](https://docs.anza.xyz/) toolchain, and the Anchor CLI. Build the program with: + +```bash +anchor build +``` + +(or `cargo build-sbf` from `programs/escrow/`). The tests load the resulting `target/deploy/escrow.so`. + +## Testing + +The tests are Rust integration tests running against [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) (with [solana-kite](https://crates.io/crates/solana-kite) helpers). After building, run: + +```bash +cargo test +``` + +(`anchor test` runs the same command, per `Anchor.toml`.) The tests cover the make/take flow, the make/cancel flow, rejection of a non-maker cancel, token balances on every leg, and the rent refunds (the maker's lamports recover the offer and vault rent after both take and cancel). ## Credit -Based on [Dean Little's Anchor Escrow](https://github.com/deanmlittle/anchor-escrow-2024), with a few changes to make it easier to discuss in class. - -### Changes from the original - -One challenge when teaching is avoiding ambiguity - names have to be clear and not confused with anything else. - -- Several custom handler functions were replaced by helpers from `@solana-developers/helpers` to reduce file size. -- Shared token-transfer logic now lives in `instructions/shared.rs`. -- The upstream project uses a custom file layout. This version uses the 'multiple files' [Anchor](https://solana.com/docs/terminology#anchor) layout. -- Contexts are separate data structures from the functions that use them. There's no need for OO-style `impl` patterns here - no mutable state is stored in the context, and the methods don't mutate it. -- The name 'deposit' was overloaded. `deposit` is both a verb and a noun, which made the code hard to read: - - deposit #1 โ†’ `token_a_offered_amount` - - deposit #2 (in `make()`) โ†’ `send_offered_tokens_to_vault` - - deposit #3 (in `take()`) โ†’ `send_wanted_tokens_to_maker` -- `seed` was renamed to `id`, because it conflicted with the `seeds` used for [PDA](https://solana.com/docs/terminology#program-derived-address-pda) derivation. -- `Escrow` was used for both the program name and the [account](https://solana.com/docs/terminology#account) that records an offer. People kept confusing the offer account with the vault. - - `Escrow` (the program) โ†’ still `Escrow`. - - `Escrow` (the offer) โ†’ `Offer`. -- `receive` was renamed to `token_b_wanted_amount`, since `receive` is a verb and not a good name for an integer. -- `mint_a` โ†’ `token_mint_a` (what the maker offered and what the taker wants). -- `mint_b` โ†’ `token_mint_b` (what the maker wants and what the taker must offer). -- `makerAtaA` โ†’ `makerTokenAccountA` -- `makerAtaB` โ†’ `makerTokenAccountB` -- `takerAtaA` โ†’ `takerTokenAccountA` -- `takerAtaB` โ†’ `takerTokenAccountB` +Based on [Dean Little's Anchor Escrow](https://github.com/deanmlittle/anchor-escrow-2024), restructured for teaching. diff --git a/finance/escrow/anchor/programs/escrow/src/instructions/cancel_offer.rs b/finance/escrow/anchor/programs/escrow/src/instructions/cancel_offer.rs index 92472a37..c2cd0fb9 100644 --- a/finance/escrow/anchor/programs/escrow/src/instructions/cancel_offer.rs +++ b/finance/escrow/anchor/programs/escrow/src/instructions/cancel_offer.rs @@ -14,7 +14,7 @@ use super::{close_token_account, transfer_tokens}; // account's rent unclaimed). The maker signs, the vault tokens flow back to // the maker, and both the vault and the offer accounts are closed. #[derive(Accounts)] -pub struct CancelOffer<'info> { +pub struct CancelOfferAccountConstraints<'info> { #[account(mut)] pub maker: Signer<'info>, @@ -51,7 +51,7 @@ pub struct CancelOffer<'info> { pub system_program: Program<'info, System>, } -pub fn handle_cancel_offer(context: Context) -> Result<()> { +pub fn handle_cancel_offer(context: Context) -> Result<()> { let maker_key = context.accounts.maker.key(); let id_bytes = context.accounts.offer.id.to_le_bytes(); let bump = [context.accounts.offer.bump]; diff --git a/finance/escrow/anchor/programs/escrow/src/instructions/make_offer.rs b/finance/escrow/anchor/programs/escrow/src/instructions/make_offer.rs index a40ac32f..cee61433 100644 --- a/finance/escrow/anchor/programs/escrow/src/instructions/make_offer.rs +++ b/finance/escrow/anchor/programs/escrow/src/instructions/make_offer.rs @@ -12,7 +12,7 @@ use super::transfer_tokens; // See https://www.anchor-lang.com/docs/references/account-constraints#instruction-attribute #[derive(Accounts)] #[instruction(id: u64)] -pub struct MakeOffer<'info> { +pub struct MakeOfferAccountConstraints<'info> { #[account(mut)] pub maker: Signer<'info>, @@ -30,10 +30,9 @@ pub struct MakeOffer<'info> { )] pub maker_token_account_a: InterfaceAccount<'info, TokenAccount>, - // The maker's token-B ATA used to be init_if_needed on the taker side, which - // meant the taker paid the maker's rent. Initialize it here (paid by the - // maker) so the rent burden lives with the party who chose to open the - // offer. + // The maker's token-B ATA is initialized here, paid by the maker, so the + // rent burden lives with the party who chose to open the offer (take_offer + // requires this account to already exist). #[account( init_if_needed, payer = maker, @@ -68,7 +67,7 @@ pub struct MakeOffer<'info> { // Move the tokens from the maker's ATA to the vault pub fn handle_send_offered_tokens_to_vault( - context: &Context, + context: &Context, token_a_offered_amount: u64, ) -> Result<()> { transfer_tokens( @@ -83,7 +82,11 @@ pub fn handle_send_offered_tokens_to_vault( } // Save the details of the offer to the offer account -pub fn handle_save_offer(context: Context, id: u64, token_b_wanted_amount: u64) -> Result<()> { +pub fn handle_save_offer( + context: Context, + id: u64, + token_b_wanted_amount: u64, +) -> Result<()> { context.accounts.offer.set_inner(Offer { id, maker: context.accounts.maker.key(), diff --git a/finance/escrow/anchor/programs/escrow/src/instructions/take_offer.rs b/finance/escrow/anchor/programs/escrow/src/instructions/take_offer.rs index e3813b65..a8edc1a1 100644 --- a/finance/escrow/anchor/programs/escrow/src/instructions/take_offer.rs +++ b/finance/escrow/anchor/programs/escrow/src/instructions/take_offer.rs @@ -10,7 +10,7 @@ use crate::Offer; use super::{close_token_account, transfer_tokens}; #[derive(Accounts)] -pub struct TakeOffer<'info> { +pub struct TakeOfferAccountConstraints<'info> { #[account(mut)] pub taker: Signer<'info>, @@ -38,9 +38,7 @@ pub struct TakeOffer<'info> { )] pub taker_token_account_b: Box>, - // The maker's token-B ATA is initialized in make_offer (paid by the maker), - // so the taker no longer pays its rent. Treat it as a plain existing account - // here. + // The maker's token-B ATA is initialized in make_offer, paid by the maker. #[account( mut, associated_token::mint = token_mint_b, @@ -73,7 +71,9 @@ pub struct TakeOffer<'info> { pub system_program: Program<'info, System>, } -pub fn handle_send_wanted_tokens_to_maker(context: &Context) -> Result<()> { +pub fn handle_send_wanted_tokens_to_maker( + context: &Context, +) -> Result<()> { transfer_tokens( &context.accounts.taker_token_account_b, &context.accounts.maker_token_account_b, @@ -85,7 +85,7 @@ pub fn handle_send_wanted_tokens_to_maker(context: &Context) -> Resul ) } -pub fn handle_withdraw_and_close_vault(context: Context) -> Result<()> { +pub fn handle_withdraw_and_close_vault(context: Context) -> Result<()> { let maker_key = context.accounts.maker.key(); let id_bytes = context.accounts.offer.id.to_le_bytes(); let bump = [context.accounts.offer.bump]; @@ -101,9 +101,11 @@ pub fn handle_withdraw_and_close_vault(context: Context) -> Result<() Some(offer_seeds), )?; + // The maker paid the vault's rent in make_offer, so the vault closes back + // to the maker (the offer account does the same via `close = maker`). close_token_account( &context.accounts.vault, - &context.accounts.taker.to_account_info(), + &context.accounts.maker.to_account_info(), &context.accounts.offer.to_account_info(), &context.accounts.token_program, Some(offer_seeds), diff --git a/finance/escrow/anchor/programs/escrow/src/lib.rs b/finance/escrow/anchor/programs/escrow/src/lib.rs index 1635afea..fd8307da 100644 --- a/finance/escrow/anchor/programs/escrow/src/lib.rs +++ b/finance/escrow/anchor/programs/escrow/src/lib.rs @@ -14,7 +14,7 @@ pub mod escrow { use super::*; pub fn make_offer( - context: Context, + context: Context, id: u64, token_a_offered_amount: u64, token_b_wanted_amount: u64, @@ -23,7 +23,7 @@ pub mod escrow { instructions::make_offer::handle_save_offer(context, id, token_b_wanted_amount) } - pub fn take_offer(context: Context) -> Result<()> { + pub fn take_offer(context: Context) -> Result<()> { instructions::take_offer::handle_send_wanted_tokens_to_maker(&context)?; instructions::take_offer::handle_withdraw_and_close_vault(context) } @@ -32,7 +32,7 @@ pub mod escrow { // to the maker, and both the vault and offer accounts are closed (rent // refunded to the maker). Without this, abandoned offers would lock funds // forever. - pub fn cancel_offer(context: Context) -> Result<()> { + pub fn cancel_offer(context: Context) -> Result<()> { instructions::cancel_offer::handle_cancel_offer(context) } } diff --git a/finance/escrow/anchor/programs/escrow/tests/test_escrow.rs b/finance/escrow/anchor/programs/escrow/tests/test_escrow.rs index 05f83ea7..db586e80 100644 --- a/finance/escrow/anchor/programs/escrow/tests/test_escrow.rs +++ b/finance/escrow/anchor/programs/escrow/tests/test_escrow.rs @@ -24,6 +24,10 @@ fn ata_program_id() -> Pubkey { .unwrap() } +fn lamports(svm: &LiteSVM, address: &Pubkey) -> u64 { + svm.get_account(address).map(|a| a.lamports).unwrap_or(0) +} + fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { let (ata, _bump) = Pubkey::find_program_address( &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], @@ -130,7 +134,7 @@ fn test_make_offer() { token_b_wanted_amount, } .data(), - escrow::accounts::MakeOffer { + escrow::accounts::MakeOfferAccountConstraints { maker: es.alice.pubkey(), token_mint_a: es.mint_a, token_mint_b: es.mint_b, @@ -188,6 +192,13 @@ fn test_take_offer() { let vault = derive_ata(&offer_pda, &es.mint_a); + // Alice pays the offer + vault rent in make_offer and must recover it all + // when the offer is taken. (Alice's token-B ATA already exists, and the + // payer covers transaction fees, so her lamports should round-trip + // exactly.) + let alice_lamports_before_make = lamports(&es.svm, &es.alice.pubkey()); + let bob_lamports_before_take = lamports(&es.svm, &es.bob.pubkey()); + // Step 1: Alice makes the offer let make_offer_ix = Instruction::new_with_bytes( es.program_id, @@ -197,7 +208,7 @@ fn test_take_offer() { token_b_wanted_amount, } .data(), - escrow::accounts::MakeOffer { + escrow::accounts::MakeOfferAccountConstraints { maker: es.alice.pubkey(), token_mint_a: es.mint_a, token_mint_b: es.mint_b, @@ -230,7 +241,7 @@ fn test_take_offer() { let take_offer_ix = Instruction::new_with_bytes( es.program_id, &escrow::instruction::TakeOffer {}.data(), - escrow::accounts::TakeOffer { + escrow::accounts::TakeOfferAccountConstraints { taker: es.bob.pubkey(), maker: es.alice.pubkey(), token_mint_a: es.mint_a, @@ -278,6 +289,20 @@ fn test_take_offer() { es.svm.get_account(&offer_pda).is_none(), "Offer should be closed after take_offer" ); + + // Rent destinations: Alice (the maker) recovers the offer + vault rent in + // full. Bob (the taker) only paid the rent of his own new token-A ATA. + assert_eq!( + lamports(&es.svm, &es.alice.pubkey()), + alice_lamports_before_make, + "maker must recover the offer and vault rent after take_offer" + ); + let bob_ata_a_rent = lamports(&es.svm, &es.bob_ata_a); + assert_eq!( + lamports(&es.svm, &es.bob.pubkey()), + bob_lamports_before_take - bob_ata_a_rent, + "taker must only pay the rent of their own token-A ATA" + ); } #[test] @@ -298,8 +323,9 @@ fn test_cancel_offer() { ); let vault = derive_ata(&offer_pda, &es.mint_a); - // Snapshot Alice's token-A balance before the offer. + // Snapshot Alice's token-A balance and lamports before the offer. let alice_a_before = get_token_account_balance(&es.svm, &es.alice_ata_a).unwrap(); + let alice_lamports_before_make = lamports(&es.svm, &es.alice.pubkey()); // Alice makes the offer. let make_offer_ix = Instruction::new_with_bytes( @@ -310,7 +336,7 @@ fn test_cancel_offer() { token_b_wanted_amount, } .data(), - escrow::accounts::MakeOffer { + escrow::accounts::MakeOfferAccountConstraints { maker: es.alice.pubkey(), token_mint_a: es.mint_a, token_mint_b: es.mint_b, @@ -341,7 +367,7 @@ fn test_cancel_offer() { let cancel_offer_ix = Instruction::new_with_bytes( es.program_id, &escrow::instruction::CancelOffer {}.data(), - escrow::accounts::CancelOffer { + escrow::accounts::CancelOfferAccountConstraints { maker: es.alice.pubkey(), token_mint_a: es.mint_a, maker_token_account_a: es.alice_ata_a, @@ -374,6 +400,13 @@ fn test_cancel_offer() { // Alice should have her token-A back to its pre-make balance. let alice_a_after = get_token_account_balance(&es.svm, &es.alice_ata_a).unwrap(); assert_eq!(alice_a_after, alice_a_before); + + // Rent destination: Alice recovers the offer + vault rent in full. + assert_eq!( + lamports(&es.svm, &es.alice.pubkey()), + alice_lamports_before_make, + "maker must recover the offer and vault rent after cancel_offer" + ); } #[test] @@ -403,7 +436,7 @@ fn test_cancel_offer_rejects_non_maker() { token_b_wanted_amount, } .data(), - escrow::accounts::MakeOffer { + escrow::accounts::MakeOfferAccountConstraints { maker: es.alice.pubkey(), token_mint_a: es.mint_a, token_mint_b: es.mint_b, @@ -433,7 +466,7 @@ fn test_cancel_offer_rejects_non_maker() { let cancel_offer_ix = Instruction::new_with_bytes( es.program_id, &escrow::instruction::CancelOffer {}.data(), - escrow::accounts::CancelOffer { + escrow::accounts::CancelOfferAccountConstraints { maker: es.bob.pubkey(), token_mint_a: es.mint_a, maker_token_account_a: bob_ata_a, diff --git a/finance/escrow/native/README.md b/finance/escrow/native/README.md new file mode 100644 index 00000000..43990f6d --- /dev/null +++ b/finance/escrow/native/README.md @@ -0,0 +1,46 @@ +# Escrow (Native) + +This Solana program is an **escrow** written directly against `solana-program`, with no framework. It lets a **maker** swap a specific amount of one token for a desired amount of another token with a **taker**, atomically and without either party having to trust the other. + +For example: Alice offers 10 USDC and wants 100 WIF in return. The program holds Alice's USDC in a vault until someone delivers the WIF, then releases both sides in a single transaction. + +See also the [Anchor](../anchor/) and [Quasar](../quasar/) variants of the same program. + +## Accounts and PDAs + +- **Offer**: a PDA with seeds `["offer", maker, id]` storing the offer's `id`, the `maker`, the two mint addresses (`token_mint_a` is what the maker offers, `token_mint_b` is what the maker wants), the `token_b_wanted_amount`, and the PDA `bump`. The `id` lets one maker keep multiple offers open at once. +- **Vault**: the offer PDA's associated token account for mint A. It holds the maker's offered tokens while the offer is open. Only the offer PDA can sign transfers out of it. + +The maker pays the rent for the offer account and the vault (and for their own mint B token account if it does not exist yet). Every path that closes those accounts refunds that rent to the maker. + +## Lifecycle + +A maker opens an offer with the `MakeOffer` instruction, passing the offer `id`, the amount of token A offered, and the amount of token B wanted. The maker signs and pays all rent. The handler derives and creates the offer PDA, creates the vault, creates the maker's mint B token account if needed (so the eventual taker never pays rent for a maker-owned account), and moves the offered token A into the vault with `transfer_checked`. It then verifies the vault holds exactly the offered amount before writing the offer state. + +A taker settles the offer with the `TakeOffer` instruction. The taker signs. The handler validates every passed account against the stored offer state (maker, both mints, the vault address, and the offer PDA itself), requires the maker's mint B token account to already exist, and lazily creates the taker's mint A token account (rent paid by the taker, since it is the taker's own account). It then transfers the wanted token B from the taker to the maker, releases the vault's token A to the taker signed by the offer PDA, and verifies conservation with checked arithmetic: the taker gained exactly the vault balance and the maker gained exactly the wanted amount. Finally it closes the vault and the offer account, refunding both rents to the maker. + +A maker abandons an offer with the `CancelOffer` instruction. Only the maker can call it; without it, an unwanted offer would lock the maker's tokens in the vault forever. The handler validates the accounts against the offer state, returns the vault's token A to the maker's token account, verifies the maker received exactly the vault balance, and closes the vault and offer accounts back to the maker. + +Errors are reported through the named `EscrowError` enum in `program/src/error.rs` (key mismatches, missing maker token account, conservation violations, arithmetic overflow). + +## Setup + +Prerequisites: the [Agave](https://docs.anza.xyz/) toolchain (`cargo build-sbf`) and Rust. + +Build the program into the test fixtures directory: + +```bash +cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures +``` + +(`npm run build-and-test` in `package.json` runs the same command.) + +## Testing + +The tests run against [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm), loading the `.so` built above. After building, run: + +```bash +cargo test --manifest-path=./program/Cargo.toml +``` + +The tests cover the make/take flow, the make/cancel flow, rejection of a non-maker cancel, token balances on every leg, and the rent refunds (the maker's lamports recover the offer and vault rent after both take and cancel). diff --git a/finance/escrow/native/program/src/error.rs b/finance/escrow/native/program/src/error.rs index 7ad3f4d0..d7b66590 100644 --- a/finance/escrow/native/program/src/error.rs +++ b/finance/escrow/native/program/src/error.rs @@ -8,6 +8,21 @@ pub enum EscrowError { #[error("Token account provided does not match expected")] TokenAccountMismatch, + + #[error("Maker account provided does not match the offer's maker")] + MakerMismatch, + + #[error("Token mint provided does not match the offer's mint")] + MintMismatch, + + #[error("Maker's token B account must exist before the offer can be taken")] + MakerTokenAccountBNotInitialized, + + #[error("Token balances after transfer do not balance against the amounts moved")] + TokenConservationViolation, + + #[error("Arithmetic overflow")] + ArithmeticOverflow, } impl From for ProgramError { diff --git a/finance/escrow/native/program/src/instructions/cancel_offer.rs b/finance/escrow/native/program/src/instructions/cancel_offer.rs new file mode 100644 index 00000000..d3a77f5f --- /dev/null +++ b/finance/escrow/native/program/src/instructions/cancel_offer.rs @@ -0,0 +1,133 @@ +use { + crate::{error::*, state::*, utils::*}, + borsh::{BorshDeserialize, BorshSerialize}, + solana_program::{ + account_info::AccountInfo, + entrypoint::ProgramResult, + program::invoke_signed, + program_error::ProgramError, + program_pack::Pack, + pubkey::Pubkey, + }, + spl_token_interface::{ + instruction as token_instruction, + state::{Account as TokenAccount, Mint}, + }, +}; + +// Cancel an outstanding offer. Without this handler, an abandoned offer would +// keep the maker's mint A tokens locked in the vault forever (and the offer +// account's rent unclaimed). Only the maker can cancel: the vault tokens flow +// back to the maker's token A account, and the vault and offer accounts are +// closed with their rent refunded to the maker. +#[derive(BorshDeserialize, BorshSerialize, Debug)] +pub struct CancelOffer {} + +impl CancelOffer { + pub fn process(program_id: &Pubkey, accounts: &[AccountInfo<'_>]) -> ProgramResult { + let [ + offer_info, + token_mint_a, + maker_token_account_a, + vault, + maker, + token_program, + system_program + ] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + // Only the maker may cancel their offer. + if !maker.is_signer { + return Err(ProgramError::MissingRequiredSignature); + } + + let offer = Offer::try_from_slice(&offer_info.data.borrow()[..])?; + + // Validate the passed accounts against the stored offer state. + if &offer.maker != maker.key { + return Err(EscrowError::MakerMismatch.into()); + } + if &offer.token_mint_a != token_mint_a.key { + return Err(EscrowError::MintMismatch.into()); + } + + // Validate the offer account with its signer seeds. + let offer_signer_seeds = &[ + Offer::SEED_PREFIX, + maker.key.as_ref(), + &offer.id.to_le_bytes(), + &[offer.bump], + ]; + + let offer_key = Pubkey::create_program_address(offer_signer_seeds, program_id)?; + + if *offer_info.key != offer_key { + return Err(EscrowError::OfferKeyMismatch.into()); + }; + + // The receiving account is the maker's own token A account, and the + // vault is the offer PDA's associated token account for mint A. + assert_is_associated_token_account(maker_token_account_a.key, maker.key, token_mint_a.key)?; + assert_is_associated_token_account(vault.key, offer_info.key, token_mint_a.key)?; + + let vault_amount_a = TokenAccount::unpack(&vault.data.borrow())?.amount; + let maker_amount_a_before_transfer = + TokenAccount::unpack(&maker_token_account_a.data.borrow())?.amount; + + // `transfer` is deprecated in favour of `transfer_checked`, which also + // verifies the mint and its decimals. Read the decimals from the mint + // account the caller passed in. + let mint_a_decimals = Mint::unpack(&token_mint_a.data.borrow())?.decimals; + + // The vault returns its mint A tokens to the maker, signed by the + // offer PDA. + invoke_signed( + &token_instruction::transfer_checked( + token_program.key, + vault.key, + token_mint_a.key, + maker_token_account_a.key, + offer_info.key, + &[offer_info.key], + vault_amount_a, + mint_a_decimals, + )?, + &[ + token_mint_a.clone(), + vault.clone(), + maker_token_account_a.clone(), + offer_info.clone(), + token_program.clone(), + ], + &[offer_signer_seeds], + )?; + + // Conservation check: the maker got back exactly what the vault held. + let maker_amount_a = TokenAccount::unpack(&maker_token_account_a.data.borrow())?.amount; + let expected_maker_amount_a = maker_amount_a_before_transfer + .checked_add(vault_amount_a) + .ok_or(EscrowError::ArithmeticOverflow)?; + if maker_amount_a != expected_maker_amount_a { + return Err(EscrowError::TokenConservationViolation.into()); + } + + // Close the vault and the offer account. The maker paid the rent for + // both in make_offer, so both refunds go to the maker. + invoke_signed( + &token_instruction::close_account( + token_program.key, + vault.key, + maker.key, + offer_info.key, + &[], + )?, + &[vault.clone(), maker.clone(), offer_info.clone()], + &[offer_signer_seeds], + )?; + + close_offer_account(offer_info, maker, system_program)?; + + Ok(()) + } +} diff --git a/finance/escrow/native/program/src/instructions/make_offer.rs b/finance/escrow/native/program/src/instructions/make_offer.rs index 0b502059..173e35c0 100644 --- a/finance/escrow/native/program/src/instructions/make_offer.rs +++ b/finance/escrow/native/program/src/instructions/make_offer.rs @@ -32,25 +32,25 @@ impl MakeOffer { accounts: &[AccountInfo<'_>], args: MakeOffer, ) -> ProgramResult { - // accounts in order. - // let [ - offer_info, // offer account info - token_mint_a, // token_mint a - token_mint_b, // token mint b - maker_token_account_a, // maker token account a - vault, // vault - maker, // maker - payer, // payer - token_program, // token program - associated_token_program, // associated token program - system_program// system program + offer_info, + token_mint_a, + token_mint_b, + maker_token_account_a, + maker_token_account_b, + vault, + maker, + token_program, + associated_token_program, + system_program ] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; - // ensure the maker signs the instruction - // + // The maker signs and pays the rent for every account created here + // (the offer account, the vault, and the maker's token B account). + // take_offer and cancel_offer later close those accounts back to the + // maker, so the rent always returns to the party who paid it. if !maker.is_signer { return Err(ProgramError::MissingRequiredSignature); } @@ -63,16 +63,18 @@ impl MakeOffer { let (offer_key, bump) = Pubkey::find_program_address(offer_seeds, program_id); - // make sure the offer key is the same - // if *offer_info.key != offer_key { return Err(EscrowError::OfferKeyMismatch.into()); }; - // check vault is owned by the offer account - // + // The vault is the offer PDA's associated token account for mint A. assert_is_associated_token_account(vault.key, offer_info.key, token_mint_a.key)?; + // The maker's token B account receives tokens when the offer is taken. + // Create it now (paid by the maker) so take_offer never has to create + // an account whose rent would fall on the taker. + assert_is_associated_token_account(maker_token_account_b.key, maker.key, token_mint_b.key)?; + let offer = Offer { bump, maker: *maker.key, @@ -85,17 +87,16 @@ impl MakeOffer { let size = borsh::to_vec::(&offer)?.len(); let lamports_required = (Rent::get()?).minimum_balance(size); - // create account - // + // Create the offer account, rent paid by the maker. invoke_signed( &system_instruction::create_account( - payer.key, + maker.key, offer_info.key, lamports_required, size as u64, program_id, ), - &[payer.clone(), offer_info.clone(), system_program.clone()], + &[maker.clone(), offer_info.clone(), system_program.clone()], &[&[ Offer::SEED_PREFIX, maker.key.as_ref(), @@ -104,11 +105,10 @@ impl MakeOffer { ]], )?; - // create the vault token account - // + // Create the vault token account, rent paid by the maker. invoke( &associated_token_account_instruction::create_associated_token_account( - payer.key, + maker.key, offer_info.key, token_mint_a.key, token_program.key, @@ -117,14 +117,36 @@ impl MakeOffer { token_mint_a.clone(), vault.clone(), offer_info.clone(), - payer.clone(), + maker.clone(), system_program.clone(), token_program.clone(), associated_token_program.clone(), ], )?; - // transfer Mint A tokens to vault + // Create the maker's token B account if it does not exist yet, rent + // paid by the maker. + if maker_token_account_b.lamports() == 0 { + invoke( + &associated_token_account_instruction::create_associated_token_account( + maker.key, + maker.key, + token_mint_b.key, + token_program.key, + ), + &[ + token_mint_b.clone(), + maker_token_account_b.clone(), + maker.clone(), + maker.clone(), + system_program.clone(), + token_program.clone(), + associated_token_program.clone(), + ], + )?; + } + + // Move the offered mint A tokens into the vault. // // `transfer` is deprecated in favour of `transfer_checked`, which also // verifies the mint and its decimals. Read the decimals from the mint @@ -150,14 +172,13 @@ impl MakeOffer { ], )?; + // Conservation check: the vault must now hold exactly the offered + // amount. let vault_token_amount = TokenAccount::unpack(&vault.data.borrow())?.amount; + if vault_token_amount != args.token_a_offered_amount { + return Err(EscrowError::TokenConservationViolation.into()); + } - solana_program::msg!("Amount in vault: {}", vault_token_amount); - - assert_eq!(vault_token_amount, args.token_a_offered_amount); - - // write data into offer account - // offer.serialize(&mut *offer_info.data.borrow_mut())?; Ok(()) diff --git a/finance/escrow/native/program/src/instructions/mod.rs b/finance/escrow/native/program/src/instructions/mod.rs index bac9a654..2567ff99 100644 --- a/finance/escrow/native/program/src/instructions/mod.rs +++ b/finance/escrow/native/program/src/instructions/mod.rs @@ -3,3 +3,6 @@ pub use make_offer::*; pub mod take_offer; pub use take_offer::*; + +pub mod cancel_offer; +pub use cancel_offer::*; diff --git a/finance/escrow/native/program/src/instructions/take_offer.rs b/finance/escrow/native/program/src/instructions/take_offer.rs index 0fd4f643..c73bc7e0 100644 --- a/finance/escrow/native/program/src/instructions/take_offer.rs +++ b/finance/escrow/native/program/src/instructions/take_offer.rs @@ -21,43 +21,42 @@ pub struct TakeOffer {} impl TakeOffer { pub fn process(program_id: &Pubkey, accounts: &[AccountInfo<'_>]) -> ProgramResult { - // accounts in order - // let [ - offer_info, // offer account info - token_mint_a, // token mint A - token_mint_b, // token mint b - maker_token_account_b, // maker token a account - taker_token_account_a, // mkaer token b account - taker_token_account_b, // taker token a account - vault, // vault - maker, // maker - taker, // taker - payer, // payer - token_program, // token program - associated_token_program, // associated token program - system_program// system program + offer_info, + token_mint_a, + token_mint_b, + maker_token_account_b, + taker_token_account_a, + taker_token_account_b, + vault, + maker, + taker, + token_program, + associated_token_program, + system_program ] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; - // ensure the taker signs the instruction - // + // The taker signs the instruction. if !taker.is_signer { return Err(ProgramError::MissingRequiredSignature); } - // get the offer data - // let offer = Offer::try_from_slice(&offer_info.data.borrow()[..])?; - // validate the offer - // - assert_eq!(&offer.maker, maker.key); - assert_eq!(&offer.token_mint_a, token_mint_a.key); - assert_eq!(&offer.token_mint_b, token_mint_b.key); + // Validate the passed accounts against the stored offer state. + if &offer.maker != maker.key { + return Err(EscrowError::MakerMismatch.into()); + } + if &offer.token_mint_a != token_mint_a.key { + return Err(EscrowError::MintMismatch.into()); + } + if &offer.token_mint_b != token_mint_b.key { + return Err(EscrowError::MintMismatch.into()); + } - // validate the offer accout with signer seeds + // Validate the offer account with its signer seeds. let offer_signer_seeds = &[ Offer::SEED_PREFIX, maker.key.as_ref(), @@ -67,24 +66,22 @@ impl TakeOffer { let offer_key = Pubkey::create_program_address(offer_signer_seeds, program_id)?; - // make sure the offer key is the same - // if *offer_info.key != offer_key { return Err(EscrowError::OfferKeyMismatch.into()); }; - // validate receiving addresses - // + // Validate receiving addresses, including the vault (the offer PDA's + // associated token account for mint A). assert_is_associated_token_account(maker_token_account_b.key, maker.key, token_mint_b.key)?; assert_is_associated_token_account(taker_token_account_a.key, taker.key, token_mint_a.key)?; + assert_is_associated_token_account(vault.key, offer_info.key, token_mint_a.key)?; - // create taker token A account if needed, before receiveing tokens - // + // Create the taker's token A account if needed. The taker pays this + // rent: it is the taker's own account. if taker_token_account_a.lamports() == 0 { - // create the vault token account invoke( &associated_token_account_instruction::create_associated_token_account( - payer.key, + taker.key, taker.key, token_mint_a.key, token_program.key, @@ -93,7 +90,7 @@ impl TakeOffer { token_mint_a.clone(), taker_token_account_a.clone(), taker.clone(), - payer.clone(), + taker.clone(), system_program.clone(), token_program.clone(), associated_token_program.clone(), @@ -101,31 +98,13 @@ impl TakeOffer { )?; } - // create maker token B account if needed, before receiveing tokens - // + // The maker's token B account was created in make_offer (rent paid by + // the maker). Require it to exist rather than creating it here, which + // would make the taker pay rent for the maker's account. if maker_token_account_b.lamports() == 0 { - // create the vault token account - invoke( - &associated_token_account_instruction::create_associated_token_account( - payer.key, - maker.key, - token_mint_b.key, - token_program.key, - ), - &[ - token_mint_b.clone(), - maker_token_account_b.clone(), - maker.clone(), - payer.clone(), - system_program.clone(), - token_program.clone(), - associated_token_program.clone(), - ], - )?; + return Err(EscrowError::MakerTokenAccountBNotInitialized.into()); } - // read token accounts - // let vault_amount_a = TokenAccount::unpack(&vault.data.borrow())?.amount; let taker_amount_a_before_transfer = TokenAccount::unpack(&taker_token_account_a.data.borrow())?.amount; @@ -150,8 +129,7 @@ impl TakeOffer { let mint_a_decimals = Mint::unpack(&token_mint_a.data.borrow())?.decimals; let mint_b_decimals = Mint::unpack(&token_mint_b.data.borrow())?.decimals; - // taker transfers mint B tokens to the maker - // + // The taker transfers mint B tokens to the maker. invoke( &token_instruction::transfer_checked( token_program.key, @@ -172,8 +150,8 @@ impl TakeOffer { ], )?; - // transfer from vault to taker - // + // The vault releases its mint A tokens to the taker, signed by the + // offer PDA. invoke_signed( &token_instruction::transfer_checked( token_program.key, @@ -196,17 +174,24 @@ impl TakeOffer { &[offer_signer_seeds], )?; + // Conservation check: the taker gained exactly the vault's mint A + // balance and the maker gained exactly the wanted mint B amount. let taker_amount_a = TokenAccount::unpack(&taker_token_account_a.data.borrow())?.amount; let maker_amount_b = TokenAccount::unpack(&maker_token_account_b.data.borrow())?.amount; - assert_eq!( - taker_amount_a, - taker_amount_a_before_transfer + vault_amount_a - ); - assert_eq!( - maker_amount_b, - taker_amount_a_before_transfer + offer.token_b_wanted_amount - ); + let expected_taker_amount_a = taker_amount_a_before_transfer + .checked_add(vault_amount_a) + .ok_or(EscrowError::ArithmeticOverflow)?; + let expected_maker_amount_b = maker_amount_b_before_transfer + .checked_add(offer.token_b_wanted_amount) + .ok_or(EscrowError::ArithmeticOverflow)?; + + if taker_amount_a != expected_taker_amount_a { + return Err(EscrowError::TokenConservationViolation.into()); + } + if maker_amount_b != expected_maker_amount_b { + return Err(EscrowError::TokenConservationViolation.into()); + } let taker_amount_b = TokenAccount::unpack(&taker_token_account_b.data.borrow())?.amount; let vault_amount_a = TokenAccount::unpack(&vault.data.borrow())?.amount; @@ -216,33 +201,21 @@ impl TakeOffer { solana_program::msg!("Maker B Balance After Transfer: {}", maker_amount_b); solana_program::msg!("Taker B Balance After Transfer: {}", taker_amount_b); - // close the vault account - // + // Close the vault and the offer account. The maker paid the rent for + // both in make_offer, so both refunds go to the maker. invoke_signed( &token_instruction::close_account( token_program.key, vault.key, - taker.key, + maker.key, offer_info.key, &[], )?, - &[vault.clone(), taker.clone(), offer_info.clone()], + &[vault.clone(), maker.clone(), offer_info.clone()], &[offer_signer_seeds], )?; - // Send the rent back to the payer - // - let lamports = offer_info.lamports(); - **offer_info.lamports.borrow_mut() -= lamports; - **payer.lamports.borrow_mut() += lamports; - - // Resize the account to zero - // - offer_info.resize(0)?; - - // Assign the account to the System Program - // - offer_info.assign(system_program.key); + close_offer_account(offer_info, maker, system_program)?; Ok(()) } diff --git a/finance/escrow/native/program/src/lib.rs b/finance/escrow/native/program/src/lib.rs index d6a5249e..ecfa1e64 100644 --- a/finance/escrow/native/program/src/lib.rs +++ b/finance/escrow/native/program/src/lib.rs @@ -23,6 +23,7 @@ fn process_instruction( match instruction { EscrowInstruction::MakeOffer(data) => MakeOffer::process(program_id, accounts, data), EscrowInstruction::TakeOffer => TakeOffer::process(program_id, accounts), + EscrowInstruction::CancelOffer => CancelOffer::process(program_id, accounts), } } @@ -30,4 +31,5 @@ fn process_instruction( enum EscrowInstruction { MakeOffer(MakeOffer), TakeOffer, + CancelOffer, } diff --git a/finance/escrow/native/program/src/utils.rs b/finance/escrow/native/program/src/utils.rs index 509e3c97..84c9dc67 100644 --- a/finance/escrow/native/program/src/utils.rs +++ b/finance/escrow/native/program/src/utils.rs @@ -1,5 +1,5 @@ use crate::error::EscrowError; -use solana_program::{program_error::ProgramError, pubkey::Pubkey}; +use solana_program::{account_info::AccountInfo, program_error::ProgramError, pubkey::Pubkey}; pub fn assert_is_associated_token_account( token_address: &Pubkey, @@ -15,3 +15,25 @@ pub fn assert_is_associated_token_account( Ok(()) } + +// Close a program-owned account: move all of its lamports to `destination` +// (the party who paid its rent), wipe its data, and hand it back to the +// System Program. +pub fn close_offer_account<'info>( + offer_info: &AccountInfo<'info>, + destination: &AccountInfo<'info>, + system_program: &AccountInfo<'info>, +) -> Result<(), ProgramError> { + let offer_lamports = offer_info.lamports(); + let destination_lamports = destination.lamports(); + + **offer_info.lamports.borrow_mut() = 0; + **destination.lamports.borrow_mut() = destination_lamports + .checked_add(offer_lamports) + .ok_or(EscrowError::ArithmeticOverflow)?; + + offer_info.resize(0)?; + offer_info.assign(system_program.key); + + Ok(()) +} diff --git a/finance/escrow/native/program/tests/test.rs b/finance/escrow/native/program/tests/test.rs index 379727d5..bbdf29cf 100644 --- a/finance/escrow/native/program/tests/test.rs +++ b/finance/escrow/native/program/tests/test.rs @@ -19,6 +19,7 @@ use { // borsh-encoded `EscrowInstruction` discriminants (see program/src/lib.rs). const MAKE_OFFER: u8 = 0; const TAKE_OFFER: u8 = 1; +const CANCEL_OFFER: u8 = 2; const DECIMALS: u8 = 6; const MINTED_AMOUNT: u64 = 100 * 1_000_000; // 100 tokens at 6 decimals @@ -29,6 +30,17 @@ const OFFER_ID: u64 = 0; /// Sign with `payer` (fee payer) plus any extra signers and send the tx, /// asserting success. fn send(svm: &mut LiteSVM, payer: &Keypair, ixs: &[Instruction], extra_signers: &[&Keypair]) { + try_send(svm, payer, ixs, extra_signers).unwrap(); +} + +/// Sign with `payer` (fee payer) plus any extra signers and send the tx, +/// returning the result. +fn try_send( + svm: &mut LiteSVM, + payer: &Keypair, + ixs: &[Instruction], + extra_signers: &[&Keypair], +) -> Result<(), Box> { let mut signers: Vec<&Keypair> = vec![payer]; signers.extend_from_slice(extra_signers); let tx = Transaction::new_signed_with_payer( @@ -37,7 +49,7 @@ fn send(svm: &mut LiteSVM, payer: &Keypair, ixs: &[Instruction], extra_signers: &signers, svm.latest_blockhash(), ); - svm.send_transaction(tx).unwrap(); + svm.send_transaction(tx).map(|_| ()).map_err(Box::new) } /// Create `mint`, an ATA for `holder`, and mint `MINTED_AMOUNT` into it. The @@ -83,8 +95,27 @@ fn token_amount(svm: &LiteSVM, address: &Pubkey) -> u64 { TokenAccount::unpack(&account.data).unwrap().amount } -#[test] -fn test_escrow_make_and_take() { +fn lamports(svm: &LiteSVM, address: &Pubkey) -> u64 { + svm.get_account(address).map(|a| a.lamports).unwrap_or(0) +} + +struct EscrowSetup { + svm: LiteSVM, + program_id: Pubkey, + payer: Keypair, + maker: Keypair, + taker: Keypair, + mint_a: Keypair, + mint_b: Keypair, + offer: Pubkey, + vault: Pubkey, + maker_account_a: Pubkey, + maker_account_b: Pubkey, + taker_account_a: Pubkey, + taker_account_b: Pubkey, +} + +fn setup() -> EscrowSetup { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); let program_bytes = include_bytes!("../../tests/fixtures/escrow_native_program.so"); @@ -105,10 +136,6 @@ fn test_escrow_make_and_take() { mint_tokens(&mut svm, &payer, &mint_a, &maker.pubkey()); mint_tokens(&mut svm, &payer, &mint_b, &taker.pubkey()); - let token_program = spl_token_interface::id(); - let ata_program = spl_associated_token_account_interface::program::id(); - let system_program = solana_system_interface::program::ID; - let (offer, _bump) = Pubkey::find_program_address( &[b"offer", maker.pubkey().as_ref(), &OFFER_ID.to_le_bytes()], &program_id, @@ -119,60 +146,205 @@ fn test_escrow_make_and_take() { let taker_account_a = get_associated_token_address(&taker.pubkey(), &mint_a.pubkey()); let taker_account_b = get_associated_token_address(&taker.pubkey(), &mint_b.pubkey()); - // ---- Make Offer ---- + EscrowSetup { + svm, + program_id, + payer, + maker, + taker, + mint_a, + mint_b, + offer, + vault, + maker_account_a, + maker_account_b, + taker_account_a, + taker_account_b, + } +} + +fn make_offer_instruction(es: &EscrowSetup) -> Instruction { let mut make_data = vec![MAKE_OFFER]; make_data.extend_from_slice(&OFFER_ID.to_le_bytes()); make_data.extend_from_slice(&AMOUNT_A.to_le_bytes()); make_data.extend_from_slice(&AMOUNT_B.to_le_bytes()); - let make_ix = Instruction { - program_id, + Instruction { + program_id: es.program_id, accounts: vec![ - AccountMeta::new(offer, false), - AccountMeta::new_readonly(mint_a.pubkey(), false), - AccountMeta::new_readonly(mint_b.pubkey(), false), - AccountMeta::new(maker_account_a, false), - AccountMeta::new(vault, false), - AccountMeta::new(maker.pubkey(), true), - AccountMeta::new(payer.pubkey(), true), - AccountMeta::new_readonly(token_program, false), - AccountMeta::new_readonly(ata_program, false), - AccountMeta::new_readonly(system_program, false), + AccountMeta::new(es.offer, false), + AccountMeta::new_readonly(es.mint_a.pubkey(), false), + AccountMeta::new_readonly(es.mint_b.pubkey(), false), + AccountMeta::new(es.maker_account_a, false), + AccountMeta::new(es.maker_account_b, false), + AccountMeta::new(es.vault, false), + AccountMeta::new(es.maker.pubkey(), true), + AccountMeta::new_readonly(spl_token_interface::id(), false), + AccountMeta::new_readonly(spl_associated_token_account_interface::program::id(), false), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), ], data: make_data, - }; - send(&mut svm, &payer, &[make_ix], &[&maker]); - - // Vault should hold the offered Mint A amount. - assert_eq!(token_amount(&svm, &vault), AMOUNT_A); + } +} - // ---- Take Offer ---- - let take_ix = Instruction { - program_id, +fn take_offer_instruction(es: &EscrowSetup) -> Instruction { + Instruction { + program_id: es.program_id, accounts: vec![ - AccountMeta::new(offer, false), - AccountMeta::new_readonly(mint_a.pubkey(), false), - AccountMeta::new_readonly(mint_b.pubkey(), false), - AccountMeta::new(maker_account_b, false), - AccountMeta::new(taker_account_a, false), - AccountMeta::new(taker_account_b, false), - AccountMeta::new(vault, false), - AccountMeta::new_readonly(maker.pubkey(), false), - AccountMeta::new(taker.pubkey(), true), - AccountMeta::new(payer.pubkey(), true), - AccountMeta::new_readonly(token_program, false), - AccountMeta::new_readonly(ata_program, false), - AccountMeta::new_readonly(system_program, false), + AccountMeta::new(es.offer, false), + AccountMeta::new_readonly(es.mint_a.pubkey(), false), + AccountMeta::new_readonly(es.mint_b.pubkey(), false), + AccountMeta::new(es.maker_account_b, false), + AccountMeta::new(es.taker_account_a, false), + AccountMeta::new(es.taker_account_b, false), + AccountMeta::new(es.vault, false), + AccountMeta::new(es.maker.pubkey(), false), + AccountMeta::new(es.taker.pubkey(), true), + AccountMeta::new_readonly(spl_token_interface::id(), false), + AccountMeta::new_readonly(spl_associated_token_account_interface::program::id(), false), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), ], data: vec![TAKE_OFFER], - }; - send(&mut svm, &payer, &[take_ix], &[&taker]); + } +} + +fn cancel_offer_instruction(es: &EscrowSetup, canceller: &Pubkey) -> Instruction { + Instruction { + program_id: es.program_id, + accounts: vec![ + AccountMeta::new(es.offer, false), + AccountMeta::new_readonly(es.mint_a.pubkey(), false), + AccountMeta::new(es.maker_account_a, false), + AccountMeta::new(es.vault, false), + AccountMeta::new(*canceller, true), + AccountMeta::new_readonly(spl_token_interface::id(), false), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), + ], + data: vec![CANCEL_OFFER], + } +} + +#[test] +fn test_escrow_make_and_take() { + let mut es = setup(); + + // Pre-create the maker's Mint B ATA (paid by the global payer) so the + // maker's lamports can be compared exactly across make + take. + let create_maker_ata_b = create_associated_token_account( + &es.payer.pubkey(), + &es.maker.pubkey(), + &es.mint_b.pubkey(), + &spl_token_interface::id(), + ); + let payer = es.payer.insecure_clone(); + send(&mut es.svm, &payer, &[create_maker_ata_b], &[]); - // Offer + vault should be closed (zero-lamport accounts are purged). - assert!(svm.get_account(&offer).map(|a| a.lamports).unwrap_or(0) == 0); - assert!(svm.get_account(&vault).map(|a| a.lamports).unwrap_or(0) == 0); + let maker_lamports_before_make = lamports(&es.svm, &es.maker.pubkey()); + let taker_lamports_before_take = lamports(&es.svm, &es.taker.pubkey()); + + // ---- Make Offer ---- + let make_ix = make_offer_instruction(&es); + let maker = es.maker.insecure_clone(); + send(&mut es.svm, &payer, &[make_ix], &[&maker]); + + // Vault holds the offered Mint A amount, and the maker paid the rent for + // the offer account and the vault. + assert_eq!(token_amount(&es.svm, &es.vault), AMOUNT_A); + let offer_rent = lamports(&es.svm, &es.offer); + let vault_rent = lamports(&es.svm, &es.vault); + assert!(offer_rent > 0 && vault_rent > 0); + assert_eq!( + lamports(&es.svm, &es.maker.pubkey()), + maker_lamports_before_make - offer_rent - vault_rent + ); + + // ---- Take Offer ---- + let take_ix = take_offer_instruction(&es); + let taker = es.taker.insecure_clone(); + send(&mut es.svm, &payer, &[take_ix], &[&taker]); + + // Offer + vault are closed (zero-lamport accounts are purged). + assert_eq!(lamports(&es.svm, &es.offer), 0); + assert_eq!(lamports(&es.svm, &es.vault), 0); // Taker received Mint A; maker received Mint B. - assert_eq!(token_amount(&svm, &taker_account_a), AMOUNT_A); - assert_eq!(token_amount(&svm, &maker_account_b), AMOUNT_B); + assert_eq!(token_amount(&es.svm, &es.taker_account_a), AMOUNT_A); + assert_eq!(token_amount(&es.svm, &es.maker_account_b), AMOUNT_B); + + // Rent destinations: the maker's lamports fully recover (the offer and + // vault rent both come back to the maker). The taker only paid the rent + // for their own new Mint A ATA. + assert_eq!( + lamports(&es.svm, &es.maker.pubkey()), + maker_lamports_before_make + ); + let taker_ata_a_rent = lamports(&es.svm, &es.taker_account_a); + assert_eq!( + lamports(&es.svm, &es.taker.pubkey()), + taker_lamports_before_take - taker_ata_a_rent + ); +} + +#[test] +fn test_escrow_make_and_cancel() { + let mut es = setup(); + let payer = es.payer.insecure_clone(); + let maker = es.maker.insecure_clone(); + + let maker_lamports_before_make = lamports(&es.svm, &es.maker.pubkey()); + let maker_a_before_make = token_amount(&es.svm, &es.maker_account_a); + + // ---- Make Offer ---- + // The maker has no Mint B ATA yet; make_offer creates it, paid by the + // maker. + let make_ix = make_offer_instruction(&es); + send(&mut es.svm, &payer, &[make_ix], &[&maker]); + assert_eq!(token_amount(&es.svm, &es.vault), AMOUNT_A); + let maker_ata_b_rent = lamports(&es.svm, &es.maker_account_b); + assert!(maker_ata_b_rent > 0); + + // ---- Cancel Offer ---- + let cancel_ix = cancel_offer_instruction(&es, &es.maker.pubkey()); + send(&mut es.svm, &payer, &[cancel_ix], &[&maker]); + + // Offer + vault are closed. + assert_eq!(lamports(&es.svm, &es.offer), 0); + assert_eq!(lamports(&es.svm, &es.vault), 0); + + // The maker's Mint A tokens are back in full. + assert_eq!( + token_amount(&es.svm, &es.maker_account_a), + maker_a_before_make + ); + + // Rent destinations: the offer and vault rent return to the maker. The + // only lamports the maker is down is the rent of their still-open Mint B + // ATA, created during make_offer. + assert_eq!( + lamports(&es.svm, &es.maker.pubkey()), + maker_lamports_before_make - maker_ata_b_rent + ); +} + +#[test] +fn test_cancel_offer_rejects_non_maker() { + let mut es = setup(); + let payer = es.payer.insecure_clone(); + let maker = es.maker.insecure_clone(); + let taker = es.taker.insecure_clone(); + + let make_ix = make_offer_instruction(&es); + send(&mut es.svm, &payer, &[make_ix], &[&maker]); + + // The taker signs a cancel attempt. The offer's stored maker does not + // match the signer, so the program must reject it. + let cancel_ix = cancel_offer_instruction(&es, &es.taker.pubkey()); + let result = try_send(&mut es.svm, &payer, &[cancel_ix], &[&taker]); + assert!( + result.is_err(), + "non-maker must not be able to cancel the offer" + ); + + // The vault still holds the offered tokens. + assert_eq!(token_amount(&es.svm, &es.vault), AMOUNT_A); } diff --git a/finance/escrow/native/tests/fixtures/escrow_native_program.so b/finance/escrow/native/tests/fixtures/escrow_native_program.so new file mode 100755 index 0000000000000000000000000000000000000000..18e0690eed1e53e760f0748b19b41a69c31465ee GIT binary patch literal 109264 zcmdqK3w&KibuYY+q@x!EDRPb?ix?eQennuAoj5TrCUTsIF`;oD$8rs-eJmS4px|TS z*rOeYl!U}dx!@!u7+P-iuwvyF7x!LLyC38`zAaGmYJDmBYToWUZGnoGhk+#e)_*gkej6cX)TV&XSPa##X+qgL~c3#KetWF<8kj?fwS1JS4KsP9+Gk+HF{r~lc( zV`G5G4tz@Dp%IQ#rELLdaEJdFr^B_M8ve@oLF zH2rs)-mK|=)$|Tc|A(e`YxLEozu!V#IlgY7K3l(bbHAiNVg2uL zMK>V*3G4T2TKW^#zn|0D0qIXy{r#F2db;XArSL*;Sbtd4(x0&Y_cbm34eLLuY2im$ z{~=CyJyE9l(x2}7cXK+DD-ti3D~0R2i;IKf)L9xjk}H&wJZbtk!9%_buIqsVTpr2Q zLQY2V1^JnCNf0y;|11EbyHry7I*B1C as=Qxp#D$mrV7$8+9hO7Z__iz?dmPuUB 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 NDOKB, pub token_mint_a: Account, @@ -31,15 +36,21 @@ pub struct CancelOffer { } #[inline(always)] -pub fn handle_withdraw_tokens_and_close_cancel_offer(accounts: &mut CancelOffer, bumps: &CancelOfferBumps) -> Result<(), ProgramError> { +pub fn handle_withdraw_tokens_and_close_cancel_offer( + accounts: &mut CancelOfferAccountConstraints, + bumps: &CancelOfferAccountConstraintsBumps, +) -> Result<(), ProgramError> { + let id_bytes = u64::from(accounts.offer.id).to_le_bytes(); let bump = [bumps.offer]; let seeds = [ Seed::from(b"offer" as &[u8]), Seed::from(accounts.maker.address().as_ref()), + Seed::from(id_bytes.as_ref()), Seed::from(bump.as_ref()), ]; - accounts.token_program + accounts + .token_program .transfer( &accounts.vault, &accounts.maker_token_account_a, @@ -48,7 +59,8 @@ pub fn handle_withdraw_tokens_and_close_cancel_offer(accounts: &mut CancelOffer, ) .invoke_signed(&seeds)?; - accounts.token_program + accounts + .token_program .close_account(&accounts.vault, &accounts.maker, &accounts.offer) .invoke_signed(&seeds)?; Ok(()) diff --git a/finance/escrow/quasar/src/instructions/make_offer.rs b/finance/escrow/quasar/src/instructions/make_offer.rs index 7def1c21..451f5ca9 100644 --- a/finance/escrow/quasar/src/instructions/make_offer.rs +++ b/finance/escrow/quasar/src/instructions/make_offer.rs @@ -5,10 +5,11 @@ use { }; #[derive(Accounts)] -pub struct MakeOffer { +#[instruction(id: u64)] +pub struct MakeOfferAccountConstraints { #[account(mut)] pub maker: Signer, - #[account(mut, init, payer = maker, address = Offer::seeds(maker.address()))] + #[account(mut, init, payer = maker, address = Offer::seeds(maker.address(), id))] pub offer: Account, pub token_mint_a: Account, pub token_mint_b: Account, @@ -34,12 +35,19 @@ pub struct MakeOffer { } #[inline(always)] -pub fn handle_make_offer(accounts: &mut MakeOffer, receive: u64, bumps: &MakeOfferBumps) -> Result<(), ProgramError> { +pub fn handle_make_offer( + accounts: &mut MakeOfferAccountConstraints, + id: u64, + receive: u64, + bumps: &MakeOfferAccountConstraintsBumps, +) -> Result<(), ProgramError> { accounts.offer.set_inner(OfferInner { + id, maker: *accounts.maker.address(), token_mint_a: *accounts.token_mint_a.address(), token_mint_b: *accounts.token_mint_b.address(), maker_token_account_b: *accounts.maker_token_account_b.address(), + vault: *accounts.vault.address(), receive, bump: bumps.offer, }); @@ -47,8 +55,17 @@ pub fn handle_make_offer(accounts: &mut MakeOffer, receive: u64, bumps: &MakeOff } #[inline(always)] -pub fn handle_deposit_tokens(accounts: &mut MakeOffer, amount: u64) -> Result<(), ProgramError> { - accounts.token_program - .transfer(&accounts.maker_token_account_a, &accounts.vault, &accounts.maker, amount) +pub fn handle_deposit_tokens( + accounts: &mut MakeOfferAccountConstraints, + amount: u64, +) -> Result<(), ProgramError> { + accounts + .token_program + .transfer( + &accounts.maker_token_account_a, + &accounts.vault, + &accounts.maker, + amount, + ) .invoke() } diff --git a/finance/escrow/quasar/src/instructions/take_offer.rs b/finance/escrow/quasar/src/instructions/take_offer.rs index a6c0c907..9f036633 100644 --- a/finance/escrow/quasar/src/instructions/take_offer.rs +++ b/finance/escrow/quasar/src/instructions/take_offer.rs @@ -5,16 +5,23 @@ use { }; #[derive(Accounts)] -pub struct TakeOffer { +pub struct TakeOfferAccountConstraints { #[account(mut)] pub taker: Signer, + // Every account the offer recorded at make time is bound to the stored + // state: the maker, both mints, the maker's token B account, and the + // vault. The offer closes back to the maker, who paid its rent in + // make_offer. #[account( mut, has_one(maker), + has_one(token_mint_a), + has_one(token_mint_b), has_one(maker_token_account_b), + has_one(vault), constraints(offer.receive > 0), - close(dest = taker), - address = Offer::seeds(maker.address()) + close(dest = maker), + address = Offer::seeds(maker.address(), offer.id.into()) )] pub offer: Account, #[account(mut)] @@ -30,12 +37,7 @@ pub struct TakeOffer { pub taker_token_account_a: Account, #[account(mut)] pub taker_token_account_b: Account, - #[account( - mut, - init(idempotent), - payer = taker, - token(mint = token_mint_b, authority = maker, token_program = token_program), - )] + #[account(mut)] pub maker_token_account_b: Account, #[account(mut)] pub vault: Account, @@ -45,8 +47,11 @@ pub struct TakeOffer { } #[inline(always)] -pub fn handle_transfer_tokens(accounts: &mut TakeOffer) -> Result<(), ProgramError> { - accounts.token_program +pub fn handle_transfer_tokens( + accounts: &mut TakeOfferAccountConstraints, +) -> Result<(), ProgramError> { + accounts + .token_program .transfer( &accounts.taker_token_account_b, &accounts.maker_token_account_b, @@ -57,15 +62,21 @@ pub fn handle_transfer_tokens(accounts: &mut TakeOffer) -> Result<(), ProgramErr } #[inline(always)] -pub fn handle_withdraw_tokens_and_close_take(accounts: &mut TakeOffer, bumps: &TakeOfferBumps) -> Result<(), ProgramError> { +pub fn handle_withdraw_tokens_and_close_take( + accounts: &mut TakeOfferAccountConstraints, + bumps: &TakeOfferAccountConstraintsBumps, +) -> Result<(), ProgramError> { + let id_bytes = u64::from(accounts.offer.id).to_le_bytes(); let bump = [bumps.offer]; let seeds = [ Seed::from(b"offer" as &[u8]), Seed::from(accounts.maker.address().as_ref()), + Seed::from(id_bytes.as_ref()), Seed::from(bump.as_ref()), ]; - accounts.token_program + accounts + .token_program .transfer( &accounts.vault, &accounts.taker_token_account_a, @@ -74,8 +85,11 @@ pub fn handle_withdraw_tokens_and_close_take(accounts: &mut TakeOffer, bumps: &T ) .invoke_signed(&seeds)?; - accounts.token_program - .close_account(&accounts.vault, &accounts.taker, &accounts.offer) + // The maker paid the vault's rent in make_offer, so the vault closes + // back to the maker. + accounts + .token_program + .close_account(&accounts.vault, &accounts.maker, &accounts.offer) .invoke_signed(&seeds)?; Ok(()) } diff --git a/finance/escrow/quasar/src/lib.rs b/finance/escrow/quasar/src/lib.rs index bfb4f76a..bca73112 100644 --- a/finance/escrow/quasar/src/lib.rs +++ b/finance/escrow/quasar/src/lib.rs @@ -18,19 +18,24 @@ mod quasar_escrow { use super::*; #[instruction(discriminator = 0)] - pub fn make_offer(ctx: Ctx, deposit: u64, receive: u64) -> Result<(), ProgramError> { - instructions::make_offer::handle_make_offer(&mut ctx.accounts, receive, &ctx.bumps)?; + pub fn make_offer( + ctx: Ctx, + id: u64, + deposit: u64, + receive: u64, + ) -> Result<(), ProgramError> { + instructions::make_offer::handle_make_offer(&mut ctx.accounts, id, receive, &ctx.bumps)?; instructions::make_offer::handle_deposit_tokens(&mut ctx.accounts, deposit) } #[instruction(discriminator = 1)] - pub fn take_offer(ctx: Ctx) -> Result<(), ProgramError> { + pub fn take_offer(ctx: Ctx) -> Result<(), ProgramError> { instructions::take_offer::handle_transfer_tokens(&mut ctx.accounts)?; instructions::take_offer::handle_withdraw_tokens_and_close_take(&mut ctx.accounts, &ctx.bumps) } #[instruction(discriminator = 2)] - pub fn cancel_offer(ctx: Ctx) -> Result<(), ProgramError> { + pub fn cancel_offer(ctx: Ctx) -> Result<(), ProgramError> { instructions::cancel_offer::handle_withdraw_tokens_and_close_cancel_offer(&mut ctx.accounts, &ctx.bumps) } } diff --git a/finance/escrow/quasar/src/state.rs b/finance/escrow/quasar/src/state.rs index 7357e181..f9a42fea 100644 --- a/finance/escrow/quasar/src/state.rs +++ b/finance/escrow/quasar/src/state.rs @@ -1,14 +1,18 @@ use quasar_lang::prelude::*; /// Offer state: records the maker's desired receive amount and the -/// associated mint/token-account addresses. +/// associated mint/token-account addresses. The `id` seed lets one maker +/// keep multiple offers open at once (matching the Anchor variant's +/// `["offer", maker, id]` seeds). #[account(discriminator = 1, set_inner)] -#[seeds(b"offer", maker: Address)] +#[seeds(b"offer", maker: Address, id: u64)] pub struct Offer { + pub id: u64, pub maker: Address, pub token_mint_a: Address, pub token_mint_b: Address, pub maker_token_account_b: Address, + pub vault: Address, pub receive: u64, pub bump: u8, } diff --git a/finance/escrow/quasar/src/tests.rs b/finance/escrow/quasar/src/tests.rs index ca81289a..b3c678dc 100644 --- a/finance/escrow/quasar/src/tests.rs +++ b/finance/escrow/quasar/src/tests.rs @@ -3,10 +3,17 @@ use { alloc::vec, alloc::vec::Vec, quasar_svm::{Account, Instruction, Pubkey, QuasarSvm}, + solana_program_pack::Pack, spl_token_interface::state::{Account as TokenAccount, AccountState, Mint}, std::println, }; +const OFFER_ID: u64 = 7; +const DEPOSIT_AMOUNT: u64 = 1337; +const RECEIVE_AMOUNT: u64 = 1337; +const STARTING_LAMPORTS: u64 = 1_000_000_000; +const OFFER_ACCOUNT_LAMPORTS: u64 = 2_000_000; + fn setup() -> QuasarSvm { let elf = std::fs::read("target/deploy/quasar_escrow.so").unwrap(); QuasarSvm::new() @@ -15,7 +22,7 @@ fn setup() -> QuasarSvm { } fn signer(address: Pubkey) -> Account { - quasar_svm::token::create_keyed_system_account(&address, 1_000_000_000) + quasar_svm::token::create_keyed_system_account(&address, STARTING_LAMPORTS) } fn empty(address: Pubkey) -> Account { @@ -54,48 +61,75 @@ fn token(address: Pubkey, mint: Pubkey, owner: Pubkey, amount: u64) -> Account { ) } +fn token_amount(account: &Account) -> u64 { + TokenAccount::unpack(&account.data).unwrap().amount +} + +fn derive_offer(maker: &Pubkey, id: u64) -> (Pubkey, u8) { + Pubkey::find_program_address(&[b"offer", maker.as_ref(), &id.to_le_bytes()], &crate::ID) +} + /// Build offer account data manually. /// Layout (from #[account] codegen): /// [disc: 1 byte = 1] +/// [id: 8 bytes (PodU64 LE)] /// [maker: 32 bytes (Address)] /// [token_mint_a: 32 bytes] /// [token_mint_b: 32 bytes] /// [maker_token_account_b: 32 bytes] +/// [vault: 32 bytes] /// [receive: 8 bytes (PodU64 LE)] /// [bump: 1 byte] -/// Total: 138 bytes +/// Total: 178 bytes +#[allow(clippy::too_many_arguments)] fn offer_data( + id: u64, maker: Pubkey, token_mint_a: Pubkey, token_mint_b: Pubkey, maker_token_account_b: Pubkey, + vault: Pubkey, receive: u64, bump: u8, ) -> Vec { - let mut data = Vec::with_capacity(138); + let mut data = Vec::with_capacity(178); data.push(1u8); // discriminator + data.extend_from_slice(&id.to_le_bytes()); data.extend_from_slice(maker.as_ref()); data.extend_from_slice(token_mint_a.as_ref()); data.extend_from_slice(token_mint_b.as_ref()); data.extend_from_slice(maker_token_account_b.as_ref()); + data.extend_from_slice(vault.as_ref()); data.extend_from_slice(&receive.to_le_bytes()); data.push(bump); data } +#[allow(clippy::too_many_arguments)] fn offer_account( address: Pubkey, + id: u64, maker: Pubkey, token_mint_a: Pubkey, token_mint_b: Pubkey, maker_token_account_b: Pubkey, + vault: Pubkey, receive: u64, bump: u8, ) -> Account { Account { address, - lamports: 2_000_000, - data: offer_data(maker, token_mint_a, token_mint_b, maker_token_account_b, receive, bump), + lamports: OFFER_ACCOUNT_LAMPORTS, + data: offer_data( + id, + maker, + token_mint_a, + token_mint_b, + maker_token_account_b, + vault, + receive, + bump, + ), owner: crate::ID, executable: false, } @@ -110,9 +144,10 @@ fn with_signers(mut ix: Instruction, indices: &[usize]) -> Instruction { } /// Build make_offer instruction data. -/// Wire format: [discriminator: u8 = 0] [deposit: u64 LE] [receive: u64 LE] -fn build_make_offer_data(deposit: u64, receive: u64) -> Vec { +/// Wire format: [discriminator: u8 = 0] [id: u64 LE] [deposit: u64 LE] [receive: u64 LE] +fn build_make_offer_data(id: u64, deposit: u64, receive: u64) -> Vec { let mut data = vec![0u8]; + data.extend_from_slice(&id.to_le_bytes()); data.extend_from_slice(&deposit.to_le_bytes()); data.extend_from_slice(&receive.to_le_bytes()); data @@ -130,6 +165,100 @@ fn build_cancel_offer_data() -> Vec { vec![2u8] } +struct TakeOfferFixture { + maker: Pubkey, + taker: Pubkey, + token_mint_a: Pubkey, + token_mint_b: Pubkey, + taker_token_account_a: Pubkey, + taker_token_account_b: Pubkey, + maker_token_account_b: Pubkey, + vault: Pubkey, + offer: Pubkey, + offer_bump: u8, +} + +fn take_offer_fixture() -> TakeOfferFixture { + let maker = Pubkey::new_unique(); + let (offer, offer_bump) = derive_offer(&maker, OFFER_ID); + TakeOfferFixture { + maker, + taker: Pubkey::new_unique(), + token_mint_a: Pubkey::new_unique(), + token_mint_b: Pubkey::new_unique(), + taker_token_account_a: Pubkey::new_unique(), + taker_token_account_b: Pubkey::new_unique(), + maker_token_account_b: Pubkey::new_unique(), + vault: Pubkey::new_unique(), + offer, + offer_bump, + } +} + +/// Build the take_offer instruction for the fixture, allowing the mint A and +/// vault metas to be overridden so attacks with substituted accounts can be +/// expressed. +fn build_take_offer_instruction( + fx: &TakeOfferFixture, + token_mint_a: Pubkey, + vault: Pubkey, +) -> Instruction { + let rent = quasar_svm::solana_sdk_ids::sysvar::rent::ID; + with_signers( + Instruction { + program_id: crate::ID, + accounts: vec![ + solana_instruction::AccountMeta::new(fx.taker.into(), true), + solana_instruction::AccountMeta::new(fx.offer.into(), false), + solana_instruction::AccountMeta::new(fx.maker.into(), false), + solana_instruction::AccountMeta::new_readonly(token_mint_a.into(), false), + solana_instruction::AccountMeta::new_readonly(fx.token_mint_b.into(), false), + solana_instruction::AccountMeta::new(fx.taker_token_account_a.into(), false), + solana_instruction::AccountMeta::new(fx.taker_token_account_b.into(), false), + solana_instruction::AccountMeta::new(fx.maker_token_account_b.into(), false), + solana_instruction::AccountMeta::new(vault.into(), false), + solana_instruction::AccountMeta::new_readonly(rent.into(), false), + solana_instruction::AccountMeta::new_readonly( + quasar_svm::SPL_TOKEN_PROGRAM_ID.into(), + false, + ), + solana_instruction::AccountMeta::new_readonly( + quasar_svm::system_program::ID.into(), + false, + ), + ], + data: build_take_offer_data(), + }, + // taker_token_account_a signs the create_account CPI for its own + // initialization. + &[5], + ) +} + +fn take_offer_fixture_accounts(fx: &TakeOfferFixture) -> Vec { + vec![ + signer(fx.taker), + offer_account( + fx.offer, + OFFER_ID, + fx.maker, + fx.token_mint_a, + fx.token_mint_b, + fx.maker_token_account_b, + fx.vault, + RECEIVE_AMOUNT, + fx.offer_bump, + ), + signer(fx.maker), + mint(fx.token_mint_a, fx.maker), + mint(fx.token_mint_b, fx.maker), + empty(fx.taker_token_account_a), + token(fx.taker_token_account_b, fx.token_mint_b, fx.taker, 10_000), + token(fx.maker_token_account_b, fx.token_mint_b, fx.maker, 0), + token(fx.vault, fx.token_mint_a, fx.offer, DEPOSIT_AMOUNT), + ] +} + #[test] fn test_make_offer() { let mut svm = setup(); @@ -142,11 +271,10 @@ fn test_make_offer() { let maker_token_account_a = Pubkey::new_unique(); let maker_token_account_b = Pubkey::new_unique(); let vault = Pubkey::new_unique(); - let (offer, offer_bump) = - Pubkey::find_program_address(&[b"offer", maker.as_ref()], &crate::ID); + let (offer, offer_bump) = derive_offer(&maker, OFFER_ID); let rent = quasar_svm::solana_sdk_ids::sysvar::rent::ID; - let data = build_make_offer_data(1337, 1337); + let data = build_make_offer_data(OFFER_ID, DEPOSIT_AMOUNT, RECEIVE_AMOUNT); let instruction = with_signers( Instruction { @@ -183,12 +311,31 @@ fn test_make_offer() { assert!(result.is_ok(), "make_offer failed: {:?}", result.raw_result); - // Verify offer state + // Verify offer state (layout documented on offer_data above). let offer_data = &result.account(&offer).unwrap().data; assert_eq!(offer_data[0], 1, "discriminator"); - assert_eq!(&offer_data[1..33], maker.as_ref(), "maker"); - assert_eq!(&offer_data[129..137], &1337u64.to_le_bytes(), "receive"); - assert_eq!(offer_data[137], offer_bump, "bump"); + assert_eq!(&offer_data[1..9], &OFFER_ID.to_le_bytes(), "id"); + assert_eq!(&offer_data[9..41], maker.as_ref(), "maker"); + assert_eq!(&offer_data[41..73], token_mint_a.as_ref(), "token_mint_a"); + assert_eq!(&offer_data[73..105], token_mint_b.as_ref(), "token_mint_b"); + assert_eq!( + &offer_data[105..137], + maker_token_account_b.as_ref(), + "maker_token_account_b" + ); + assert_eq!(&offer_data[137..169], vault.as_ref(), "vault"); + assert_eq!( + &offer_data[169..177], + &RECEIVE_AMOUNT.to_le_bytes(), + "receive" + ); + assert_eq!(offer_data[177], offer_bump, "bump"); + + // The deposit landed in the vault. + assert_eq!( + token_amount(result.account(&vault).unwrap()), + DEPOSIT_AMOUNT + ); println!(" MAKE_OFFER CU: {}", result.compute_units_consumed); } @@ -196,111 +343,240 @@ fn test_make_offer() { #[test] fn test_take_offer() { let mut svm = setup(); + let fx = take_offer_fixture(); + let accounts = take_offer_fixture_accounts(&fx); + let vault_rent = accounts[8].lamports; + + let instruction = build_take_offer_instruction(&fx, fx.token_mint_a, fx.vault); + let result = svm.process_instruction(&instruction, &accounts); + assert!(result.is_ok(), "take_offer failed: {:?}", result.raw_result); + + // Token balances: the taker received the vault's mint A, the maker + // received the wanted mint B. + assert_eq!( + token_amount(result.account(&fx.taker_token_account_a).unwrap()), + DEPOSIT_AMOUNT + ); + assert_eq!( + token_amount(result.account(&fx.maker_token_account_b).unwrap()), + RECEIVE_AMOUNT + ); + + // The offer and vault are closed. + let offer_lamports = result.account(&fx.offer).map(|a| a.lamports).unwrap_or(0); + let vault_lamports = result.account(&fx.vault).map(|a| a.lamports).unwrap_or(0); + assert_eq!(offer_lamports, 0, "offer must be closed"); + assert_eq!(vault_lamports, 0, "vault must be closed"); + + // Rent destinations: the maker recovers the rent of both accounts they + // paid for in make_offer; the taker gains no lamports from the close. + let maker_lamports = result.account(&fx.maker).unwrap().lamports; + let expected_maker_lamports = STARTING_LAMPORTS + .checked_add(OFFER_ACCOUNT_LAMPORTS) + .and_then(|lamports| lamports.checked_add(vault_rent)) + .unwrap(); + assert_eq!( + maker_lamports, expected_maker_lamports, + "maker must recover the offer and vault rent" + ); + let taker_lamports = result.account(&fx.taker).unwrap().lamports; + assert!( + taker_lamports <= STARTING_LAMPORTS, + "taker must not gain lamports from closing the maker's accounts" + ); + + println!(" TAKE_OFFER CU: {}", result.compute_units_consumed); +} + +#[test] +fn test_take_offer_rejects_wrong_mint() { + let mut svm = setup(); + let fx = take_offer_fixture(); + let mut accounts = take_offer_fixture_accounts(&fx); + + // The attacker substitutes a different mint for token_mint_a. The + // has_one(token_mint_a) binding to the offer state must reject it. + let wrong_mint = Pubkey::new_unique(); + accounts[3] = mint(wrong_mint, fx.maker); + + let instruction = build_take_offer_instruction(&fx, wrong_mint, fx.vault); + let result = svm.process_instruction(&instruction, &accounts); + assert!( + !result.is_ok(), + "take_offer must reject a mint that does not match the offer state" + ); +} + +#[test] +fn test_take_offer_rejects_wrong_vault() { + let mut svm = setup(); + let fx = take_offer_fixture(); + let mut accounts = take_offer_fixture_accounts(&fx); + + // The attacker substitutes a different token account (same mint, also + // owned by the offer PDA) for the vault. The has_one(vault) binding to + // the offer state must reject it. + let wrong_vault = Pubkey::new_unique(); + accounts[8] = token(wrong_vault, fx.token_mint_a, fx.offer, DEPOSIT_AMOUNT); + + let instruction = build_take_offer_instruction(&fx, fx.token_mint_a, wrong_vault); + let result = svm.process_instruction(&instruction, &accounts); + assert!( + !result.is_ok(), + "take_offer must reject a vault that does not match the offer state" + ); +} + +#[test] +fn test_cancel_offer() { + let mut svm = setup(); - let token_program = quasar_svm::SPL_TOKEN_PROGRAM_ID; - let system_program = quasar_svm::system_program::ID; let maker = Pubkey::new_unique(); - let taker = Pubkey::new_unique(); let token_mint_a = Pubkey::new_unique(); let token_mint_b = Pubkey::new_unique(); - let taker_token_account_a = Pubkey::new_unique(); - let taker_token_account_b = Pubkey::new_unique(); + let maker_token_account_a = Pubkey::new_unique(); let maker_token_account_b = Pubkey::new_unique(); let vault = Pubkey::new_unique(); - let (offer, offer_bump) = - Pubkey::find_program_address(&[b"offer", maker.as_ref()], &crate::ID); + let (offer, offer_bump) = derive_offer(&maker, OFFER_ID); let rent = quasar_svm::solana_sdk_ids::sysvar::rent::ID; - let data = build_take_offer_data(); - - let instruction = with_signers( - Instruction { - program_id: crate::ID, - accounts: vec![ - solana_instruction::AccountMeta::new(taker.into(), true), - solana_instruction::AccountMeta::new(offer.into(), false), - solana_instruction::AccountMeta::new(maker.into(), false), - solana_instruction::AccountMeta::new_readonly(token_mint_a.into(), false), - solana_instruction::AccountMeta::new_readonly(token_mint_b.into(), false), - solana_instruction::AccountMeta::new(taker_token_account_a.into(), false), - solana_instruction::AccountMeta::new(taker_token_account_b.into(), false), - solana_instruction::AccountMeta::new(maker_token_account_b.into(), false), - solana_instruction::AccountMeta::new(vault.into(), false), - solana_instruction::AccountMeta::new_readonly(rent.into(), false), - solana_instruction::AccountMeta::new_readonly(token_program.into(), false), - solana_instruction::AccountMeta::new_readonly(system_program.into(), false), - ], - data, - }, - &[5, 7], // taker_token_account_a, maker_token_account_b as signers for create_account CPI - ); + let instruction = Instruction { + program_id: crate::ID, + accounts: vec![ + solana_instruction::AccountMeta::new(maker.into(), true), + solana_instruction::AccountMeta::new(offer.into(), false), + solana_instruction::AccountMeta::new_readonly(token_mint_a.into(), false), + solana_instruction::AccountMeta::new(maker_token_account_a.into(), false), + solana_instruction::AccountMeta::new(vault.into(), false), + solana_instruction::AccountMeta::new_readonly(rent.into(), false), + solana_instruction::AccountMeta::new_readonly( + quasar_svm::SPL_TOKEN_PROGRAM_ID.into(), + false, + ), + solana_instruction::AccountMeta::new_readonly( + quasar_svm::system_program::ID.into(), + false, + ), + ], + data: build_cancel_offer_data(), + }; + let vault_account = token(vault, token_mint_a, offer, DEPOSIT_AMOUNT); + let vault_rent = vault_account.lamports; let result = svm.process_instruction( &instruction, &[ - signer(taker), - offer_account(offer, maker, token_mint_a, token_mint_b, maker_token_account_b, 1337, offer_bump), signer(maker), + offer_account( + offer, + OFFER_ID, + maker, + token_mint_a, + token_mint_b, + maker_token_account_b, + vault, + RECEIVE_AMOUNT, + offer_bump, + ), mint(token_mint_a, maker), - mint(token_mint_b, maker), - empty(taker_token_account_a), - token(taker_token_account_b, token_mint_b, taker, 10_000), - empty(maker_token_account_b), - token(vault, token_mint_a, offer, 1337), + // Pre-created with a zero balance so the maker's lamports can be + // compared exactly after the cancel. + token(maker_token_account_a, token_mint_a, maker, 0), + vault_account, ], ); - assert!(result.is_ok(), "take_offer failed: {:?}", result.raw_result); - println!(" TAKE_OFFER CU: {}", result.compute_units_consumed); + assert!( + result.is_ok(), + "cancel_offer failed: {:?}", + result.raw_result + ); + + // The maker got their mint A tokens back. + assert_eq!( + token_amount(result.account(&maker_token_account_a).unwrap()), + DEPOSIT_AMOUNT + ); + + // The offer and vault are closed and their rent returned to the maker. + let offer_lamports = result.account(&offer).map(|a| a.lamports).unwrap_or(0); + let vault_lamports = result.account(&vault).map(|a| a.lamports).unwrap_or(0); + assert_eq!(offer_lamports, 0, "offer must be closed"); + assert_eq!(vault_lamports, 0, "vault must be closed"); + + let maker_lamports = result.account(&maker).unwrap().lamports; + let expected_maker_lamports = STARTING_LAMPORTS + .checked_add(OFFER_ACCOUNT_LAMPORTS) + .and_then(|lamports| lamports.checked_add(vault_rent)) + .unwrap(); + assert_eq!( + maker_lamports, expected_maker_lamports, + "maker must recover the offer and vault rent" + ); + + println!(" CANCEL_OFFER CU: {}", result.compute_units_consumed); } #[test] -fn test_cancel_offer() { +fn test_cancel_offer_rejects_non_maker() { let mut svm = setup(); - let token_program = quasar_svm::SPL_TOKEN_PROGRAM_ID; - let system_program = quasar_svm::system_program::ID; let maker = Pubkey::new_unique(); + let attacker = Pubkey::new_unique(); let token_mint_a = Pubkey::new_unique(); let token_mint_b = Pubkey::new_unique(); - let maker_token_account_a = Pubkey::new_unique(); + let attacker_token_account_a = Pubkey::new_unique(); let maker_token_account_b = Pubkey::new_unique(); let vault = Pubkey::new_unique(); - let (offer, offer_bump) = - Pubkey::find_program_address(&[b"offer", maker.as_ref()], &crate::ID); + let (offer, offer_bump) = derive_offer(&maker, OFFER_ID); let rent = quasar_svm::solana_sdk_ids::sysvar::rent::ID; - let data = build_cancel_offer_data(); - - let instruction = with_signers( - Instruction { - program_id: crate::ID, - accounts: vec![ - solana_instruction::AccountMeta::new(maker.into(), true), - solana_instruction::AccountMeta::new(offer.into(), false), - solana_instruction::AccountMeta::new_readonly(token_mint_a.into(), false), - solana_instruction::AccountMeta::new(maker_token_account_a.into(), false), - solana_instruction::AccountMeta::new(vault.into(), false), - solana_instruction::AccountMeta::new_readonly(rent.into(), false), - solana_instruction::AccountMeta::new_readonly(token_program.into(), false), - solana_instruction::AccountMeta::new_readonly(system_program.into(), false), - ], - data, - }, - &[3], // maker_token_account_a as signer for create_account CPI - ); + // The attacker signs as the "maker". has_one(maker) and the offer's PDA + // seeds both fail to match. + let instruction = Instruction { + program_id: crate::ID, + accounts: vec![ + solana_instruction::AccountMeta::new(attacker.into(), true), + solana_instruction::AccountMeta::new(offer.into(), false), + solana_instruction::AccountMeta::new_readonly(token_mint_a.into(), false), + solana_instruction::AccountMeta::new(attacker_token_account_a.into(), false), + solana_instruction::AccountMeta::new(vault.into(), false), + solana_instruction::AccountMeta::new_readonly(rent.into(), false), + solana_instruction::AccountMeta::new_readonly( + quasar_svm::SPL_TOKEN_PROGRAM_ID.into(), + false, + ), + solana_instruction::AccountMeta::new_readonly( + quasar_svm::system_program::ID.into(), + false, + ), + ], + data: build_cancel_offer_data(), + }; let result = svm.process_instruction( &instruction, &[ - signer(maker), - offer_account(offer, maker, token_mint_a, token_mint_b, maker_token_account_b, 1337, offer_bump), + signer(attacker), + offer_account( + offer, + OFFER_ID, + maker, + token_mint_a, + token_mint_b, + maker_token_account_b, + vault, + RECEIVE_AMOUNT, + offer_bump, + ), mint(token_mint_a, maker), - empty(maker_token_account_a), - token(vault, token_mint_a, offer, 1337), + token(attacker_token_account_a, token_mint_a, attacker, 0), + token(vault, token_mint_a, offer, DEPOSIT_AMOUNT), ], ); - assert!(result.is_ok(), "cancel_offer failed: {:?}", result.raw_result); - println!(" CANCEL_OFFER CU: {}", result.compute_units_consumed); + assert!( + !result.is_ok(), + "cancel_offer must reject a signer who is not the offer's maker" + ); } From 77874073d5dbce9b95b4b49324eeb0d4b0b47035 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:40:33 +0000 Subject: [PATCH 057/138] escrow/native: untrack built program fixture; CI rebuilds it via cargo build-sbf https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- .../tests/fixtures/escrow_native_program.so | Bin 109264 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 finance/escrow/native/tests/fixtures/escrow_native_program.so diff --git a/finance/escrow/native/tests/fixtures/escrow_native_program.so b/finance/escrow/native/tests/fixtures/escrow_native_program.so deleted file mode 100755 index 18e0690eed1e53e760f0748b19b41a69c31465ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109264 zcmdqK3w&KibuYY+q@x!EDRPb?ix?eQennuAoj5TrCUTsIF`;oD$8rs-eJmS4px|TS z*rOeYl!U}dx!@!u7+P-iuwvyF7x!LLyC38`zAaGmYJDmBYToWUZGnoGhk+#e)_*gkej6cX)TV&XSPa##X+qgL~c3#KetWF<8kj?fwS1JS4KsP9+Gk+HF{r~lc( zV`G5G4tz@Dp%IQ#rELLdaEJdFr^B_M8ve@oLF zH2rs)-mK|=)$|Tc|A(e`YxLEozu!V#IlgY7K3l(bbHAiNVg2uL zMK>V*3G4T2TKW^#zn|0D0qIXy{r#F2db;XArSL*;Sbtd4(x0&Y_cbm34eLLuY2im$ z{~=CyJyE9l(x2}7cXK+DD-ti3D~0R2i;IKf)L9xjk}H&wJZbtk!9%_buIqsVTpr2Q zLQY2V1^JnCNf0y;|11EbyHry7I*B1C as=Qxp#D$mrV7$8+9hO7Z__iz?dmPuUB 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 NDOKB Date: Wed, 10 Jun 2026 21:49:42 +0000 Subject: [PATCH 058/138] cnft-vault: enforce a withdraw authority, bounds-check proof lengths, real quasar tests - the vault PDA signed Bubblegum transfers for any caller with an arbitrary new_leaf_owner: anyone could withdraw any cNFT to any address. Both variants now have an initialize_vault instruction that stores an authority on the Vault account, and both withdraw handlers require that authority as a signer (has_one) before the CPI. The README 'Limitations' admission is gone because the limitation is gone - anchor withdraw_two_cnfts passed the client-supplied proof_1_length to split_at unchecked (panic on adversarial input); both variants now require proof_1_length + proof_2_length == remaining accounts, with a named ProofLengthMismatch error, and the quasar variant's silent .min() clamp and ignored proof_2_length are fixed - quasar variant's placeholder tests replaced with a full QuasarSVM port of the LiteSVM harness loading the same mainnet-dumped Bubblegum / Account Compression fixtures: 6 tests covering authority enforcement, replay, two-tree withdraw, and both proof-length failure modes - structs renamed *AccountConstraints; named error enums in both variants https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- compression/cnft-vault/anchor/README.md | 17 +- .../anchor/programs/cnft-vault/src/error.rs | 9 + .../src/instructions/initialize_vault.rs | 27 + .../cnft-vault/src/instructions/mod.rs | 2 + .../src/instructions/withdraw_cnft.rs | 38 +- .../src/instructions/withdraw_two_cnfts.rs | 62 +- .../anchor/programs/cnft-vault/src/lib.rs | 10 +- .../programs/cnft-vault/src/state/mod.rs | 3 + .../programs/cnft-vault/src/state/vault.rs | 14 + .../programs/cnft-vault/tests/test_vault.rs | 431 ++++++++++-- compression/cnft-vault/quasar/Cargo.toml | 7 + compression/cnft-vault/quasar/README.md | 24 +- compression/cnft-vault/quasar/src/error.rs | 14 + .../src/instructions/initialize_vault.rs | 24 + .../cnft-vault/quasar/src/instructions/mod.rs | 3 + .../quasar/src/instructions/withdraw.rs | 47 +- .../quasar/src/instructions/withdraw_two.rs | 107 +-- compression/cnft-vault/quasar/src/lib.rs | 41 +- compression/cnft-vault/quasar/src/state.rs | 13 + compression/cnft-vault/quasar/src/tests.rs | 622 +++++++++++++++++- 20 files changed, 1340 insertions(+), 175 deletions(-) create mode 100644 compression/cnft-vault/anchor/programs/cnft-vault/src/error.rs create mode 100644 compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/initialize_vault.rs create mode 100644 compression/cnft-vault/anchor/programs/cnft-vault/src/state/mod.rs create mode 100644 compression/cnft-vault/anchor/programs/cnft-vault/src/state/vault.rs create mode 100644 compression/cnft-vault/quasar/src/error.rs create mode 100644 compression/cnft-vault/quasar/src/instructions/initialize_vault.rs create mode 100644 compression/cnft-vault/quasar/src/state.rs diff --git a/compression/cnft-vault/anchor/README.md b/compression/cnft-vault/anchor/README.md index 86066aa1..0bf60022 100644 --- a/compression/cnft-vault/anchor/README.md +++ b/compression/cnft-vault/anchor/README.md @@ -2,12 +2,17 @@ Example code for working with Metaplex compressed NFTs (cNFTs) inside Solana [Anchor](https://solana.com/docs/terminology#anchor) [programs](https://solana.com/docs/terminology#program). -The program keeps a PDA-owned vault. You send cNFTs to the vault, then withdraw them via the program's [instruction handlers](https://solana.com/docs/terminology#instruction-handler). +The program keeps a PDA-owned vault. You send cNFTs to the vault, then the vault authority withdraws them via the program's [instruction handlers](https://solana.com/docs/terminology#instruction-handler). -Two handlers: +## Authority model -- A simple transfer that withdraws one cNFT. -- A withdraw that handles two cNFTs in a single transaction. +Deposits are plain Bubblegum transfers to the **vault PDA** (seeds `["cNFT-vault"]`); no program instruction runs on deposit. Because of that, withdraw authorization is per-vault, not per-deposit: `initialize_vault` creates the vault PDA as a `Vault` state account and stores the signer as its **authority**. Both withdraw handlers require that stored authority as a `Signer` (`has_one = authority`) and reject any other signer with `VaultError::InvalidWithdrawAuthority` before the Bubblegum CPI runs. The same PDA doubles as the Bubblegum leaf owner and signs the transfer CPIs via `invoke_signed`. + +Three handlers: + +- `initialize_vault` - creates the vault PDA and stores the withdraw authority. +- `withdraw_cnft` - withdraws one cNFT to a recipient chosen by the authority. +- `withdraw_two_cnfts` - withdraws two cNFTs (possibly from different trees) in a single transaction. The client passes `proof_1_length` and `proof_2_length` to split the proof accounts between the two Bubblegum transfers; the handler rejects lengths that do not add up to the supplied proof accounts with `VaultError::ProofLengthMismatch`. Use this as a reference for working with cNFTs in your own programs. @@ -17,7 +22,7 @@ Use this as a reference for working with cNFTs in your own programs. ## Testing -A Rust [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) integration suite lives in `programs/cnft-vault/tests/`. It loads mainnet-dumped fixture binaries for Bubblegum, SPL Account Compression, and SPL Noop from `tests/fixtures/` (see the README there), so the CPIs run against the real programs in-process. +A Rust [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) integration suite lives in `programs/cnft-vault/tests/`. It loads mainnet-dumped fixture binaries for Bubblegum, SPL Account Compression, and SPL Noop from `tests/fixtures/` (see the README there), so the CPIs run against the real programs in-process. The suite covers authority withdraws (single and two-cNFT), rejection of non-authority signers, stale-root replays, and out-of-range proof lengths. ```bash cargo build-sbf @@ -32,7 +37,7 @@ To deploy your own copy, change the program ID in `lib.rs` and `Anchor.toml`, th ## Limitations -This is a reference implementation. There's no authorization on withdraws - anyone can withdraw any cNFT in the vault. It's not optimized for compute either. Treat it as a proof of concept. +This is a reference implementation and is not optimized for compute. The vault is global to the program deployment: there is one vault PDA with one authority, so anyone who deposits a cNFT is entrusting it to that authority. ## Further resources diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/src/error.rs b/compression/cnft-vault/anchor/programs/cnft-vault/src/error.rs new file mode 100644 index 00000000..a349bac1 --- /dev/null +++ b/compression/cnft-vault/anchor/programs/cnft-vault/src/error.rs @@ -0,0 +1,9 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum VaultError { + #[msg("Only the vault authority may withdraw cNFTs from the vault")] + InvalidWithdrawAuthority, + #[msg("proof_1_length + proof_2_length must equal the number of proof accounts supplied")] + ProofLengthMismatch, +} diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/initialize_vault.rs b/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/initialize_vault.rs new file mode 100644 index 00000000..58cf3389 --- /dev/null +++ b/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/initialize_vault.rs @@ -0,0 +1,27 @@ +use anchor_lang::prelude::*; + +use crate::state::{Vault, VAULT_SEED}; + +#[derive(Accounts)] +pub struct InitializeVaultAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + init, + payer = authority, + space = Vault::DISCRIMINATOR.len() + Vault::INIT_SPACE, + seeds = [VAULT_SEED], + bump, + )] + pub vault: Account<'info, Vault>, + + pub system_program: Program<'info, System>, +} + +pub fn handler(context: Context) -> Result<()> { + let vault = &mut context.accounts.vault; + vault.authority = context.accounts.authority.key(); + vault.bump = context.bumps.vault; + Ok(()) +} diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/mod.rs b/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/mod.rs index 895527e3..435b40c7 100644 --- a/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/mod.rs +++ b/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/mod.rs @@ -1,5 +1,7 @@ +pub mod initialize_vault; pub mod withdraw_cnft; pub mod withdraw_two_cnfts; +pub use initialize_vault::*; pub use withdraw_cnft::*; pub use withdraw_two_cnfts::*; diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_cnft.rs b/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_cnft.rs index d85dbe1e..79dfaed9 100644 --- a/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_cnft.rs +++ b/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_cnft.rs @@ -1,10 +1,24 @@ use anchor_lang::prelude::*; use anchor_lang::solana_program::{instruction::AccountMeta, program::invoke_signed}; +use crate::error::VaultError; +use crate::state::{Vault, VAULT_SEED}; use crate::{build_transfer_instruction, SPLCompression, TransferArgs, MPL_BUBBLEGUM_ID}; #[derive(Accounts)] -pub struct Withdraw<'info> { +pub struct WithdrawCnftAccountConstraints<'info> { + /// The stored vault authority. Only this signer may withdraw. + pub authority: Signer<'info>, + + // The vault PDA owns the cNFTs (as Bubblegum leaf owner) and signs the + // transfer CPI via invoke_signed. + #[account( + seeds = [VAULT_SEED], + bump = vault.bump, + has_one = authority @ VaultError::InvalidWithdrawAuthority, + )] + pub vault: Account<'info, Vault>, + #[account(mut)] #[account( seeds = [merkle_tree.key().as_ref()], @@ -13,30 +27,30 @@ pub struct Withdraw<'info> { )] /// CHECK: This account is modified in the downstream program pub tree_authority: UncheckedAccount<'info>, - #[account( - seeds = [b"cNFT-vault"], - bump, - )] - /// CHECK: This account doesnt even exist (it is just the pda to sign) - pub leaf_owner: UncheckedAccount<'info>, + /// CHECK: This account is neither written to nor read from. pub new_leaf_owner: UncheckedAccount<'info>, + #[account(mut)] /// CHECK: This account is modified in the downstream program pub merkle_tree: UncheckedAccount<'info>, + /// CHECK: This account is neither written to nor read from. pub log_wrapper: UncheckedAccount<'info>, + pub compression_program: Program<'info, SPLCompression>, + // Pin the bubblegum program account to the known mpl-bubblegum id. Without // this constraint the caller could pass any account to the CPI. /// CHECK: address constrained to the mpl-bubblegum program id. #[account(address = MPL_BUBBLEGUM_ID)] pub bubblegum_program: UncheckedAccount<'info>, + pub system_program: Program<'info, System>, } pub fn handler<'info>( - context: Context<'info, Withdraw<'info>>, + context: Context<'info, WithdrawCnftAccountConstraints<'info>>, root: [u8; 32], data_hash: [u8; 32], creator_hash: [u8; 32], @@ -57,8 +71,8 @@ pub fn handler<'info>( let instruction = build_transfer_instruction( context.accounts.tree_authority.key(), - context.accounts.leaf_owner.key(), - context.accounts.leaf_owner.key(), + context.accounts.vault.key(), + context.accounts.vault.key(), context.accounts.new_leaf_owner.key(), context.accounts.merkle_tree.key(), context.accounts.log_wrapper.key(), @@ -78,7 +92,7 @@ pub fn handler<'info>( let mut account_infos = vec![ context.accounts.bubblegum_program.to_account_info(), context.accounts.tree_authority.to_account_info(), - context.accounts.leaf_owner.to_account_info(), + context.accounts.vault.to_account_info(), context.accounts.new_leaf_owner.to_account_info(), context.accounts.merkle_tree.to_account_info(), context.accounts.log_wrapper.to_account_info(), @@ -92,7 +106,7 @@ pub fn handler<'info>( invoke_signed( &instruction, &account_infos, - &[&[b"cNFT-vault", &[context.bumps.leaf_owner]]], + &[&[VAULT_SEED, &[context.accounts.vault.bump]]], )?; Ok(()) diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_two_cnfts.rs b/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_two_cnfts.rs index 0ad80351..fadae6e0 100644 --- a/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_two_cnfts.rs +++ b/compression/cnft-vault/anchor/programs/cnft-vault/src/instructions/withdraw_two_cnfts.rs @@ -1,10 +1,24 @@ use anchor_lang::prelude::*; use anchor_lang::solana_program::{instruction::AccountMeta, program::invoke_signed}; +use crate::error::VaultError; +use crate::state::{Vault, VAULT_SEED}; use crate::{build_transfer_instruction, SPLCompression, TransferArgs, MPL_BUBBLEGUM_ID}; #[derive(Accounts)] -pub struct WithdrawTwo<'info> { +pub struct WithdrawTwoCnftsAccountConstraints<'info> { + /// The stored vault authority. Only this signer may withdraw. + pub authority: Signer<'info>, + + // The vault PDA owns the cNFTs (as Bubblegum leaf owner) and signs both + // transfer CPIs via invoke_signed. + #[account( + seeds = [VAULT_SEED], + bump = vault.bump, + has_one = authority @ VaultError::InvalidWithdrawAuthority, + )] + pub vault: Account<'info, Vault>, + #[account(mut)] #[account( seeds = [merkle_tree1.key().as_ref()], @@ -13,14 +27,10 @@ pub struct WithdrawTwo<'info> { )] /// CHECK: This account is modified in the downstream program pub tree_authority1: UncheckedAccount<'info>, - #[account( - seeds = [b"cNFT-vault"], - bump, - )] - /// CHECK: This account doesnt even exist (it is just the pda to sign) - pub leaf_owner: UncheckedAccount<'info>, + /// CHECK: This account is neither written to nor read from. pub new_leaf_owner1: UncheckedAccount<'info>, + #[account(mut)] /// CHECK: This account is modified in the downstream program pub merkle_tree1: UncheckedAccount<'info>, @@ -33,26 +43,31 @@ pub struct WithdrawTwo<'info> { )] /// CHECK: This account is modified in the downstream program pub tree_authority2: UncheckedAccount<'info>, + /// CHECK: This account is neither written to nor read from. pub new_leaf_owner2: UncheckedAccount<'info>, + #[account(mut)] /// CHECK: This account is modified in the downstream program pub merkle_tree2: UncheckedAccount<'info>, /// CHECK: This account is neither written to nor read from. pub log_wrapper: UncheckedAccount<'info>, + pub compression_program: Program<'info, SPLCompression>, + // Pin the bubblegum program account to the known mpl-bubblegum id. Without // this constraint the caller could pass any account to the two CPI calls. /// CHECK: address constrained to the mpl-bubblegum program id. #[account(address = MPL_BUBBLEGUM_ID)] pub bubblegum_program: UncheckedAccount<'info>, + pub system_program: Program<'info, System>, } #[allow(clippy::too_many_arguments)] pub fn handler<'info>( - context: Context<'info, WithdrawTwo<'info>>, + context: Context<'info, WithdrawTwoCnftsAccountConstraints<'info>>, root1: [u8; 32], data_hash1: [u8; 32], creator_hash1: [u8; 32], @@ -64,7 +79,7 @@ pub fn handler<'info>( creator_hash2: [u8; 32], nonce2: u64, index2: u32, - _proof_2_length: u8, + proof_2_length: u8, ) -> Result<()> { let merkle_tree1 = context.accounts.merkle_tree1.key(); let merkle_tree2 = context.accounts.merkle_tree2.key(); @@ -74,11 +89,22 @@ pub fn handler<'info>( merkle_tree2 ); - let signer_seeds: &[&[u8]] = &[b"cNFT-vault", &[context.bumps.leaf_owner]]; + // The proof lengths are client-supplied: bounds-check them against the + // accounts actually provided before slicing, so adversarial input gets a + // clean named error instead of a panic. + let proof_1_length = proof_1_length as usize; + let proof_2_length = proof_2_length as usize; + require!( + proof_1_length + .checked_add(proof_2_length) + .is_some_and(|total| total == context.remaining_accounts.len()), + VaultError::ProofLengthMismatch + ); + + let signer_seeds: &[&[u8]] = &[VAULT_SEED, &[context.accounts.vault.bump]]; // Split remaining accounts into proof1 and proof2 - let (proof1_accounts, proof2_accounts) = - context.remaining_accounts.split_at(proof_1_length as usize); + let (proof1_accounts, proof2_accounts) = context.remaining_accounts.split_at(proof_1_length); let proof1_metas: Vec = proof1_accounts .iter() @@ -94,8 +120,8 @@ pub fn handler<'info>( msg!("withdrawing cNFT#1"); let instruction1 = build_transfer_instruction( context.accounts.tree_authority1.key(), - context.accounts.leaf_owner.key(), - context.accounts.leaf_owner.key(), + context.accounts.vault.key(), + context.accounts.vault.key(), context.accounts.new_leaf_owner1.key(), context.accounts.merkle_tree1.key(), context.accounts.log_wrapper.key(), @@ -114,7 +140,7 @@ pub fn handler<'info>( let mut account_infos1 = vec![ context.accounts.bubblegum_program.to_account_info(), context.accounts.tree_authority1.to_account_info(), - context.accounts.leaf_owner.to_account_info(), + context.accounts.vault.to_account_info(), context.accounts.new_leaf_owner1.to_account_info(), context.accounts.merkle_tree1.to_account_info(), context.accounts.log_wrapper.to_account_info(), @@ -131,8 +157,8 @@ pub fn handler<'info>( msg!("withdrawing cNFT#2"); let instruction2 = build_transfer_instruction( context.accounts.tree_authority2.key(), - context.accounts.leaf_owner.key(), - context.accounts.leaf_owner.key(), + context.accounts.vault.key(), + context.accounts.vault.key(), context.accounts.new_leaf_owner2.key(), context.accounts.merkle_tree2.key(), context.accounts.log_wrapper.key(), @@ -151,7 +177,7 @@ pub fn handler<'info>( let mut account_infos2 = vec![ context.accounts.bubblegum_program.to_account_info(), context.accounts.tree_authority2.to_account_info(), - context.accounts.leaf_owner.to_account_info(), + context.accounts.vault.to_account_info(), context.accounts.new_leaf_owner2.to_account_info(), context.accounts.merkle_tree2.to_account_info(), context.accounts.log_wrapper.to_account_info(), diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/src/lib.rs b/compression/cnft-vault/anchor/programs/cnft-vault/src/lib.rs index 5d6a3dbe..f86065d0 100644 --- a/compression/cnft-vault/anchor/programs/cnft-vault/src/lib.rs +++ b/compression/cnft-vault/anchor/programs/cnft-vault/src/lib.rs @@ -4,7 +4,9 @@ use anchor_lang::prelude::*; use anchor_lang::solana_program::instruction::{AccountMeta, Instruction}; use borsh::BorshSerialize; +pub mod error; mod instructions; +pub mod state; use instructions::*; declare_id!("Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D"); @@ -85,8 +87,12 @@ pub fn build_transfer_instruction( pub mod cnft_vault { use super::*; + pub fn initialize_vault(context: Context) -> Result<()> { + instructions::initialize_vault::handler(context) + } + pub fn withdraw_cnft<'info>( - context: Context<'info, Withdraw<'info>>, + context: Context<'info, WithdrawCnftAccountConstraints<'info>>, root: [u8; 32], data_hash: [u8; 32], creator_hash: [u8; 32], @@ -98,7 +104,7 @@ pub mod cnft_vault { #[allow(clippy::too_many_arguments)] pub fn withdraw_two_cnfts<'info>( - context: Context<'info, WithdrawTwo<'info>>, + context: Context<'info, WithdrawTwoCnftsAccountConstraints<'info>>, root1: [u8; 32], data_hash1: [u8; 32], creator_hash1: [u8; 32], diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/src/state/mod.rs b/compression/cnft-vault/anchor/programs/cnft-vault/src/state/mod.rs new file mode 100644 index 00000000..2d068824 --- /dev/null +++ b/compression/cnft-vault/anchor/programs/cnft-vault/src/state/mod.rs @@ -0,0 +1,3 @@ +pub mod vault; + +pub use vault::*; diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/src/state/vault.rs b/compression/cnft-vault/anchor/programs/cnft-vault/src/state/vault.rs new file mode 100644 index 00000000..5ce304df --- /dev/null +++ b/compression/cnft-vault/anchor/programs/cnft-vault/src/state/vault.rs @@ -0,0 +1,14 @@ +use anchor_lang::prelude::*; + +/// Seed prefix for the vault PDA. The same PDA stores the withdraw authority +/// and acts as the cNFT leaf owner that signs Bubblegum transfers. +pub const VAULT_SEED: &[u8] = b"cNFT-vault"; + +#[derive(InitSpace)] +#[account] +pub struct Vault { + /// The only signer allowed to withdraw cNFTs from the vault. + pub authority: Pubkey, + + pub bump: u8, +} diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs b/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs index 2b1da953..9e0df7d9 100644 --- a/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs +++ b/compression/cnft-vault/anchor/programs/cnft-vault/tests/test_vault.rs @@ -1,22 +1,33 @@ -//! LiteSVM integration test for the cnft-vault Anchor program. +//! LiteSVM integration tests for the cnft-vault Anchor program. //! -//! Full flow exercised: +//! Shared flow exercised by the tests: //! 1. Load the cnft-vault program plus the three mainnet fixtures //! (mpl-bubblegum, spl-account-compression, spl-noop) into LiteSVM. -//! 2. Allocate + initialize a Bubblegum Merkle tree (max_depth=3, +//! 2. Initialize the vault PDA via `initialize_vault`, storing the +//! withdraw authority. +//! 3. Allocate + initialize a Bubblegum Merkle tree (max_depth=3, //! max_buffer_size=8, canopy=0) via `create_tree_config`. -//! 3. Mint a single cNFT whose leaf_owner is the vault PDA (so the vault +//! 4. Mint a single cNFT whose leaf_owner is the vault PDA (so the vault //! holds it) via `mint_v1`. -//! 4. Recompute `data_hash` / `creator_hash` exactly as Bubblegum does. -//! 5. Build the Merkle proof for leaf 0 (all empty-node siblings) and read +//! 5. Recompute `data_hash` / `creator_hash` exactly as Bubblegum does. +//! 6. Build the Merkle proof for leaf 0 (all empty-node siblings) and read //! the current root from the onchain tree account. -//! 6. Call our program's `withdraw_cnft`, which CPIs Bubblegum `Transfer` -//! signed by the vault PDA (`invoke_signed`), to move the cNFT to a -//! recipient. Assert the transaction succeeds and that a second withdraw -//! with the now-stale root fails (the leaf moved, so the root changed). +//! 7. Call the program's withdraw handlers, which CPI Bubblegum `Transfer` +//! signed by the vault PDA (`invoke_signed`), to move the cNFT(s) to a +//! recipient. +//! +//! Coverage: +//! - withdraw by the stored authority succeeds (single and two-cNFT) +//! - withdraw by a non-authority signer fails with +//! `VaultError::InvalidWithdrawAuthority` +//! - replaying a withdraw with the now-stale root fails +//! - a two-cNFT withdraw whose proof lengths do not match the supplied +//! proof accounts fails with `VaultError::ProofLengthMismatch` instead +//! of panicking inside `split_at` use { borsh::BorshSerialize, + cnft_vault::error::VaultError, litesvm::LiteSVM, solana_instruction::{account_meta::AccountMeta, Instruction}, solana_keccak_hasher::hashv, @@ -112,18 +123,19 @@ fn empty_node(level: u32) -> [u8; 32] { hashv(&[&lower, &lower]).to_bytes() } -// ---- Anchor discriminator for withdraw_cnft -------------------------------- +// ---- Anchor instruction discriminators -------------------------------------- -fn withdraw_cnft_disc() -> [u8; 8] { - // sha256("global:withdraw_cnft")[..8]. Implemented inline to avoid pulling - // a crypto crate that conflicts with the program's solana version. - let digest = sha256(b"global:withdraw_cnft"); +// sha256("global:")[..8]. Implemented inline to avoid pulling +// a crypto crate that conflicts with the program's solana version. +fn anchor_discriminator(handler_name: &str) -> [u8; 8] { + let preimage = format!("global:{handler_name}"); + let digest = sha256(preimage.as_bytes()); let mut out = [0u8; 8]; out.copy_from_slice(&digest[..8]); out } -// Minimal SHA-256 (FIPS 180-4) - only used to derive the Anchor discriminator. +// Minimal SHA-256 (FIPS 180-4) - only used to derive Anchor discriminators. fn sha256(input: &[u8]) -> [u8; 32] { const K: [u32; 64] = [ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, @@ -235,7 +247,7 @@ fn read_current_root(data: &[u8]) -> [u8; 32] { root } -// ---- Helpers --------------------------------------------------------------- +// ---- Transaction helpers ---------------------------------------------------- fn send( svm: &mut LiteSVM, @@ -250,8 +262,42 @@ fn send( svm.send_transaction(tx).map(|_| ()).map_err(Box::new) } -#[test] -fn test_withdraw_cnft() { +/// Assert a failed transaction carries the given program error. +fn assert_custom_error( + result: Result<(), Box>, + expected: VaultError, +) { + let failed = result.expect_err("transaction should fail"); + let expected_code = u32::from(expected); + let error_text = format!("{:?}", failed.err); + assert!( + error_text.contains(&format!("Custom({expected_code})")), + "expected Custom({expected_code}), got: {error_text}" + ); +} + +// ---- Fixture setup ---------------------------------------------------------- + +/// One Bubblegum tree holding a single cNFT owned by the vault PDA, plus +/// everything needed to withdraw it (root, hashes, proof). +struct TreeWithVaultCnft { + merkle_tree: Pubkey, + tree_config: Pubkey, + root: [u8; 32], + data_hash: [u8; 32], + creator_hash: [u8; 32], + proof: [[u8; 32]; MAX_DEPTH as usize], +} + +struct VaultTestContext { + svm: LiteSVM, + payer: Keypair, + /// The keypair stored as the vault's withdraw authority. + authority: Keypair, + vault_pda: Pubkey, +} + +fn setup_vault() -> VaultTestContext { let mut svm = LiteSVM::new(); // Load the cnft-vault program and the three mainnet fixtures. @@ -276,21 +322,58 @@ fn test_withdraw_cnft() { ) .unwrap(); - // Fund payer. let payer = Keypair::new(); svm.airdrop(&payer.pubkey(), 100 * solana_native_token::LAMPORTS_PER_SOL) .unwrap(); - // The vault PDA that owns the cNFT and signs the transfer CPI. - // seeds = [b"cNFT-vault"] under the cnft-vault program. + let authority = Keypair::new(); + svm.airdrop( + &authority.pubkey(), + 10 * solana_native_token::LAMPORTS_PER_SOL, + ) + .unwrap(); + + // The vault PDA that stores the authority, owns the cNFTs (as Bubblegum + // leaf owner) and signs the transfer CPI. let (vault_pda, _vault_bump) = Pubkey::find_program_address(&[b"cNFT-vault"], &CNFT_VAULT_ID); - // The recipient of the withdraw. - let recipient = Keypair::new(); + // initialize_vault: store `authority` on the vault PDA. + let initialize_ix = Instruction { + program_id: CNFT_VAULT_ID, + accounts: vec![ + AccountMeta::new(authority.pubkey(), true), + AccountMeta::new(vault_pda, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: anchor_discriminator("initialize_vault").to_vec(), + }; + let mut svm_context = VaultTestContext { + svm, + payer, + authority, + vault_pda, + }; + let authority_keypair = svm_context.authority.insecure_clone(); + send( + &mut svm_context.svm, + vec![initialize_ix], + &authority_keypair, + &[&authority_keypair], + ) + .expect("initialize_vault should succeed"); + + svm_context +} + +/// Create a Bubblegum tree and mint one cNFT into the vault PDA. +fn create_tree_with_vault_cnft(context: &mut VaultTestContext) -> TreeWithVaultCnft { + let payer = context.payer.insecure_clone(); // Create the Merkle tree account, owned by the compression program. let merkle_tree = Keypair::new(); - let rent = svm.minimum_balance_for_rent_exemption(TREE_ACCOUNT_SIZE); + let rent = context + .svm + .minimum_balance_for_rent_exemption(TREE_ACCOUNT_SIZE); let create_acc = Instruction { program_id: SYSTEM_ID, accounts: vec![ @@ -334,7 +417,7 @@ fn test_withdraw_cnft() { }; send( - &mut svm, + &mut context.svm, vec![create_acc, create_tree_ix], &payer, &[&payer, &merkle_tree], @@ -368,8 +451,8 @@ fn test_withdraw_cnft() { program_id: BUBBLEGUM_ID, accounts: vec![ AccountMeta::new(tree_config, false), - AccountMeta::new_readonly(vault_pda, false), - AccountMeta::new_readonly(vault_pda, false), // leaf_delegate + AccountMeta::new_readonly(context.vault_pda, false), + AccountMeta::new_readonly(context.vault_pda, false), // leaf_delegate AccountMeta::new(merkle_tree.pubkey(), false), AccountMeta::new_readonly(payer.pubkey(), true), AccountMeta::new_readonly(payer.pubkey(), true), // tree_creator_or_delegate @@ -383,7 +466,7 @@ fn test_withdraw_cnft() { d }, }; - send(&mut svm, vec![mint_ix], &payer, &[&payer]).expect("mint_v1 should succeed"); + send(&mut context.svm, vec![mint_ix], &payer, &[&payer]).expect("mint_v1 should succeed"); // Recompute data_hash and creator_hash exactly as Bubblegum does. let data_hash = hash_metadata(&metadata); @@ -393,61 +476,293 @@ fn test_withdraw_cnft() { let proof = [empty_node(0), empty_node(1), empty_node(2)]; // Read the current root from the onchain tree account. - let tree_data = svm.get_account(&merkle_tree.pubkey()).unwrap().data; + let tree_data = context + .svm + .get_account(&merkle_tree.pubkey()) + .unwrap() + .data; let root = read_current_root(&tree_data); - // Build withdraw_cnft via our program. Accounts per Withdraw struct: - // tree_authority (mut), leaf_owner (vault PDA), new_leaf_owner (recipient), - // merkle_tree (mut), log_wrapper, compression_program, bubblegum_program, - // system_program, then proof nodes as remaining accounts. - let mut withdraw_accounts = vec![ - AccountMeta::new(tree_config, false), - AccountMeta::new_readonly(vault_pda, false), - AccountMeta::new_readonly(recipient.pubkey(), false), - AccountMeta::new(merkle_tree.pubkey(), false), + TreeWithVaultCnft { + merkle_tree: merkle_tree.pubkey(), + tree_config, + root, + data_hash, + creator_hash, + proof, + } +} + +// ---- Instruction builders for the program under test ------------------------ + +/// Build withdraw_cnft. Accounts per WithdrawCnftAccountConstraints: +/// authority (signer), vault, tree_authority (mut), new_leaf_owner, +/// merkle_tree (mut), log_wrapper, compression_program, bubblegum_program, +/// system_program, then proof nodes as remaining accounts. +fn build_withdraw_cnft_instruction( + context: &VaultTestContext, + signer: Pubkey, + tree: &TreeWithVaultCnft, + recipient: Pubkey, +) -> Instruction { + let mut accounts = vec![ + AccountMeta::new_readonly(signer, true), + AccountMeta::new_readonly(context.vault_pda, false), + AccountMeta::new(tree.tree_config, false), + AccountMeta::new_readonly(recipient, false), + AccountMeta::new(tree.merkle_tree, false), AccountMeta::new_readonly(NOOP_ID, false), AccountMeta::new_readonly(COMPRESSION_ID, false), AccountMeta::new_readonly(BUBBLEGUM_ID, false), AccountMeta::new_readonly(SYSTEM_ID, false), ]; - for node in proof.iter() { - withdraw_accounts.push(AccountMeta::new_readonly( + for node in tree.proof.iter() { + accounts.push(AccountMeta::new_readonly( Pubkey::new_from_array(*node), false, )); } - let withdraw_data = { - let mut d = withdraw_cnft_disc().to_vec(); - d.extend_from_slice(&root); - d.extend_from_slice(&data_hash); - d.extend_from_slice(&creator_hash); + let data = { + let mut d = anchor_discriminator("withdraw_cnft").to_vec(); + d.extend_from_slice(&tree.root); + d.extend_from_slice(&tree.data_hash); + d.extend_from_slice(&tree.creator_hash); d.extend_from_slice(&0u64.to_le_bytes()); // nonce d.extend_from_slice(&0u32.to_le_bytes()); // index d }; - let withdraw_ix = Instruction { + Instruction { program_id: CNFT_VAULT_ID, - accounts: withdraw_accounts.clone(), - data: withdraw_data.clone(), + accounts, + data, + } +} + +/// Build withdraw_two_cnfts. Accounts per WithdrawTwoCnftsAccountConstraints: +/// authority (signer), vault, tree_authority1 (mut), new_leaf_owner1, +/// merkle_tree1 (mut), tree_authority2 (mut), new_leaf_owner2, +/// merkle_tree2 (mut), log_wrapper, compression_program, bubblegum_program, +/// system_program, then proof1 ++ proof2 as remaining accounts. +fn build_withdraw_two_cnfts_instruction( + context: &VaultTestContext, + signer: Pubkey, + tree1: &TreeWithVaultCnft, + tree2: &TreeWithVaultCnft, + recipient: Pubkey, + proof_1_length: u8, + proof_2_length: u8, +) -> Instruction { + let mut accounts = vec![ + AccountMeta::new_readonly(signer, true), + AccountMeta::new_readonly(context.vault_pda, false), + AccountMeta::new(tree1.tree_config, false), + AccountMeta::new_readonly(recipient, false), + AccountMeta::new(tree1.merkle_tree, false), + AccountMeta::new(tree2.tree_config, false), + AccountMeta::new_readonly(recipient, false), + AccountMeta::new(tree2.merkle_tree, false), + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(BUBBLEGUM_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ]; + for node in tree1.proof.iter().chain(tree2.proof.iter()) { + accounts.push(AccountMeta::new_readonly( + Pubkey::new_from_array(*node), + false, + )); + } + + let data = { + let mut d = anchor_discriminator("withdraw_two_cnfts").to_vec(); + d.extend_from_slice(&tree1.root); + d.extend_from_slice(&tree1.data_hash); + d.extend_from_slice(&tree1.creator_hash); + d.extend_from_slice(&0u64.to_le_bytes()); // nonce1 + d.extend_from_slice(&0u32.to_le_bytes()); // index1 + d.push(proof_1_length); + d.extend_from_slice(&tree2.root); + d.extend_from_slice(&tree2.data_hash); + d.extend_from_slice(&tree2.creator_hash); + d.extend_from_slice(&0u64.to_le_bytes()); // nonce2 + d.extend_from_slice(&0u32.to_le_bytes()); // index2 + d.push(proof_2_length); + d }; - // Withdraw is signed by the payer (the vault PDA signs via invoke_signed - // inside the program, not as a transaction signer). - send(&mut svm, vec![withdraw_ix], &payer, &[&payer]).expect("withdraw_cnft should succeed"); + Instruction { + program_id: CNFT_VAULT_ID, + accounts, + data, + } +} + +// ---- Tests ------------------------------------------------------------------ + +#[test] +fn test_withdraw_cnft_by_authority() { + let mut context = setup_vault(); + let tree = create_tree_with_vault_cnft(&mut context); + let recipient = Keypair::new(); + let authority = context.authority.insecure_clone(); + + let withdraw_ix = build_withdraw_cnft_instruction( + &context, + authority.pubkey(), + &tree, + recipient.pubkey(), + ); + + // The stored authority signs, so the withdraw succeeds (the vault PDA + // signs the Bubblegum CPI via invoke_signed inside the program). + send( + &mut context.svm, + vec![withdraw_ix.clone()], + &authority, + &[&authority], + ) + .expect("withdraw_cnft signed by the vault authority should succeed"); // After transfer, leaf 0's owner changed (vault -> recipient), so the root // moved. A second withdraw replaying the same (root, hashes) must fail: the // cached root is stale and the leaf no longer hashes to it for the vault. - let withdraw_ix2 = Instruction { - program_id: CNFT_VAULT_ID, - accounts: withdraw_accounts, - data: withdraw_data, - }; - let second = send(&mut svm, vec![withdraw_ix2], &payer, &[&payer]); + let second = send( + &mut context.svm, + vec![withdraw_ix], + &authority, + &[&authority], + ); assert!( second.is_err(), "second withdraw must fail: leaf already transferred out of the vault" ); } + +#[test] +fn test_withdraw_cnft_rejected_for_non_authority() { + let mut context = setup_vault(); + let tree = create_tree_with_vault_cnft(&mut context); + let recipient = Keypair::new(); + + // An attacker funds and signs their own withdraw attempt; the vault's + // stored authority did not sign. + let attacker = Keypair::new(); + context + .svm + .airdrop( + &attacker.pubkey(), + 10 * solana_native_token::LAMPORTS_PER_SOL, + ) + .unwrap(); + + let withdraw_ix = + build_withdraw_cnft_instruction(&context, attacker.pubkey(), &tree, recipient.pubkey()); + + let result = send(&mut context.svm, vec![withdraw_ix], &attacker, &[&attacker]); + assert_custom_error(result, VaultError::InvalidWithdrawAuthority); +} + +#[test] +fn test_withdraw_two_cnfts_by_authority() { + let mut context = setup_vault(); + let tree1 = create_tree_with_vault_cnft(&mut context); + let tree2 = create_tree_with_vault_cnft(&mut context); + let recipient = Keypair::new(); + let authority = context.authority.insecure_clone(); + + let withdraw_ix = build_withdraw_two_cnfts_instruction( + &context, + authority.pubkey(), + &tree1, + &tree2, + recipient.pubkey(), + MAX_DEPTH as u8, + MAX_DEPTH as u8, + ); + + send( + &mut context.svm, + vec![withdraw_ix], + &authority, + &[&authority], + ) + .expect("withdraw_two_cnfts signed by the vault authority should succeed"); + + // Both trees' roots moved, so both cNFTs left the vault: replaying the + // single-tree withdraw against either tree with the cached roots fails. + let replay1 = build_withdraw_cnft_instruction( + &context, + authority.pubkey(), + &tree1, + recipient.pubkey(), + ); + let replay = send(&mut context.svm, vec![replay1], &authority, &[&authority]); + assert!( + replay.is_err(), + "cNFT#1 already left the vault, replay must fail" + ); +} + +#[test] +fn test_withdraw_two_cnfts_rejects_out_of_range_proof_length() { + let mut context = setup_vault(); + let tree1 = create_tree_with_vault_cnft(&mut context); + let tree2 = create_tree_with_vault_cnft(&mut context); + let recipient = Keypair::new(); + let authority = context.authority.insecure_clone(); + + // Claim one more proof node for tree1 than the instruction supplies in + // total: the bounds check must return ProofLengthMismatch instead of + // letting split_at(proof_1_length) panic and abort the program. + let supplied_proof_nodes = 2 * MAX_DEPTH as u8; + let out_of_range_proof_1_length = supplied_proof_nodes + 1; + + let withdraw_ix = build_withdraw_two_cnfts_instruction( + &context, + authority.pubkey(), + &tree1, + &tree2, + recipient.pubkey(), + out_of_range_proof_1_length, + 0, + ); + + let result = send( + &mut context.svm, + vec![withdraw_ix], + &authority, + &[&authority], + ); + assert_custom_error(result, VaultError::ProofLengthMismatch); +} + +#[test] +fn test_withdraw_two_cnfts_rejects_inconsistent_proof_lengths() { + let mut context = setup_vault(); + let tree1 = create_tree_with_vault_cnft(&mut context); + let tree2 = create_tree_with_vault_cnft(&mut context); + let recipient = Keypair::new(); + let authority = context.authority.insecure_clone(); + + // proof_1_length is in range but the two lengths do not add up to the + // supplied proof accounts, so the split would misattribute proof nodes. + let withdraw_ix = build_withdraw_two_cnfts_instruction( + &context, + authority.pubkey(), + &tree1, + &tree2, + recipient.pubkey(), + MAX_DEPTH as u8 - 1, + MAX_DEPTH as u8, + ); + + let result = send( + &mut context.svm, + vec![withdraw_ix], + &authority, + &[&authority], + ); + assert_custom_error(result, VaultError::ProofLengthMismatch); +} diff --git a/compression/cnft-vault/quasar/Cargo.toml b/compression/cnft-vault/quasar/Cargo.toml index 9c3b449f..db8b0e30 100644 --- a/compression/cnft-vault/quasar/Cargo.toml +++ b/compression/cnft-vault/quasar/Cargo.toml @@ -31,3 +31,10 @@ solana-instruction = { version = "3.2.0" } [dev-dependencies] quasar-svm = { git = "https://github.com/blueshift-gg/quasar-svm" } solana-address = { version = "2.2.0", features = ["decode"] } +# Generated by `quasar build` (see [clients] in Quasar.toml); gives tests +# typed *Instruction builders instead of hand-built account metas. +quasar-cnft-vault-client = { path = "target/client/rust/quasar-cnft-vault-client" } +# Tests mirror Bubblegum's borsh metadata layout and keccak leaf hashing to +# recompute data_hash / creator_hash, same as the Anchor twin's suite. +borsh = { version = "1", features = ["derive"] } +solana-keccak-hasher = "3" diff --git a/compression/cnft-vault/quasar/README.md b/compression/cnft-vault/quasar/README.md index 6f267f04..fdf2ba57 100644 --- a/compression/cnft-vault/quasar/README.md +++ b/compression/cnft-vault/quasar/README.md @@ -1,13 +1,20 @@ # cNFT Vault (Quasar) -Deposit and withdraw compressed NFTs from a PDA vault. +Hold compressed NFTs in a PDA vault and let the stored vault authority withdraw them. See also: the [repository catalog](../../../README.md). -## Major concepts +## Authority model -- cNFT transfers -- PDA vault +Deposits are plain Bubblegum transfers to the **vault PDA** (seeds `["cNFT-vault"]`); no program instruction runs on deposit. Because of that, withdraw authorization is per-vault, not per-deposit: `initialize_vault` creates the vault PDA as a `Vault` state account and stores the signer as its **authority**. Both withdraw handlers require that stored authority as a `Signer` (`has_one(authority)`) and reject any other signer with `VaultError::InvalidWithdrawAuthority` before the Bubblegum CPI runs. The same PDA doubles as the Bubblegum leaf owner and signs the transfer CPIs via `invoke_signed`. The seeds, state layout, and error codes match the [Anchor](../anchor/) twin. + +Three handlers: + +- `initialize_vault` - creates the vault PDA and stores the withdraw authority. +- `withdraw_cnft` - withdraws one cNFT to a recipient chosen by the authority. +- `withdraw_two_cnfts` - withdraws two cNFTs (possibly from different trees) in a single transaction. The client passes `proof_1_length` and `proof_2_length` to split the proof accounts between the two Bubblegum transfers; the handler rejects lengths that do not add up to the supplied proof accounts with `VaultError::ProofLengthMismatch`. + +The vault is global to the program deployment: there is one vault PDA with one authority, so anyone who deposits a cNFT is entrusting it to that authority. ## Setup @@ -21,10 +28,13 @@ Prerequisites: [Quasar](https://quasar-lang.com/docs) CLI and [Agave](https://do ## Testing -This variant has no automated test suite yet: the instruction handlers CPI into external programs (Bubblegum, SPL Account Compression) and a QuasarSVM harness that loads those fixture binaries has not been written. `quasar build` verifies the program and CPI construction compile. +A QuasarSVM integration suite lives in `src/tests.rs`. It loads the same mainnet-dumped fixture binaries as the Anchor twin (Bubblegum, SPL Account Compression, SPL Noop, from `../anchor/tests/fixtures/`), creates a Bubblegum tree, mints cNFTs to the vault PDA, and exercises the withdraw handlers end to end. The suite covers authority withdraws (single and two-cNFT), rejection of non-authority signers, stale-root replays, and out-of-range proof lengths. -The Anchor twin at `../anchor/` has a full LiteSVM integration suite that exercises the same flows against mainnet-dumped fixture programs; use it as the behavioural reference. +```bash +quasar build +quasar test +``` ## Usage -Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example. diff --git a/compression/cnft-vault/quasar/src/error.rs b/compression/cnft-vault/quasar/src/error.rs new file mode 100644 index 00000000..19588717 --- /dev/null +++ b/compression/cnft-vault/quasar/src/error.rs @@ -0,0 +1,14 @@ +use quasar_lang::prelude::*; + +#[error_code] +pub enum VaultError { + /// Only the vault authority may withdraw cNFTs from the vault. + // 6000 is the conventional Anchor-compatible starting offset for + // program-specific error codes (Quasar's #[error_code] starts at 0 + // unless told otherwise; framework errors occupy 3000+). Matches the + // Anchor twin's codes. + InvalidWithdrawAuthority = 6000, + /// proof_1_length + proof_2_length must equal the number of proof + /// accounts supplied. + ProofLengthMismatch, +} diff --git a/compression/cnft-vault/quasar/src/instructions/initialize_vault.rs b/compression/cnft-vault/quasar/src/instructions/initialize_vault.rs new file mode 100644 index 00000000..6d834876 --- /dev/null +++ b/compression/cnft-vault/quasar/src/instructions/initialize_vault.rs @@ -0,0 +1,24 @@ +use crate::state::{Vault, VaultInner}; +use quasar_lang::prelude::*; + +#[derive(Accounts)] +pub struct InitializeVaultAccountConstraints { + #[account(mut)] + pub authority: Signer, + + #[account(mut, init, payer = authority, address = Vault::seeds())] + pub vault: Account, + + pub system_program: Program, +} + +pub fn handle_initialize_vault( + accounts: &mut InitializeVaultAccountConstraints, + bump: u8, +) -> Result<(), ProgramError> { + accounts.vault.set_inner(VaultInner { + authority: *accounts.authority.address(), + bump, + }); + Ok(()) +} diff --git a/compression/cnft-vault/quasar/src/instructions/mod.rs b/compression/cnft-vault/quasar/src/instructions/mod.rs index a2a5deb9..bc84daaf 100644 --- a/compression/cnft-vault/quasar/src/instructions/mod.rs +++ b/compression/cnft-vault/quasar/src/instructions/mod.rs @@ -1,3 +1,6 @@ +pub mod initialize_vault; +pub use initialize_vault::*; + pub mod withdraw; pub use withdraw::*; diff --git a/compression/cnft-vault/quasar/src/instructions/withdraw.rs b/compression/cnft-vault/quasar/src/instructions/withdraw.rs index 3f106626..2ff92a4c 100644 --- a/compression/cnft-vault/quasar/src/instructions/withdraw.rs +++ b/compression/cnft-vault/quasar/src/instructions/withdraw.rs @@ -1,5 +1,10 @@ +use crate::error::VaultError; +use crate::state::Vault; use crate::*; -use quasar_lang::{cpi::{InstructionAccount, InstructionView, Seed, Signer}, remaining::RemainingAccounts}; +use quasar_lang::{ + cpi::{InstructionAccount, InstructionView, Seed, Signer as CpiSigner}, + remaining::RemainingAccounts, +}; /// Maximum proof nodes for the merkle tree. const MAX_PROOF_NODES: usize = 24; @@ -12,13 +17,21 @@ const TRANSFER_ARGS_LEN: usize = 108; /// Accounts for withdrawing a single compressed NFT from the vault. #[derive(Accounts)] -pub struct Withdraw { +pub struct WithdrawCnftAccountConstraints { + /// The stored vault authority. Only this signer may withdraw. + pub authority: Signer, + + /// Vault PDA that owns the cNFT (as Bubblegum leaf owner) and signs the + /// transfer via invoke_signed. + #[account( + address = Vault::seeds(), + has_one(authority) @ VaultError::InvalidWithdrawAuthority, + )] + pub vault: Account, + /// Tree authority PDA (seeds checked by Bubblegum). #[account(mut)] pub tree_authority: UncheckedAccount, - /// Vault PDA that owns the cNFT - signs the transfer via invoke_signed. - #[account(address = crate::VaultPda::seeds())] - pub leaf_owner: UncheckedAccount, /// New owner to receive the cNFT. pub new_leaf_owner: UncheckedAccount, /// Merkle tree account. @@ -43,7 +56,12 @@ fn build_transfer_data(args: &[u8]) -> [u8; 8 + TRANSFER_ARGS_LEN] { ix_data } -pub fn handle_withdraw_cnft(accounts: &mut Withdraw, data: &[u8], remaining: RemainingAccounts<'_>, leaf_owner_bump: u8) -> Result<(), ProgramError> { +pub fn handle_withdraw_cnft( + accounts: &mut WithdrawCnftAccountConstraints, + data: &[u8], + remaining: RemainingAccounts<'_>, + vault_bump: u8, +) -> Result<(), ProgramError> { if data.len() < TRANSFER_ARGS_LEN { return Err(ProgramError::InvalidInstructionData); } @@ -80,9 +98,9 @@ pub fn handle_withdraw_cnft(accounts: &mut Withdraw, data: &[u8], remaining: Rem core::array::from_fn(|_| InstructionAccount::readonly(sys_addr)); ix_accounts[0] = InstructionAccount::readonly(accounts.tree_authority.address()); - ix_accounts[1] = InstructionAccount::readonly_signer(accounts.leaf_owner.address()); - // leaf_delegate = leaf_owner, not an additional signer - ix_accounts[2] = InstructionAccount::readonly(accounts.leaf_owner.address()); + ix_accounts[1] = InstructionAccount::readonly_signer(accounts.vault.address()); + // leaf_delegate = leaf_owner (the vault), not an additional signer + ix_accounts[2] = InstructionAccount::readonly(accounts.vault.address()); ix_accounts[3] = InstructionAccount::readonly(accounts.new_leaf_owner.address()); ix_accounts[4] = InstructionAccount::writable(accounts.merkle_tree.address()); ix_accounts[5] = InstructionAccount::readonly(accounts.log_wrapper.address()); @@ -95,12 +113,11 @@ pub fn handle_withdraw_cnft(accounts: &mut Withdraw, data: &[u8], remaining: Rem // Build account views let sys_view = accounts.system_program.to_account_view().clone(); - let mut views: [AccountView; MAX_CPI_ACCOUNTS] = - core::array::from_fn(|_| sys_view.clone()); + let mut views: [AccountView; MAX_CPI_ACCOUNTS] = core::array::from_fn(|_| sys_view.clone()); views[0] = accounts.tree_authority.to_account_view().clone(); - views[1] = accounts.leaf_owner.to_account_view().clone(); - views[2] = accounts.leaf_owner.to_account_view().clone(); + views[1] = accounts.vault.to_account_view().clone(); + views[2] = accounts.vault.to_account_view().clone(); views[3] = accounts.new_leaf_owner.to_account_view().clone(); views[4] = accounts.merkle_tree.to_account_view().clone(); views[5] = accounts.log_wrapper.to_account_view().clone(); @@ -118,12 +135,12 @@ pub fn handle_withdraw_cnft(accounts: &mut Withdraw, data: &[u8], remaining: Rem }; // PDA signer seeds: ["cNFT-vault", bump] - let bump_bytes = [leaf_owner_bump]; + let bump_bytes = [vault_bump]; let seeds: [Seed; 2] = [ Seed::from(b"cNFT-vault" as &[u8]), Seed::from(&bump_bytes as &[u8]), ]; - let signer = Signer::from(&seeds as &[Seed]); + let signer = CpiSigner::from(&seeds as &[Seed]); solana_instruction_view::cpi::invoke_signed_with_bounds::( &instruction, diff --git a/compression/cnft-vault/quasar/src/instructions/withdraw_two.rs b/compression/cnft-vault/quasar/src/instructions/withdraw_two.rs index 98603de6..ea9a3f85 100644 --- a/compression/cnft-vault/quasar/src/instructions/withdraw_two.rs +++ b/compression/cnft-vault/quasar/src/instructions/withdraw_two.rs @@ -1,5 +1,10 @@ +use crate::error::VaultError; +use crate::state::Vault; use crate::*; -use quasar_lang::{cpi::{InstructionAccount, InstructionView, Seed, Signer}, remaining::RemainingAccounts}; +use quasar_lang::{ + cpi::{InstructionAccount, InstructionView, Seed, Signer as CpiSigner}, + remaining::RemainingAccounts, +}; /// Maximum proof nodes per tree. const MAX_PROOF_NODES: usize = 24; @@ -10,28 +15,44 @@ const MAX_CPI_ACCOUNTS: usize = 8 + MAX_PROOF_NODES; /// Transfer args byte length: root(32) + data_hash(32) + creator_hash(32) + nonce(8) + index(4). const TRANSFER_ARGS_LEN: usize = 108; +/// Instruction data length: +/// args1(108) + proof_1_length(1) + args2(108) + proof_2_length(1). +const WITHDRAW_TWO_DATA_LEN: usize = TRANSFER_ARGS_LEN * 2 + 2; + /// Accounts for withdrawing two compressed NFTs from the vault in one transaction. /// Each cNFT can be from a different merkle tree. #[derive(Accounts)] -pub struct WithdrawTwo { +pub struct WithdrawTwoCnftsAccountConstraints { + /// The stored vault authority. Only this signer may withdraw. + pub authority: Signer, + + /// Vault PDA that owns the cNFTs (as Bubblegum leaf owner) and signs + /// both transfers via invoke_signed. + #[account( + address = Vault::seeds(), + has_one(authority) @ VaultError::InvalidWithdrawAuthority, + )] + pub vault: Account, + /// Tree authority PDA for tree 1. #[account(mut)] pub tree_authority1: UncheckedAccount, - /// Vault PDA that owns the cNFTs - signs both transfers. - #[account(address = crate::VaultPda::seeds())] - pub leaf_owner: UncheckedAccount, /// Recipient for cNFT 1. pub new_leaf_owner1: UncheckedAccount, /// Merkle tree for cNFT 1. #[account(mut)] pub merkle_tree1: UncheckedAccount, + // The second tree's accounts and recipient are marked `dup` because they + // may legitimately repeat first-position accounts: both cNFTs can live in + // the same tree and both can go to the same recipient. /// Tree authority PDA for tree 2. - #[account(mut)] + #[account(mut, dup)] pub tree_authority2: UncheckedAccount, /// Recipient for cNFT 2. + #[account(dup)] pub new_leaf_owner2: UncheckedAccount, /// Merkle tree for cNFT 2. - #[account(mut)] + #[account(mut, dup)] pub merkle_tree2: UncheckedAccount, /// SPL Noop log wrapper. pub log_wrapper: UncheckedAccount, @@ -45,25 +66,28 @@ pub struct WithdrawTwo { } #[allow(clippy::too_many_lines)] -pub fn handle_withdraw_two_cnfts(accounts: &mut WithdrawTwo, data: &[u8], remaining: RemainingAccounts<'_>, leaf_owner_bump: u8) -> Result<(), ProgramError> { - // Parse instruction args: - // args1(108) + proof_1_length(1) + args2(108) + _proof_2_length(1) = 218 bytes - if data.len() < 218 { +pub fn handle_withdraw_two_cnfts( + accounts: &mut WithdrawTwoCnftsAccountConstraints, + data: &[u8], + remaining: RemainingAccounts<'_>, + vault_bump: u8, +) -> Result<(), ProgramError> { + if data.len() < WITHDRAW_TWO_DATA_LEN { return Err(ProgramError::InvalidInstructionData); } let args1 = &data[0..TRANSFER_ARGS_LEN]; let proof_1_length = data[TRANSFER_ARGS_LEN] as usize; let args2 = &data[TRANSFER_ARGS_LEN + 1..TRANSFER_ARGS_LEN * 2 + 1]; - // _proof_2_length at data[217] - not needed, remaining after proof1 is proof2 + let proof_2_length = data[TRANSFER_ARGS_LEN * 2 + 1] as usize; // PDA signer seeds - let bump_bytes = [leaf_owner_bump]; + let bump_bytes = [vault_bump]; let seeds: [Seed; 2] = [ Seed::from(b"cNFT-vault" as &[u8]), Seed::from(&bump_bytes as &[u8]), ]; - let signer = Signer::from(&seeds as &[Seed]); + let signer = CpiSigner::from(&seeds as &[Seed]); // Collect all remaining accounts (proof1 ++ proof2). // @@ -85,9 +109,18 @@ pub fn handle_withdraw_two_cnfts(accounts: &mut WithdrawTwo, data: &[u8], remain total_proofs += 1; } - // Split into proof1 and proof2 - let proof1_count = proof_1_length.min(total_proofs); - let proof2_count = total_proofs.saturating_sub(proof1_count); + // The proof lengths are client-supplied: bounds-check them against the + // accounts actually provided before splitting, so adversarial input gets + // a clean named error instead of misattributed proof nodes. + require!( + proof_1_length + .checked_add(proof_2_length) + .is_some_and(|total| total == total_proofs), + VaultError::ProofLengthMismatch + ); + + let proof1_count = proof_1_length; + let proof2_count = proof_2_length; // --- Withdraw cNFT #1 --- log("withdrawing cNFT#1"); @@ -102,8 +135,8 @@ pub fn handle_withdraw_two_cnfts(accounts: &mut WithdrawTwo, data: &[u8], remain core::array::from_fn(|_| InstructionAccount::readonly(sys_addr)); ix_accounts[0] = InstructionAccount::readonly(accounts.tree_authority1.address()); - ix_accounts[1] = InstructionAccount::readonly_signer(accounts.leaf_owner.address()); - ix_accounts[2] = InstructionAccount::readonly(accounts.leaf_owner.address()); + ix_accounts[1] = InstructionAccount::readonly_signer(accounts.vault.address()); + ix_accounts[2] = InstructionAccount::readonly(accounts.vault.address()); ix_accounts[3] = InstructionAccount::readonly(accounts.new_leaf_owner1.address()); ix_accounts[4] = InstructionAccount::writable(accounts.merkle_tree1.address()); ix_accounts[5] = InstructionAccount::readonly(accounts.log_wrapper.address()); @@ -115,12 +148,11 @@ pub fn handle_withdraw_two_cnfts(accounts: &mut WithdrawTwo, data: &[u8], remain } let sys_view = accounts.system_program.to_account_view().clone(); - let mut views: [AccountView; MAX_CPI_ACCOUNTS] = - core::array::from_fn(|_| sys_view.clone()); + let mut views: [AccountView; MAX_CPI_ACCOUNTS] = core::array::from_fn(|_| sys_view.clone()); views[0] = accounts.tree_authority1.to_account_view().clone(); - views[1] = accounts.leaf_owner.to_account_view().clone(); - views[2] = accounts.leaf_owner.to_account_view().clone(); + views[1] = accounts.vault.to_account_view().clone(); + views[2] = accounts.vault.to_account_view().clone(); views[3] = accounts.new_leaf_owner1.to_account_view().clone(); views[4] = accounts.merkle_tree1.to_account_view().clone(); views[5] = accounts.log_wrapper.to_account_view().clone(); @@ -137,10 +169,11 @@ pub fn handle_withdraw_two_cnfts(accounts: &mut WithdrawTwo, data: &[u8], remain accounts: &ix_accounts[..total_accounts], }; - solana_instruction_view::cpi::invoke_signed_with_bounds::< - MAX_CPI_ACCOUNTS, - AccountView, - >(&instruction, &views[..total_accounts], &[signer.clone()])?; + solana_instruction_view::cpi::invoke_signed_with_bounds::( + &instruction, + &views[..total_accounts], + &[signer.clone()], + )?; } // --- Withdraw cNFT #2 --- @@ -156,8 +189,8 @@ pub fn handle_withdraw_two_cnfts(accounts: &mut WithdrawTwo, data: &[u8], remain core::array::from_fn(|_| InstructionAccount::readonly(sys_addr)); ix_accounts[0] = InstructionAccount::readonly(accounts.tree_authority2.address()); - ix_accounts[1] = InstructionAccount::readonly_signer(accounts.leaf_owner.address()); - ix_accounts[2] = InstructionAccount::readonly(accounts.leaf_owner.address()); + ix_accounts[1] = InstructionAccount::readonly_signer(accounts.vault.address()); + ix_accounts[2] = InstructionAccount::readonly(accounts.vault.address()); ix_accounts[3] = InstructionAccount::readonly(accounts.new_leaf_owner2.address()); ix_accounts[4] = InstructionAccount::writable(accounts.merkle_tree2.address()); ix_accounts[5] = InstructionAccount::readonly(accounts.log_wrapper.address()); @@ -171,12 +204,11 @@ pub fn handle_withdraw_two_cnfts(accounts: &mut WithdrawTwo, data: &[u8], remain } let sys_view = accounts.system_program.to_account_view().clone(); - let mut views: [AccountView; MAX_CPI_ACCOUNTS] = - core::array::from_fn(|_| sys_view.clone()); + let mut views: [AccountView; MAX_CPI_ACCOUNTS] = core::array::from_fn(|_| sys_view.clone()); views[0] = accounts.tree_authority2.to_account_view().clone(); - views[1] = accounts.leaf_owner.to_account_view().clone(); - views[2] = accounts.leaf_owner.to_account_view().clone(); + views[1] = accounts.vault.to_account_view().clone(); + views[2] = accounts.vault.to_account_view().clone(); views[3] = accounts.new_leaf_owner2.to_account_view().clone(); views[4] = accounts.merkle_tree2.to_account_view().clone(); views[5] = accounts.log_wrapper.to_account_view().clone(); @@ -193,10 +225,11 @@ pub fn handle_withdraw_two_cnfts(accounts: &mut WithdrawTwo, data: &[u8], remain accounts: &ix_accounts[..total_accounts], }; - solana_instruction_view::cpi::invoke_signed_with_bounds::< - MAX_CPI_ACCOUNTS, - AccountView, - >(&instruction, &views[..total_accounts], &[signer])?; + solana_instruction_view::cpi::invoke_signed_with_bounds::( + &instruction, + &views[..total_accounts], + &[signer], + )?; } log("successfully sent cNFTs"); diff --git a/compression/cnft-vault/quasar/src/lib.rs b/compression/cnft-vault/quasar/src/lib.rs index 9d4f5052..f676485f 100644 --- a/compression/cnft-vault/quasar/src/lib.rs +++ b/compression/cnft-vault/quasar/src/lib.rs @@ -2,7 +2,9 @@ use quasar_lang::prelude::*; +pub mod error; mod instructions; +pub mod state; use instructions::*; #[cfg(test)] mod tests; @@ -26,32 +28,41 @@ const SPL_ACCOUNT_COMPRESSION_ID: Address = Address::new_from_array([ declare_id!("Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D"); -/// Marker carrying the seeds for the vault PDA. Used by the -/// `address = VaultPda::seeds()` derive form; Quasar does not accept -/// inline `seeds = [...]` here. -#[derive(Seeds)] -#[seeds(b"cNFT-vault")] -pub struct VaultPda; - #[program] mod quasar_cnft_vault { use super::*; - /// Withdraw a single compressed NFT from the vault PDA. + /// Withdraw a single compressed NFT from the vault PDA. Only the + /// authority stored by initialize_vault may sign this. #[instruction(discriminator = 0)] - pub fn withdraw_cnft(ctx: CtxWithRemaining) -> Result<(), ProgramError> { + pub fn withdraw_cnft( + ctx: CtxWithRemaining, + ) -> Result<(), ProgramError> { let data = ctx.data; let remaining = ctx.remaining_accounts(); - let leaf_owner_bump = ctx.bumps.leaf_owner; - instructions::handle_withdraw_cnft(&mut ctx.accounts, data, remaining, leaf_owner_bump) + let vault_bump = ctx.bumps.vault; + instructions::handle_withdraw_cnft(&mut ctx.accounts, data, remaining, vault_bump) } - /// Withdraw two compressed NFTs from the vault PDA in a single transaction. + /// Withdraw two compressed NFTs from the vault PDA in a single + /// transaction. Only the authority stored by initialize_vault may sign + /// this. #[instruction(discriminator = 1)] - pub fn withdraw_two_cnfts(ctx: CtxWithRemaining) -> Result<(), ProgramError> { + pub fn withdraw_two_cnfts( + ctx: CtxWithRemaining, + ) -> Result<(), ProgramError> { let data = ctx.data; let remaining = ctx.remaining_accounts(); - let leaf_owner_bump = ctx.bumps.leaf_owner; - instructions::handle_withdraw_two_cnfts(&mut ctx.accounts, data, remaining, leaf_owner_bump) + let vault_bump = ctx.bumps.vault; + instructions::handle_withdraw_two_cnfts(&mut ctx.accounts, data, remaining, vault_bump) + } + + /// Create the vault PDA and store the signer as its withdraw authority. + #[instruction(discriminator = 2)] + pub fn initialize_vault( + ctx: Ctx, + ) -> Result<(), ProgramError> { + let vault_bump = ctx.bumps.vault; + instructions::handle_initialize_vault(&mut ctx.accounts, vault_bump) } } diff --git a/compression/cnft-vault/quasar/src/state.rs b/compression/cnft-vault/quasar/src/state.rs new file mode 100644 index 00000000..86ad6c50 --- /dev/null +++ b/compression/cnft-vault/quasar/src/state.rs @@ -0,0 +1,13 @@ +use quasar_lang::prelude::*; + +/// Vault PDA state. The same PDA stores the withdraw authority, owns the +/// cNFTs (as Bubblegum leaf owner), and signs transfer CPIs via +/// invoke_signed. +#[account(discriminator = 1, set_inner)] +#[seeds(b"cNFT-vault")] +pub struct Vault { + /// The only signer allowed to withdraw cNFTs from the vault. + pub authority: Address, + + pub bump: u8, +} diff --git a/compression/cnft-vault/quasar/src/tests.rs b/compression/cnft-vault/quasar/src/tests.rs index 0f15d10c..c65c6a05 100644 --- a/compression/cnft-vault/quasar/src/tests.rs +++ b/compression/cnft-vault/quasar/src/tests.rs @@ -1,5 +1,617 @@ -// No tests yet: the instruction handlers CPI into external programs -// (Bubblegum, SPL Account Compression) and a QuasarSVM harness that loads -// those fixture binaries has not been written. The Anchor twin's LiteSVM -// suite covers the same flows. TODO: port that suite to QuasarSVM using -// the fixture .so files under ../anchor/tests/fixtures/. +//! QuasarSVM integration tests for the cnft-vault Quasar program. +//! +//! Ported from the Anchor twin's LiteSVM suite. The SVM loads the program +//! plus the three mainnet fixtures (mpl-bubblegum, spl-account-compression, +//! spl-noop) from `../anchor/tests/fixtures/`, then: +//! 1. Initializes the vault PDA via `initialize_vault`, storing the +//! withdraw authority. +//! 2. Creates a Bubblegum Merkle tree (max_depth=3, max_buffer_size=8, +//! canopy=0) via `create_tree_config`. The pre-allocated tree account is +//! passed in as a compression-program-owned account, standing in for the +//! system `create_account` step. +//! 3. Mints a cNFT whose leaf owner is the vault PDA via `mint_v1`. +//! 4. Recomputes `data_hash` / `creator_hash` exactly as Bubblegum does and +//! builds the proof for leaf 0 (all empty-node siblings). +//! 5. Calls the program's withdraw handlers, which CPI Bubblegum `Transfer` +//! signed by the vault PDA. +//! +//! Coverage: +//! - withdraw by the stored authority succeeds (single and two-cNFT) +//! - withdraw by a non-authority signer fails with +//! `VaultError::InvalidWithdrawAuthority` +//! - replaying a withdraw with the now-stale root fails +//! - a two-cNFT withdraw whose proof lengths do not match the supplied +//! proof accounts fails with `VaultError::ProofLengthMismatch` + +extern crate std; +use { + borsh::BorshSerialize, + quasar_cnft_vault_client::{ + InitializeVaultInstruction, QuasarCnftVaultError, WithdrawCnftInstruction, + WithdrawTwoCnftsInstruction, + }, + quasar_svm::{Account, Instruction, ProgramError, Pubkey, QuasarSvm}, + solana_instruction::AccountMeta, + solana_keccak_hasher::hashv, + std::{string::ToString, vec, vec::Vec}, +}; + +// ---- Program IDs ---------------------------------------------------------- + +const BUBBLEGUM_ID: Pubkey = Pubkey::from_str_const("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY"); +const COMPRESSION_ID: Pubkey = + Pubkey::from_str_const("cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK"); +const NOOP_ID: Pubkey = Pubkey::from_str_const("noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV"); + +// ---- Bubblegum instruction discriminators --------------------------------- + +const CREATE_TREE_CONFIG_DISC: [u8; 8] = [165, 83, 136, 142, 89, 202, 47, 220]; +const MINT_V1_DISC: [u8; 8] = [145, 98, 192, 118, 184, 147, 118, 104]; + +// ---- Tree parameters ------------------------------------------------------ + +const MAX_DEPTH: u32 = 3; +const MAX_BUFFER_SIZE: u32 = 8; + +/// Lamports for funded signers and prefabricated accounts; comfortably above +/// rent exemption for every account size used here. +const FUNDING_LAMPORTS: u64 = 1_000_000_000; + +// ---- MetadataArgs (mirrors mpl_bubblegum::types::MetadataArgs borsh layout) ---- + +#[derive(BorshSerialize, Clone)] +struct Creator { + address: [u8; 32], + verified: bool, + share: u8, +} + +#[derive(BorshSerialize, Clone)] +enum TokenProgramVersion { + #[allow(dead_code)] + Original, + #[allow(dead_code)] + Token2022, +} + +#[derive(BorshSerialize, Clone)] +struct MetadataArgs { + name: std::string::String, + symbol: std::string::String, + uri: std::string::String, + seller_fee_basis_points: u16, + primary_sale_happened: bool, + is_mutable: bool, + edition_nonce: Option, + token_standard: Option, // TokenStandard enum, encoded by variant index + collection: Option, // None - Collection, kept absent + uses: Option, // None - Uses, kept absent + token_program_version: TokenProgramVersion, + creators: Vec, +} + +// ---- Hashing, exactly as the Bubblegum program does ------------------------ + +fn hash_metadata(metadata: &MetadataArgs) -> [u8; 32] { + let serialized = borsh::to_vec(metadata).unwrap(); + let inner = hashv(&[serialized.as_slice()]).to_bytes(); + hashv(&[&inner, &metadata.seller_fee_basis_points.to_le_bytes()]).to_bytes() +} + +fn hash_creators(creators: &[Creator]) -> [u8; 32] { + let creator_data: Vec> = creators + .iter() + .map(|c| [c.address.as_ref(), &[c.verified as u8], &[c.share]].concat()) + .collect(); + hashv( + creator_data + .iter() + .map(|c| c.as_slice()) + .collect::>() + .as_slice(), + ) + .to_bytes() +} + +// ---- SPL account-compression empty-node helper ----------------------------- + +fn empty_node(level: u32) -> [u8; 32] { + if level == 0 { + return [0u8; 32]; + } + let lower = empty_node(level - 1); + hashv(&[&lower, &lower]).to_bytes() +} + +// ---- ConcurrentMerkleTree<3,8> account layout ------------------------------ +// +// account_data = header (56 bytes) || zero-copy ConcurrentMerkleTree (1248) || canopy (0) +// +// Header (ConcurrentMerkleTreeHeader): account_type(1) + header-enum-discriminant(1) +// + V1{ max_buffer_size(4), max_depth(4), authority(32), creation_slot(8), +// is_batch_initialized(1), _padding[5] } = 56 bytes total. +// +// ConcurrentMerkleTree<3,8> (#[repr(C)]): +// sequence_number u64 (off 0) +// active_index u64 (off 8) +// buffer_size u64 (off 16) +// change_logs [ChangeLog<3>; 8] (off 24), stride = 136 +// ChangeLog<3> = root[32] + path[3*32] + index u32 + _padding u32 = 136 +// rightmost_proof Path<3> +// +// Current root = change_logs[active_index].root. + +const HEADER_SIZE: usize = 56; +const CMT_SIZE: usize = { + let changelog = 32 + 3 * 32 + 4 + 4; // 136 + let path = 3 * 32 + 32 + 4 + 4; // 136 + 8 + 8 + 8 + changelog * 8 + path +}; +const TREE_ACCOUNT_SIZE: usize = HEADER_SIZE + CMT_SIZE; + +fn read_current_root(data: &[u8]) -> [u8; 32] { + let tree = &data[HEADER_SIZE..]; + let active_index = u64::from_le_bytes(tree[8..16].try_into().unwrap()) as usize; + let changelog_stride = 136; + let root_off = 24 + active_index * changelog_stride; + let mut root = [0u8; 32]; + root.copy_from_slice(&tree[root_off..root_off + 32]); + root +} + +// ---- Account helpers -------------------------------------------------------- + +fn signer(address: Pubkey) -> Account { + quasar_svm::token::create_keyed_system_account(&address, FUNDING_LAMPORTS) +} + +fn empty(address: Pubkey) -> Account { + Account { + address, + lamports: 0, + data: vec![], + owner: quasar_svm::system_program::ID, + executable: false, + } +} + +fn vault_error(error: QuasarCnftVaultError) -> ProgramError { + ProgramError::Custom(error as u32) +} + +// ---- Fixture setup ---------------------------------------------------------- + +/// One Bubblegum tree holding a single cNFT owned by the vault PDA, plus +/// everything needed to withdraw it (root, hashes, proof). +struct TreeWithVaultCnft { + merkle_tree: Pubkey, + tree_config: Pubkey, + root: [u8; 32], + data_hash: [u8; 32], + creator_hash: [u8; 32], + proof: [[u8; 32]; MAX_DEPTH as usize], +} + +struct VaultTestContext { + svm: QuasarSvm, + payer: Pubkey, + /// The address stored as the vault's withdraw authority. + authority: Pubkey, + vault_pda: Pubkey, +} + +fn setup_vault() -> VaultTestContext { + // The fixture binaries are shared with the Anchor twin's LiteSVM suite. + let program_elf = std::fs::read("target/deploy/quasar_cnft_vault.so").unwrap(); + let bubblegum_elf = std::fs::read("../anchor/tests/fixtures/mpl_bubblegum.so").unwrap(); + let compression_elf = + std::fs::read("../anchor/tests/fixtures/spl_account_compression.so").unwrap(); + let noop_elf = std::fs::read("../anchor/tests/fixtures/spl_noop.so").unwrap(); + + let mut svm = QuasarSvm::new() + .with_program(&crate::ID, &program_elf) + .with_program(&BUBBLEGUM_ID, &bubblegum_elf) + .with_program(&COMPRESSION_ID, &compression_elf) + .with_program(&NOOP_ID, &noop_elf); + + let payer = Pubkey::new_unique(); + let authority = Pubkey::new_unique(); + let (vault_pda, _) = Pubkey::find_program_address(&[b"cNFT-vault"], &crate::ID); + + // initialize_vault: store `authority` on the vault PDA. + let instruction: Instruction = InitializeVaultInstruction { + authority, + vault: vault_pda, + system_program: quasar_svm::system_program::ID, + } + .into(); + let result = svm.process_instruction(&instruction, &[signer(authority), empty(vault_pda)]); + result.assert_success(); + + VaultTestContext { + svm, + payer, + authority, + vault_pda, + } +} + +/// Create a Bubblegum tree and mint one cNFT into the vault PDA. +fn create_tree_with_vault_cnft(context: &mut VaultTestContext) -> TreeWithVaultCnft { + let payer = context.payer; + let merkle_tree = Pubkey::new_unique(); + + // The allocated-but-uninitialized tree account the system program would + // have created in the `create_account` step (a foreign-program account, + // so prefabricating it is fine). + let tree_account = Account { + address: merkle_tree, + lamports: FUNDING_LAMPORTS, + data: vec![0; TREE_ACCOUNT_SIZE], + owner: COMPRESSION_ID, + executable: false, + }; + + // tree_authority (a.k.a tree_config) PDA = [merkle_tree] under bubblegum. + let (tree_config, _) = Pubkey::find_program_address(&[merkle_tree.as_ref()], &BUBBLEGUM_ID); + + // create_tree_config(max_depth, max_buffer_size, public=None) + let create_tree_instruction = Instruction { + program_id: BUBBLEGUM_ID, + accounts: vec![ + AccountMeta::new(tree_config, false), + AccountMeta::new(merkle_tree, false), + AccountMeta::new(payer, true), + AccountMeta::new_readonly(payer, true), // tree_creator + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(quasar_svm::system_program::ID, false), + ], + data: { + let mut d = CREATE_TREE_CONFIG_DISC.to_vec(); + d.extend_from_slice(&MAX_DEPTH.to_le_bytes()); + d.extend_from_slice(&MAX_BUFFER_SIZE.to_le_bytes()); + d.push(0); // Option::None + d + }, + }; + context + .svm + .process_instruction( + &create_tree_instruction, + &[signer(payer), empty(tree_config), tree_account], + ) + .assert_success(); + + // Build the MetadataArgs for the single cNFT we mint. The leaf owner / + // delegate are the vault PDA, so the vault holds the cNFT. + let creator = Creator { + address: payer.to_bytes(), + verified: false, + share: 100, + }; + let metadata = MetadataArgs { + name: "Vault cNFT".to_string(), + symbol: "VCNFT".to_string(), + uri: "https://example.com/nft.json".to_string(), + seller_fee_basis_points: 500, + primary_sale_happened: false, + is_mutable: true, + edition_nonce: None, + token_standard: Some(0), // TokenStandard::NonFungible + collection: None, + uses: None, + token_program_version: TokenProgramVersion::Original, + creators: vec![creator], + }; + + // mint_v1 - leaf_owner and leaf_delegate are the vault PDA. + let mint_instruction = Instruction { + program_id: BUBBLEGUM_ID, + accounts: vec![ + AccountMeta::new(tree_config, false), + AccountMeta::new_readonly(context.vault_pda, false), + AccountMeta::new_readonly(context.vault_pda, false), // leaf_delegate + AccountMeta::new(merkle_tree, false), + AccountMeta::new_readonly(payer, true), + AccountMeta::new_readonly(payer, true), // tree_creator_or_delegate + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(quasar_svm::system_program::ID, false), + ], + data: { + let mut d = MINT_V1_DISC.to_vec(); + d.extend_from_slice(&borsh::to_vec(&metadata).unwrap()); + d + }, + }; + context + .svm + .process_instruction(&mint_instruction, &[]) + .assert_success(); + + // Recompute data_hash and creator_hash exactly as Bubblegum does. + let data_hash = hash_metadata(&metadata); + let creator_hash = hash_creators(&metadata.creators); + + // Proof for leaf index 0 in an otherwise-empty tree: empty-node siblings. + let proof = [empty_node(0), empty_node(1), empty_node(2)]; + + // Read the current root from the onchain tree account. + let tree_data = context.svm.get_account(&merkle_tree).unwrap().data; + let root = read_current_root(&tree_data); + + TreeWithVaultCnft { + merkle_tree, + tree_config, + root, + data_hash, + creator_hash, + proof, + } +} + +// ---- Instruction builders for the program under test ------------------------ + +/// Bubblegum Transfer args: root(32) + data_hash(32) + creator_hash(32) + +/// nonce(8) + index(4). Leaf 0 in a fresh tree has nonce 0 and index 0. +fn transfer_args(tree: &TreeWithVaultCnft) -> Vec { + let mut args = Vec::new(); + args.extend_from_slice(&tree.root); + args.extend_from_slice(&tree.data_hash); + args.extend_from_slice(&tree.creator_hash); + args.extend_from_slice(&0u64.to_le_bytes()); // nonce + args.extend_from_slice(&0u32.to_le_bytes()); // index + args +} + +fn proof_metas(nodes: &[[u8; 32]]) -> Vec { + nodes + .iter() + .map(|node| AccountMeta::new_readonly(Pubkey::new_from_array(*node), false)) + .collect() +} + +fn proof_accounts(nodes: &[[u8; 32]]) -> Vec { + nodes + .iter() + .map(|node| Pubkey::new_from_array(*node)) + // empty_node(0) is all zeros, which is the system program's address. + // That account is already in the SVM's database; passing an empty + // account for it would overwrite the loaded program. + .filter(|address| *address != quasar_svm::system_program::ID) + .map(empty) + .collect() +} + +fn build_withdraw_cnft_instruction( + context: &VaultTestContext, + signer: Pubkey, + tree: &TreeWithVaultCnft, + recipient: Pubkey, +) -> Instruction { + let mut instruction: Instruction = WithdrawCnftInstruction { + authority: signer, + vault: context.vault_pda, + tree_authority: tree.tree_config, + new_leaf_owner: recipient, + merkle_tree: tree.merkle_tree, + log_wrapper: NOOP_ID, + compression_program: COMPRESSION_ID, + bubblegum_program: BUBBLEGUM_ID, + system_program: quasar_svm::system_program::ID, + remaining_accounts: proof_metas(&tree.proof), + } + .into(); + // The generated builder carries only the discriminator byte; the handler + // reads the raw Transfer args from the rest of the instruction data. + instruction.data.extend_from_slice(&transfer_args(tree)); + instruction +} + +#[allow(clippy::too_many_arguments)] +fn build_withdraw_two_cnfts_instruction( + context: &VaultTestContext, + signer: Pubkey, + tree1: &TreeWithVaultCnft, + tree2: &TreeWithVaultCnft, + recipient: Pubkey, + proof_1_length: u8, + proof_2_length: u8, +) -> Instruction { + let mut remaining_accounts = proof_metas(&tree1.proof); + remaining_accounts.extend(proof_metas(&tree2.proof)); + let mut instruction: Instruction = WithdrawTwoCnftsInstruction { + authority: signer, + vault: context.vault_pda, + tree_authority1: tree1.tree_config, + new_leaf_owner1: recipient, + merkle_tree1: tree1.merkle_tree, + tree_authority2: tree2.tree_config, + new_leaf_owner2: recipient, + merkle_tree2: tree2.merkle_tree, + log_wrapper: NOOP_ID, + compression_program: COMPRESSION_ID, + bubblegum_program: BUBBLEGUM_ID, + system_program: quasar_svm::system_program::ID, + remaining_accounts, + } + .into(); + // args1(108) + proof_1_length(1) + args2(108) + proof_2_length(1) + instruction.data.extend_from_slice(&transfer_args(tree1)); + instruction.data.push(proof_1_length); + instruction.data.extend_from_slice(&transfer_args(tree2)); + instruction.data.push(proof_2_length); + instruction +} + +/// Accounts a withdraw brings to process_instruction: the recipient and the +/// proof-node addresses (everything else is already in the SVM's database). +fn withdraw_extra_accounts(recipient: Pubkey, trees: &[&TreeWithVaultCnft]) -> Vec { + let mut accounts = vec![empty(recipient)]; + for tree in trees { + accounts.extend(proof_accounts(&tree.proof)); + } + accounts +} + +// ---- Tests ------------------------------------------------------------------ + +#[test] +fn test_initialize_vault_stores_authority() { + let context = setup_vault(); + + // Vault zero-copy layout: [disc:1][authority:32][bump:1] + let vault_account = context.svm.get_account(&context.vault_pda).unwrap(); + assert_eq!(vault_account.data[0], 1, "Vault discriminator"); + assert_eq!(&vault_account.data[1..33], context.authority.as_ref()); + let (_, expected_bump) = Pubkey::find_program_address(&[b"cNFT-vault"], &crate::ID); + assert_eq!(vault_account.data[33], expected_bump); +} + +#[test] +fn test_withdraw_cnft_by_authority() { + let mut context = setup_vault(); + let tree = create_tree_with_vault_cnft(&mut context); + let recipient = Pubkey::new_unique(); + + let instruction = + build_withdraw_cnft_instruction(&context, context.authority, &tree, recipient); + + // The stored authority signs, so the withdraw succeeds (the vault PDA + // signs the Bubblegum CPI via invoke_signed inside the program). + let result = context + .svm + .process_instruction(&instruction, &withdraw_extra_accounts(recipient, &[&tree])); + assert!( + result.is_ok(), + "withdraw_cnft signed by the vault authority should succeed: {:?}\nlogs: {:#?}", + result.raw_result, + result.logs + ); + + // After transfer, leaf 0's owner changed (vault -> recipient), so the root + // moved. A second withdraw replaying the same (root, hashes) must fail: the + // cached root is stale and the leaf no longer hashes to it for the vault. + let replay = context + .svm + .process_instruction(&instruction, &withdraw_extra_accounts(recipient, &[&tree])); + assert!( + !replay.is_ok(), + "second withdraw must fail: leaf already transferred out of the vault" + ); +} + +#[test] +fn test_withdraw_cnft_rejected_for_non_authority() { + let mut context = setup_vault(); + let tree = create_tree_with_vault_cnft(&mut context); + let recipient = Pubkey::new_unique(); + + // An attacker signs their own withdraw attempt; the vault's stored + // authority did not sign. + let attacker = Pubkey::new_unique(); + let instruction = build_withdraw_cnft_instruction(&context, attacker, &tree, recipient); + + let mut accounts = withdraw_extra_accounts(recipient, &[&tree]); + accounts.push(signer(attacker)); + let result = context.svm.process_instruction(&instruction, &accounts); + result.assert_error(vault_error(QuasarCnftVaultError::InvalidWithdrawAuthority)); +} + +#[test] +fn test_withdraw_two_cnfts_by_authority() { + let mut context = setup_vault(); + let tree1 = create_tree_with_vault_cnft(&mut context); + let tree2 = create_tree_with_vault_cnft(&mut context); + let recipient = Pubkey::new_unique(); + + let instruction = build_withdraw_two_cnfts_instruction( + &context, + context.authority, + &tree1, + &tree2, + recipient, + MAX_DEPTH as u8, + MAX_DEPTH as u8, + ); + + let result = context.svm.process_instruction( + &instruction, + &withdraw_extra_accounts(recipient, &[&tree1, &tree2]), + ); + assert!( + result.is_ok(), + "withdraw_two_cnfts signed by the vault authority should succeed: {:?}", + result.raw_result + ); + + // Both trees' roots moved, so both cNFTs left the vault: replaying the + // single-tree withdraw against tree1 with the cached root fails. + let replay_instruction = + build_withdraw_cnft_instruction(&context, context.authority, &tree1, recipient); + let replay = context.svm.process_instruction( + &replay_instruction, + &withdraw_extra_accounts(recipient, &[&tree1]), + ); + assert!( + !replay.is_ok(), + "cNFT#1 already left the vault, replay must fail" + ); +} + +#[test] +fn test_withdraw_two_cnfts_rejects_out_of_range_proof_length() { + let mut context = setup_vault(); + let tree1 = create_tree_with_vault_cnft(&mut context); + let tree2 = create_tree_with_vault_cnft(&mut context); + let recipient = Pubkey::new_unique(); + + // Claim one more proof node for tree1 than the instruction supplies in + // total: the bounds check must return ProofLengthMismatch instead of + // splitting past the end of the supplied proof accounts. + let supplied_proof_nodes = 2 * MAX_DEPTH as u8; + let out_of_range_proof_1_length = supplied_proof_nodes + 1; + + let instruction = build_withdraw_two_cnfts_instruction( + &context, + context.authority, + &tree1, + &tree2, + recipient, + out_of_range_proof_1_length, + 0, + ); + + let result = context.svm.process_instruction( + &instruction, + &withdraw_extra_accounts(recipient, &[&tree1, &tree2]), + ); + result.assert_error(vault_error(QuasarCnftVaultError::ProofLengthMismatch)); +} + +#[test] +fn test_withdraw_two_cnfts_rejects_inconsistent_proof_lengths() { + let mut context = setup_vault(); + let tree1 = create_tree_with_vault_cnft(&mut context); + let tree2 = create_tree_with_vault_cnft(&mut context); + let recipient = Pubkey::new_unique(); + + // proof_1_length is in range but the two lengths do not add up to the + // supplied proof accounts, so the split would misattribute proof nodes. + let instruction = build_withdraw_two_cnfts_instruction( + &context, + context.authority, + &tree1, + &tree2, + recipient, + MAX_DEPTH as u8 - 1, + MAX_DEPTH as u8, + ); + + let result = context.svm.process_instruction( + &instruction, + &withdraw_extra_accounts(recipient, &[&tree1, &tree2]), + ); + result.assert_error(vault_error(QuasarCnftVaultError::ProofLengthMismatch)); +} From 155fe6a7eac43ed85e64034815084dd5467cec22 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:52:13 +0000 Subject: [PATCH 059/138] cutils, cnft-burn: remove banned handler-as-method pattern, dead state, runtime hashing cutils (anchor): - mint/verify were implemented as methods on the account structs with empty validate() stubs wired through #[access_control]; they are now plain handle_* functions, structs renamed *AccountConstraints - verify computed sha256("global:verify_leaf") at runtime per call; the discriminator is a precomputed constant with its derivation documented, and the sha2 program dependency is gone - dead Data state struct removed (both variants) - '/// CHECK: unsafe' comments replaced with truthful descriptions cnft-burn (anchor): - burn_cnft handler and accounts struct moved from lib.rs into instructions/; struct renamed BurnCnftAccountConstraints - the merkle_tree '/// CHECK' comment claimed the account is never written; the burn CPI rewrites the leaf and root - comment now true - raw 32-byte program ID arrays replaced with pubkey!() constants https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- .../cnft-burn/src/instructions/burn_cnft.rs | 127 ++++++++ .../cnft-burn/src/instructions/mod.rs | 3 + .../anchor/programs/cnft-burn/src/lib.rs | 133 +-------- .../cutils/anchor/programs/cutils/Cargo.toml | 1 - .../programs/cutils/src/instructions/mint.rs | 274 +++++++++--------- .../cutils/src/instructions/verify.rs | 101 +++---- .../cutils/anchor/programs/cutils/src/lib.rs | 16 +- .../anchor/programs/cutils/src/state/data.rs | 22 -- .../anchor/programs/cutils/src/state/mod.rs | 2 - compression/cutils/quasar/src/lib.rs | 1 - compression/cutils/quasar/src/state.rs | 17 -- 11 files changed, 330 insertions(+), 367 deletions(-) create mode 100644 compression/cnft-burn/anchor/programs/cnft-burn/src/instructions/burn_cnft.rs create mode 100644 compression/cnft-burn/anchor/programs/cnft-burn/src/instructions/mod.rs delete mode 100644 compression/cutils/anchor/programs/cutils/src/state/data.rs delete mode 100644 compression/cutils/anchor/programs/cutils/src/state/mod.rs delete mode 100644 compression/cutils/quasar/src/state.rs diff --git a/compression/cnft-burn/anchor/programs/cnft-burn/src/instructions/burn_cnft.rs b/compression/cnft-burn/anchor/programs/cnft-burn/src/instructions/burn_cnft.rs new file mode 100644 index 00000000..595a81da --- /dev/null +++ b/compression/cnft-burn/anchor/programs/cnft-burn/src/instructions/burn_cnft.rs @@ -0,0 +1,127 @@ +use anchor_lang::prelude::*; +use anchor_lang::solana_program::{ + instruction::{AccountMeta, Instruction}, + program::invoke, +}; +use borsh::BorshSerialize; + +use crate::{MPL_BUBBLEGUM_ID, SPLCompression}; + +/// Burn instruction discriminator from mpl-bubblegum +const BURN_DISCRIMINATOR: [u8; 8] = [116, 110, 29, 56, 107, 219, 42, 93]; + +/// Instruction arguments for mpl-bubblegum Burn, serialized with borsh +#[derive(BorshSerialize)] +struct BurnArgs { + root: [u8; 32], + data_hash: [u8; 32], + creator_hash: [u8; 32], + nonce: u64, + index: u32, +} + +#[derive(Accounts)] +pub struct BurnCnftAccountConstraints<'info> { + #[account(mut)] + pub leaf_owner: Signer<'info>, + #[account(mut)] + #[account( + seeds = [merkle_tree.key().as_ref()], + bump, + seeds::program = bubblegum_program.key() + )] + /// CHECK: This account is modified in the downstream program + pub tree_authority: UncheckedAccount<'info>, + #[account(mut)] + /// CHECK: Written by the Bubblegum/Account Compression CPI (the burn + /// replaces the leaf and updates the tree root); validated downstream + /// by those programs. + pub merkle_tree: UncheckedAccount<'info>, + /// CHECK: This account is neither written to nor read from. + pub log_wrapper: UncheckedAccount<'info>, + pub compression_program: Program<'info, SPLCompression>, + // Pin the bubblegum program account to the known mpl-bubblegum id. Without + // this constraint the caller could pass any account and a malicious one + // could short-circuit the CPI in unexpected ways. + /// CHECK: address constrained to the mpl-bubblegum program id. + #[account(address = MPL_BUBBLEGUM_ID)] + pub bubblegum_program: UncheckedAccount<'info>, + pub system_program: Program<'info, System>, +} + +pub fn handle_burn_cnft<'info>( + context: Context<'info, BurnCnftAccountConstraints<'info>>, + root: [u8; 32], + data_hash: [u8; 32], + creator_hash: [u8; 32], + nonce: u64, + index: u32, +) -> Result<()> { + // Build instruction data: discriminator + borsh-serialized args + let args = BurnArgs { + root, + data_hash, + creator_hash, + nonce, + index, + }; + let mut data = BURN_DISCRIMINATOR.to_vec(); + args.serialize(&mut data)?; + + // Build account metas matching mpl-bubblegum Burn instruction layout + let mut accounts = Vec::with_capacity(7 + context.remaining_accounts.len()); + accounts.push(AccountMeta::new_readonly( + context.accounts.tree_authority.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.leaf_owner.key(), + true, + )); + // leaf_delegate = leaf_owner, not a signer in this call + accounts.push(AccountMeta::new_readonly( + context.accounts.leaf_owner.key(), + false, + )); + accounts.push(AccountMeta::new(context.accounts.merkle_tree.key(), false)); + accounts.push(AccountMeta::new_readonly( + context.accounts.log_wrapper.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.compression_program.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.system_program.key(), + false, + )); + // Append remaining accounts (proof nodes) + for acc in context.remaining_accounts.iter() { + accounts.push(AccountMeta::new_readonly(acc.key(), false)); + } + + let instruction = Instruction { + program_id: MPL_BUBBLEGUM_ID, + accounts, + data, + }; + + // Gather all account infos for the CPI + let mut account_infos = vec![ + context.accounts.bubblegum_program.to_account_info(), + context.accounts.tree_authority.to_account_info(), + context.accounts.leaf_owner.to_account_info(), + context.accounts.merkle_tree.to_account_info(), + context.accounts.log_wrapper.to_account_info(), + context.accounts.compression_program.to_account_info(), + context.accounts.system_program.to_account_info(), + ]; + for acc in context.remaining_accounts.iter() { + account_infos.push(acc.to_account_info()); + } + + invoke(&instruction, &account_infos)?; + + Ok(()) +} diff --git a/compression/cnft-burn/anchor/programs/cnft-burn/src/instructions/mod.rs b/compression/cnft-burn/anchor/programs/cnft-burn/src/instructions/mod.rs new file mode 100644 index 00000000..cd32a282 --- /dev/null +++ b/compression/cnft-burn/anchor/programs/cnft-burn/src/instructions/mod.rs @@ -0,0 +1,3 @@ +pub mod burn_cnft; + +pub use burn_cnft::*; diff --git a/compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs b/compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs index 94dc864b..7bd40193 100644 --- a/compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs +++ b/compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs @@ -4,38 +4,18 @@ #![allow(clippy::diverging_sub_expression)] use anchor_lang::prelude::*; -use anchor_lang::solana_program::{ - instruction::{AccountMeta, Instruction}, - program::invoke, -}; -use borsh::BorshSerialize; -declare_id!("C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv"); - -/// mpl-bubblegum program ID (BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY) -const MPL_BUBBLEGUM_ID: Pubkey = Pubkey::new_from_array([ - 0x98, 0x8b, 0x80, 0xeb, 0x79, 0x35, 0x28, 0x69, 0xb2, 0x24, 0x74, 0x5f, 0x59, 0xdd, 0xbf, 0x8a, - 0x26, 0x58, 0xca, 0x13, 0xdc, 0x68, 0x81, 0x21, 0x26, 0x35, 0x1c, 0xae, 0x07, 0xc1, 0xa5, 0xa5, -]); +pub mod instructions; +use instructions::*; -/// SPL Account Compression program ID (cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK) -const SPL_ACCOUNT_COMPRESSION_ID: Pubkey = Pubkey::new_from_array([ - 0x09, 0x2a, 0x13, 0xee, 0x95, 0xc4, 0x1c, 0xba, 0x08, 0xa6, 0x7f, 0x5a, 0xc6, 0x7e, 0x8d, 0xf7, - 0xe1, 0xda, 0x11, 0x62, 0x5e, 0x1d, 0x64, 0x13, 0x7f, 0x8f, 0x4f, 0x23, 0x83, 0x03, 0x7f, 0x14, -]); +declare_id!("C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv"); -/// Burn instruction discriminator from mpl-bubblegum -const BURN_DISCRIMINATOR: [u8; 8] = [116, 110, 29, 56, 107, 219, 42, 93]; +/// mpl-bubblegum program ID +pub const MPL_BUBBLEGUM_ID: Pubkey = pubkey!("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY"); -/// Instruction arguments for mpl-bubblegum Burn, serialized with borsh -#[derive(BorshSerialize)] -struct BurnArgs { - root: [u8; 32], - data_hash: [u8; 32], - creator_hash: [u8; 32], - nonce: u64, - index: u32, -} +/// SPL Account Compression program ID +pub const SPL_ACCOUNT_COMPRESSION_ID: Pubkey = + pubkey!("cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK"); #[derive(Clone)] pub struct SPLCompression; @@ -51,106 +31,13 @@ pub mod cnft_burn { use super::*; pub fn burn_cnft<'info>( - context: Context<'info, BurnCnft<'info>>, + context: Context<'info, BurnCnftAccountConstraints<'info>>, root: [u8; 32], data_hash: [u8; 32], creator_hash: [u8; 32], nonce: u64, index: u32, ) -> Result<()> { - // Build instruction data: discriminator + borsh-serialized args - let args = BurnArgs { - root, - data_hash, - creator_hash, - nonce, - index, - }; - let mut data = BURN_DISCRIMINATOR.to_vec(); - args.serialize(&mut data)?; - - // Build account metas matching mpl-bubblegum Burn instruction layout - let mut accounts = Vec::with_capacity(7 + context.remaining_accounts.len()); - accounts.push(AccountMeta::new_readonly( - context.accounts.tree_authority.key(), - false, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.leaf_owner.key(), - true, - )); - // leaf_delegate = leaf_owner, not a signer in this call - accounts.push(AccountMeta::new_readonly( - context.accounts.leaf_owner.key(), - false, - )); - accounts.push(AccountMeta::new(context.accounts.merkle_tree.key(), false)); - accounts.push(AccountMeta::new_readonly( - context.accounts.log_wrapper.key(), - false, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.compression_program.key(), - false, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.system_program.key(), - false, - )); - // Append remaining accounts (proof nodes) - for acc in context.remaining_accounts.iter() { - accounts.push(AccountMeta::new_readonly(acc.key(), false)); - } - - let instruction = Instruction { - program_id: MPL_BUBBLEGUM_ID, - accounts, - data, - }; - - // Gather all account infos for the CPI - let mut account_infos = vec![ - context.accounts.bubblegum_program.to_account_info(), - context.accounts.tree_authority.to_account_info(), - context.accounts.leaf_owner.to_account_info(), - context.accounts.merkle_tree.to_account_info(), - context.accounts.log_wrapper.to_account_info(), - context.accounts.compression_program.to_account_info(), - context.accounts.system_program.to_account_info(), - ]; - for acc in context.remaining_accounts.iter() { - account_infos.push(acc.to_account_info()); - } - - invoke(&instruction, &account_infos)?; - - Ok(()) + instructions::burn_cnft::handle_burn_cnft(context, root, data_hash, creator_hash, nonce, index) } } - -#[derive(Accounts)] -pub struct BurnCnft<'info> { - #[account(mut)] - pub leaf_owner: Signer<'info>, - #[account(mut)] - #[account( - seeds = [merkle_tree.key().as_ref()], - bump, - seeds::program = bubblegum_program.key() - )] - /// CHECK: This account is modified in the downstream program - pub tree_authority: UncheckedAccount<'info>, - #[account(mut)] - /// CHECK: This account is neither written to nor read from. - pub merkle_tree: UncheckedAccount<'info>, - /// CHECK: This account is neither written to nor read from. - pub log_wrapper: UncheckedAccount<'info>, - pub compression_program: Program<'info, SPLCompression>, - // Pin the bubblegum program account to the known mpl-bubblegum id. Without - // this constraint the caller could pass any account and a malicious one - // could short-circuit the CPI in unexpected ways. - /// CHECK: address constrained to the mpl-bubblegum program id. - #[account(address = MPL_BUBBLEGUM_ID)] - pub bubblegum_program: UncheckedAccount<'info>, - pub system_program: Program<'info, System>, -} diff --git a/compression/cutils/anchor/programs/cutils/Cargo.toml b/compression/cutils/anchor/programs/cutils/Cargo.toml index 8ded92cb..7f5c38be 100644 --- a/compression/cutils/anchor/programs/cutils/Cargo.toml +++ b/compression/cutils/anchor/programs/cutils/Cargo.toml @@ -26,7 +26,6 @@ anchor-lang = "1.0.0" # using raw invoke() with hardcoded program IDs and discriminators. Bubblegum types # (MetadataArgs, LeafSchema, etc.) are re-implemented in bubblegum_types.rs. borsh = "1" -sha2 = "0.10" sha3 = "0.10" [lints.rust] diff --git a/compression/cutils/anchor/programs/cutils/src/instructions/mint.rs b/compression/cutils/anchor/programs/cutils/src/instructions/mint.rs index 45adeb64..795bb9ca 100644 --- a/compression/cutils/anchor/programs/cutils/src/instructions/mint.rs +++ b/compression/cutils/anchor/programs/cutils/src/instructions/mint.rs @@ -11,7 +11,7 @@ use borsh::BorshSerialize; #[derive(Accounts)] #[instruction(params: MintParams)] -pub struct Mint<'info> { +pub struct MintAccountConstraints<'info> { pub payer: Signer<'info>, #[account( @@ -30,7 +30,8 @@ pub struct Mint<'info> { pub leaf_delegate: UncheckedAccount<'info>, #[account(mut)] - /// CHECK: unsafe + /// CHECK: Written by the Bubblegum/Account Compression CPI (the mint + /// appends a leaf and updates the tree root); validated downstream. pub merkle_tree: UncheckedAccount<'info>, pub tree_delegate: Signer<'info>, @@ -70,140 +71,137 @@ pub struct MintParams { uri: String, } -impl Mint<'_> { - pub fn validate(&self, _context: &Context, _params: &MintParams) -> Result<()> { - Ok(()) - } - - // `with_capacity` + push is intentional here: it documents the exact 16-account - // MintToCollectionV1 layout in CPI order, so allow clippy's vec_init_then_push. - #[allow(clippy::vec_init_then_push)] - pub fn actuate<'info>(context: Context<'info, Mint<'info>>, params: MintParams) -> Result<()> { - // Build MintToCollectionV1 instruction data - let args = MintToCollectionV1InstructionArgs { - metadata: MetadataArgs { - name: "BURGER".to_string(), - symbol: "BURG".to_string(), - uri: params.uri, - creators: vec![Creator { - address: context.accounts.collection_authority.key(), - verified: false, - share: 100, - }], - seller_fee_basis_points: 0, - primary_sale_happened: false, - is_mutable: false, - edition_nonce: Some(0), - uses: None, - collection: Some(Collection { - verified: false, - key: context.accounts.collection_mint.key(), - }), - token_program_version: TokenProgramVersion::Original, - token_standard: Some(TokenStandard::NonFungible), - }, - }; - - let mut data = MINT_TO_COLLECTION_V1_DISCRIMINATOR.to_vec(); - args.serialize(&mut data)?; - - // Build account metas matching MintToCollectionV1 instruction layout - let mut accounts = Vec::with_capacity(16); - accounts.push(AccountMeta::new( - context.accounts.tree_authority.key(), - false, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.leaf_owner.key(), - false, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.leaf_delegate.key(), - false, - )); - accounts.push(AccountMeta::new(context.accounts.merkle_tree.key(), false)); - accounts.push(AccountMeta::new_readonly( - context.accounts.payer.key(), - true, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.tree_delegate.key(), - true, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.collection_authority.key(), - true, - )); - // collection_authority_record_pda - pass as-is - accounts.push(AccountMeta::new_readonly( - context.accounts.collection_authority_record_pda.key(), - false, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.collection_mint.key(), - false, - )); - accounts.push(AccountMeta::new( - context.accounts.collection_metadata.key(), - false, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.edition_account.key(), - false, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.bubblegum_signer.key(), - false, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.log_wrapper.key(), - false, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.compression_program.key(), - false, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.token_metadata_program.key(), - false, - )); - accounts.push(AccountMeta::new_readonly( - context.accounts.system_program.key(), - false, - )); - - let instruction = Instruction { - program_id: MPL_BUBBLEGUM_ID, - accounts, - data, - }; - - // Gather all account infos for the CPI - let account_infos = vec![ - context.accounts.bubblegum_program.to_account_info(), - context.accounts.tree_authority.to_account_info(), - context.accounts.leaf_owner.to_account_info(), - context.accounts.leaf_delegate.to_account_info(), - context.accounts.merkle_tree.to_account_info(), - context.accounts.payer.to_account_info(), - context.accounts.tree_delegate.to_account_info(), - context.accounts.collection_authority.to_account_info(), - context - .accounts - .collection_authority_record_pda - .to_account_info(), - context.accounts.collection_mint.to_account_info(), - context.accounts.collection_metadata.to_account_info(), - context.accounts.edition_account.to_account_info(), - context.accounts.bubblegum_signer.to_account_info(), - context.accounts.log_wrapper.to_account_info(), - context.accounts.compression_program.to_account_info(), - context.accounts.token_metadata_program.to_account_info(), - context.accounts.system_program.to_account_info(), - ]; - - invoke(&instruction, &account_infos)?; - - Ok(()) - } +// `with_capacity` + push is intentional here: it documents the exact 16-account +// MintToCollectionV1 layout in CPI order, so allow clippy's vec_init_then_push. +#[allow(clippy::vec_init_then_push)] +pub fn handle_mint<'info>( + context: Context<'info, MintAccountConstraints<'info>>, + params: MintParams, +) -> Result<()> { + // Build MintToCollectionV1 instruction data + let args = MintToCollectionV1InstructionArgs { + metadata: MetadataArgs { + name: "BURGER".to_string(), + symbol: "BURG".to_string(), + uri: params.uri, + creators: vec![Creator { + address: context.accounts.collection_authority.key(), + verified: false, + share: 100, + }], + seller_fee_basis_points: 0, + primary_sale_happened: false, + is_mutable: false, + edition_nonce: Some(0), + uses: None, + collection: Some(Collection { + verified: false, + key: context.accounts.collection_mint.key(), + }), + token_program_version: TokenProgramVersion::Original, + token_standard: Some(TokenStandard::NonFungible), + }, + }; + + let mut data = MINT_TO_COLLECTION_V1_DISCRIMINATOR.to_vec(); + args.serialize(&mut data)?; + + // Build account metas matching MintToCollectionV1 instruction layout + let mut accounts = Vec::with_capacity(16); + accounts.push(AccountMeta::new( + context.accounts.tree_authority.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.leaf_owner.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.leaf_delegate.key(), + false, + )); + accounts.push(AccountMeta::new(context.accounts.merkle_tree.key(), false)); + accounts.push(AccountMeta::new_readonly( + context.accounts.payer.key(), + true, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.tree_delegate.key(), + true, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.collection_authority.key(), + true, + )); + // collection_authority_record_pda - pass as-is + accounts.push(AccountMeta::new_readonly( + context.accounts.collection_authority_record_pda.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.collection_mint.key(), + false, + )); + accounts.push(AccountMeta::new( + context.accounts.collection_metadata.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.edition_account.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.bubblegum_signer.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.log_wrapper.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.compression_program.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.token_metadata_program.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.system_program.key(), + false, + )); + + let instruction = Instruction { + program_id: MPL_BUBBLEGUM_ID, + accounts, + data, + }; + + // Gather all account infos for the CPI + let account_infos = vec![ + context.accounts.bubblegum_program.to_account_info(), + context.accounts.tree_authority.to_account_info(), + context.accounts.leaf_owner.to_account_info(), + context.accounts.leaf_delegate.to_account_info(), + context.accounts.merkle_tree.to_account_info(), + context.accounts.payer.to_account_info(), + context.accounts.tree_delegate.to_account_info(), + context.accounts.collection_authority.to_account_info(), + context + .accounts + .collection_authority_record_pda + .to_account_info(), + context.accounts.collection_mint.to_account_info(), + context.accounts.collection_metadata.to_account_info(), + context.accounts.edition_account.to_account_info(), + context.accounts.bubblegum_signer.to_account_info(), + context.accounts.log_wrapper.to_account_info(), + context.accounts.compression_program.to_account_info(), + context.accounts.token_metadata_program.to_account_info(), + context.accounts.system_program.to_account_info(), + ]; + + invoke(&instruction, &account_infos)?; + + Ok(()) } diff --git a/compression/cutils/anchor/programs/cutils/src/instructions/verify.rs b/compression/cutils/anchor/programs/cutils/src/instructions/verify.rs index bb5cda15..60d72b51 100644 --- a/compression/cutils/anchor/programs/cutils/src/instructions/verify.rs +++ b/compression/cutils/anchor/programs/cutils/src/instructions/verify.rs @@ -4,13 +4,14 @@ use anchor_lang::solana_program::instruction::{AccountMeta, Instruction}; #[derive(Accounts)] #[instruction(params: VerifyParams)] -pub struct Verify<'info> { +pub struct VerifyAccountConstraints<'info> { pub leaf_owner: Signer<'info>, /// CHECK: This account is neither written to nor read from. pub leaf_delegate: UncheckedAccount<'info>, - /// CHECK: unsafe + /// CHECK: Read by the SPL Account Compression verify_leaf CPI, which + /// validates the proof against this tree's stored root. pub merkle_tree: UncheckedAccount<'info>, pub compression_program: Program<'info, SPLCompression>, @@ -25,62 +26,54 @@ pub struct VerifyParams { index: u32, } -impl Verify<'_> { - pub fn validate(&self, _context: &Context, _params: &VerifyParams) -> Result<()> { - Ok(()) - } - - pub fn actuate<'info>( - context: Context<'info, Verify<'info>>, - params: &VerifyParams, - ) -> Result<()> { - let asset_id = get_asset_id(&context.accounts.merkle_tree.key(), params.nonce); - let leaf_hash = leaf_schema_v1_hash( - &asset_id, - &context.accounts.leaf_owner.key(), - &context.accounts.leaf_delegate.key(), - params.nonce, - ¶ms.data_hash, - ¶ms.creator_hash, - ); +/// spl-account-compression `verify_leaf` instruction discriminator: +/// sha256("global:verify_leaf")[..8]. Precomputed because hashing a constant +/// at runtime burns compute for no benefit. +const VERIFY_LEAF_DISCRIMINATOR: [u8; 8] = [124, 220, 22, 223, 104, 10, 250, 224]; - // Build verify_leaf instruction manually because spl-account-compression 1.0.0 - // depends on solana-program 2.x which is incompatible with Anchor 1.0's solana 3.x - // types. Once a compatible version is available, replace this with the CPI wrapper. - use sha2::{Digest, Sha256}; +pub fn handle_verify<'info>( + context: Context<'info, VerifyAccountConstraints<'info>>, + params: &VerifyParams, +) -> Result<()> { + let asset_id = get_asset_id(&context.accounts.merkle_tree.key(), params.nonce); + let leaf_hash = leaf_schema_v1_hash( + &asset_id, + &context.accounts.leaf_owner.key(), + &context.accounts.leaf_delegate.key(), + params.nonce, + ¶ms.data_hash, + ¶ms.creator_hash, + ); - let mut accounts = vec![AccountMeta::new_readonly( - context.accounts.merkle_tree.key(), - false, - )]; - for acc in context.remaining_accounts.iter() { - accounts.push(AccountMeta::new_readonly(acc.key(), false)); - } + // Build verify_leaf instruction manually because spl-account-compression 1.0.0 + // depends on solana-program 2.x which is incompatible with Anchor 1.0's solana 3.x + // types. Once a compatible version is available, replace this with the CPI wrapper. + let mut accounts = vec![AccountMeta::new_readonly( + context.accounts.merkle_tree.key(), + false, + )]; + for acc in context.remaining_accounts.iter() { + accounts.push(AccountMeta::new_readonly(acc.key(), false)); + } - // Compute the spl-account-compression verify_leaf discriminator: - // sha256("global:verify_leaf")[..8] - let discriminator: [u8; 8] = Sha256::digest(b"global:verify_leaf")[..8] - .try_into() - .unwrap(); - let mut data = discriminator.to_vec(); - data.extend_from_slice(¶ms.root); - data.extend_from_slice(&leaf_hash); - data.extend_from_slice(¶ms.index.to_le_bytes()); + let mut data = VERIFY_LEAF_DISCRIMINATOR.to_vec(); + data.extend_from_slice(¶ms.root); + data.extend_from_slice(&leaf_hash); + data.extend_from_slice(¶ms.index.to_le_bytes()); - let mut account_infos = vec![context.accounts.merkle_tree.to_account_info()]; - for acc in context.remaining_accounts.iter() { - account_infos.push(acc.to_account_info()); - } + let mut account_infos = vec![context.accounts.merkle_tree.to_account_info()]; + for acc in context.remaining_accounts.iter() { + account_infos.push(acc.to_account_info()); + } - anchor_lang::solana_program::program::invoke( - &Instruction { - program_id: context.accounts.compression_program.key(), - accounts, - data, - }, - &account_infos, - )?; + anchor_lang::solana_program::program::invoke( + &Instruction { + program_id: context.accounts.compression_program.key(), + accounts, + data, + }, + &account_infos, + )?; - Ok(()) - } + Ok(()) } diff --git a/compression/cutils/anchor/programs/cutils/src/lib.rs b/compression/cutils/anchor/programs/cutils/src/lib.rs index e39a7602..dde598ed 100644 --- a/compression/cutils/anchor/programs/cutils/src/lib.rs +++ b/compression/cutils/anchor/programs/cutils/src/lib.rs @@ -7,9 +7,6 @@ pub use instructions::*; pub mod bubblegum_types; -pub mod state; -pub use state::*; - use anchor_lang::prelude::*; /// SPL Account Compression program ID (cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK) @@ -39,16 +36,17 @@ declare_id!("BuFyrgRYzg2nPhqYrxZ7d9uYUs4VXtxH71U8EcoAfTQZ"); pub mod cutils { use super::*; - #[access_control(context.accounts.validate(&context, ¶ms))] - pub fn mint<'info>(context: Context<'info, Mint<'info>>, params: MintParams) -> Result<()> { - Mint::actuate(context, params) + pub fn mint<'info>( + context: Context<'info, MintAccountConstraints<'info>>, + params: MintParams, + ) -> Result<()> { + instructions::mint::handle_mint(context, params) } - #[access_control(context.accounts.validate(&context, ¶ms))] pub fn verify<'info>( - context: Context<'info, Verify<'info>>, + context: Context<'info, VerifyAccountConstraints<'info>>, params: VerifyParams, ) -> Result<()> { - Verify::actuate(context, ¶ms) + instructions::verify::handle_verify(context, ¶ms) } } diff --git a/compression/cutils/anchor/programs/cutils/src/state/data.rs b/compression/cutils/anchor/programs/cutils/src/state/data.rs deleted file mode 100644 index a4d9ef5b..00000000 --- a/compression/cutils/anchor/programs/cutils/src/state/data.rs +++ /dev/null @@ -1,22 +0,0 @@ -use crate::*; - -pub const SEED_DATA: &[u8] = b"DATA"; - -#[account] -#[derive(Default, Debug, InitSpace)] -pub struct Data { - /// The bump, used for PDA validation. - pub bump: u8, - pub tree: Pubkey, - pub tree_nonce: u64, -} - -impl Data { - pub fn new(bump: u8, tree: Pubkey, tree_nonce: u64) -> Self { - Self { - bump, - tree, - tree_nonce, - } - } -} diff --git a/compression/cutils/anchor/programs/cutils/src/state/mod.rs b/compression/cutils/anchor/programs/cutils/src/state/mod.rs deleted file mode 100644 index 8800e0f3..00000000 --- a/compression/cutils/anchor/programs/cutils/src/state/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod data; -pub use data::*; diff --git a/compression/cutils/quasar/src/lib.rs b/compression/cutils/quasar/src/lib.rs index e9b674c6..b272dac2 100644 --- a/compression/cutils/quasar/src/lib.rs +++ b/compression/cutils/quasar/src/lib.rs @@ -4,7 +4,6 @@ use quasar_lang::prelude::*; mod bubblegum_types; mod instructions; -mod state; use instructions::*; #[cfg(test)] mod tests; diff --git a/compression/cutils/quasar/src/state.rs b/compression/cutils/quasar/src/state.rs deleted file mode 100644 index aa57bee2..00000000 --- a/compression/cutils/quasar/src/state.rs +++ /dev/null @@ -1,17 +0,0 @@ -use quasar_lang::prelude::*; - -/// Seed for the data account PDA. -pub const SEED_DATA: &[u8] = b"DATA"; - -/// Tracks the merkle tree and its nonce for minting. -#[account(discriminator = 1)] -pub struct Data { - /// PDA bump seed. - pub bump: u8, - /// Padding for alignment. - pub _padding: [u8; 7], - /// The merkle tree address. - pub tree: Address, - /// Current nonce in the tree. - pub tree_nonce: u64, -} From b188f997394f1233079fd7a432ebe2f471e28a25 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:52:26 +0000 Subject: [PATCH 060/138] cutils: drop README references to the removed validate/actuate pattern https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- compression/cutils/anchor/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/compression/cutils/anchor/README.md b/compression/cutils/anchor/README.md index 9a8330a3..edd5ae69 100644 --- a/compression/cutils/anchor/README.md +++ b/compression/cutils/anchor/README.md @@ -11,7 +11,7 @@ Use this as a reference for working with cNFTs in your own programs. ## Components -- `programs/cutils/` - the Anchor program. The setup uses a `validate`/`actuate` pattern via Anchor's `access_control` macro; this pairs well with the cNFT verification logic. +- `programs/cutils/` - the Anchor program. Instruction handlers live in `src/instructions/` (`handle_mint`, `handle_verify`). ## Testing @@ -36,4 +36,3 @@ Reference implementation only. - [@nickfrosty](https://twitter.com/nickfrosty) for the sample code and [live demo](https://youtu.be/LxhTxS9DexU). - [@HeyAndyS](https://twitter.com/HeyAndyS) for the groundwork in `cnft-vault`. -- Switchboard VRF-flip (since archived) for inspiring the validate/actuate setup. From f2db3d8af41f8949d6b777f1c7a8b73bc61e830b Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:53:52 +0000 Subject: [PATCH 061/138] gitignore: keep escrow native's rebuilt fixture .so untracked https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 0103d507..9b4f2613 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,10 @@ node_modules/ **/*/target **/*/tests/fixtures/* !**/*/tests/fixtures/*.so +# Exception to the exception: escrow native's fixture .so is OUR program's +# build output (cargo build-sbf --sbf-out-dir=tests/fixtures regenerates it), +# not a third-party dump, so it stays untracked. +finance/escrow/native/tests/fixtures/escrow_native_program.so **/*.rs.bk **/*/test-ledger **/*/yarn.lock From 3e2441cd5ab559354b48018272bd68340fcf7723 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:54:10 +0000 Subject: [PATCH 062/138] Cargo.lock: prune stale counter-mpl-stack and shank entries left from removed packages https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- Cargo.lock | 55 ------------------------------------------------------ 1 file changed, 55 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 09654b5e..2a68a992 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1156,15 +1156,6 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" -[[package]] -name = "counter-mpl-stack" -version = "0.1.0" -dependencies = [ - "borsh 1.6.1", - "shank", - "solana-program 4.0.0", -] - [[package]] name = "counter-solana-native" version = "0.1.0" @@ -3172,52 +3163,6 @@ dependencies = [ "keccak", ] -[[package]] -name = "shank" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a1dc1d3af4ba5f02190110598b2abac0d13ce9dc58408aba4549e1c0f91a24c" -dependencies = [ - "shank_macro", -] - -[[package]] -name = "shank_macro" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63dbf105335507ad339dccacf3b1ea20e4c0b70d992b4de7cc11d5c0b91b0747" -dependencies = [ - "proc-macro2", - "quote", - "shank_macro_impl", - "shank_render", - "syn 1.0.109", -] - -[[package]] -name = "shank_macro_impl" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346563412da6d1a53bc53c81f9d8b102f177952b95fd8de00e5d2203a4685635" -dependencies = [ - "anyhow", - "proc-macro2", - "quote", - "serde", - "syn 1.0.109", -] - -[[package]] -name = "shank_render" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8358067ec1787814d2577e76d9ddcc980559ad821e6bd04584f4847f4d1d955c" -dependencies = [ - "proc-macro2", - "quote", - "shank_macro_impl", -] - [[package]] name = "shlex" version = "1.3.0" From 638f4271608e038d521962deb2520367f8cc1b5a Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 21:58:33 +0000 Subject: [PATCH 063/138] wip: checkpoint of in-progress fix sweeps (signer checks, decimal scaling, ID alignment) Checkpoint of agent work still being verified: shank-and-codama and close-account signer/owner checks, token decimal-scaling fixes, quasar program-ID alignment, and basics account-struct renames. Final verified states land in the following commits. https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- basics/close-account/native/package.json | 18 +- basics/close-account/native/pnpm-lock.yaml | 2163 ++++++++++------- .../program/src/instructions/close_user.rs | 45 +- .../native/program/src/processor.rs | 2 +- .../native/program/tests/test.rs | 170 +- .../native/tests/close-account.test.ts | 174 +- .../fixtures/close_account_native_program.so | Bin 0 -> 88528 bytes .../native/tests/tsconfig.test.json | 10 - .../pinocchio/program/src/lib.rs | 65 +- .../pinocchio/program/tests/tests.rs | 223 +- .../close_account_pinocchio_program.so | Bin 0 -> 19200 bytes basics/counter/quasar/src/lib.rs | 2 +- .../quasar/src/instructions/hello.rs | 2 +- basics/hello-solana/quasar/src/lib.rs | 2 +- .../src/instructions/initialize.rs | 4 +- .../anchor-realloc/src/instructions/update.rs | 4 +- .../anchor/programs/anchor-realloc/src/lib.rs | 4 +- .../anchor-realloc/tests/test_realloc.rs | 10 +- .../tests/fixtures/transfer_sol_program.so | Bin 0 -> 70416 bytes .../instructions/transfer_sol_with_program.rs | 44 +- basics/transfer-sol/quasar/src/lib.rs | 2 +- finance/escrow/quasar/src/lib.rs | 2 +- finance/token-fundraiser/quasar/src/lib.rs | 2 +- finance/token-swap/quasar/src/lib.rs | 2 +- tokens/create-token/quasar/src/lib.rs | 56 +- tokens/create-token/quasar/src/tests.rs | 13 +- .../quasar/src/lib.rs | 2 +- tokens/nft-minter/quasar/src/lib.rs | 2 +- tokens/pda-mint-authority/anchor/Anchor.toml | 5 +- tokens/pda-mint-authority/anchor/README.md | 1 + .../token-minter/src/instructions/mint.rs | 15 +- .../anchor/programs/token-minter/src/lib.rs | 6 +- .../token-minter/tests/test_pda_mint.rs | 23 +- .../token-extensions/basics/quasar/src/lib.rs | 2 +- .../cpi-guard/quasar/src/lib.rs | 2 +- .../default-account-state/quasar/src/lib.rs | 2 +- .../token-extensions/group/quasar/src/lib.rs | 2 +- .../immutable-owner/quasar/src/lib.rs | 2 +- .../interest-bearing/quasar/src/lib.rs | 2 +- .../memo-transfer/quasar/src/lib.rs | 2 +- .../mint-close-authority/quasar/src/lib.rs | 2 +- .../non-transferable/quasar/src/lib.rs | 2 +- .../permanent-delegate/quasar/src/lib.rs | 2 +- .../transfer-fee/quasar/src/lib.rs | 2 +- .../account-data-as-seed/quasar/src/lib.rs | 2 +- .../transfer-hook/counter/quasar/src/lib.rs | 2 +- .../hello-world/quasar/src/lib.rs | 2 +- .../transfer-cost/quasar/src/lib.rs | 2 +- .../transfer-switch/quasar/src/lib.rs | 2 +- .../transfer-hook/whitelist/quasar/src/lib.rs | 2 +- tokens/token-minter/anchor/Anchor.toml | 5 +- tokens/token-minter/anchor/README.md | 1 + .../token-minter/src/instructions/mint.rs | 16 +- .../anchor/programs/token-minter/src/lib.rs | 6 +- .../token-minter/tests/test_token_minter.rs | 23 +- tokens/transfer-tokens/README.md | 2 +- tokens/transfer-tokens/anchor/Anchor.toml | 5 +- tokens/transfer-tokens/anchor/README.md | 6 +- .../src/instructions/create.rs | 12 +- .../transfer-tokens/src/instructions/mint.rs | 25 +- .../src/instructions/transfer.rs | 40 +- .../programs/transfer-tokens/src/lib.rs | 14 +- .../tests/test_transfer_tokens.rs | 40 +- tools/shank-and-codama/native/README.md | 10 +- .../program/idl/car_rental_service.json | 60 +- .../native/program/src/error.rs | 30 + .../program/src/instructions/add_car.rs | 6 +- .../program/src/instructions/book_rental.rs | 9 +- .../native/program/src/instructions/mod.rs | 8 +- .../program/src/instructions/pick_up_car.rs | 27 +- .../program/src/instructions/return_car.rs | 28 +- .../native/program/src/lib.rs | 1 + .../native/program/src/state/mod.rs | 2 +- .../generated/src/generated/accounts/car.ts | 21 +- .../src/generated/accounts/rentalOrder.ts | 21 +- .../src/generated/instructions/addCar.ts | 105 +- .../src/generated/instructions/bookRental.ts | 102 +- .../src/generated/instructions/pickUpCar.ts | 100 +- .../src/generated/instructions/returnCar.ts | 100 +- .../generated/programs/carRentalService.ts | 64 +- .../src/generated/types/rentalOrderStatus.ts | 14 +- tools/shank-and-codama/native/tests/test.ts | 181 +- 82 files changed, 2821 insertions(+), 1370 deletions(-) create mode 100755 basics/close-account/native/tests/fixtures/close_account_native_program.so delete mode 100644 basics/close-account/native/tests/tsconfig.test.json create mode 100755 basics/close-account/pinocchio/tests/fixtures/close_account_pinocchio_program.so create mode 100755 basics/transfer-sol/native/tests/fixtures/transfer_sol_program.so create mode 100644 tools/shank-and-codama/native/program/src/error.rs diff --git a/basics/close-account/native/package.json b/basics/close-account/native/package.json index f464f367..740e87a4 100644 --- a/basics/close-account/native/package.json +++ b/basics/close-account/native/package.json @@ -1,22 +1,20 @@ { "type": "module", "scripts": { - "test": "pnpm ts-mocha -p ./tests/tsconfig.test.json -t 1000000 ./tests/close-account.test.ts", + "test": "node --import tsx --test ./tests/close-account.test.ts", "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", "deploy": "solana program deploy ./program/target/so/program.so" }, "dependencies": { - "@solana/web3.js": "^1.98.4" + "@solana/kit": "^6.9.0", + "@solana/web3.js": "^1.98.4", + "borsh": "^0.7.0", + "litesvm": "^1.1.0" }, "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" + "@types/node": "^25.9.1", + "tsx": "^4.22.4", + "typescript": "^5.9.0" } } diff --git a/basics/close-account/native/pnpm-lock.yaml b/basics/close-account/native/pnpm-lock.yaml index 6f8339c0..67600698 100644 --- a/basics/close-account/native/pnpm-lock.yaml +++ b/basics/close-account/native/pnpm-lock.yaml @@ -8,34 +8,28 @@ importers: .: dependencies: + '@solana/kit': + specifier: ^6.9.0 + version: 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) + version: 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + borsh: + specifier: ^0.7.0 + version: 0.7.0 + litesvm: + specifier: ^1.1.0 + version: 1.1.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) + '@types/node': + specifier: ^25.9.1 + version: 25.9.2 + tsx: + specifier: ^4.22.4 + version: 4.22.4 typescript: - specifier: ^4.3.5 - version: 4.9.5 + specifier: ^5.9.0 + version: 5.9.3 packages: @@ -43,6 +37,162 @@ packages: resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} engines: {node: '>=6.9.0'} + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@noble/curves@1.9.1': resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} engines: {node: ^14.21.3 || >=16} @@ -51,6 +201,43 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} + '@solana-program/system@0.12.2': + resolution: {integrity: sha512-MaBeOxlvTruQhA7UYkOb3hVTEHPPagOtd+PvTm6a8rGgvEAP0kD4BbC37NceOaR4ABNqdaCmD5OMVRKgrE6KAg==} + peerDependencies: + '@solana/kit': ^6.4.0 + + '@solana-program/token@0.13.0': + resolution: {integrity: sha512-/Apjrd5lwOJGrPB0J5Rv7EBeclvyEBQPAGA85Scm7wBH+GpkbdLDM9uK3TNg8jjFKyWQYai/JtPHbrx7VgFLSg==} + peerDependencies: + '@solana/kit': ^6.5.0 + + '@solana/accounts@6.9.0': + resolution: {integrity: sha512-g36AJreJrgf9AAjOfbdFHEFUTymBgzbWHoEDElZ+fDKvqBINDiUVKzDApwc7C7kGPMFqQBaoEHnQRxf2IqfKZQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/addresses@6.9.0': + resolution: {integrity: sha512-tWnG2L6lo/ZhcMT019F3myDsH87MM8EZbTO0cgwgvVPlEdIGblROFF3tGVrb7FVCOlbPI0ONCFyPbnrmR58LsA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/assertions@6.9.0': + resolution: {integrity: sha512-FjWWD6e0in+HFsHMvU2zKCbyPfKtDW6iGXZZ9+Qg1QUYpO1AEObsya3F7hb9RkZKUueK4WwWAQnIuvEUp3A1uA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@solana/buffer-layout@4.0.1': resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} engines: {node: '>=5.10'} @@ -61,12 +248,60 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/codecs-core@6.9.0': + resolution: {integrity: sha512-F2BmLecG/1nTtnjyD509NsEc254pxJKa2bpvotymv1lL1WfEn3zchcZ9SMIiLyL4G6J8b9F3OKIq2YSZho2AOQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-data-structures@6.9.0': + resolution: {integrity: sha512-f7GYtiHafvJDhqiwzUUSr/6AYSK4DCw6quPmA80NZGtkNiFa+g6LoJy2wbC0wp2dxvCwNpxf6x3ILCYRutAvvg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@solana/codecs-numbers@2.1.1': resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/codecs-numbers@6.9.0': + resolution: {integrity: sha512-XMI0FOHV2h7yPAllxWCX8z+J1msidNjXzN1mRjH5KR6C+vfzyKa2xWHve0bNSV/bjVAhqqhc7dQCpBKuF4+ScQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-strings@6.9.0': + resolution: {integrity: sha512-PTqYQxMsmdfEEq29bV1AnALD4FjFEsSxOj1fYNqooOSTEQEpUoYEQtsd55/kBsnIKltXbvYwXYXBusm19n1sQA==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.4.0' + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true + + '@solana/codecs@6.9.0': + resolution: {integrity: sha512-oWOybKa1PTGI1D/FyrvGKralADM1jmVZC2AtgEo+4JTKG0+i1p9ZbwNY2UcJqdYsDMDaGHAx0LMAid9LDCxXTQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@solana/errors@2.1.1': resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} engines: {node: '>=20.18.0'} @@ -74,32 +309,327 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/errors@6.9.0': + resolution: {integrity: sha512-7i+b07KMnkbHvFlz7uWade3jvyc22UmVm8o9taxPK8YV3JNM/NkS8oQFvMac2MIaLPAlEs7I8MHyVLUal1yY4g==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fast-stable-stringify@6.9.0': + resolution: {integrity: sha512-l14zGVsURbT5Aox/kLFQywqV4VaE9/j3h2EvCu9oULVPMwzQB6yezJb1/KyiDwhm/RscooPd0gFQFIKEGQbayw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fixed-points@6.9.0': + resolution: {integrity: sha512-0K7mbYC4jdAZFlXqXjpNanmEyZxk7K9NtXDLc1zuhGuxwH8J9guvohwdw2V7TQ9bfjCYsprY3Tp2kUVQpECGmA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/functional@6.9.0': + resolution: {integrity: sha512-sgNHOaIjETZZuziZdlwPsU5EjBVj5M0dUbwrSQTTNZe0SxX3pQ1QFVcs5KyvdS7AQcpBVdLjx4CfQjdKXk52GA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instruction-plans@6.9.0': + resolution: {integrity: sha512-SxTSOetEKD+WPzvDuYRsP1+KkwUp8KqL1n7oFx9ThxjyfEY0ly0i9KdbvX5yYVDOA2TSwrltgdu14y/Pf6y3Cg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instructions@6.9.0': + resolution: {integrity: sha512-LZfJx3bGdUSbGaswoOEPHygticqkCg3TusRczPJXyCmKhoQzPCcGQQ99qMzP7Wg8pEV5tWA5t7tycf8E237ydg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/keys@6.9.0': + resolution: {integrity: sha512-1g2QARiqSjNqT0EIqLDLQ5vRm7hCsbqgFwFAp5GsMV/8BTYT8s1Ct2wLHDZiJ4eAX6beTHVf8LbOBfVejtn3oQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/kit@6.9.0': + resolution: {integrity: sha512-k7BRz7Akfv8wiRtlCR/xUyDLfuMfYMelMR1+AC5KgwaRRJReDF0BucMLNN1In7WoI+KuWwr1OKv4na/oKpyeAQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/nominal-types@6.9.0': + resolution: {integrity: sha512-ouhrnY7a6nsLXRGcariwcmHDdXroCNqOuzwtdjKt2c8e8Drwao9yxPH2VoViNgpq8IGNJeQMEI1TVnoJZRn0gw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/offchain-messages@6.9.0': + resolution: {integrity: sha512-qK3tqRPb+E0kmTz5qFXZbEdF4pyzfOWRZjyVESHVGemDDeGzZ1SV3zAxcA6HBCnv4wCBnlyaDPw8t+5sryNMAw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/options@6.9.0': + resolution: {integrity: sha512-H5ZRWNzzLMwHU/fRU9aVx+3TaMN4gDNCUYxsZxq0h7mqiwxFy6mpy95xPsfdldthCHDYtYnUTxe2sBatGbNHig==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-core@6.9.0': + resolution: {integrity: sha512-KslLSnzY8zbGZibEBVMVUm2ZS8T2xf+cut7F65VjWPoWNAxU+p7933wsMz/az6CF7b65RI7iU3HhCr5/5QF50w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-interfaces@6.9.0': + resolution: {integrity: sha512-Qj4sk9thkM1UgnFXvWIoezd/CbqpX/2jigLBDsMB5Ed/gmFlkBSTL127LFDSY3OtzBpXl4hROs+Zqv+5xqtguA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/program-client-core@6.9.0': + resolution: {integrity: sha512-+iUnsddhs72QoBJoUO+/yHUXoBvYWa1sGCBRJk35zeg8j7ZXEwRkk6eX0VOrUPxhEpQbYJsIOCrIYApNIt8RFw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/programs@6.9.0': + resolution: {integrity: sha512-L9LAnQtfFFcCDLcbbnxhUtgAmu/kS4aRmrVncdnX5CFyQshlpo0/Qhrq3UA7vnhute4gjYV4pFT+64onH5qGEQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/promises@6.9.0': + resolution: {integrity: sha512-227PlXRi6KZX4ODYTkJitr9InSa79NTquI72slay4gzxO9VmMepgvYdMAX6kawdN5pt+VzaklKhNhWXk50Pi9g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-api@6.9.0': + resolution: {integrity: sha512-3KhXS6A1ie6GqTywW/KEMSXJ1VJEU66fxjhuiiqPILuJstP7kex3ycr3H6DirKydUsy6gaKaPN43rE+LfyS7OA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-parsed-types@6.9.0': + resolution: {integrity: sha512-6ThH8izY+DWDyrVOOlS40vTcFjwjCinjfqnId7zhRk8OxhkfHQ/iEj+OnGwD4Yhe8pGdVa7GNVYlrQgQgzQ3eQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec-types@6.9.0': + resolution: {integrity: sha512-A4fY1JRrcKqX3EfttO4Q8L97nGPqdjfekAV0eDyxN5nu9ngf5p7GKenkl7AYDoHLNr6ZX/C96cRADxXjsRJ0iA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec@6.9.0': + resolution: {integrity: sha512-3yHRoChc0IpsJbUq0/94l+ar3t9U3Ax58W0HON7eyYe7zFP10UAxpkHn7DPch9DeALyuGph8kVnvl+kXRgJlGg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-api@6.9.0': + resolution: {integrity: sha512-UA/rPQeNx6zQMUFcS8PPPuB4vzUOtSzIY/igMH0DRoP020NyES2GguIb7Zo7sqDNi4n0gkQRhoW4dPVotcNKdA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-channel-websocket@6.9.0': + resolution: {integrity: sha512-kT8Yne9HjJD2gooaOFNSyKrvaIfOy2GR0Ymv8OfecBCwFStdz+SPo5eYXq8ZWoZbr5E/MMpHgqsHBanqa2Ffyg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-spec@6.9.0': + resolution: {integrity: sha512-DbaG67s99vRZQxFMK80UQ7DEKkRJK6JEZeYg/U5UttD6n7ax/vct7qopxGnrt4RCkaaac2fU8Sr+fcnvWQweUg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions@6.9.0': + resolution: {integrity: sha512-IMctZQaMxzvRACQ6ooW98lP+7tVoUJnRgOZtkAdzgBizldQAYPIKd3MulP0jbQPCMfdPsa2Hs0NBcUwfgonq3w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transformers@6.9.0': + resolution: {integrity: sha512-dg4LK2wEBpaY+KRk/SJIkYvrvjdsc1AwD4bkmGY4Fp7EwVlvwBQShAQn78Qi4IP0WQ/0n9ncFyUxgcB1Y01ZuQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transport-http@6.9.0': + resolution: {integrity: sha512-4gy30fWJcS6jrcXCoP/optFpGJ/gD9xdkE8wDbe1Ys/Y+e4XjyBt45xtTnbdmMdukvdRX+oXS3zgUIYoagpNzQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-types@6.9.0': + resolution: {integrity: sha512-iFhPzZK3qiQ1lhfNTNBTI7BIs5PfWZSgRLD3enKm8ZAQggzvUklfO3KPh47jVsc/Jsr1UGPH8M3o3m17qjO1Cg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc@6.9.0': + resolution: {integrity: sha512-ny1Kt20+oq3xZErNA56+Magmb2JKYfQgHwZTsBmHKVl/9mBpv1y1+ygV+KNiiX/wWXWstLbdIo1jgPwZPbU2Vg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/signers@6.9.0': + resolution: {integrity: sha512-x7WyoRm9IORMqeSqNivZgyY+RERPkmqWxpINPD13kUH+oaZzonORIgxk2Lz+u5iPRXiJPkdRPrQ4FoFWv8i6kQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/subscribable@6.9.0': + resolution: {integrity: sha512-YV0/BrJNfepf10CTfLwD7kRY1kkELDHd+BbHJZhBeiuiXTY3xQTvvx1RFs3NtfFCcTHG25Uh8NpRacQJnxSSIQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/sysvars@6.9.0': + resolution: {integrity: sha512-e0e+QKr/th9t/O2N1oUoJmcodLghzAtWKUlGb1zyYub0/WJrPImnKqJqp/gDP4tK98mJxopPMcprCeHk4B+TQg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-confirmation@6.9.0': + resolution: {integrity: sha512-fzYCOih7hhtBzzNSkAnxMjeFeQ8U7e27k9i0RsgQc3/e3OCynF5HoIVNhhqZbwfIBKiaD4ginJR6slRnfqO32Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-messages@6.9.0': + resolution: {integrity: sha512-OWpryt0w6SHlwHx12Vd1wvx2QwSGBXAIUEHTCtkctcM3AaZRy5cIl7CAq9iD5PgahUsaOyRLBV0zlCJcC2JrJA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transactions@6.9.0': + resolution: {integrity: sha512-uKPzLwHbjwChfVl82he17ntkh02PfgnMMhN7uOAC+VbkIt1O+EEw8sX87gi6kdG/EV+QBDQXm9PLAo5W0tYylw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@solana/web3.js@1.98.4': resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} + '@types/node@25.9.2': + resolution: {integrity: sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==} '@types/uuid@8.3.4': resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} @@ -110,74 +640,25 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - agentkeepalive@4.6.0: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - bn.js@5.2.2: resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -185,94 +666,39 @@ packages: resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} engines: {node: '>=6.14.2'} - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - chalk@5.4.1: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} commander@13.1.0: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - delay@5.0.0: resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} engines: {node: '>=10'} - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} es6-promisify@5.0.0: resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -282,99 +708,19 @@ packages: engines: {node: '> 0.1.90'} fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isomorphic-ws@4.0.1: resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} peerDependencies: @@ -385,61 +731,56 @@ packages: engines: {node: '>=8'} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + litesvm-darwin-arm64@1.1.0: + resolution: {integrity: sha512-SjcivEOOjBk65U6TgIeMJ7CCnHNKQXHx0qf6K6GIFZC1aHTg7ePrEi+WhAQD6VUBMdDHIMCVKC/uXnXPi6EKIw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + litesvm-darwin-x64@1.1.0: + resolution: {integrity: sha512-hTs+eZ9sHVZXhjggpnn/8A/E+Nt/E6Gf8E2ejdWWL9bBQKmq1Y0VcrDpORbIvqqRpTLHXqbxCuH1wQB2C8frJg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} + litesvm-linux-arm64-gnu@1.1.0: + resolution: {integrity: sha512-6EjJ6+E+1SUXdJmCyeyhvlKhNncccqQNH241+P8d4E72rE3zuFxeCtLHhusCQk2p/Xau3dBI0qTLogZ1F1IGSA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + litesvm-linux-arm64-musl@1.1.0: + resolution: {integrity: sha512-mNuBOfX6GnDFT2i/kYPWud7eZGe57dDP0u4lwiSTQPRE0BxQbGZT2aEwX8LTwbonhbc6HSt50LamaZZzK4h4ig==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + litesvm-linux-x64-gnu@1.1.0: + resolution: {integrity: sha512-Ot8RgUVlMKzKJi2nVDxaHVo0hjB5vtYTomYNIf26mIA32DOy0+dQfwOqUhynhvvSMxN3VFec3r/OtCnk6lRBrw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true + litesvm-linux-x64-musl@1.1.0: + resolution: {integrity: sha512-6kmneOIsTBSActELRTwxIYVJOVaLm3P6uwlmkqc9BUtDAQ7bRdRmwREWSbM8XxKBGw2LjiUfgRJ5WJGYo8fUFg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + litesvm@1.1.0: + resolution: {integrity: sha512-UOlMIEst50gSUyPnC2pGjGLygH8iC/GOqnNXQIHc8iGwD76m44ReeA/0h0vu/AIieZ2zG5/ERLxFV0kdNxkNsA==} + engines: {node: '>= 20'} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -453,171 +794,46 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - rpc-websockets@9.1.1: resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - stream-chain@2.2.5: resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} stream-json@1.9.1: resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - superstruct@2.0.2: resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} engines: {node: '>=14.0.0'} - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - text-encoding-utf-8@1.0.2: resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} + tsx@4.22.4: + resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} + engines: {node: '>=18.0.0'} + hasBin: true - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} hasBin: true - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + undici-types@8.4.1: + resolution: {integrity: sha512-iIXDNrTeaM0lDZvNUY1Urfs9dVgOWdQCkv6VMiePh644EKce0qoz6FNxxg7/DS4CxbFI36Atlz0VgHKS2qL1Dw==} utf-8-validate@5.0.10: resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} @@ -633,21 +849,6 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -672,68 +873,612 @@ packages: utf-8-validate: optional: true - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + +snapshots: + + '@babel/runtime@7.27.1': {} + + '@esbuild/aix-ppc64@0.28.0': + optional: true + + '@esbuild/android-arm64@0.28.0': + optional: true + + '@esbuild/android-arm@0.28.0': + optional: true + + '@esbuild/android-x64@0.28.0': + optional: true + + '@esbuild/darwin-arm64@0.28.0': + optional: true + + '@esbuild/darwin-x64@0.28.0': + optional: true + + '@esbuild/freebsd-arm64@0.28.0': + optional: true + + '@esbuild/freebsd-x64@0.28.0': + optional: true + + '@esbuild/linux-arm64@0.28.0': + optional: true + + '@esbuild/linux-arm@0.28.0': + optional: true + + '@esbuild/linux-ia32@0.28.0': + optional: true + + '@esbuild/linux-loong64@0.28.0': + optional: true + + '@esbuild/linux-mips64el@0.28.0': + optional: true + + '@esbuild/linux-ppc64@0.28.0': + optional: true + + '@esbuild/linux-riscv64@0.28.0': + optional: true + + '@esbuild/linux-s390x@0.28.0': + optional: true + + '@esbuild/linux-x64@0.28.0': + optional: true + + '@esbuild/netbsd-arm64@0.28.0': + optional: true + + '@esbuild/netbsd-x64@0.28.0': + optional: true + + '@esbuild/openbsd-arm64@0.28.0': + optional: true + + '@esbuild/openbsd-x64@0.28.0': + optional: true + + '@esbuild/openharmony-arm64@0.28.0': + optional: true + + '@esbuild/sunos-x64@0.28.0': + optional: true + + '@esbuild/win32-arm64@0.28.0': + optional: true + + '@esbuild/win32-ia32@0.28.0': + optional: true + + '@esbuild/win32-x64@0.28.0': + optional: true + + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.8.0': {} + + '@solana-program/system@0.12.2(@solana/kit@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/kit': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + + '@solana-program/token@0.13.0(@solana/kit@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana-program/system': 0.12.2(@solana/kit@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/kit': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + + '@solana/accounts@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/addresses@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/assertions': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/assertions@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/buffer-layout@4.0.1': + dependencies: + buffer: 6.0.3 + + '@solana/codecs-core@2.1.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.1.1(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-core@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-data-structures@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-numbers@2.1.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.1.1(typescript@5.9.3) + '@solana/errors': 2.1.1(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-numbers@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-strings@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/fixed-points': 6.9.0(typescript@5.9.3) + '@solana/options': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/errors@2.1.1(typescript@5.9.3)': + dependencies: + chalk: 5.4.1 + commander: 13.1.0 + typescript: 5.9.3 + + '@solana/errors@6.9.0(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.3 + optionalDependencies: + typescript: 5.9.3 + + '@solana/fast-stable-stringify@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/fixed-points@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/functional@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/instruction-plans@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/instructions': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/promises': 6.9.0(typescript@5.9.3) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + '@solana/transactions': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/instructions@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/keys@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/assertions': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + '@solana/promises': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/kit@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/accounts': 6.9.0(typescript@5.9.3) + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/instruction-plans': 6.9.0(typescript@5.9.3) + '@solana/instructions': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/offchain-messages': 6.9.0(typescript@5.9.3) + '@solana/plugin-core': 6.9.0(typescript@5.9.3) + '@solana/plugin-interfaces': 6.9.0(typescript@5.9.3) + '@solana/program-client-core': 6.9.0(typescript@5.9.3) + '@solana/programs': 6.9.0(typescript@5.9.3) + '@solana/rpc': 6.9.0(typescript@5.9.3) + '@solana/rpc-api': 6.9.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/signers': 6.9.0(typescript@5.9.3) + '@solana/subscribable': 6.9.0(typescript@5.9.3) + '@solana/sysvars': 6.9.0(typescript@5.9.3) + '@solana/transaction-confirmation': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + '@solana/transactions': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/nominal-types@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/offchain-messages@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} + '@solana/plugin-core@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} + '@solana/plugin-interfaces@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/instruction-plans': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/signers': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/program-client-core@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 6.9.0(typescript@5.9.3) + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/instruction-plans': 6.9.0(typescript@5.9.3) + '@solana/instructions': 6.9.0(typescript@5.9.3) + '@solana/plugin-interfaces': 6.9.0(typescript@5.9.3) + '@solana/rpc-api': 6.9.0(typescript@5.9.3) + '@solana/signers': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + '@solana/programs@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} + '@solana/promises@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-api@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + '@solana/transactions': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + '@solana/rpc-parsed-types@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 -snapshots: + '@solana/rpc-spec-types@6.9.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 - '@babel/runtime@7.27.1': {} + '@solana/rpc-spec@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 - '@noble/curves@1.9.1': + '@solana/rpc-subscriptions-api@6.9.0(typescript@5.9.3)': dependencies: - '@noble/hashes': 1.8.0 + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + '@solana/transactions': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@noble/hashes@1.8.0': {} + '@solana/rpc-subscriptions-channel-websocket@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) + '@solana/subscribable': 6.9.0(typescript@5.9.3) + ws: 8.21.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate - '@solana/buffer-layout@4.0.1': + '@solana/rpc-subscriptions-spec@6.9.0(typescript@5.9.3)': dependencies: - buffer: 6.0.3 + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/promises': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + '@solana/subscribable': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-subscriptions@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/promises': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/subscribable': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/rpc-transformers@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transport-http@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + undici-types: 8.4.1 + optionalDependencies: + typescript: 5.9.3 - '@solana/codecs-core@2.1.1(typescript@4.9.5)': + '@solana/rpc-types@6.9.0(typescript@5.9.3)': dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/fixed-points': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/rpc-api': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec': 6.9.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) + '@solana/rpc-transport-http': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/instructions': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + '@solana/offchain-messages': 6.9.0(typescript@5.9.3) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + '@solana/transactions': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': + '@solana/subscribable@6.9.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 + '@solana/errors': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 - '@solana/errors@2.1.1(typescript@4.9.5)': + '@solana/sysvars@6.9.0(typescript@5.9.3)': dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 + '@solana/accounts': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-confirmation@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/promises': 6.9.0(typescript@5.9.3) + '@solana/rpc': 6.9.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + '@solana/transactions': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/transaction-messages@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/instructions': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@6.9.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.9.0(typescript@5.9.3) + '@solana/codecs-core': 6.9.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) + '@solana/codecs-strings': 6.9.0(typescript@5.9.3) + '@solana/errors': 6.9.0(typescript@5.9.3) + '@solana/functional': 6.9.0(typescript@5.9.3) + '@solana/instructions': 6.9.0(typescript@5.9.3) + '@solana/keys': 6.9.0(typescript@5.9.3) + '@solana/nominal-types': 6.9.0(typescript@5.9.3) + '@solana/rpc-types': 6.9.0(typescript@5.9.3) + '@solana/transaction-messages': 6.9.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': + '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.27.1 '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) + '@solana/codecs-numbers': 2.1.1(typescript@5.9.3) agentkeepalive: 4.6.0 bn.js: 5.2.2 borsh: 0.7.0 @@ -754,72 +1499,36 @@ snapshots: dependencies: tslib: 2.8.1 - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - '@types/connect@3.4.38': dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} + '@types/node': 25.9.2 '@types/node@12.20.55': {} - '@types/node@22.15.19': + '@types/node@25.9.2': dependencies: - undici-types: 6.21.0 + undici-types: 7.24.6 '@types/uuid@8.3.4': {} '@types/ws@7.4.7': dependencies: - '@types/node': 22.15.19 + '@types/node': 25.9.2 '@types/ws@8.18.1': dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} + '@types/node': 25.9.2 agentkeepalive@4.6.0: dependencies: humanize-ms: 1.2.1 - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - base-x@3.0.11: dependencies: safe-buffer: 5.2.1 base64-js@1.5.1: {} - binary-extensions@2.3.0: {} - bn.js@5.2.2: {} borsh@0.7.0: @@ -828,23 +1537,10 @@ snapshots: bs58: 4.0.1 text-encoding-utf-8: 1.0.2 - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - bs58@4.0.1: dependencies: base-x: 3.0.11 - buffer-from@1.1.2: {} - buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -855,88 +1551,52 @@ snapshots: node-gyp-build: 4.8.4 optional: true - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chalk@5.4.1: {} - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} + chalk@5.6.2: {} commander@13.1.0: {} - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} + commander@14.0.3: {} - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 + commander@2.20.3: {} delay@5.0.0: {} - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - es6-promise@4.2.8: {} es6-promisify@5.0.0: dependencies: es6-promise: 4.2.8 - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 eventemitter3@5.0.1: {} @@ -944,78 +1604,15 @@ snapshots: fast-stable-stringify@1.0.0: {} - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - humanize-ms@1.2.1: dependencies: ms: 2.1.3 ieee754@1.2.1: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -1038,79 +1635,46 @@ snapshots: - bufferutil - utf-8-validate - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - json-stringify-safe@5.0.1: {} - json5@1.0.2: - dependencies: - minimist: 1.2.8 + litesvm-darwin-arm64@1.1.0: optional: true - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} + litesvm-darwin-x64@1.1.0: + optional: true - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 + litesvm-linux-arm64-gnu@1.1.0: + optional: true - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 + litesvm-linux-arm64-musl@1.1.0: + optional: true - minimist@1.2.8: {} + litesvm-linux-x64-gnu@1.1.0: + optional: true - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 + litesvm-linux-x64-musl@1.1.0: + optional: true - mocha@9.2.2: + litesvm@1.1.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10): dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} + '@solana-program/system': 0.12.2(@solana/kit@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana-program/token': 0.13.0(@solana/kit@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/kit': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + optionalDependencies: + litesvm-darwin-arm64: 1.1.0 + litesvm-darwin-x64: 1.1.0 + litesvm-linux-arm64-gnu: 1.1.0 + litesvm-linux-arm64-musl: 1.1.0 + litesvm-linux-x64-gnu: 1.1.0 + litesvm-linux-x64-musl: 1.1.0 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate ms@2.1.3: {} - nanoid@3.3.1: {} - node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -1118,38 +1682,6 @@ snapshots: node-gyp-build@4.8.4: optional: true - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - rpc-websockets@9.1.1: dependencies: '@swc/helpers': 0.5.17 @@ -1165,120 +1697,31 @@ snapshots: safe-buffer@5.2.1: {} - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - stream-chain@2.2.5: {} stream-json@1.9.1: dependencies: stream-chain: 2.2.5 - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - superstruct@2.0.2: {} - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - text-encoding-utf-8@1.0.2: {} - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - tr46@0.0.3: {} - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 + tslib@2.8.1: {} - tsconfig-paths@3.15.0: + tsx@4.22.4: dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} + esbuild: 0.28.0 + optionalDependencies: + fsevents: 2.3.3 - type-detect@4.1.0: {} + typescript@5.9.3: {} - typescript@4.9.5: {} + undici-types@7.24.6: {} - undici-types@6.21.0: {} + undici-types@8.4.1: {} utf-8-validate@5.0.10: dependencies: @@ -1294,20 +1737,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.9 @@ -1318,27 +1747,7 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} + ws@8.21.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 diff --git a/basics/close-account/native/program/src/instructions/close_user.rs b/basics/close-account/native/program/src/instructions/close_user.rs index c928008c..7a4664a1 100644 --- a/basics/close-account/native/program/src/instructions/close_user.rs +++ b/basics/close-account/native/program/src/instructions/close_user.rs @@ -1,29 +1,50 @@ use solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint::ProgramResult, - rent::Rent, - sysvar::Sysvar, + program_error::ProgramError, + pubkey::Pubkey, }; -pub fn close_user(accounts: &[AccountInfo]) -> ProgramResult { +use crate::state::user::User; + +pub fn close_user(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult { let accounts_iter = &mut accounts.iter(); let target_account = next_account_info(accounts_iter)?; let payer = next_account_info(accounts_iter)?; let system_program = next_account_info(accounts_iter)?; - let account_span = 0usize; - let lamports_required = (Rent::get()?).minimum_balance(account_span); + // Only the user whose key derives the PDA may close it. + if !payer.is_signer { + return Err(ProgramError::MissingRequiredSignature); + } - let diff = target_account.lamports() - lamports_required; + // The target must be this payer's own User PDA; otherwise anyone could + // close anyone else's account and pocket the rent. + let (user_pda, _) = Pubkey::find_program_address( + &[User::SEED_PREFIX.as_bytes(), payer.key.as_ref()], + program_id, + ); + if &user_pda != target_account.key { + return Err(ProgramError::InvalidSeeds); + } - // Send the rent back to the payer - **target_account.lamports.borrow_mut() -= diff; - **payer.lamports.borrow_mut() += diff; + // The account must belong to this program before we drain it. + if target_account.owner != program_id { + return Err(ProgramError::IncorrectProgramId); + } - // Realloc the account to zero - target_account.resize(account_span)?; + // Move ALL lamports back to the payer. Leaving any balance behind would + // strand it forever: nobody can sign for the PDA to recover it later. + let lamports_to_return = target_account.lamports(); + let new_payer_lamports = payer + .lamports() + .checked_add(lamports_to_return) + .ok_or(ProgramError::ArithmeticOverflow)?; + **payer.lamports.borrow_mut() = new_payer_lamports; + **target_account.lamports.borrow_mut() = 0; - // Assign the account to the System Program + // Wipe the data and hand the empty account back to the System Program. + target_account.resize(0)?; target_account.assign(system_program.key); Ok(()) diff --git a/basics/close-account/native/program/src/processor.rs b/basics/close-account/native/program/src/processor.rs index 9d9a9247..44c4254b 100644 --- a/basics/close-account/native/program/src/processor.rs +++ b/basics/close-account/native/program/src/processor.rs @@ -18,6 +18,6 @@ pub fn process_instruction( let instruction = MyInstruction::try_from_slice(input)?; match instruction { MyInstruction::CreateUser(data) => create_user(program_id, accounts, data), - MyInstruction::CloseUser => close_user(accounts), + MyInstruction::CloseUser => close_user(program_id, accounts), } } diff --git a/basics/close-account/native/program/tests/test.rs b/basics/close-account/native/program/tests/test.rs index 94549910..a9ab4ccb 100644 --- a/basics/close-account/native/program/tests/test.rs +++ b/basics/close-account/native/program/tests/test.rs @@ -8,65 +8,171 @@ use solana_transaction::Transaction; use close_account_native_program::processor::MyInstruction; -#[test] -fn test_close_account() { - let mut svm = LiteSVM::new(); +/// LiteSVM's default fee: 5000 lamports per signature, one signer per +/// transaction in these tests. +const TRANSACTION_FEE_LAMPORTS: u64 = 5000; +fn setup() -> (LiteSVM, Pubkey) { + let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); let program_bytes = include_bytes!("../../tests/fixtures/close_account_native_program.so"); - svm.add_program(program_id, program_bytes).unwrap(); + (svm, program_id) +} - let payer = Keypair::new(); - svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); +fn funded_keypair(svm: &mut LiteSVM) -> Keypair { + let keypair = Keypair::new(); + svm.airdrop(&keypair.pubkey(), LAMPORTS_PER_SOL * 10) + .unwrap(); + keypair +} - let test_account_pubkey = - Pubkey::find_program_address(&[b"USER".as_ref(), &payer.pubkey().as_ref()], &program_id).0; +fn user_pda(program_id: &Pubkey, user: &Pubkey) -> Pubkey { + Pubkey::find_program_address(&[User::SEED_PREFIX.as_bytes(), user.as_ref()], program_id).0 +} - // create user ix +fn create_user_instruction(program_id: Pubkey, target: Pubkey, payer: Pubkey) -> Instruction { let data = borsh::to_vec(&MyInstruction::CreateUser(User { name: "Jacob".to_string(), })) .unwrap(); - - let ix = Instruction { + Instruction { program_id, accounts: vec![ - AccountMeta::new(test_account_pubkey, false), - AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(target, false), + AccountMeta::new(payer, true), AccountMeta::new(solana_system_interface::program::ID, false), ], data, - }; - - let tx = Transaction::new_signed_with_payer( - &[ix], - Some(&payer.pubkey()), - &[&payer], - svm.latest_blockhash(), - ); - - assert!(svm.send_transaction(tx).is_ok()); + } +} - // clsose user ix +fn close_user_instruction( + program_id: Pubkey, + target: Pubkey, + payer: Pubkey, + payer_is_signer: bool, +) -> Instruction { let data = borsh::to_vec(&MyInstruction::CloseUser).unwrap(); - - let ix = Instruction { + Instruction { program_id, accounts: vec![ - AccountMeta::new(test_account_pubkey, false), - AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(target, false), + AccountMeta::new(payer, payer_is_signer), AccountMeta::new(solana_system_interface::program::ID, false), ], data, - }; + } +} +fn send(svm: &mut LiteSVM, instruction: Instruction, payer: &Keypair) -> Result<(), String> { let tx = Transaction::new_signed_with_payer( - &[ix], + &[instruction], Some(&payer.pubkey()), - &[&payer], + &[payer], svm.latest_blockhash(), ); + svm.send_transaction(tx) + .map(|_| ()) + .map_err(|failed| format!("{:?}", failed.err)) +} + +#[test] +fn close_returns_all_lamports_to_owner() { + let (mut svm, program_id) = setup(); + let payer = funded_keypair(&mut svm); + let target = user_pda(&program_id, &payer.pubkey()); + + send( + &mut svm, + create_user_instruction(program_id, target, payer.pubkey()), + &payer, + ) + .unwrap(); + + let target_lamports = svm.get_account(&target).unwrap().lamports; + assert!(target_lamports > 0, "created PDA should hold rent lamports"); + let payer_balance_before_close = svm.get_balance(&payer.pubkey()).unwrap(); + + send( + &mut svm, + close_user_instruction(program_id, target, payer.pubkey(), true), + &payer, + ) + .unwrap(); + + // Every lamport in the PDA comes back to the payer; only the + // transaction fee is lost. + let payer_balance_after_close = svm.get_balance(&payer.pubkey()).unwrap(); + assert_eq!( + payer_balance_after_close, + payer_balance_before_close + target_lamports - TRANSACTION_FEE_LAMPORTS, + ); + + // The drained account no longer exists (0 lamports, no data). + let closed = svm.get_account(&target); + assert!( + closed.is_none() || closed.unwrap().lamports == 0, + "closed account should hold no lamports", + ); +} + +#[test] +fn close_rejects_non_owner() { + let (mut svm, program_id) = setup(); + let victim = funded_keypair(&mut svm); + let attacker = funded_keypair(&mut svm); + let victim_account = user_pda(&program_id, &victim.pubkey()); + + send( + &mut svm, + create_user_instruction(program_id, victim_account, victim.pubkey()), + &victim, + ) + .unwrap(); + + // The attacker signs, but the target is the victim's PDA, not the + // attacker's, so the seeds check fails. + let result = send( + &mut svm, + close_user_instruction(program_id, victim_account, attacker.pubkey(), true), + &attacker, + ); + assert!(result.is_err(), "non-owner close must fail"); + + // The victim's account is untouched. + let victim_account_after = svm.get_account(&victim_account).unwrap(); + assert_eq!(victim_account_after.owner, program_id); + assert!(victim_account_after.lamports > 0); +} + +#[test] +fn close_rejects_payer_that_did_not_sign() { + let (mut svm, program_id) = setup(); + let victim = funded_keypair(&mut svm); + let attacker = funded_keypair(&mut svm); + let victim_account = user_pda(&program_id, &victim.pubkey()); + + send( + &mut svm, + create_user_instruction(program_id, victim_account, victim.pubkey()), + &victim, + ) + .unwrap(); + + // The attacker names the victim as the payer without the victim's + // signature: rejected by the signer check. + let result = send( + &mut svm, + close_user_instruction(program_id, victim_account, victim.pubkey(), false), + &attacker, + ); + assert!( + result.is_err(), + "close without the owner's signature must fail" + ); - assert!(svm.send_transaction(tx).is_ok()); + let victim_account_after = svm.get_account(&victim_account).unwrap(); + assert_eq!(victim_account_after.owner, program_id); + assert!(victim_account_after.lamports > 0); } diff --git a/basics/close-account/native/tests/close-account.test.ts b/basics/close-account/native/tests/close-account.test.ts index df253f1f..790275a8 100644 --- a/basics/close-account/native/tests/close-account.test.ts +++ b/basics/close-account/native/tests/close-account.test.ts @@ -1,38 +1,160 @@ +// In-process integration test: the program `.so` is loaded into a LiteSVM +// instance (no validator) and driven through the web3.js instruction +// builders in ../ts. + +import assert from "node:assert/strict"; +import { readFileSync } from "node:fs"; +import { dirname, join } from "node:path"; import { describe, test } from "node:test"; -import { PublicKey, Transaction } from "@solana/web3.js"; -import { start } from "solana-bankrun"; +import { fileURLToPath } from "node:url"; + +import { + AccountRole, + type Address, + appendTransactionMessageInstruction, + createTransactionMessage, + generateKeyPairSigner, + type Instruction, + lamports, + pipe, + setTransactionMessageFeePayerSigner, + signTransactionMessageWithSigners, +} from "@solana/kit"; +import { PublicKey, type TransactionInstruction } from "@solana/web3.js"; +import { FailedTransactionMetadata, LiteSVM } from "litesvm"; + import { createCloseUserInstruction, createCreateUserInstruction } from "../ts"; -describe("Close Account!", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "close_account_native_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; +const here = dirname(fileURLToPath(import.meta.url)); +const programSoPath = join(here, "fixtures", "close_account_native_program.so"); - const testAccountPublicKey = PublicKey.findProgramAddressSync( - [Buffer.from("USER"), payer.publicKey.toBuffer()], - PROGRAM_ID, - )[0]; +// LiteSVM's default fee: 5000 lamports per signature, one signer per +// transaction in these tests. +const TRANSACTION_FEE_LAMPORTS = 5000n; - test("Create the account", async () => { - const blockhash = context.lastBlockhash; - const ix = createCreateUserInstruction(testAccountPublicKey, payer.publicKey, PROGRAM_ID, "Jacob"); +/** Convert a web3.js TransactionInstruction (from ../ts) into a kit Instruction. */ +function toKitInstruction(instruction: TransactionInstruction): Instruction { + return { + programAddress: instruction.programId.toBase58() as Address, + accounts: instruction.keys.map((meta) => ({ + address: meta.pubkey.toBase58() as Address, + role: meta.isSigner + ? meta.isWritable + ? AccountRole.WRITABLE_SIGNER + : AccountRole.READONLY_SIGNER + : meta.isWritable + ? AccountRole.WRITABLE + : AccountRole.READONLY, + })), + data: new Uint8Array(instruction.data), + }; +} - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer); +async function sendIx( + svm: LiteSVM, + feePayer: Awaited>, + instruction: Instruction, +) { + const tx = await pipe( + createTransactionMessage({ version: 0 }), + (m) => setTransactionMessageFeePayerSigner(feePayer, m), + (m) => svm.setTransactionMessageLifetimeUsingLatestBlockhash(m), + (m) => appendTransactionMessageInstruction(instruction, m), + (m) => signTransactionMessageWithSigners(m), + ); + const result = svm.sendTransaction(tx); + if (result instanceof FailedTransactionMetadata) { + throw new Error(`Transaction failed: ${result.err()}\n${result.meta().logs().join("\n")}`); + } + return result; +} - await client.processTransaction(tx); - }); +describe("Close Account!", () => { + test("create, reject a non-owner close, then close and recover every lamport", async () => { + const svm = new LiteSVM(); + const programId = (await generateKeyPairSigner()).address; + svm.addProgram(programId, readFileSync(programSoPath)); + + const payer = await generateKeyPairSigner(); + svm.airdrop(payer.address, lamports(10_000_000_000n)); + const payerPublicKey = new PublicKey(payer.address); + const programPublicKey = new PublicKey(programId); + + const userAccount = PublicKey.findProgramAddressSync( + [Buffer.from("USER"), payerPublicKey.toBuffer()], + programPublicKey, + )[0]; + const userAccountAddress = userAccount.toBase58() as Address; + + // 1. Create the user account. + await sendIx( + svm, + payer, + toKitInstruction( + createCreateUserInstruction(userAccount, payerPublicKey, programPublicKey, "Jacob"), + ), + ); + + const userAccountLamports = svm.getBalance(userAccountAddress); + assert.ok( + userAccountLamports !== null && userAccountLamports > 0n, + "user account should hold rent lamports after create", + ); + + // 2. A non-owner cannot close it: the attacker signs as payer, but the + // target is the victim's PDA, so the program's seeds check rejects it. + const attacker = await generateKeyPairSigner(); + svm.airdrop(attacker.address, lamports(1_000_000_000n)); + const attackerPublicKey = new PublicKey(attacker.address); + + await assert.rejects( + sendIx( + svm, + attacker, + toKitInstruction( + createCloseUserInstruction(userAccount, attackerPublicKey, programPublicKey), + ), + ), + "closing someone else's account must fail", + ); + + // 3. Naming the victim as payer without their signature is rejected too. + const closeWithoutSignature = toKitInstruction( + createCloseUserInstruction(userAccount, payerPublicKey, programPublicKey), + ); + const demotedAccounts = closeWithoutSignature.accounts!.map((meta) => + meta.address === payer.address ? { address: meta.address, role: AccountRole.WRITABLE } : meta, + ); + await assert.rejects( + sendIx(svm, attacker, { ...closeWithoutSignature, accounts: demotedAccounts }), + "closing without the owner's signature must fail", + ); + assert.equal( + svm.getBalance(userAccountAddress), + userAccountLamports, + "victim account must survive the attacks untouched", + ); - test("Close the account", async () => { - const blockhash = context.lastBlockhash; + // 4. The owner closes it and recovers every lamport (minus the + // transaction fee). Nothing is stranded at the PDA. + const payerBalanceBefore = svm.getBalance(payer.address)!; + await sendIx( + svm, + payer, + toKitInstruction(createCloseUserInstruction(userAccount, payerPublicKey, programPublicKey)), + ); - const ix = createCloseUserInstruction(testAccountPublicKey, payer.publicKey, PROGRAM_ID); - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer); + const payerBalanceAfter = svm.getBalance(payer.address)!; + assert.equal( + payerBalanceAfter, + payerBalanceBefore + userAccountLamports - TRANSACTION_FEE_LAMPORTS, + "payer should recover every lamport the PDA held", + ); - await client.processTransaction(tx); + const closedBalance = svm.getBalance(userAccountAddress); + assert.ok( + closedBalance === null || closedBalance === 0n, + "closed account should hold no lamports", + ); }); }); diff --git a/basics/close-account/native/tests/fixtures/close_account_native_program.so b/basics/close-account/native/tests/fixtures/close_account_native_program.so new file mode 100755 index 0000000000000000000000000000000000000000..bb1c5e0d89d8b1ac4df36c08466e2fd7e9a9a0e6 GIT binary patch literal 88528 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 Ok3&GIMBB15Ec7{X-$ literal 0 HcmV?d00001 diff --git a/basics/close-account/native/tests/tsconfig.test.json b/basics/close-account/native/tests/tsconfig.test.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/close-account/native/tests/tsconfig.test.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/close-account/pinocchio/program/src/lib.rs b/basics/close-account/pinocchio/program/src/lib.rs index d63f67b0..d8a2873f 100644 --- a/basics/close-account/pinocchio/program/src/lib.rs +++ b/basics/close-account/pinocchio/program/src/lib.rs @@ -20,7 +20,7 @@ fn process_instruction( ) -> ProgramResult { match instruction_data.split_first() { Some((&CREATE_DISCRIMINATOR, data)) => process_user(program_id, accounts, data), - Some((&CLOSE_DISCRIMINATOR, _)) => process_close(accounts), + Some((&CLOSE_DISCRIMINATOR, _)) => process_close(program_id, accounts), _ => Err(ProgramError::InvalidInstructionData), } } @@ -46,12 +46,30 @@ fn process_user( return Err(ProgramError::NotEnoughAccountKeys); }; + // Expected layout: 1 bump byte followed by `User::LEN` name bytes. + // Bounds-check before slicing so malformed input returns a clean error + // instead of panicking. + if instruction_data.len() < 1 + User::LEN { + return Err(ProgramError::InvalidInstructionData); + } + let bump = instruction_data[0]; + + // The bump comes from the client, so verify it: it must be the canonical + // bump and the derived PDA must be the account we were asked to create. + let (user_pda, canonical_bump) = Address::find_program_address( + &[User::SEED_PREFIX.as_bytes(), payer.address().as_ref()], + program_id, + ); + if bump != canonical_bump || target_account.address() != &user_pda { + return Err(ProgramError::InvalidSeeds); + } + let rent = Rent::get()?; let account_span = User::LEN; let lamports_required = rent.try_minimum_balance(account_span)?; - let bump_bytes = instruction_data[0].to_le_bytes(); + let bump_bytes = [bump]; let seeds = [ Seed::from(User::SEED_PREFIX.as_bytes()), @@ -69,28 +87,49 @@ fn process_user( } .invoke_signed(&signers)?; - let mut address_info_data = target_account.try_borrow_mut()?; - address_info_data.copy_from_slice(&instruction_data[1..]); + let mut user_account_data = target_account.try_borrow_mut()?; + user_account_data.copy_from_slice(&instruction_data[1..1 + User::LEN]); Ok(()) } -fn process_close(accounts: &[AccountView]) -> ProgramResult { +fn process_close(program_id: &Address, accounts: &[AccountView]) -> ProgramResult { let [target_account, payer, system_program] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; - let rent = Rent::get()?; - - let account_span = 0usize; - let lamports_required = rent.try_minimum_balance(account_span)?; + // Only the user whose key derives the PDA may close it. + if !payer.is_signer() { + return Err(ProgramError::MissingRequiredSignature); + } - let diff = target_account.lamports() - lamports_required; + // The target must be this payer's own User PDA; otherwise anyone could + // close anyone else's account and pocket the rent. + let (user_pda, _) = Address::find_program_address( + &[User::SEED_PREFIX.as_bytes(), payer.address().as_ref()], + program_id, + ); + if target_account.address() != &user_pda { + return Err(ProgramError::InvalidSeeds); + } - target_account.set_lamports(target_account.lamports() - diff); - payer.set_lamports(payer.lamports() + diff); + // The account must belong to this program before we drain it. + if !target_account.owned_by(program_id) { + return Err(ProgramError::IncorrectProgramId); + } - target_account.resize(account_span)?; + // Move ALL lamports back to the payer. Leaving any balance behind would + // strand it forever: nobody can sign for the PDA to recover it later. + let lamports_to_return = target_account.lamports(); + let new_payer_lamports = payer + .lamports() + .checked_add(lamports_to_return) + .ok_or(ProgramError::ArithmeticOverflow)?; + payer.set_lamports(new_payer_lamports); + target_account.set_lamports(0); + + // Wipe the data and hand the empty account back to the System Program. + target_account.resize(0)?; unsafe { target_account.assign(system_program.address()); diff --git a/basics/close-account/pinocchio/program/tests/tests.rs b/basics/close-account/pinocchio/program/tests/tests.rs index 9814b4d4..868bc7c0 100644 --- a/basics/close-account/pinocchio/program/tests/tests.rs +++ b/basics/close-account/pinocchio/program/tests/tests.rs @@ -7,28 +7,30 @@ use solana_transaction::Transaction; use close_account_pinocchio_program::{User, CLOSE_DISCRIMINATOR, CREATE_DISCRIMINATOR}; -#[test] -fn test_close_account() { - let mut svm = LiteSVM::new(); +/// LiteSVM's default fee: 5000 lamports per signature, one signer per +/// transaction in these tests. +const TRANSACTION_FEE_LAMPORTS: u64 = 5000; +fn setup() -> (LiteSVM, Pubkey) { + let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); let program_bytes = include_bytes!("../../tests/fixtures/close_account_pinocchio_program.so"); - svm.add_program(program_id, program_bytes).unwrap(); + (svm, program_id) +} - let payer = Keypair::new(); - svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); - - let test_account_pubkey = - Pubkey::find_program_address(&[b"USER".as_ref(), &payer.pubkey().as_ref()], &program_id).0; +fn funded_keypair(svm: &mut LiteSVM) -> Keypair { + let keypair = Keypair::new(); + svm.airdrop(&keypair.pubkey(), LAMPORTS_PER_SOL * 10) + .unwrap(); + keypair +} - let bump = Pubkey::find_program_address( - &[User::SEED_PREFIX.as_bytes(), payer.pubkey().as_ref()], - &program_id, - ) - .1; +fn user_pda(program_id: &Pubkey, user: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address(&[User::SEED_PREFIX.as_bytes(), user.as_ref()], program_id) +} - // process_user +fn create_user_data(bump: u8) -> Vec { let mut data = Vec::new(); data.push(CREATE_DISCRIMINATOR); data.push(bump); @@ -36,57 +38,188 @@ fn test_close_account() { let name_len = b"Jacob".len().min(User::LEN); name[..name_len].copy_from_slice(&b"Jacob"[..name_len]); data.extend_from_slice(&name); + data +} - let ix = Instruction { +fn user_instruction( + program_id: Pubkey, + target: Pubkey, + payer: Pubkey, + data: Vec, +) -> Instruction { + Instruction { program_id, accounts: vec![ - AccountMeta::new(test_account_pubkey, false), - AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(target, false), + AccountMeta::new(payer, true), AccountMeta::new(solana_system_interface::program::ID, false), ], data, - }; + } +} +fn send(svm: &mut LiteSVM, instruction: Instruction, payer: &Keypair) -> Result<(), String> { let tx = Transaction::new_signed_with_payer( - &[ix], + &[instruction], Some(&payer.pubkey()), - &[&payer], + &[payer], svm.latest_blockhash(), ); + svm.send_transaction(tx) + .map(|_| ()) + .map_err(|failed| format!("{:?}", failed.err)) +} - let res = svm.send_transaction(tx); - assert!(res.is_ok()); +fn create_user_account(svm: &mut LiteSVM, program_id: Pubkey, payer: &Keypair) -> Pubkey { + let (target, bump) = user_pda(&program_id, &payer.pubkey()); + send( + svm, + user_instruction(program_id, target, payer.pubkey(), create_user_data(bump)), + payer, + ) + .unwrap(); + target +} - let account = svm.get_account(&test_account_pubkey).unwrap(); - assert_eq!(account.data.len(), User::LEN); - assert_eq!(account.owner, program_id); - assert_eq!(&account.data[..5], b"Jacob"); +#[test] +fn create_then_close_returns_all_lamports() { + let (mut svm, program_id) = setup(); + let payer = funded_keypair(&mut svm); + + let target = create_user_account(&mut svm, program_id, &payer); + + let created = svm.get_account(&target).unwrap(); + assert_eq!(created.data.len(), User::LEN); + assert_eq!(created.owner, program_id); + assert_eq!(&created.data[..5], b"Jacob"); + let target_lamports = created.lamports; + assert!(target_lamports > 0, "created PDA should hold rent lamports"); + + let payer_balance_before_close = svm.get_balance(&payer.pubkey()).unwrap(); + + send( + &mut svm, + user_instruction( + program_id, + target, + payer.pubkey(), + vec![CLOSE_DISCRIMINATOR], + ), + &payer, + ) + .unwrap(); + + // Every lamport in the PDA comes back to the payer; only the + // transaction fee is lost. + let payer_balance_after_close = svm.get_balance(&payer.pubkey()).unwrap(); + assert_eq!( + payer_balance_after_close, + payer_balance_before_close + target_lamports - TRANSACTION_FEE_LAMPORTS, + ); - // process_close - let mut data = Vec::new(); - data.push(CLOSE_DISCRIMINATOR); + // The drained account no longer exists (0 lamports, no data). + let closed = svm.get_account(&target); + assert!( + closed.is_none() || closed.unwrap().lamports == 0, + "closed account should hold no lamports", + ); +} - let ix = Instruction { +#[test] +fn close_rejects_non_owner() { + let (mut svm, program_id) = setup(); + let victim = funded_keypair(&mut svm); + let attacker = funded_keypair(&mut svm); + + let victim_account = create_user_account(&mut svm, program_id, &victim); + + // The attacker signs, but the target is the victim's PDA, not the + // attacker's, so the seeds check fails. + let result = send( + &mut svm, + user_instruction( + program_id, + victim_account, + attacker.pubkey(), + vec![CLOSE_DISCRIMINATOR], + ), + &attacker, + ); + assert!(result.is_err(), "non-owner close must fail"); + + let victim_account_after = svm.get_account(&victim_account).unwrap(); + assert_eq!(victim_account_after.owner, program_id); + assert!(victim_account_after.lamports > 0); +} + +#[test] +fn close_rejects_payer_that_did_not_sign() { + let (mut svm, program_id) = setup(); + let victim = funded_keypair(&mut svm); + let attacker = funded_keypair(&mut svm); + + let victim_account = create_user_account(&mut svm, program_id, &victim); + + // The attacker names the victim as the payer without the victim's + // signature: rejected by the signer check. + let close_with_unsigned_payer = Instruction { program_id, accounts: vec![ - AccountMeta::new(test_account_pubkey, false), - AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(victim_account, false), + AccountMeta::new(victim.pubkey(), false), AccountMeta::new(solana_system_interface::program::ID, false), ], - data, + data: vec![CLOSE_DISCRIMINATOR], }; - - let tx = Transaction::new_signed_with_payer( - &[ix], - Some(&payer.pubkey()), - &[&payer], - svm.latest_blockhash(), + let result = send(&mut svm, close_with_unsigned_payer, &attacker); + assert!( + result.is_err(), + "close without the owner's signature must fail" ); - let res = svm.send_transaction(tx); - assert!(res.is_ok()); + let victim_account_after = svm.get_account(&victim_account).unwrap(); + assert_eq!(victim_account_after.owner, program_id); + assert!(victim_account_after.lamports > 0); +} + +#[test] +fn create_rejects_wrong_bump() { + let (mut svm, program_id) = setup(); + let payer = funded_keypair(&mut svm); + let (target, bump) = user_pda(&program_id, &payer.pubkey()); + + let wrong_bump = bump.wrapping_sub(1); + let result = send( + &mut svm, + user_instruction( + program_id, + target, + payer.pubkey(), + create_user_data(wrong_bump), + ), + &payer, + ); + assert!(result.is_err(), "create with a non-canonical bump must fail"); + assert!(svm.get_account(&target).is_none()); +} - let account = svm.get_account(&test_account_pubkey).unwrap(); - assert_eq!(account.data.len(), 0); - assert_eq!(account.owner, solana_system_interface::program::ID); +#[test] +fn create_rejects_short_instruction_data() { + let (mut svm, program_id) = setup(); + let payer = funded_keypair(&mut svm); + let (target, bump) = user_pda(&program_id, &payer.pubkey()); + + // Discriminator plus bump only: name bytes are missing entirely. + let result = send( + &mut svm, + user_instruction( + program_id, + target, + payer.pubkey(), + vec![CREATE_DISCRIMINATOR, bump], + ), + &payer, + ); + assert!(result.is_err(), "create with short data must fail cleanly"); + assert!(svm.get_account(&target).is_none()); } diff --git a/basics/close-account/pinocchio/tests/fixtures/close_account_pinocchio_program.so b/basics/close-account/pinocchio/tests/fixtures/close_account_pinocchio_program.so new file mode 100755 index 0000000000000000000000000000000000000000..4fa09d9fff8243f2a5820f8a012ac0ac527c5408 GIT binary patch literal 19200 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 literal 0 HcmV?d00001 diff --git a/basics/counter/quasar/src/lib.rs b/basics/counter/quasar/src/lib.rs index bbdb7a07..6dde8851 100644 --- a/basics/counter/quasar/src/lib.rs +++ b/basics/counter/quasar/src/lib.rs @@ -9,7 +9,7 @@ mod state; #[cfg(test)] mod tests; -declare_id!("HYSDBQLVUSMRQKQZxfKJwDy5PPrZb7bvuBLaWfbcYhEP"); +declare_id!("BmDHboaj1kBUoinJKKSRqKfMeRKJqQqEbUj1VgzeQe4A"); #[program] mod quasar_counter { diff --git a/basics/hello-solana/quasar/src/instructions/hello.rs b/basics/hello-solana/quasar/src/instructions/hello.rs index d36abb01..ae2a3128 100644 --- a/basics/hello-solana/quasar/src/instructions/hello.rs +++ b/basics/hello-solana/quasar/src/instructions/hello.rs @@ -12,6 +12,6 @@ pub struct Hello { #[inline(always)] pub fn handle_hello(_accounts: &mut Hello) -> Result<(), ProgramError> { log("Hello, Solana!"); - log("Our program's Program ID: FLUH9c5oAfXb1eYbkZvdGK9r9SLQJBUi2DZQaBVj7Tzr"); + log("Our program's Program ID: 2phbC62wekpw95XuBk4i1KX4uA8zBUWmYbiTMhicSuBV"); Ok(()) } diff --git a/basics/hello-solana/quasar/src/lib.rs b/basics/hello-solana/quasar/src/lib.rs index 53fcf9ad..73239ff0 100644 --- a/basics/hello-solana/quasar/src/lib.rs +++ b/basics/hello-solana/quasar/src/lib.rs @@ -7,7 +7,7 @@ use instructions::*; #[cfg(test)] mod tests; -declare_id!("FLUH9c5oAfXb1eYbkZvdGK9r9SLQJBUi2DZQaBVj7Tzr"); +declare_id!("2phbC62wekpw95XuBk4i1KX4uA8zBUWmYbiTMhicSuBV"); #[program] mod quasar_hello_solana { diff --git a/basics/realloc/anchor/programs/anchor-realloc/src/instructions/initialize.rs b/basics/realloc/anchor/programs/anchor-realloc/src/instructions/initialize.rs index 1fc5afb4..dc45b857 100644 --- a/basics/realloc/anchor/programs/anchor-realloc/src/instructions/initialize.rs +++ b/basics/realloc/anchor/programs/anchor-realloc/src/instructions/initialize.rs @@ -4,7 +4,7 @@ use crate::Message; #[derive(Accounts)] #[instruction(input: String)] -pub struct Initialize<'info> { +pub struct InitializeAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -17,7 +17,7 @@ pub struct Initialize<'info> { pub system_program: Program<'info, System>, } -pub fn handler(context: Context, input: String) -> Result<()> { +pub fn handler(context: Context, input: String) -> Result<()> { context.accounts.message_account.message = input; Ok(()) } diff --git a/basics/realloc/anchor/programs/anchor-realloc/src/instructions/update.rs b/basics/realloc/anchor/programs/anchor-realloc/src/instructions/update.rs index f3ff4425..cd1032c5 100644 --- a/basics/realloc/anchor/programs/anchor-realloc/src/instructions/update.rs +++ b/basics/realloc/anchor/programs/anchor-realloc/src/instructions/update.rs @@ -4,7 +4,7 @@ use crate::Message; #[derive(Accounts)] #[instruction(input: String)] -pub struct Update<'info> { +pub struct UpdateAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -18,7 +18,7 @@ pub struct Update<'info> { pub system_program: Program<'info, System>, } -pub fn handler(context: Context, input: String) -> Result<()> { +pub fn handler(context: Context, input: String) -> Result<()> { context.accounts.message_account.message = input; Ok(()) } diff --git a/basics/realloc/anchor/programs/anchor-realloc/src/lib.rs b/basics/realloc/anchor/programs/anchor-realloc/src/lib.rs index 0d628b2e..f51e65d6 100644 --- a/basics/realloc/anchor/programs/anchor-realloc/src/lib.rs +++ b/basics/realloc/anchor/programs/anchor-realloc/src/lib.rs @@ -9,11 +9,11 @@ declare_id!("Fod47xKXjdHVQDzkFPBvfdWLm8gEAV4iMSXkfUzCHiSD"); pub mod anchor_realloc { use super::*; - pub fn initialize(context: Context, input: String) -> Result<()> { + pub fn initialize(context: Context, input: String) -> Result<()> { instructions::initialize::handler(context, input) } - pub fn update(context: Context, input: String) -> Result<()> { + pub fn update(context: Context, input: String) -> Result<()> { instructions::update::handler(context, input) } } diff --git a/basics/realloc/anchor/programs/anchor-realloc/tests/test_realloc.rs b/basics/realloc/anchor/programs/anchor-realloc/tests/test_realloc.rs index ffc045d2..fecf1c6c 100644 --- a/basics/realloc/anchor/programs/anchor-realloc/tests/test_realloc.rs +++ b/basics/realloc/anchor/programs/anchor-realloc/tests/test_realloc.rs @@ -38,7 +38,7 @@ fn test_initialize() { input: "hello".to_string(), } .data(), - anchor_realloc::accounts::Initialize { + anchor_realloc::accounts::InitializeAccountConstraints { payer: payer.pubkey(), message_account: message_keypair.pubkey(), system_program: system_program::id(), @@ -79,7 +79,7 @@ fn test_update_grows() { input: "hello".to_string(), } .data(), - anchor_realloc::accounts::Initialize { + anchor_realloc::accounts::InitializeAccountConstraints { payer: payer.pubkey(), message_account: message_keypair.pubkey(), system_program: system_program::id(), @@ -102,7 +102,7 @@ fn test_update_grows() { input: "hello world".to_string(), } .data(), - anchor_realloc::accounts::Update { + anchor_realloc::accounts::UpdateAccountConstraints { payer: payer.pubkey(), message_account: message_keypair.pubkey(), system_program: system_program::id(), @@ -136,7 +136,7 @@ fn test_update_shrinks() { input: "hello world".to_string(), } .data(), - anchor_realloc::accounts::Initialize { + anchor_realloc::accounts::InitializeAccountConstraints { payer: payer.pubkey(), message_account: message_keypair.pubkey(), system_program: system_program::id(), @@ -159,7 +159,7 @@ fn test_update_shrinks() { input: "hi".to_string(), } .data(), - anchor_realloc::accounts::Update { + anchor_realloc::accounts::UpdateAccountConstraints { payer: payer.pubkey(), message_account: message_keypair.pubkey(), system_program: system_program::id(), diff --git a/basics/transfer-sol/native/tests/fixtures/transfer_sol_program.so b/basics/transfer-sol/native/tests/fixtures/transfer_sol_program.so new file mode 100755 index 0000000000000000000000000000000000000000..e59e7a31668e599614fde269798b3b52fc084b9d GIT binary patch literal 70416 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 F{~s^GKIs4e literal 0 HcmV?d00001 diff --git a/basics/transfer-sol/quasar/src/instructions/transfer_sol_with_program.rs b/basics/transfer-sol/quasar/src/instructions/transfer_sol_with_program.rs index 14dc016e..b5781384 100644 --- a/basics/transfer-sol/quasar/src/instructions/transfer_sol_with_program.rs +++ b/basics/transfer-sol/quasar/src/instructions/transfer_sol_with_program.rs @@ -1,20 +1,52 @@ use quasar_lang::prelude::*; +/// Errors for direct lamport transfers. Codes start at 6000, the same +/// offset Anchor uses for custom errors. +#[error_code] +pub enum TransferSolError { + /// The runtime only lets a program debit lamports from accounts it + /// owns, so a payer owned by anyone else must be rejected up front. + PayerNotOwnedByProgram = 6000, + /// The payer does not hold `amount` lamports. + InsufficientFunds, + /// Adding `amount` to the recipient balance would overflow a u64. + AmountOverflow, +} + /// Accounts for transferring SOL by directly manipulating lamports. -/// The payer account must be owned by this program for direct lamport access. +/// The `constraints(...)` check enforces that the payer is owned by this +/// program, mirroring the Anchor twin's `owner = crate::ID` constraint. #[derive(Accounts)] -pub struct TransferSolWithProgram { - #[account(mut)] +pub struct TransferSolWithProgramAccountConstraints { + #[account( + mut, + constraints(payer.to_account_view().owner() == &crate::ID) + @ TransferSolError::PayerNotOwnedByProgram + )] pub payer: UncheckedAccount, + #[account(mut)] pub recipient: UncheckedAccount, } #[inline(always)] -pub fn handle_transfer_sol_with_program(accounts: &mut TransferSolWithProgram, amount: u64) -> Result<(), ProgramError> { +pub fn handle_transfer_sol_with_program( + accounts: &mut TransferSolWithProgramAccountConstraints, + amount: u64, +) -> Result<(), ProgramError> { let payer_view = accounts.payer.to_account_view(); let recipient_view = accounts.recipient.to_account_view(); - set_lamports(payer_view, payer_view.lamports() - amount); - set_lamports(recipient_view, recipient_view.lamports() + amount); + + let new_payer_lamports = payer_view + .lamports() + .checked_sub(amount) + .ok_or(TransferSolError::InsufficientFunds)?; + let new_recipient_lamports = recipient_view + .lamports() + .checked_add(amount) + .ok_or(TransferSolError::AmountOverflow)?; + + set_lamports(payer_view, new_payer_lamports); + set_lamports(recipient_view, new_recipient_lamports); Ok(()) } diff --git a/basics/transfer-sol/quasar/src/lib.rs b/basics/transfer-sol/quasar/src/lib.rs index 6942be4d..ce4c113a 100644 --- a/basics/transfer-sol/quasar/src/lib.rs +++ b/basics/transfer-sol/quasar/src/lib.rs @@ -26,7 +26,7 @@ mod quasar_transfer_sol { /// The payer account must be owned by this program. #[instruction(discriminator = 1)] pub fn transfer_sol_with_program( - ctx: Ctx, + ctx: Ctx, amount: u64, ) -> Result<(), ProgramError> { instructions::handle_transfer_sol_with_program(&mut ctx.accounts, amount) diff --git a/finance/escrow/quasar/src/lib.rs b/finance/escrow/quasar/src/lib.rs index bca73112..6b92d6f3 100644 --- a/finance/escrow/quasar/src/lib.rs +++ b/finance/escrow/quasar/src/lib.rs @@ -8,7 +8,7 @@ mod state; #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("qbuMdeYxYJXBjU6C6qFKjZKjXmrU83eDQomHdrch826"); /// Token escrow program: a maker deposits token A into a vault and specifies /// how much of token B they want in return. A taker fulfils the offer by diff --git a/finance/token-fundraiser/quasar/src/lib.rs b/finance/token-fundraiser/quasar/src/lib.rs index 84472bdb..39453ba4 100644 --- a/finance/token-fundraiser/quasar/src/lib.rs +++ b/finance/token-fundraiser/quasar/src/lib.rs @@ -9,7 +9,7 @@ mod state; #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("Eoiuq1dXvHxh6dLx3wh9gj8kSAUpga11krTrbfF5XYsC"); /// Token crowdfunding program: a maker creates a fundraiser targeting a specific /// SPL token. Contributors deposit tokens into a vault. If the target is met, diff --git a/finance/token-swap/quasar/src/lib.rs b/finance/token-swap/quasar/src/lib.rs index 49d72750..4861fde6 100644 --- a/finance/token-swap/quasar/src/lib.rs +++ b/finance/token-swap/quasar/src/lib.rs @@ -9,7 +9,7 @@ pub mod state; #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("GahM6PrXesrBkHiGJ5no4EskLNnVBCaSwVKbM4UtzyK6"); /// Minimum liquidity locked on first deposit to prevent manipulation. pub const MINIMUM_LIQUIDITY: u64 = 100; diff --git a/tokens/create-token/quasar/src/lib.rs b/tokens/create-token/quasar/src/lib.rs index 223aa4d6..9392921c 100644 --- a/tokens/create-token/quasar/src/lib.rs +++ b/tokens/create-token/quasar/src/lib.rs @@ -11,37 +11,45 @@ declare_id!("22222222222222222222222222222222222222222222"); /// Creates a token mint and mints initial tokens to the creator's token account. /// /// The Anchor version uses Metaplex for onchain metadata. Quasar's metadata -/// crate is demonstrated in the `nft-minter` and `token-minter` examples; -/// this example focuses on the core SPL Token operations: creating a mint and -/// minting tokens. +/// crate is demonstrated in the `nft-operations` example; this example focuses +/// on the core SPL Token operations: creating a mint and minting tokens. #[program] mod quasar_create_token { use super::*; - /// Create a new token mint (account init handled by Quasar's `#[account(init)]`). + /// Create a new token mint with the caller-supplied number of decimals + /// (account init handled by Quasar's `#[account(init)]`). #[instruction(discriminator = 0)] - pub fn create_token(ctx: Ctx, _decimals: u8) -> Result<(), ProgramError> { - handle_create_token(&mut ctx.accounts) + pub fn create_token( + ctx: Ctx, + decimals: u8, + ) -> Result<(), ProgramError> { + handle_create_token(&mut ctx.accounts, decimals) } - /// Mint tokens to the creator's token account. + /// Mint `amount` minor units to the creator's token account. #[instruction(discriminator = 1)] - pub fn mint_tokens(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { + pub fn mint_tokens( + ctx: Ctx, + amount: u64, + ) -> Result<(), ProgramError> { handle_mint_tokens(&mut ctx.accounts, amount) } } /// Accounts for creating a new token mint. -/// Quasar's `#[account(init)]` handles the create_account + initialize_mint CPI. +/// Quasar's `#[account(init)]` handles the create_account + initialize_mint +/// CPI; the `decimals` instruction argument is threaded into the mint init. #[derive(Accounts)] -pub struct CreateToken { +#[instruction(decimals: u8)] +pub struct CreateTokenAccountConstraints { #[account(mut)] pub payer: Signer, #[account( mut, init, payer = payer, - mint(decimals = 9, authority = payer, freeze_authority = None, token_program = token_program), + mint(decimals = decimals, authority = payer, freeze_authority = None, token_program = token_program), )] pub mint: Account, pub rent: Sysvar, @@ -51,7 +59,7 @@ pub struct CreateToken { /// Accounts for minting tokens to an existing token account. #[derive(Accounts)] -pub struct MintTokens { +pub struct MintTokensAccountConstraints { #[account(mut)] pub authority: Signer, #[account(mut)] @@ -62,14 +70,28 @@ pub struct MintTokens { } #[inline(always)] -fn handle_create_token(_accounts: &mut CreateToken) -> Result<(), ProgramError> { - // Mint account is created and initialised by Quasar's account init. +fn handle_create_token( + _accounts: &mut CreateTokenAccountConstraints, + _decimals: u8, +) -> Result<(), ProgramError> { + // Mint account is created and initialised by Quasar's account init, which + // reads `decimals` from the instruction data via the struct-level + // #[instruction(decimals: u8)] declaration. Ok(()) } #[inline(always)] -fn handle_mint_tokens(accounts: &mut MintTokens, amount: u64) -> Result<(), ProgramError> { - accounts.token_program - .mint_to(&accounts.mint, &accounts.token_account, &accounts.authority, amount) +fn handle_mint_tokens( + accounts: &mut MintTokensAccountConstraints, + amount: u64, +) -> Result<(), ProgramError> { + accounts + .token_program + .mint_to( + &accounts.mint, + &accounts.token_account, + &accounts.authority, + amount, + ) .invoke() } diff --git a/tokens/create-token/quasar/src/tests.rs b/tokens/create-token/quasar/src/tests.rs index 97bc420e..b5350389 100644 --- a/tokens/create-token/quasar/src/tests.rs +++ b/tokens/create-token/quasar/src/tests.rs @@ -85,7 +85,10 @@ fn test_create_token() { let system_program = quasar_svm::system_program::ID; let rent = quasar_svm::solana_sdk_ids::sysvar::rent::ID; - let data = build_create_token_data(9); + // Deliberately not 9: proves the decimals instruction argument reaches + // the initialize_mint CPI instead of being hardcoded. + let requested_decimals = 6u8; + let data = build_create_token_data(requested_decimals); let instruction = Instruction { program_id: crate::ID, @@ -105,6 +108,14 @@ fn test_create_token() { ); assert!(result.is_ok(), "create_token failed: {:?}", result.raw_result); + + // The created mint must carry the requested decimals. + let mint_account = result.account(&mint_address).expect("mint should exist"); + let mint_state = + ::unpack(&mint_account.data).expect("valid mint"); + assert_eq!(mint_state.decimals, requested_decimals); + assert_eq!(mint_state.mint_authority, Some(payer).into()); + println!(" CREATE TOKEN CU: {}", result.compute_units_consumed); } diff --git a/tokens/external-delegate-token-master/quasar/src/lib.rs b/tokens/external-delegate-token-master/quasar/src/lib.rs index 87be95cf..73953211 100644 --- a/tokens/external-delegate-token-master/quasar/src/lib.rs +++ b/tokens/external-delegate-token-master/quasar/src/lib.rs @@ -6,7 +6,7 @@ use quasar_spl::prelude::*; #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("FYPkt5VWMvtyWZDMGCwoKFkE3wXTzphicTpnNGuHWVbD"); /// User account storing the Solana authority and linked Ethereum address. #[account(discriminator = 1, set_inner)] diff --git a/tokens/nft-minter/quasar/src/lib.rs b/tokens/nft-minter/quasar/src/lib.rs index 4bdc8317..5320a50c 100644 --- a/tokens/nft-minter/quasar/src/lib.rs +++ b/tokens/nft-minter/quasar/src/lib.rs @@ -7,7 +7,7 @@ use quasar_spl::prelude::*; #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("52quezNUzc1Ej6Jh6L4bvtxPW8j6TEFHuLVAWiFvdnsc"); /// NFT minter: creates a mint (decimals = 0), mints 1 token, creates Metaplex /// metadata and master edition in a single instruction. diff --git a/tokens/pda-mint-authority/anchor/Anchor.toml b/tokens/pda-mint-authority/anchor/Anchor.toml index 53ccdcd2..1104b2b3 100644 --- a/tokens/pda-mint-authority/anchor/Anchor.toml +++ b/tokens/pda-mint-authority/anchor/Anchor.toml @@ -13,7 +13,6 @@ cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests - the validator tests (test.ts) need Metaplex Token -# Metadata cloned from mainnet which is too slow/unreliable in CI. -# bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). +# Rust + LiteSVM tests; Metaplex Token Metadata is loaded from a local +# fixture (tests/fixtures/mpl_token_metadata.so), no validator needed. test = "cargo test" diff --git a/tokens/pda-mint-authority/anchor/README.md b/tokens/pda-mint-authority/anchor/README.md index cbd1864c..a088d909 100644 --- a/tokens/pda-mint-authority/anchor/README.md +++ b/tokens/pda-mint-authority/anchor/README.md @@ -8,6 +8,7 @@ See also: [Pda Mint Authority overview](../README.md) and the [repository catalo - PDA mint authority - CPI mint_to +- Amounts: `mint_token` takes `amount` in **minor units**, the raw integer the token program operates on. Clients convert from major units offchain: 1 token with 9 decimals is `1 * 10^9` minor units. The program never scales amounts onchain. ## Setup diff --git a/tokens/pda-mint-authority/anchor/programs/token-minter/src/instructions/mint.rs b/tokens/pda-mint-authority/anchor/programs/token-minter/src/instructions/mint.rs index bfd52cb1..eedae32c 100644 --- a/tokens/pda-mint-authority/anchor/programs/token-minter/src/instructions/mint.rs +++ b/tokens/pda-mint-authority/anchor/programs/token-minter/src/instructions/mint.rs @@ -7,7 +7,7 @@ use { }; #[derive(Accounts)] -pub struct MintToken<'info> { +pub struct MintTokenAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -34,7 +34,16 @@ pub struct MintToken<'info> { pub system_program: Program<'info, System>, } -pub fn handle_mint_token(context: Context, amount: u64) -> Result<()> { +/// Mints `amount` tokens to the payer's associated token account, signed by +/// the PDA mint authority. +/// +/// `amount` is in minor units (the raw integer the token program operates +/// on). Clients convert from major units, e.g. 1 token with 9 decimals is +/// `1 * 10u64.pow(9)` minor units. +pub fn handle_mint_token( + context: Context, + amount: u64, +) -> Result<()> { msg!("Minting token to associated token account..."); msg!("Mint: {}", &context.accounts.mint_account.key()); msg!( @@ -56,7 +65,7 @@ pub fn handle_mint_token(context: Context, amount: u64) -> Result<()> }, ) .with_signer(signer_seeds), // using PDA to sign - amount * 10u64.pow(context.accounts.mint_account.decimals as u32), // Mint tokens, adjust for decimals + amount, )?; msg!("Token minted successfully."); diff --git a/tokens/pda-mint-authority/anchor/programs/token-minter/src/lib.rs b/tokens/pda-mint-authority/anchor/programs/token-minter/src/lib.rs index 71a6c08f..bea8707d 100644 --- a/tokens/pda-mint-authority/anchor/programs/token-minter/src/lib.rs +++ b/tokens/pda-mint-authority/anchor/programs/token-minter/src/lib.rs @@ -17,7 +17,11 @@ pub mod token_minter { create::handle_create_token(context, token_name, token_symbol, token_uri) } - pub fn mint_token(context: Context, amount: u64) -> Result<()> { + /// Mint `amount` minor units of the token to the payer. + pub fn mint_token( + context: Context, + amount: u64, + ) -> Result<()> { mint::handle_mint_token(context, amount) } } diff --git a/tokens/pda-mint-authority/anchor/programs/token-minter/tests/test_pda_mint.rs b/tokens/pda-mint-authority/anchor/programs/token-minter/tests/test_pda_mint.rs index 35f7ff18..9a7488c8 100644 --- a/tokens/pda-mint-authority/anchor/programs/token-minter/tests/test_pda_mint.rs +++ b/tokens/pda-mint-authority/anchor/programs/token-minter/tests/test_pda_mint.rs @@ -11,6 +11,16 @@ use { solana_signer::Signer, }; +/// Decimals configured by the program's `mint::decimals` constraint in +/// `CreateToken`. +const MINT_DECIMALS: u32 = 9; + +/// Converts a whole-token (major unit) count to minor units, the form the +/// program's `mint_token` handler takes amounts in. +fn to_minor_units(major_units: u64) -> u64 { + major_units.checked_mul(10u64.pow(MINT_DECIMALS)).unwrap() +} + fn metadata_program_id() -> Pubkey { "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" .parse() @@ -117,14 +127,17 @@ fn test_create_token_and_mint() { .expect("Metadata should exist"); assert!(!meta.data.is_empty()); - // 2. Mint tokens (100 tokens to payer's ATA) + // 2. Mint 100 tokens to the payer's ATA. The handler takes minor units. svm.expire_blockhash(); let ata = derive_ata(&payer.pubkey(), &mint_pda); let mint_ix = Instruction::new_with_bytes( program_id, - &token_minter::instruction::MintToken { amount: 100 }.data(), - token_minter::accounts::MintToken { + &token_minter::instruction::MintToken { + amount: to_minor_units(100), + } + .data(), + token_minter::accounts::MintTokenAccountConstraints { payer: payer.pubkey(), mint_account: mint_pda, associated_token_account: ata, @@ -142,7 +155,7 @@ fn test_create_token_and_mint() { ) .unwrap(); - // Verify: 100 * 10^9 = 100_000_000_000 tokens (9 decimals) + // Verify 100 tokens minted (in minor units) let balance = get_token_account_balance(&svm, &ata).unwrap(); - assert_eq!(balance, 100_000_000_000, "Should have 100 tokens"); + assert_eq!(balance, to_minor_units(100), "Should have 100 tokens"); } diff --git a/tokens/token-extensions/basics/quasar/src/lib.rs b/tokens/token-extensions/basics/quasar/src/lib.rs index 8f51a080..6b0e8ba7 100644 --- a/tokens/token-extensions/basics/quasar/src/lib.rs +++ b/tokens/token-extensions/basics/quasar/src/lib.rs @@ -8,7 +8,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("6qNqxkRF791FXFeQwqYQLEzAbGiqDULC5SSHVsfRoG89"); /// Correct Token Extensions program ID. /// diff --git a/tokens/token-extensions/cpi-guard/quasar/src/lib.rs b/tokens/token-extensions/cpi-guard/quasar/src/lib.rs index 74d63c9c..7bb40d7d 100644 --- a/tokens/token-extensions/cpi-guard/quasar/src/lib.rs +++ b/tokens/token-extensions/cpi-guard/quasar/src/lib.rs @@ -8,7 +8,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("6tU3MEowU6oxxeDZLSxEwzcEZsZrhBJsfUR6xECvShid"); /// Correct Token Extensions program ID (quasar-spl 0.0.0 has wrong bytes). pub struct Token2022Program; diff --git a/tokens/token-extensions/default-account-state/quasar/src/lib.rs b/tokens/token-extensions/default-account-state/quasar/src/lib.rs index 23393545..e33f8d5e 100644 --- a/tokens/token-extensions/default-account-state/quasar/src/lib.rs +++ b/tokens/token-extensions/default-account-state/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("5LdYbHiUsFxVG8bfqoeBkhBYMRmWZb3BoLuABgYW7coB"); /// Correct Token Extensions program ID (quasar-spl 0.0.0 has wrong bytes). pub struct Token2022Program; diff --git a/tokens/token-extensions/group/quasar/src/lib.rs b/tokens/token-extensions/group/quasar/src/lib.rs index d7665346..438b3dac 100644 --- a/tokens/token-extensions/group/quasar/src/lib.rs +++ b/tokens/token-extensions/group/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("4XCDGMD8fsdjUzmYj6d9if8twFt1f23Ym52iDmWK8fFs"); pub struct Token2022Program; impl Id for Token2022Program { diff --git a/tokens/token-extensions/immutable-owner/quasar/src/lib.rs b/tokens/token-extensions/immutable-owner/quasar/src/lib.rs index 83606f22..2c1420ca 100644 --- a/tokens/token-extensions/immutable-owner/quasar/src/lib.rs +++ b/tokens/token-extensions/immutable-owner/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("6g5URpqqurW8RbKjuGeRCVZBKky3J4kYcLeotQ6vj6UT"); pub struct Token2022Program; impl Id for Token2022Program { diff --git a/tokens/token-extensions/interest-bearing/quasar/src/lib.rs b/tokens/token-extensions/interest-bearing/quasar/src/lib.rs index b649b59e..af2124c1 100644 --- a/tokens/token-extensions/interest-bearing/quasar/src/lib.rs +++ b/tokens/token-extensions/interest-bearing/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("DMQdkzRJz8uQSN8Kx2QYmQJn6xLKhsu3LcPYxs314MgC"); pub struct Token2022Program; impl Id for Token2022Program { diff --git a/tokens/token-extensions/memo-transfer/quasar/src/lib.rs b/tokens/token-extensions/memo-transfer/quasar/src/lib.rs index bead24bb..35005349 100644 --- a/tokens/token-extensions/memo-transfer/quasar/src/lib.rs +++ b/tokens/token-extensions/memo-transfer/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("5BQyC7y2Pc283woThq11uZRqsgcRbBRLKz4yQ8BJadi2"); pub struct Token2022Program; impl Id for Token2022Program { diff --git a/tokens/token-extensions/mint-close-authority/quasar/src/lib.rs b/tokens/token-extensions/mint-close-authority/quasar/src/lib.rs index 3c9eae46..299242a4 100644 --- a/tokens/token-extensions/mint-close-authority/quasar/src/lib.rs +++ b/tokens/token-extensions/mint-close-authority/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("AcfQLsYKuzprcCNH1n96pKKgAbAnZchwpbr3gbVN742n"); pub struct Token2022Program; impl Id for Token2022Program { diff --git a/tokens/token-extensions/non-transferable/quasar/src/lib.rs b/tokens/token-extensions/non-transferable/quasar/src/lib.rs index 1e66dba5..cfc176da 100644 --- a/tokens/token-extensions/non-transferable/quasar/src/lib.rs +++ b/tokens/token-extensions/non-transferable/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("8Bz4wpHaUckiC169Rg5ZfaBHFemp5S8RwTSDTKzhJ9W"); pub struct Token2022Program; impl Id for Token2022Program { diff --git a/tokens/token-extensions/permanent-delegate/quasar/src/lib.rs b/tokens/token-extensions/permanent-delegate/quasar/src/lib.rs index e5f3e06b..ef734e9e 100644 --- a/tokens/token-extensions/permanent-delegate/quasar/src/lib.rs +++ b/tokens/token-extensions/permanent-delegate/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("A9rxKS84ZoJVyeTfQbCEfxME2vvAM4uwSMjkmhR5XWb1"); pub struct Token2022Program; impl Id for Token2022Program { diff --git a/tokens/token-extensions/transfer-fee/quasar/src/lib.rs b/tokens/token-extensions/transfer-fee/quasar/src/lib.rs index 4307fd38..48cbbabc 100644 --- a/tokens/token-extensions/transfer-fee/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-fee/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("4evptdGtALCNT8uTxJhbWBRZpBE8w5oNtmgfSyfQu7td"); pub struct Token2022Program; impl Id for Token2022Program { diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/src/lib.rs index 28628d16..eca18dcb 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("1qahDxKHeCLZhbBU2NyMU6vQCQmEUmdeSEBrG5drffK"); /// SPL Transfer Hook Interface discriminators (SHA-256 prefix). #[allow(dead_code)] diff --git a/tokens/token-extensions/transfer-hook/counter/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/counter/quasar/src/lib.rs index b0465c61..ef1652ad 100644 --- a/tokens/token-extensions/transfer-hook/counter/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/counter/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("1qahDxKHeCLZhbBU2NyMU6vQCQmEUmdeSEBrG5drffK"); /// SPL Transfer Hook Interface discriminators (SHA-256 prefix). /// Execute: sha256("spl-transfer-hook-interface:execute")[:8] diff --git a/tokens/token-extensions/transfer-hook/hello-world/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/hello-world/quasar/src/lib.rs index a5102e2e..5396e272 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/hello-world/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("jY5DfVksJT8Le38LCaQhz5USeiGu4rUeVSS8QRAMoba"); pub struct Token2022Program; impl Id for Token2022Program { diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/transfer-cost/quasar/src/lib.rs index 1e33e6ef..e448b342 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/transfer-cost/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("FjcHckEgXcBhFmSGai3FRpDLiT6hbpV893n8iTxVd81g"); /// SPL Transfer Hook Interface discriminators (SHA-256 prefix). #[allow(dead_code)] diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/lib.rs index a768c9f3..323ac417 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("FjcHckEgXcBhFmSGai3FRpDLiT6hbpV893n8iTxVd81g"); /// SPL Transfer Hook Interface discriminators (SHA-256 prefix). #[allow(dead_code)] diff --git a/tokens/token-extensions/transfer-hook/whitelist/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/whitelist/quasar/src/lib.rs index 003ef6f5..26a61a43 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/whitelist/quasar/src/lib.rs @@ -9,7 +9,7 @@ use quasar_lang::{ #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("DrWbQtYJGtsoRwzKqAbHKHKsCJJfpysudF39GBVFSxub"); /// SPL Transfer Hook Interface discriminators (SHA-256 prefix). #[allow(dead_code)] diff --git a/tokens/token-minter/anchor/Anchor.toml b/tokens/token-minter/anchor/Anchor.toml index 21553a00..e1ac6290 100644 --- a/tokens/token-minter/anchor/Anchor.toml +++ b/tokens/token-minter/anchor/Anchor.toml @@ -13,7 +13,6 @@ cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests - the validator tests (test.ts) need Metaplex Token -# Metadata cloned from mainnet which is too slow/unreliable in CI. -# bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). +# Rust + LiteSVM tests; Metaplex Token Metadata is loaded from a local +# fixture (tests/fixtures/mpl_token_metadata.so), no validator needed. test = "cargo test" diff --git a/tokens/token-minter/anchor/README.md b/tokens/token-minter/anchor/README.md index ee9455f3..d6719642 100644 --- a/tokens/token-minter/anchor/README.md +++ b/tokens/token-minter/anchor/README.md @@ -8,6 +8,7 @@ See also: [Token Minter overview](../README.md) and the [repository catalog](../ - Mint authority on a PDA or signer - Token account initialization +- Amounts: `mint_token` takes `amount` in **minor units**, the raw integer the token program operates on. Clients convert from major units offchain: 1 token with 9 decimals is `1 * 10^9` minor units. The program never scales amounts onchain. ## Setup diff --git a/tokens/token-minter/anchor/programs/token-minter/src/instructions/mint.rs b/tokens/token-minter/anchor/programs/token-minter/src/instructions/mint.rs index f00ebbd1..7d731da0 100644 --- a/tokens/token-minter/anchor/programs/token-minter/src/instructions/mint.rs +++ b/tokens/token-minter/anchor/programs/token-minter/src/instructions/mint.rs @@ -7,13 +7,15 @@ use { }; #[derive(Accounts)] -pub struct MintToken<'info> { +pub struct MintTokenAccountConstraints<'info> { #[account(mut)] pub mint_authority: Signer<'info>, pub recipient: SystemAccount<'info>, + #[account(mut)] pub mint_account: Account<'info, Mint>, + #[account( init_if_needed, payer = mint_authority, @@ -27,7 +29,15 @@ pub struct MintToken<'info> { pub system_program: Program<'info, System>, } -pub fn handle_mint_token(context: Context, amount: u64) -> Result<()> { +/// Mints `amount` tokens to the recipient's associated token account. +/// +/// `amount` is in minor units (the raw integer the token program operates +/// on). Clients convert from major units, e.g. 1 token with 9 decimals is +/// `1 * 10u64.pow(9)` minor units. +pub fn handle_mint_token( + context: Context, + amount: u64, +) -> Result<()> { msg!("Minting tokens to associated token account..."); msg!("Mint: {}", &context.accounts.mint_account.key()); msg!( @@ -45,7 +55,7 @@ pub fn handle_mint_token(context: Context, amount: u64) -> Result<()> authority: context.accounts.mint_authority.to_account_info(), }, ), - amount * 10u64.pow(context.accounts.mint_account.decimals as u32), // Mint tokens, adjust for decimals + amount, )?; msg!("Token minted successfully."); diff --git a/tokens/token-minter/anchor/programs/token-minter/src/lib.rs b/tokens/token-minter/anchor/programs/token-minter/src/lib.rs index f7415398..3b20bac5 100644 --- a/tokens/token-minter/anchor/programs/token-minter/src/lib.rs +++ b/tokens/token-minter/anchor/programs/token-minter/src/lib.rs @@ -18,7 +18,11 @@ pub mod token_minter { create::handle_create_token(context, token_name, token_symbol, token_uri) } - pub fn mint_token(context: Context, amount: u64) -> Result<()> { + /// Mint `amount` minor units of the token to the recipient. + pub fn mint_token( + context: Context, + amount: u64, + ) -> Result<()> { mint::handle_mint_token(context, amount) } } diff --git a/tokens/token-minter/anchor/programs/token-minter/tests/test_token_minter.rs b/tokens/token-minter/anchor/programs/token-minter/tests/test_token_minter.rs index b7748020..3249c297 100644 --- a/tokens/token-minter/anchor/programs/token-minter/tests/test_token_minter.rs +++ b/tokens/token-minter/anchor/programs/token-minter/tests/test_token_minter.rs @@ -11,6 +11,16 @@ use { solana_signer::Signer, }; +/// Decimals configured by the program's `mint::decimals` constraint in +/// `CreateToken`. +const MINT_DECIMALS: u32 = 9; + +/// Converts a whole-token (major unit) count to minor units, the form the +/// program's `mint_token` handler takes amounts in. +fn to_minor_units(major_units: u64) -> u64 { + major_units.checked_mul(10u64.pow(MINT_DECIMALS)).unwrap() +} + fn metadata_program_id() -> Pubkey { "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" .parse() @@ -151,14 +161,17 @@ fn test_create_and_mint_tokens() { ) .unwrap(); - // 2. Mint 100 tokens + // 2. Mint 100 tokens. The handler takes minor units. svm.expire_blockhash(); let ata = derive_ata(&payer.pubkey(), &mint_keypair.pubkey()); let mint_ix = Instruction::new_with_bytes( program_id, - &token_minter::instruction::MintToken { amount: 100 }.data(), - token_minter::accounts::MintToken { + &token_minter::instruction::MintToken { + amount: to_minor_units(100), + } + .data(), + token_minter::accounts::MintTokenAccountConstraints { mint_authority: payer.pubkey(), recipient: payer.pubkey(), mint_account: mint_keypair.pubkey(), @@ -177,7 +190,7 @@ fn test_create_and_mint_tokens() { ) .unwrap(); - // Verify: 100 * 10^9 = 100_000_000_000 tokens minted (9 decimals) + // Verify 100 tokens minted (in minor units) let balance = get_token_account_balance(&svm, &ata).unwrap(); - assert_eq!(balance, 100_000_000_000, "Should have 100 tokens"); + assert_eq!(balance, to_minor_units(100), "Should have 100 tokens"); } diff --git a/tokens/transfer-tokens/README.md b/tokens/transfer-tokens/README.md index 56dc493b..816768a4 100644 --- a/tokens/transfer-tokens/README.md +++ b/tokens/transfer-tokens/README.md @@ -2,6 +2,6 @@ Like minting, token transfers happen between [Associated Token Accounts](https://solana.com/docs/terminology#associated-token-account-ata). -Use the [Classic Token Program](https://solana.com/docs/terminology#token-program)'s `transfer` [instruction handler](https://solana.com/docs/terminology#instruction-handler) to move tokens, given the appropriate permissions. +Use the token program's `transfer_checked` [instruction handler](https://solana.com/docs/terminology#instruction-handler) to move tokens, given the appropriate permissions. `transfer_checked` carries the mint and decimals through the CPI, so a wrong-mint or wrong-decimals account fails the CPI instead of silently moving the wrong quantity. Amounts are passed in minor units, the raw integer the token program operates on. See [Token Minter](../token-minter) and [NFT Minter](../nft-minter) for more on Associated Token Accounts. diff --git a/tokens/transfer-tokens/anchor/Anchor.toml b/tokens/transfer-tokens/anchor/Anchor.toml index a5a49fb9..c6316abf 100644 --- a/tokens/transfer-tokens/anchor/Anchor.toml +++ b/tokens/transfer-tokens/anchor/Anchor.toml @@ -13,7 +13,6 @@ cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests - the validator tests (test.ts) need Metaplex Token -# Metadata cloned from mainnet which is too slow/unreliable in CI. -# bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). +# Rust + LiteSVM tests; Metaplex Token Metadata is loaded from a local +# fixture (tests/fixtures/mpl_token_metadata.so), no validator needed. test = "cargo test" diff --git a/tokens/transfer-tokens/anchor/README.md b/tokens/transfer-tokens/anchor/README.md index 6a64882d..b173325e 100644 --- a/tokens/transfer-tokens/anchor/README.md +++ b/tokens/transfer-tokens/anchor/README.md @@ -1,13 +1,15 @@ # Transfer Tokens (Anchor) -Transfer tokens between token accounts via CPI to the Classic Token Program. +Transfer tokens between token accounts via CPI to the token program. See also: [Transfer Tokens overview](../README.md) and the [repository catalog](../../../README.md). ## Major concepts - Associated token accounts -- transfer or transfer_checked +- `transfer_checked`, which carries the mint and decimals through the CPI +- `anchor_spl::token_interface` types, so the same program works against both the Classic Token Program and the Token Extensions Program +- Amounts: `mint_token` and `transfer_tokens` take `amount` in **minor units**, the raw integer the token program operates on. Clients convert from major units offchain: 1 token with 9 decimals is `1 * 10^9` minor units. The program never scales amounts onchain. ## Setup diff --git a/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/instructions/create.rs b/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/instructions/create.rs index b2916b74..6670117d 100644 --- a/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/instructions/create.rs +++ b/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/instructions/create.rs @@ -5,12 +5,12 @@ use { create_metadata_accounts_v3, mpl_token_metadata::types::DataV2, CreateMetadataAccountsV3, Metadata, }, - token::{Mint, Token}, + token_interface::{Mint, TokenInterface}, }, }; #[derive(Accounts)] -pub struct CreateToken<'info> { +pub struct CreateTokenAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -20,9 +20,9 @@ pub struct CreateToken<'info> { mint::decimals = 9, mint::authority = payer.key(), mint::freeze_authority = payer.key(), - + mint::token_program = token_program, )] - pub mint_account: Account<'info, Mint>, + pub mint_account: InterfaceAccount<'info, Mint>, /// CHECK: Validate address by deriving pda #[account( @@ -33,14 +33,14 @@ pub struct CreateToken<'info> { )] pub metadata_account: UncheckedAccount<'info>, - pub token_program: Program<'info, Token>, + pub token_program: Interface<'info, TokenInterface>, pub token_metadata_program: Program<'info, Metadata>, pub system_program: Program<'info, System>, pub rent: Sysvar<'info, Rent>, } pub fn handle_create_token( - context: Context, + context: Context, token_name: String, token_symbol: String, token_uri: String, diff --git a/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/instructions/mint.rs b/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/instructions/mint.rs index 0313b054..f57df043 100644 --- a/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/instructions/mint.rs +++ b/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/instructions/mint.rs @@ -2,32 +2,43 @@ use { anchor_lang::prelude::*, anchor_spl::{ associated_token::AssociatedToken, - token::{mint_to, Mint, MintTo, Token, TokenAccount}, + token_interface::{mint_to, Mint, MintTo, TokenAccount, TokenInterface}, }, }; #[derive(Accounts)] -pub struct MintToken<'info> { +pub struct MintTokenAccountConstraints<'info> { #[account(mut)] pub mint_authority: Signer<'info>, pub recipient: SystemAccount<'info>, + #[account(mut)] - pub mint_account: Account<'info, Mint>, + pub mint_account: InterfaceAccount<'info, Mint>, + #[account( init_if_needed, payer = mint_authority, associated_token::mint = mint_account, associated_token::authority = recipient, + associated_token::token_program = token_program, )] - pub associated_token_account: Account<'info, TokenAccount>, + pub associated_token_account: InterfaceAccount<'info, TokenAccount>, - pub token_program: Program<'info, Token>, + pub token_program: Interface<'info, TokenInterface>, pub associated_token_program: Program<'info, AssociatedToken>, pub system_program: Program<'info, System>, } -pub fn handle_mint_token(context: Context, amount: u64) -> Result<()> { +/// Mints `amount` tokens to the recipient's associated token account. +/// +/// `amount` is in minor units (the raw integer the token program operates +/// on). Clients convert from major units, e.g. 1 token with 9 decimals is +/// `1 * 10u64.pow(9)` minor units. +pub fn handle_mint_token( + context: Context, + amount: u64, +) -> Result<()> { msg!("Minting tokens to associated token account..."); msg!("Mint: {}", &context.accounts.mint_account.key()); msg!( @@ -45,7 +56,7 @@ pub fn handle_mint_token(context: Context, amount: u64) -> Result<()> authority: context.accounts.mint_authority.to_account_info(), }, ), - amount * 10u64.pow(context.accounts.mint_account.decimals as u32), // Mint tokens + amount, )?; msg!("Token minted successfully."); diff --git a/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/instructions/transfer.rs b/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/instructions/transfer.rs index b8e3bea9..b471124d 100644 --- a/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/instructions/transfer.rs +++ b/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/instructions/transfer.rs @@ -2,38 +2,54 @@ use { anchor_lang::prelude::*, anchor_spl::{ associated_token::AssociatedToken, - token::{transfer, Mint, Token, TokenAccount, Transfer}, + token_interface::{transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked}, }, }; #[derive(Accounts)] -pub struct TransferTokens<'info> { +pub struct TransferTokensAccountConstraints<'info> { #[account(mut)] pub sender: Signer<'info>, + pub recipient: SystemAccount<'info>, #[account(mut)] - pub mint_account: Account<'info, Mint>, + pub mint_account: InterfaceAccount<'info, Mint>, + #[account( mut, associated_token::mint = mint_account, associated_token::authority = sender, + associated_token::token_program = token_program, )] - pub sender_token_account: Account<'info, TokenAccount>, + pub sender_token_account: InterfaceAccount<'info, TokenAccount>, + #[account( init_if_needed, payer = sender, associated_token::mint = mint_account, associated_token::authority = recipient, + associated_token::token_program = token_program, )] - pub recipient_token_account: Account<'info, TokenAccount>, + pub recipient_token_account: InterfaceAccount<'info, TokenAccount>, - pub token_program: Program<'info, Token>, + pub token_program: Interface<'info, TokenInterface>, pub associated_token_program: Program<'info, AssociatedToken>, pub system_program: Program<'info, System>, } -pub fn handle_transfer_tokens(context: Context, amount: u64) -> Result<()> { +/// Transfers `amount` tokens from the sender's to the recipient's associated +/// token account. +/// +/// `amount` is in minor units (the raw integer the token program operates +/// on). Clients convert from major units, e.g. 1 token with 9 decimals is +/// `1 * 10u64.pow(9)` minor units. `transfer_checked` carries the mint and +/// decimals through the CPI so a wrong-mint or wrong-decimals account fails +/// the CPI instead of silently moving the wrong quantity. +pub fn handle_transfer_tokens( + context: Context, + amount: u64, +) -> Result<()> { msg!("Transferring tokens..."); msg!( "Mint: {}", @@ -48,17 +64,19 @@ pub fn handle_transfer_tokens(context: Context, amount: u64) -> &context.accounts.recipient_token_account.key() ); - // Invoke the transfer instruction on the token program - transfer( + // Invoke the transfer_checked instruction on the token program + transfer_checked( CpiContext::new( context.accounts.token_program.key(), - Transfer { + TransferChecked { from: context.accounts.sender_token_account.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), to: context.accounts.recipient_token_account.to_account_info(), authority: context.accounts.sender.to_account_info(), }, ), - amount * 10u64.pow(context.accounts.mint_account.decimals as u32), // Transfer amount, adjust for decimals + amount, + context.accounts.mint_account.decimals, )?; msg!("Tokens transferred successfully."); diff --git a/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/lib.rs b/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/lib.rs index 5930b495..3d008421 100644 --- a/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/lib.rs +++ b/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/lib.rs @@ -11,7 +11,7 @@ pub mod transfer_tokens { use super::*; pub fn create_token( - context: Context, + context: Context, token_title: String, token_symbol: String, token_uri: String, @@ -19,11 +19,19 @@ pub mod transfer_tokens { create::handle_create_token(context, token_title, token_symbol, token_uri) } - pub fn mint_token(context: Context, amount: u64) -> Result<()> { + /// Mint `amount` minor units of the token to the recipient. + pub fn mint_token( + context: Context, + amount: u64, + ) -> Result<()> { mint::handle_mint_token(context, amount) } - pub fn transfer_tokens(context: Context, amount: u64) -> Result<()> { + /// Transfer `amount` minor units of the token from sender to recipient. + pub fn transfer_tokens( + context: Context, + amount: u64, + ) -> Result<()> { transfer::handle_transfer_tokens(context, amount) } } diff --git a/tokens/transfer-tokens/anchor/programs/transfer-tokens/tests/test_transfer_tokens.rs b/tokens/transfer-tokens/anchor/programs/transfer-tokens/tests/test_transfer_tokens.rs index b660ed47..bf0052e9 100644 --- a/tokens/transfer-tokens/anchor/programs/transfer-tokens/tests/test_transfer_tokens.rs +++ b/tokens/transfer-tokens/anchor/programs/transfer-tokens/tests/test_transfer_tokens.rs @@ -9,6 +9,16 @@ use { solana_signer::Signer, }; +/// Decimals configured by the program's `mint::decimals` constraint in +/// `CreateTokenAccountConstraints`. +const MINT_DECIMALS: u32 = 9; + +/// Converts a whole-token (major unit) count to minor units, the form the +/// program's instruction handlers take amounts in. +fn to_minor_units(major_units: u64) -> u64 { + major_units.checked_mul(10u64.pow(MINT_DECIMALS)).unwrap() +} + fn metadata_program_id() -> Pubkey { "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" .parse() @@ -84,7 +94,7 @@ fn test_create_mint_and_transfer() { token_uri: "https://example.com/token.json".to_string(), } .data(), - transfer_tokens::accounts::CreateToken { + transfer_tokens::accounts::CreateTokenAccountConstraints { payer: payer.pubkey(), mint_account: mint_keypair.pubkey(), metadata_account, @@ -109,14 +119,17 @@ fn test_create_mint_and_transfer() { .expect("Mint should exist"); assert!(!mint_account.data.is_empty()); - // 2. Mint tokens (100 tokens to payer's ATA) + // 2. Mint 100 tokens to payer's ATA. The handler takes minor units. svm.expire_blockhash(); let sender_ata = derive_ata(&payer.pubkey(), &mint_keypair.pubkey()); let mint_ix = Instruction::new_with_bytes( program_id, - &transfer_tokens::instruction::MintToken { amount: 100 }.data(), - transfer_tokens::accounts::MintToken { + &transfer_tokens::instruction::MintToken { + amount: to_minor_units(100), + } + .data(), + transfer_tokens::accounts::MintTokenAccountConstraints { mint_authority: payer.pubkey(), recipient: payer.pubkey(), mint_account: mint_keypair.pubkey(), @@ -135,21 +148,24 @@ fn test_create_mint_and_transfer() { ) .unwrap(); - // Verify tokens minted - 100 * 10^9 = 100_000_000_000 (9 decimals) + // Verify 100 tokens minted (in minor units) assert_eq!( get_token_account_balance(&svm, &sender_ata).unwrap(), - 100_000_000_000 + to_minor_units(100) ); - // 3. Transfer tokens (50 tokens to recipient) + // 3. Transfer 50 tokens to recipient. The handler takes minor units. svm.expire_blockhash(); let recipient = Keypair::new(); let recipient_ata = derive_ata(&recipient.pubkey(), &mint_keypair.pubkey()); let transfer_ix = Instruction::new_with_bytes( program_id, - &transfer_tokens::instruction::TransferTokens { amount: 50 }.data(), - transfer_tokens::accounts::TransferTokens { + &transfer_tokens::instruction::TransferTokens { + amount: to_minor_units(50), + } + .data(), + transfer_tokens::accounts::TransferTokensAccountConstraints { sender: payer.pubkey(), recipient: recipient.pubkey(), mint_account: mint_keypair.pubkey(), @@ -169,13 +185,13 @@ fn test_create_mint_and_transfer() { ) .unwrap(); - // Verify: sender 50 tokens, recipient 50 tokens (at 9 decimals) + // Verify: sender 50 tokens, recipient 50 tokens (in minor units) assert_eq!( get_token_account_balance(&svm, &sender_ata).unwrap(), - 50_000_000_000 + to_minor_units(50) ); assert_eq!( get_token_account_balance(&svm, &recipient_ata).unwrap(), - 50_000_000_000 + to_minor_units(50) ); } diff --git a/tools/shank-and-codama/native/README.md b/tools/shank-and-codama/native/README.md index 9cfbbd08..a92bbf53 100644 --- a/tools/shank-and-codama/native/README.md +++ b/tools/shank-and-codama/native/README.md @@ -117,6 +117,10 @@ pnpm build-and-test # build, regenerate the client, then run the LiteSVM test ``` The test ([`tests/test.ts`](./tests/test.ts)) loads the compiled `.so` into a -[LiteSVM](https://github.com/litesvm/litesvm) instance and exercises `add_car`, -`book_rental`, and `pick_up_car` through the generated client, asserting on the -resulting onchain account state. +[LiteSVM](https://github.com/litesvm/litesvm) instance and drives the full +rental lifecycle (`add_car`, `book_rental`, `pick_up_car`, `return_car`) +through the generated client, asserting on the resulting onchain account +state. It also asserts the program's account validation: a payer that did not +sign, a rental account owned by the wrong program, and an out-of-order status +transition (returning a car that was never picked up) are all rejected with +the named errors from `program/src/error.rs`. diff --git a/tools/shank-and-codama/native/program/idl/car_rental_service.json b/tools/shank-and-codama/native/program/idl/car_rental_service.json index bd014148..168a6a59 100644 --- a/tools/shank-and-codama/native/program/idl/car_rental_service.json +++ b/tools/shank-and-codama/native/program/idl/car_rental_service.json @@ -9,19 +9,25 @@ "name": "carAccount", "isMut": true, "isSigner": false, - "docs": ["The account that will represent the Car being created"] + "docs": [ + "The account that will represent the Car being created" + ] }, { "name": "payer", "isMut": true, - "isSigner": false, - "docs": ["Fee payer"] + "isSigner": true, + "docs": [ + "Fee payer" + ] }, { "name": "systemProgram", "isMut": false, "isSigner": false, - "docs": ["The System Program"] + "docs": [ + "The System Program" + ] } ], "args": [ @@ -44,25 +50,33 @@ "name": "rentalAccount", "isMut": true, "isSigner": false, - "docs": ["The account that will represent the actual order for the rental"] + "docs": [ + "The account that will represent the actual order for the rental" + ] }, { "name": "carAccount", "isMut": false, "isSigner": false, - "docs": ["The account representing the Car being rented in this order"] + "docs": [ + "The account representing the Car being rented in this order" + ] }, { "name": "payer", "isMut": true, - "isSigner": false, - "docs": ["Fee payer"] + "isSigner": true, + "docs": [ + "Fee payer" + ] }, { "name": "systemProgram", "isMut": false, "isSigner": false, - "docs": ["The System Program"] + "docs": [ + "The System Program" + ] } ], "args": [ @@ -85,19 +99,25 @@ "name": "rentalAccount", "isMut": true, "isSigner": false, - "docs": ["The account representing the active rental"] + "docs": [ + "The account representing the active rental" + ] }, { "name": "carAccount", "isMut": false, "isSigner": false, - "docs": ["The account representing the Car being rented in this order"] + "docs": [ + "The account representing the Car being rented in this order" + ] }, { "name": "payer", "isMut": true, - "isSigner": false, - "docs": ["Fee payer"] + "isSigner": true, + "docs": [ + "Fee payer" + ] } ], "args": [], @@ -113,19 +133,25 @@ "name": "rentalAccount", "isMut": true, "isSigner": false, - "docs": ["The account representing the active rental"] + "docs": [ + "The account representing the active rental" + ] }, { "name": "carAccount", "isMut": false, "isSigner": false, - "docs": ["The account representing the Car being rented in this order"] + "docs": [ + "The account representing the Car being rented in this order" + ] }, { "name": "payer", "isMut": true, - "isSigner": false, - "docs": ["Fee payer"] + "isSigner": true, + "docs": [ + "Fee payer" + ] } ], "args": [], diff --git a/tools/shank-and-codama/native/program/src/error.rs b/tools/shank-and-codama/native/program/src/error.rs new file mode 100644 index 00000000..516f985e --- /dev/null +++ b/tools/shank-and-codama/native/program/src/error.rs @@ -0,0 +1,30 @@ +use solana_program::program_error::ProgramError; + +/// Errors returned by the car rental service program. +/// Codes start at 6000 (the same offset Anchor uses for custom errors), so +/// they never collide with `ProgramError`'s built-in codes. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum CarRentalError { + /// The car account passed in does not match the PDA derived from the + /// car's make and model. + CarAccountAddressMismatch = 6000, + /// The rental account passed in does not match the PDA derived from the + /// car account and the payer. + RentalAccountAddressMismatch, + /// The payer must sign: the rental PDA is derived from the payer's key, + /// so without this check anyone could act on anyone else's rental. + PayerSignatureMissing, + /// The rental account is not owned by this program, so its data cannot + /// be trusted. + RentalAccountNotOwnedByProgram, + /// A car can only be picked up from a rental in `Created` status. + RentalNotInCreatedStatus, + /// A car can only be returned from a rental in `PickedUp` status. + RentalNotInPickedUpStatus, +} + +impl From for ProgramError { + fn from(error: CarRentalError) -> Self { + ProgramError::Custom(error as u32) + } +} diff --git a/tools/shank-and-codama/native/program/src/instructions/add_car.rs b/tools/shank-and-codama/native/program/src/instructions/add_car.rs index 7b195825..913d777b 100644 --- a/tools/shank-and-codama/native/program/src/instructions/add_car.rs +++ b/tools/shank-and-codama/native/program/src/instructions/add_car.rs @@ -1,4 +1,4 @@ -use crate::state::Car; +use crate::{error::CarRentalError, state::Car}; use { borsh::{BorshDeserialize, BorshSerialize}, solana_program::{ @@ -26,7 +26,9 @@ pub fn add_car(program_id: &Pubkey, accounts: &[AccountInfo], args: AddCarArgs) let system_program = next_account_info(accounts_iter)?; let (car_account_pda, car_account_bump) = Car::find_pda(program_id, &args.make, &args.model); - assert!(&car_account_pda == car_account.key); + if &car_account_pda != car_account.key { + return Err(CarRentalError::CarAccountAddressMismatch.into()); + } let car_data = Car { year: args.year, diff --git a/tools/shank-and-codama/native/program/src/instructions/book_rental.rs b/tools/shank-and-codama/native/program/src/instructions/book_rental.rs index a523ae3d..ad00c207 100644 --- a/tools/shank-and-codama/native/program/src/instructions/book_rental.rs +++ b/tools/shank-and-codama/native/program/src/instructions/book_rental.rs @@ -1,4 +1,7 @@ -use crate::state::{RentalOrder, RentalOrderStatus}; +use crate::{ + error::CarRentalError, + state::{RentalOrder, RentalOrderStatus}, +}; use { borsh::{BorshDeserialize, BorshSerialize}, solana_program::{ @@ -33,7 +36,9 @@ pub fn book_rental( let (rental_order_account_pda, rental_order_account_bump) = RentalOrder::find_pda(program_id, car_account.key, payer.key); - assert!(&rental_order_account_pda == rental_order_account.key); + if &rental_order_account_pda != rental_order_account.key { + return Err(CarRentalError::RentalAccountAddressMismatch.into()); + } let rental_order_data = RentalOrder { car: *car_account.key, diff --git a/tools/shank-and-codama/native/program/src/instructions/mod.rs b/tools/shank-and-codama/native/program/src/instructions/mod.rs index 3572eae5..d35f56c4 100644 --- a/tools/shank-and-codama/native/program/src/instructions/mod.rs +++ b/tools/shank-and-codama/native/program/src/instructions/mod.rs @@ -21,7 +21,7 @@ pub enum CarRentalServiceInstruction { name = "car_account", desc = "The account that will represent the Car being created" )] - #[account(1, writable, name = "payer", desc = "Fee payer")] + #[account(1, writable, signer, name = "payer", desc = "Fee payer")] #[account(2, name = "system_program", desc = "The System Program")] AddCar(AddCarArgs), @@ -36,7 +36,7 @@ pub enum CarRentalServiceInstruction { name = "car_account", desc = "The account representing the Car being rented in this order" )] - #[account(2, writable, name = "payer", desc = "Fee payer")] + #[account(2, writable, signer, name = "payer", desc = "Fee payer")] #[account(3, name = "system_program", desc = "The System Program")] BookRental(BookRentalArgs), @@ -51,7 +51,7 @@ pub enum CarRentalServiceInstruction { name = "car_account", desc = "The account representing the Car being rented in this order" )] - #[account(2, writable, name = "payer", desc = "Fee payer")] + #[account(2, writable, signer, name = "payer", desc = "Fee payer")] PickUpCar, #[account( @@ -65,6 +65,6 @@ pub enum CarRentalServiceInstruction { name = "car_account", desc = "The account representing the Car being rented in this order" )] - #[account(2, writable, name = "payer", desc = "Fee payer")] + #[account(2, writable, signer, name = "payer", desc = "Fee payer")] ReturnCar, } diff --git a/tools/shank-and-codama/native/program/src/instructions/pick_up_car.rs b/tools/shank-and-codama/native/program/src/instructions/pick_up_car.rs index 8637edb1..1dde7662 100644 --- a/tools/shank-and-codama/native/program/src/instructions/pick_up_car.rs +++ b/tools/shank-and-codama/native/program/src/instructions/pick_up_car.rs @@ -1,4 +1,7 @@ -use crate::state::{RentalOrder, RentalOrderStatus}; +use crate::{ + error::CarRentalError, + state::{RentalOrder, RentalOrderStatus}, +}; use { borsh::{BorshDeserialize, BorshSerialize}, solana_program::{ @@ -14,11 +17,31 @@ pub fn pick_up_car(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResu let car_account = next_account_info(accounts_iter)?; let payer = next_account_info(accounts_iter)?; + // The rental PDA is derived from the payer's key, so the payer must sign: + // otherwise anyone could pick up (and later return) someone else's rental + // just by naming the victim as `payer`. + if !payer.is_signer { + return Err(CarRentalError::PayerSignatureMissing.into()); + } + + // Only deserialize accounts this program owns. + if rental_order_account.owner != program_id { + return Err(CarRentalError::RentalAccountNotOwnedByProgram.into()); + } + let (rental_order_account_pda, _) = RentalOrder::find_pda(program_id, car_account.key, payer.key); - assert!(&rental_order_account_pda == rental_order_account.key); + if &rental_order_account_pda != rental_order_account.key { + return Err(CarRentalError::RentalAccountAddressMismatch.into()); + } let rental_order = &mut RentalOrder::try_from_slice(&rental_order_account.data.borrow())?; + + // Valid lifecycle: Created -> PickedUp -> Returned. + if rental_order.status != RentalOrderStatus::Created { + return Err(CarRentalError::RentalNotInCreatedStatus.into()); + } + rental_order.status = RentalOrderStatus::PickedUp; rental_order.serialize(&mut &mut rental_order_account.data.borrow_mut()[..])?; diff --git a/tools/shank-and-codama/native/program/src/instructions/return_car.rs b/tools/shank-and-codama/native/program/src/instructions/return_car.rs index 1962bd3a..c90443a5 100644 --- a/tools/shank-and-codama/native/program/src/instructions/return_car.rs +++ b/tools/shank-and-codama/native/program/src/instructions/return_car.rs @@ -1,4 +1,7 @@ -use crate::state::{RentalOrder, RentalOrderStatus}; +use crate::{ + error::CarRentalError, + state::{RentalOrder, RentalOrderStatus}, +}; use { borsh::{BorshDeserialize, BorshSerialize}, solana_program::{ @@ -14,11 +17,32 @@ pub fn return_car(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResul let car_account = next_account_info(accounts_iter)?; let payer = next_account_info(accounts_iter)?; + // The rental PDA is derived from the payer's key, so the payer must sign: + // otherwise anyone could return someone else's rental just by naming the + // victim as `payer`. + if !payer.is_signer { + return Err(CarRentalError::PayerSignatureMissing.into()); + } + + // Only deserialize accounts this program owns. + if rental_order_account.owner != program_id { + return Err(CarRentalError::RentalAccountNotOwnedByProgram.into()); + } + let (rental_order_account_pda, _) = RentalOrder::find_pda(program_id, car_account.key, payer.key); - assert!(&rental_order_account_pda == rental_order_account.key); + if &rental_order_account_pda != rental_order_account.key { + return Err(CarRentalError::RentalAccountAddressMismatch.into()); + } let rental_order = &mut RentalOrder::try_from_slice(&rental_order_account.data.borrow())?; + + // Valid lifecycle: Created -> PickedUp -> Returned. A car that was never + // picked up cannot be returned. + if rental_order.status != RentalOrderStatus::PickedUp { + return Err(CarRentalError::RentalNotInPickedUpStatus.into()); + } + rental_order.status = RentalOrderStatus::Returned; rental_order.serialize(&mut &mut rental_order_account.data.borrow_mut()[..])?; diff --git a/tools/shank-and-codama/native/program/src/lib.rs b/tools/shank-and-codama/native/program/src/lib.rs index 376b66be..0645925a 100644 --- a/tools/shank-and-codama/native/program/src/lib.rs +++ b/tools/shank-and-codama/native/program/src/lib.rs @@ -1,3 +1,4 @@ +mod error; mod instructions; mod state; diff --git a/tools/shank-and-codama/native/program/src/state/mod.rs b/tools/shank-and-codama/native/program/src/state/mod.rs index cb5fd132..f9ce35f9 100644 --- a/tools/shank-and-codama/native/program/src/state/mod.rs +++ b/tools/shank-and-codama/native/program/src/state/mod.rs @@ -37,7 +37,7 @@ impl Car { } } -#[derive(BorshDeserialize, BorshSerialize, Clone, Debug)] +#[derive(BorshDeserialize, BorshSerialize, Clone, Copy, Debug, PartialEq, Eq)] pub enum RentalOrderStatus { Created, PickedUp, diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts index 1da00ac7..871f35d6 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts @@ -7,20 +7,12 @@ */ import { - type Account, - type Address, addDecoderSizePrefix, addEncoderSizePrefix, assertAccountExists, assertAccountsExist, - type Codec, combineCodec, - type Decoder, decodeAccount, - type EncodedAccount, - type Encoder, - type FetchAccountConfig, - type FetchAccountsConfig, fetchEncodedAccount, fetchEncodedAccounts, getStructDecoder, @@ -31,6 +23,14 @@ import { getU32Encoder, getUtf8Decoder, getUtf8Encoder, + type Account, + type Address, + type Codec, + type Decoder, + type EncodedAccount, + type Encoder, + type FetchAccountConfig, + type FetchAccountsConfig, type MaybeAccount, type MaybeEncodedAccount, } from "@solana/kit"; @@ -71,7 +71,10 @@ export function decodeCar( export function decodeCar( encodedAccount: EncodedAccount | MaybeEncodedAccount, ): Account | MaybeAccount { - return decodeAccount(encodedAccount as MaybeEncodedAccount, getCarDecoder()); + return decodeAccount( + encodedAccount as MaybeEncodedAccount, + getCarDecoder(), + ); } export async function fetchCar( diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts index 668a53c9..539854a1 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts @@ -7,20 +7,12 @@ */ import { - type Account, - type Address, addDecoderSizePrefix, addEncoderSizePrefix, assertAccountExists, assertAccountsExist, - type Codec, combineCodec, - type Decoder, decodeAccount, - type EncodedAccount, - type Encoder, - type FetchAccountConfig, - type FetchAccountsConfig, fetchEncodedAccount, fetchEncodedAccounts, getAddressDecoder, @@ -33,6 +25,14 @@ import { getU64Encoder, getUtf8Decoder, getUtf8Encoder, + type Account, + type Address, + type Codec, + type Decoder, + type EncodedAccount, + type Encoder, + type FetchAccountConfig, + type FetchAccountsConfig, type MaybeAccount, type MaybeEncodedAccount, } from "@solana/kit"; @@ -99,7 +99,10 @@ export function decodeRentalOrder( export function decodeRentalOrder( encodedAccount: EncodedAccount | MaybeEncodedAccount, ): Account | MaybeAccount { - return decodeAccount(encodedAccount as MaybeEncodedAccount, getRentalOrderDecoder()); + return decodeAccount( + encodedAccount as MaybeEncodedAccount, + getRentalOrderDecoder(), + ); } export async function fetchRentalOrder( diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts index eed0d904..a74b14bf 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts @@ -7,35 +7,41 @@ */ import { - type AccountMeta, - type Address, addDecoderSizePrefix, addEncoderSizePrefix, - type Codec, combineCodec, - type Decoder, - type Encoder, getStructDecoder, getStructEncoder, - getU8Decoder, - getU8Encoder, getU16Decoder, getU16Encoder, getU32Decoder, getU32Encoder, + getU8Decoder, + getU8Encoder, getUtf8Decoder, getUtf8Encoder, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, + transformEncoder, + type AccountMeta, + type AccountSignerMeta, + type Address, + type Codec, + type Decoder, + type Encoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - transformEncoder, + type TransactionSigner, type WritableAccount, + type WritableSignerAccount, } from "@solana/kit"; -import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; +import { + getAccountMetaFactory, + type ResolvedInstructionAccount, +} from "@solana/program-client-core"; import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; export const ADD_CAR_DISCRIMINATOR = 0; @@ -48,15 +54,23 @@ export type AddCarInstruction< TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, TAccountCarAccount extends string | AccountMeta = string, TAccountPayer extends string | AccountMeta = string, - TAccountSystemProgram extends string | AccountMeta = "11111111111111111111111111111111", + TAccountSystemProgram extends string | AccountMeta = + "11111111111111111111111111111111", TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ - TAccountCarAccount extends string ? WritableAccount : TAccountCarAccount, - TAccountPayer extends string ? WritableAccount : TAccountPayer, - TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, + TAccountCarAccount extends string + ? WritableAccount + : TAccountCarAccount, + TAccountPayer extends string + ? WritableSignerAccount & + AccountSignerMeta + : TAccountPayer, + TAccountSystemProgram extends string + ? ReadonlyAccount + : TAccountSystemProgram, ...TRemainingAccounts, ] >; @@ -95,8 +109,14 @@ export function getAddCarInstructionDataDecoder(): Decoder { - return combineCodec(getAddCarInstructionDataEncoder(), getAddCarInstructionDataDecoder()); +export function getAddCarInstructionDataCodec(): Codec< + AddCarInstructionDataArgs, + AddCarInstructionData +> { + return combineCodec( + getAddCarInstructionDataEncoder(), + getAddCarInstructionDataDecoder(), + ); } export type AddCarInput< @@ -107,7 +127,7 @@ export type AddCarInput< /** The account that will represent the Car being created */ carAccount: Address; /** Fee payer */ - payer: Address; + payer: TransactionSigner; /** The System Program */ systemProgram?: Address; year: AddCarInstructionDataArgs["year"]; @@ -123,9 +143,15 @@ export function getAddCarInstruction< >( input: AddCarInput, config?: { programAddress?: TProgramAddress }, -): AddCarInstruction { +): AddCarInstruction< + TProgramAddress, + TAccountCarAccount, + TAccountPayer, + TAccountSystemProgram +> { // Program address. - const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + const programAddress = + config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { @@ -133,14 +159,18 @@ export function getAddCarInstruction< payer: { value: input.payer ?? null, isWritable: true }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, }; - const accounts = originalAccounts as Record; + const accounts = originalAccounts as Record< + keyof typeof originalAccounts, + ResolvedInstructionAccount + >; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; + accounts.systemProgram.value = + "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); @@ -150,9 +180,16 @@ export function getAddCarInstruction< getAccountMeta("payer", accounts.payer), getAccountMeta("systemProgram", accounts.systemProgram), ], - data: getAddCarInstructionDataEncoder().encode(args as AddCarInstructionDataArgs), + data: getAddCarInstructionDataEncoder().encode( + args as AddCarInstructionDataArgs, + ), programAddress, - } as AddCarInstruction); + } as AddCarInstruction< + TProgramAddress, + TAccountCarAccount, + TAccountPayer, + TAccountSystemProgram + >); } export type ParsedAddCarInstruction< @@ -171,14 +208,22 @@ export type ParsedAddCarInstruction< data: AddCarInstructionData; }; -export function parseAddCarInstruction( - instruction: Instruction & InstructionWithAccounts & InstructionWithData, +export function parseAddCarInstruction< + TProgram extends string, + TAccountMetas extends readonly AccountMeta[], +>( + instruction: Instruction & + InstructionWithAccounts & + InstructionWithData, ): ParsedAddCarInstruction { if (instruction.accounts.length < 3) { - throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 3, - }); + throw new SolanaError( + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 3, + }, + ); } let accountIndex = 0; const getNextAccount = () => { diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts index d0324b70..7925f36c 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts @@ -7,35 +7,41 @@ */ import { - type AccountMeta, - type Address, addDecoderSizePrefix, addEncoderSizePrefix, - type Codec, combineCodec, - type Decoder, - type Encoder, getStructDecoder, getStructEncoder, - getU8Decoder, - getU8Encoder, getU32Decoder, getU32Encoder, getU64Decoder, getU64Encoder, + getU8Decoder, + getU8Encoder, getUtf8Decoder, getUtf8Encoder, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, + transformEncoder, + type AccountMeta, + type AccountSignerMeta, + type Address, + type Codec, + type Decoder, + type Encoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - transformEncoder, + type TransactionSigner, type WritableAccount, + type WritableSignerAccount, } from "@solana/kit"; -import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; +import { + getAccountMetaFactory, + type ResolvedInstructionAccount, +} from "@solana/program-client-core"; import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; export const BOOK_RENTAL_DISCRIMINATOR = 1; @@ -49,16 +55,26 @@ export type BookRentalInstruction< TAccountRentalAccount extends string | AccountMeta = string, TAccountCarAccount extends string | AccountMeta = string, TAccountPayer extends string | AccountMeta = string, - TAccountSystemProgram extends string | AccountMeta = "11111111111111111111111111111111", + TAccountSystemProgram extends string | AccountMeta = + "11111111111111111111111111111111", TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ - TAccountRentalAccount extends string ? WritableAccount : TAccountRentalAccount, - TAccountCarAccount extends string ? ReadonlyAccount : TAccountCarAccount, - TAccountPayer extends string ? WritableAccount : TAccountPayer, - TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, + TAccountRentalAccount extends string + ? WritableAccount + : TAccountRentalAccount, + TAccountCarAccount extends string + ? ReadonlyAccount + : TAccountCarAccount, + TAccountPayer extends string + ? WritableSignerAccount & + AccountSignerMeta + : TAccountPayer, + TAccountSystemProgram extends string + ? ReadonlyAccount + : TAccountSystemProgram, ...TRemainingAccounts, ] >; @@ -101,8 +117,14 @@ export function getBookRentalInstructionDataDecoder(): Decoder { - return combineCodec(getBookRentalInstructionDataEncoder(), getBookRentalInstructionDataDecoder()); +export function getBookRentalInstructionDataCodec(): Codec< + BookRentalInstructionDataArgs, + BookRentalInstructionData +> { + return combineCodec( + getBookRentalInstructionDataEncoder(), + getBookRentalInstructionDataDecoder(), + ); } export type BookRentalInput< @@ -116,7 +138,7 @@ export type BookRentalInput< /** The account representing the Car being rented in this order */ carAccount: Address; /** Fee payer */ - payer: Address; + payer: TransactionSigner; /** The System Program */ systemProgram?: Address; name: BookRentalInstructionDataArgs["name"]; @@ -132,7 +154,12 @@ export function getBookRentalInstruction< TAccountSystemProgram extends string, TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, >( - input: BookRentalInput, + input: BookRentalInput< + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer, + TAccountSystemProgram + >, config?: { programAddress?: TProgramAddress }, ): BookRentalInstruction< TProgramAddress, @@ -142,7 +169,8 @@ export function getBookRentalInstruction< TAccountSystemProgram > { // Program address. - const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + const programAddress = + config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { @@ -151,14 +179,18 @@ export function getBookRentalInstruction< payer: { value: input.payer ?? null, isWritable: true }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, }; - const accounts = originalAccounts as Record; + const accounts = originalAccounts as Record< + keyof typeof originalAccounts, + ResolvedInstructionAccount + >; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; + accounts.systemProgram.value = + "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); @@ -169,7 +201,9 @@ export function getBookRentalInstruction< getAccountMeta("payer", accounts.payer), getAccountMeta("systemProgram", accounts.systemProgram), ], - data: getBookRentalInstructionDataEncoder().encode(args as BookRentalInstructionDataArgs), + data: getBookRentalInstructionDataEncoder().encode( + args as BookRentalInstructionDataArgs, + ), programAddress, } as BookRentalInstruction< TProgramAddress, @@ -198,14 +232,22 @@ export type ParsedBookRentalInstruction< data: BookRentalInstructionData; }; -export function parseBookRentalInstruction( - instruction: Instruction & InstructionWithAccounts & InstructionWithData, +export function parseBookRentalInstruction< + TProgram extends string, + TAccountMetas extends readonly AccountMeta[], +>( + instruction: Instruction & + InstructionWithAccounts & + InstructionWithData, ): ParsedBookRentalInstruction { if (instruction.accounts.length < 4) { - throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 4, - }); + throw new SolanaError( + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 4, + }, + ); } let accountIndex = 0; const getNextAccount = () => { diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts index a91a2ec0..2297f93e 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts @@ -7,27 +7,33 @@ */ import { - type AccountMeta, - type Address, combineCodec, - type FixedSizeCodec, - type FixedSizeDecoder, - type FixedSizeEncoder, getStructDecoder, getStructEncoder, getU8Decoder, getU8Encoder, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, + transformEncoder, + type AccountMeta, + type AccountSignerMeta, + type Address, + type FixedSizeCodec, + type FixedSizeDecoder, + type FixedSizeEncoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - transformEncoder, + type TransactionSigner, type WritableAccount, + type WritableSignerAccount, } from "@solana/kit"; -import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; +import { + getAccountMetaFactory, + type ResolvedInstructionAccount, +} from "@solana/program-client-core"; import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; export const PICK_UP_CAR_DISCRIMINATOR = 2; @@ -46,9 +52,16 @@ export type PickUpCarInstruction< InstructionWithData & InstructionWithAccounts< [ - TAccountRentalAccount extends string ? WritableAccount : TAccountRentalAccount, - TAccountCarAccount extends string ? ReadonlyAccount : TAccountCarAccount, - TAccountPayer extends string ? WritableAccount : TAccountPayer, + TAccountRentalAccount extends string + ? WritableAccount + : TAccountRentalAccount, + TAccountCarAccount extends string + ? ReadonlyAccount + : TAccountCarAccount, + TAccountPayer extends string + ? WritableSignerAccount & + AccountSignerMeta + : TAccountPayer, ...TRemainingAccounts, ] >; @@ -58,10 +71,10 @@ export type PickUpCarInstructionData = { discriminator: number }; export type PickUpCarInstructionDataArgs = {}; export function getPickUpCarInstructionDataEncoder(): FixedSizeEncoder { - return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ - ...value, - discriminator: PICK_UP_CAR_DISCRIMINATOR, - })); + return transformEncoder( + getStructEncoder([["discriminator", getU8Encoder()]]), + (value) => ({ ...value, discriminator: PICK_UP_CAR_DISCRIMINATOR }), + ); } export function getPickUpCarInstructionDataDecoder(): FixedSizeDecoder { @@ -72,7 +85,10 @@ export function getPickUpCarInstructionDataCodec(): FixedSizeCodec< PickUpCarInstructionDataArgs, PickUpCarInstructionData > { - return combineCodec(getPickUpCarInstructionDataEncoder(), getPickUpCarInstructionDataDecoder()); + return combineCodec( + getPickUpCarInstructionDataEncoder(), + getPickUpCarInstructionDataDecoder(), + ); } export type PickUpCarInput< @@ -85,7 +101,7 @@ export type PickUpCarInput< /** The account representing the Car being rented in this order */ carAccount: Address; /** Fee payer */ - payer: Address; + payer: TransactionSigner; }; export function getPickUpCarInstruction< @@ -94,11 +110,21 @@ export function getPickUpCarInstruction< TAccountPayer extends string, TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, >( - input: PickUpCarInput, + input: PickUpCarInput< + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer + >, config?: { programAddress?: TProgramAddress }, -): PickUpCarInstruction { +): PickUpCarInstruction< + TProgramAddress, + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer +> { // Program address. - const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + const programAddress = + config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { @@ -106,7 +132,10 @@ export function getPickUpCarInstruction< carAccount: { value: input.carAccount ?? null, isWritable: false }, payer: { value: input.payer ?? null, isWritable: true }, }; - const accounts = originalAccounts as Record; + const accounts = originalAccounts as Record< + keyof typeof originalAccounts, + ResolvedInstructionAccount + >; const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ @@ -117,7 +146,12 @@ export function getPickUpCarInstruction< ], data: getPickUpCarInstructionDataEncoder().encode({}), programAddress, - } as PickUpCarInstruction); + } as PickUpCarInstruction< + TProgramAddress, + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer + >); } export type ParsedPickUpCarInstruction< @@ -136,14 +170,22 @@ export type ParsedPickUpCarInstruction< data: PickUpCarInstructionData; }; -export function parsePickUpCarInstruction( - instruction: Instruction & InstructionWithAccounts & InstructionWithData, +export function parsePickUpCarInstruction< + TProgram extends string, + TAccountMetas extends readonly AccountMeta[], +>( + instruction: Instruction & + InstructionWithAccounts & + InstructionWithData, ): ParsedPickUpCarInstruction { if (instruction.accounts.length < 3) { - throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 3, - }); + throw new SolanaError( + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 3, + }, + ); } let accountIndex = 0; const getNextAccount = () => { diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts index d3ec60a8..a331fed1 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts @@ -7,27 +7,33 @@ */ import { - type AccountMeta, - type Address, combineCodec, - type FixedSizeCodec, - type FixedSizeDecoder, - type FixedSizeEncoder, getStructDecoder, getStructEncoder, getU8Decoder, getU8Encoder, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, + transformEncoder, + type AccountMeta, + type AccountSignerMeta, + type Address, + type FixedSizeCodec, + type FixedSizeDecoder, + type FixedSizeEncoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - transformEncoder, + type TransactionSigner, type WritableAccount, + type WritableSignerAccount, } from "@solana/kit"; -import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; +import { + getAccountMetaFactory, + type ResolvedInstructionAccount, +} from "@solana/program-client-core"; import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; export const RETURN_CAR_DISCRIMINATOR = 3; @@ -46,9 +52,16 @@ export type ReturnCarInstruction< InstructionWithData & InstructionWithAccounts< [ - TAccountRentalAccount extends string ? WritableAccount : TAccountRentalAccount, - TAccountCarAccount extends string ? ReadonlyAccount : TAccountCarAccount, - TAccountPayer extends string ? WritableAccount : TAccountPayer, + TAccountRentalAccount extends string + ? WritableAccount + : TAccountRentalAccount, + TAccountCarAccount extends string + ? ReadonlyAccount + : TAccountCarAccount, + TAccountPayer extends string + ? WritableSignerAccount & + AccountSignerMeta + : TAccountPayer, ...TRemainingAccounts, ] >; @@ -58,10 +71,10 @@ export type ReturnCarInstructionData = { discriminator: number }; export type ReturnCarInstructionDataArgs = {}; export function getReturnCarInstructionDataEncoder(): FixedSizeEncoder { - return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ - ...value, - discriminator: RETURN_CAR_DISCRIMINATOR, - })); + return transformEncoder( + getStructEncoder([["discriminator", getU8Encoder()]]), + (value) => ({ ...value, discriminator: RETURN_CAR_DISCRIMINATOR }), + ); } export function getReturnCarInstructionDataDecoder(): FixedSizeDecoder { @@ -72,7 +85,10 @@ export function getReturnCarInstructionDataCodec(): FixedSizeCodec< ReturnCarInstructionDataArgs, ReturnCarInstructionData > { - return combineCodec(getReturnCarInstructionDataEncoder(), getReturnCarInstructionDataDecoder()); + return combineCodec( + getReturnCarInstructionDataEncoder(), + getReturnCarInstructionDataDecoder(), + ); } export type ReturnCarInput< @@ -85,7 +101,7 @@ export type ReturnCarInput< /** The account representing the Car being rented in this order */ carAccount: Address; /** Fee payer */ - payer: Address; + payer: TransactionSigner; }; export function getReturnCarInstruction< @@ -94,11 +110,21 @@ export function getReturnCarInstruction< TAccountPayer extends string, TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, >( - input: ReturnCarInput, + input: ReturnCarInput< + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer + >, config?: { programAddress?: TProgramAddress }, -): ReturnCarInstruction { +): ReturnCarInstruction< + TProgramAddress, + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer +> { // Program address. - const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + const programAddress = + config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { @@ -106,7 +132,10 @@ export function getReturnCarInstruction< carAccount: { value: input.carAccount ?? null, isWritable: false }, payer: { value: input.payer ?? null, isWritable: true }, }; - const accounts = originalAccounts as Record; + const accounts = originalAccounts as Record< + keyof typeof originalAccounts, + ResolvedInstructionAccount + >; const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ @@ -117,7 +146,12 @@ export function getReturnCarInstruction< ], data: getReturnCarInstructionDataEncoder().encode({}), programAddress, - } as ReturnCarInstruction); + } as ReturnCarInstruction< + TProgramAddress, + TAccountRentalAccount, + TAccountCarAccount, + TAccountPayer + >); } export type ParsedReturnCarInstruction< @@ -136,14 +170,22 @@ export type ParsedReturnCarInstruction< data: ReturnCarInstructionData; }; -export function parseReturnCarInstruction( - instruction: Instruction & InstructionWithAccounts & InstructionWithData, +export function parseReturnCarInstruction< + TProgram extends string, + TAccountMetas extends readonly AccountMeta[], +>( + instruction: Instruction & + InstructionWithAccounts & + InstructionWithData, ): ParsedReturnCarInstruction { if (instruction.accounts.length < 3) { - throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 3, - }); + throw new SolanaError( + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 3, + }, + ); } let accountIndex = 0; const getNextAccount = () => { diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts b/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts index f054d668..2d2fcdab 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts @@ -7,23 +7,23 @@ */ import { - type Address, assertIsInstructionWithAccounts, + containsBytes, + extendClient, + getU8Encoder, + SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, + SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, + SolanaError, + type Address, type ClientWithPayer, type ClientWithRpc, type ClientWithTransactionPlanning, type ClientWithTransactionSending, - containsBytes, - extendClient, type GetAccountInfoApi, type GetMultipleAccountsApi, - getU8Encoder, type Instruction, type InstructionWithData, type ReadonlyUint8Array, - SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, - SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, - SolanaError, } from "@solana/kit"; import { addSelfFetchFunctions, @@ -32,29 +32,29 @@ import { type SelfPlanAndSendFunctions, } from "@solana/program-client-core"; import { - type Car, - type CarArgs, getCarCodec, getRentalOrderCodec, + type Car, + type CarArgs, type RentalOrder, type RentalOrderArgs, } from "../accounts"; import { - type AddCarInput, - type BookRentalInput, getAddCarInstruction, getBookRentalInstruction, getPickUpCarInstruction, getReturnCarInstruction, + parseAddCarInstruction, + parseBookRentalInstruction, + parsePickUpCarInstruction, + parseReturnCarInstruction, + type AddCarInput, + type BookRentalInput, type ParsedAddCarInstruction, type ParsedBookRentalInstruction, type ParsedPickUpCarInstruction, type ParsedReturnCarInstruction, type PickUpCarInput, - parseAddCarInstruction, - parseBookRentalInstruction, - parsePickUpCarInstruction, - parseReturnCarInstruction, type ReturnCarInput, } from "../instructions"; @@ -89,10 +89,10 @@ export function identifyCarRentalServiceInstruction( if (containsBytes(data, getU8Encoder().encode(3), 0)) { return CarRentalServiceInstruction.ReturnCar; } - throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, { - instructionData: data, - programName: "carRentalService", - }); + throw new SolanaError( + SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, + { instructionData: data, programName: "carRentalService" }, + ); } export type ParsedCarRentalServiceInstruction< @@ -145,10 +145,13 @@ export function parseCarRentalServiceInstruction( }; } default: - throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, { - instructionType: instructionType as string, - programName: "carRentalService", - }); + throw new SolanaError( + SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, + { + instructionType: instructionType as string, + programName: "carRentalService", + }, + ); } } @@ -159,7 +162,8 @@ export type CarRentalServicePlugin = { export type CarRentalServicePluginAccounts = { car: ReturnType & SelfFetchFunctions; - rentalOrder: ReturnType & SelfFetchFunctions; + rentalOrder: ReturnType & + SelfFetchFunctions; }; export type CarRentalServicePluginInstructions = { @@ -177,7 +181,9 @@ export type CarRentalServicePluginInstructions = { ) => ReturnType & SelfPlanAndSendFunctions; }; -export type CarRentalServicePluginRequirements = ClientWithRpc & +export type CarRentalServicePluginRequirements = ClientWithRpc< + GetAccountInfoApi & GetMultipleAccountsApi +> & ClientWithPayer & ClientWithTransactionPlanning & ClientWithTransactionSending; @@ -200,7 +206,7 @@ export function carRentalServiceProgram() { client, getAddCarInstruction({ ...input, - payer: input.payer ?? client.payer.address, + payer: input.payer ?? client.payer, }), ), bookRental: (input) => @@ -208,7 +214,7 @@ export function carRentalServiceProgram() { client, getBookRentalInstruction({ ...input, - payer: input.payer ?? client.payer.address, + payer: input.payer ?? client.payer, }), ), pickUpCar: (input) => @@ -216,7 +222,7 @@ export function carRentalServiceProgram() { client, getPickUpCarInstruction({ ...input, - payer: input.payer ?? client.payer.address, + payer: input.payer ?? client.payer, }), ), returnCar: (input) => @@ -224,7 +230,7 @@ export function carRentalServiceProgram() { client, getReturnCarInstruction({ ...input, - payer: input.payer ?? client.payer.address, + payer: input.payer ?? client.payer, }), ), }, diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts b/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts index 6034aec0..f4d5054d 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts @@ -8,11 +8,11 @@ import { combineCodec, + getEnumDecoder, + getEnumEncoder, type FixedSizeCodec, type FixedSizeDecoder, type FixedSizeEncoder, - getEnumDecoder, - getEnumEncoder, } from "@solana/kit"; export enum RentalOrderStatus { @@ -31,6 +31,12 @@ export function getRentalOrderStatusDecoder(): FixedSizeDecoder { - return combineCodec(getRentalOrderStatusEncoder(), getRentalOrderStatusDecoder()); +export function getRentalOrderStatusCodec(): FixedSizeCodec< + RentalOrderStatusArgs, + RentalOrderStatus +> { + return combineCodec( + getRentalOrderStatusEncoder(), + getRentalOrderStatusDecoder(), + ); } diff --git a/tools/shank-and-codama/native/tests/test.ts b/tools/shank-and-codama/native/tests/test.ts index bbf03fbd..240c623c 100644 --- a/tools/shank-and-codama/native/tests/test.ts +++ b/tools/shank-and-codama/native/tests/test.ts @@ -2,9 +2,11 @@ // // Runs entirely in CI with no network: the program `.so` is loaded into a // LiteSVM instance and exercised through the Codama-generated client -// (tests/generated). It creates a car (add_car), books a rental -// (book_rental) and picks it up (pick_up_car), asserting onchain account -// state after each step. +// (tests/generated). It walks the full rental lifecycle (add_car, +// book_rental, pick_up_car, return_car), asserting onchain account state +// after each step, and verifies the program's account validation: a +// non-signing payer, a rental account owned by the wrong program, and an +// invalid status transition are all rejected. import assert from "node:assert/strict"; import { readFileSync } from "node:fs"; @@ -13,14 +15,16 @@ import { test } from "node:test"; import { fileURLToPath } from "node:url"; import { + AccountRole, type Address, - address, appendTransactionMessageInstruction, + createNoopSigner, createTransactionMessage, generateKeyPairSigner, getAddressEncoder, getProgramDerivedAddress, getUtf8Encoder, + type Instruction, lamports, pipe, setTransactionMessageFeePayerSigner, @@ -35,9 +39,16 @@ import { getAddCarInstruction, getBookRentalInstruction, getPickUpCarInstruction, + getReturnCarInstruction, RentalOrderStatus, } from "./generated/src/generated/index.ts"; +// Custom error codes from program/src/error.rs (CarRentalError). The enum +// starts at 6000, matching Anchor's custom-error offset. +const ERROR_PAYER_SIGNATURE_MISSING = 6002; +const ERROR_RENTAL_ACCOUNT_NOT_OWNED_BY_PROGRAM = 6003; +const ERROR_RENTAL_NOT_IN_PICKED_UP_STATUS = 6005; + const here = dirname(fileURLToPath(import.meta.url)); const programSoPath = join(here, "..", "program", "target", "so", "car_rental_service.so"); @@ -70,14 +81,13 @@ async function rentalPda(programId: Address, car: Address, payer: Address): Prom async function sendIx( svm: LiteSVM, payer: Awaited>, - // deno-lint-ignore no-explicit-any - ix: any, + instruction: Instruction, ) { const tx = await pipe( createTransactionMessage({ version: 0 }), (m) => setTransactionMessageFeePayerSigner(payer, m), (m) => svm.setTransactionMessageLifetimeUsingLatestBlockhash(m), - (m) => appendTransactionMessageInstruction(ix, m), + (m) => appendTransactionMessageInstruction(instruction, m), (m) => signTransactionMessageWithSigners(m), ); const result = svm.sendTransaction(tx); @@ -87,11 +97,31 @@ async function sendIx( return result; } -test("car rental service: add_car, book_rental, pick_up_car", async () => { - const { svm, programId } = loadSvm(); +/** Assert that sending `instruction` fails with the given custom error code. */ +async function expectCustomError( + svm: LiteSVM, + payer: Awaited>, + instruction: Instruction, + errorCode: number, +) { + // The runtime logs custom errors as hex: "custom program error: 0x1772". + const errorCodeHex = `0x${errorCode.toString(16)}`; + await assert.rejects( + sendIx(svm, payer, instruction), + (thrownObject: Error) => thrownObject.message.includes(errorCodeHex), + `expected custom program error ${errorCode} (${errorCodeHex})`, + ); +} + +async function fundedSigner(svm: LiteSVM) { + const signer = await generateKeyPairSigner(); + svm.airdrop(signer.address, lamports(10_000_000_000n)); + return signer; +} - const payer = await generateKeyPairSigner(); - svm.airdrop(payer.address, lamports(10_000_000_000n)); +test("car rental service: full lifecycle add_car -> book_rental -> pick_up_car -> return_car", async () => { + const { svm, programId } = loadSvm(); + const payer = await fundedSigner(svm); // 1. add_car const make = "BMW"; @@ -132,10 +162,137 @@ test("car rental service: add_car, book_rental, pick_up_car", async () => { assert.equal(rental.data.status, RentalOrderStatus.Created); // 3. pick_up_car - await sendIx(svm, payer, getPickUpCarInstruction({ rentalAccount, carAccount, payer: payer.address })); + await sendIx(svm, payer, getPickUpCarInstruction({ rentalAccount, carAccount, payer })); rentalRaw = svm.getAccount(rentalAccount); assert.ok(rentalRaw?.exists, "rental account should still exist"); rental = decodeRentalOrder(rentalRaw); assert.equal(rental.data.status, RentalOrderStatus.PickedUp); + + // 4. return_car + await sendIx(svm, payer, getReturnCarInstruction({ rentalAccount, carAccount, payer })); + + rentalRaw = svm.getAccount(rentalAccount); + assert.ok(rentalRaw?.exists, "rental account should still exist"); + rental = decodeRentalOrder(rentalRaw); + assert.equal(rental.data.status, RentalOrderStatus.Returned); +}); + +test("pick_up_car rejects a payer that did not sign", async () => { + const { svm, programId } = loadSvm(); + const victim = await fundedSigner(svm); + const attacker = await fundedSigner(svm); + + const make = "Tesla"; + const model = "Model 3"; + const carAccount = await carPda(programId, make, model); + await sendIx(svm, victim, getAddCarInstruction({ carAccount, payer: victim, year: 2024, make, model })); + + const rentalAccount = await rentalPda(programId, carAccount, victim.address); + await sendIx( + svm, + victim, + getBookRentalInstruction({ + rentalAccount, + carAccount, + payer: victim, + name: "Wilma Flintstone", + pickUpDate: "02/01/2023 9:00 AM", + returnDate: "02/01/2023 5:00 PM", + price: 250, + }), + ); + + // The attacker names the victim as `payer` but cannot produce the victim's + // signature, so the account meta is demoted to a plain writable account. + const instruction = getPickUpCarInstruction({ + rentalAccount, + carAccount, + payer: createNoopSigner(victim.address), + }); + const instructionWithoutVictimSignature: Instruction = { + ...instruction, + accounts: instruction.accounts.map((account) => + account.address === victim.address + ? { address: account.address, role: AccountRole.WRITABLE } + : account, + ), + }; + + await expectCustomError( + svm, + attacker, + instructionWithoutVictimSignature, + ERROR_PAYER_SIGNATURE_MISSING, + ); + + // The rental is untouched. + const rental = decodeRentalOrder(svm.getAccount(rentalAccount)!); + assert.equal(rental.data.status, RentalOrderStatus.Created); +}); + +test("pick_up_car rejects a rental account not owned by the program", async () => { + const { svm, programId } = loadSvm(); + const payer = await fundedSigner(svm); + + const make = "Volvo"; + const model = "EX30"; + const carAccount = await carPda(programId, make, model); + await sendIx(svm, payer, getAddCarInstruction({ carAccount, payer, year: 2025, make, model })); + + // Plant an account with plausible rental data at the correct PDA address, + // but owned by the system program instead of the rental program. + const rentalAccount = await rentalPda(programId, carAccount, payer.address); + const plantedDataLength = 165; + svm.setAccount({ + address: rentalAccount, + lamports: lamports(10_000_000n), + data: new Uint8Array(plantedDataLength), + programAddress: "11111111111111111111111111111111" as Address, + executable: false, + space: BigInt(plantedDataLength), + }); + + await expectCustomError( + svm, + payer, + getPickUpCarInstruction({ rentalAccount, carAccount, payer }), + ERROR_RENTAL_ACCOUNT_NOT_OWNED_BY_PROGRAM, + ); +}); + +test("return_car rejects a rental that was never picked up", async () => { + const { svm, programId } = loadSvm(); + const payer = await fundedSigner(svm); + + const make = "Kia"; + const model = "EV9"; + const carAccount = await carPda(programId, make, model); + await sendIx(svm, payer, getAddCarInstruction({ carAccount, payer, year: 2023, make, model })); + + const rentalAccount = await rentalPda(programId, carAccount, payer.address); + await sendIx( + svm, + payer, + getBookRentalInstruction({ + rentalAccount, + carAccount, + payer, + name: "Barney Rubble", + pickUpDate: "03/15/2023 10:00 AM", + returnDate: "03/16/2023 10:00 AM", + price: 400, + }), + ); + + // Created -> Returned skips PickedUp and must be rejected. + await expectCustomError( + svm, + payer, + getReturnCarInstruction({ rentalAccount, carAccount, payer }), + ERROR_RENTAL_NOT_IN_PICKED_UP_STATUS, + ); + + const rental = decodeRentalOrder(svm.getAccount(rentalAccount)!); + assert.equal(rental.data.status, RentalOrderStatus.Created); }); From 0441253df40818f956e4c90b98d9be4f218844fd Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 22:15:57 +0000 Subject: [PATCH 064/138] betting-market: close Bet accounts and free User index slots; wallets no longer brick at 32 lifetime bets - Bet accounts were never closed (claim paths only set a claimed flag) and User.bets was append-only, so 32 lifetime bets bricked a wallet permanently. Bets now close (rent to the bettor) at every resolution site, each close removes the index entry, and MAX_BETS_PER_USER caps concurrent open positions instead of lifetime bets - new close_losing_bet instruction: losers could never call the claim paths, so losing bets would still have accumulated forever - the claimed flag and AlreadyClaimed error are gone; account closure is what prevents double claims - payout and stake math converted to checked arithmetic; touched structs renamed *AccountConstraints - tests assert exact User.bets contents through each lifecycle, prove the 33rd concurrent bet fails, and prove a freed slot accepts a new bet https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- tokens/betting-market/anchor/README.md | 47 ++-- .../anchor/programs/betting-market/Cargo.toml | 6 + .../programs/betting-market/src/error.rs | 10 +- .../src/instructions/claim_refund.rs | 25 +- .../src/instructions/claim_winnings.rs | 40 ++- .../src/instructions/close_losing_bet.rs | 51 ++++ .../betting-market/src/instructions/mod.rs | 2 + .../src/instructions/place_bet.rs | 26 +- .../anchor/programs/betting-market/src/lib.rs | 18 +- .../programs/betting-market/src/state/bet.rs | 5 +- .../programs/betting-market/src/state/user.rs | 33 ++- .../tests/test_betting_market.rs | 265 +++++++++++++++++- 12 files changed, 461 insertions(+), 67 deletions(-) create mode 100644 tokens/betting-market/anchor/programs/betting-market/src/instructions/close_losing_bet.rs diff --git a/tokens/betting-market/anchor/README.md b/tokens/betting-market/anchor/README.md index 52b0c35f..9337779b 100644 --- a/tokens/betting-market/anchor/README.md +++ b/tokens/betting-market/anchor/README.md @@ -30,11 +30,15 @@ powers are creating events/outcomes and choosing the winning outcome (or cancell - **Outcome** (`seeds = [b"outcome", event, index]`) - one possible result. Its `total_amount` is the outcome's share of the pool and the denominator for pro-rata payouts when it wins. - **Bet** (`seeds = [b"bet", outcome, bettor]`) - a bettor's total stake on one outcome. Re-betting - the same outcome adds to the existing Bet, so there is exactly one per (outcome, bettor). -- **User** (`seeds = [b"user", wallet]`) - a per-wallet index listing the bettor's Bet addresses, so - a client can find someone's positions without scanning every Bet on the program. The list is - capped (see `MAX_BETS_PER_USER`) to keep the account a fixed size; the Bet accounts are the - authoritative stake record. + the same outcome adds to the existing Bet, so there is exactly one per (outcome, bettor). The + account exists only while the position is open: it closes (rent back to the bettor) via + `claim_winnings`, `claim_refund`, or `close_losing_bet`, which is also what makes a second claim + impossible. +- **User** (`seeds = [b"user", wallet]`) - a per-wallet index listing the bettor's open Bet + addresses, so a client can find someone's positions without scanning every Bet on the program. + `place_bet` adds an entry and every instruction that closes a Bet removes it, so the cap (see + `MAX_BETS_PER_USER`) limits concurrent open positions, not lifetime bets. The fixed cap keeps the + account a constant size; the Bet accounts are the authoritative stake record. ### The vault @@ -60,24 +64,28 @@ payout = stake + stake * distributable_losing / winning_pool ``` A winner always gets their own stake back; the fee is only ever taken from losing stakes. Integer -division floors each share, leaving at most a few base units of dust in the vault. +division floors each share, leaving at most a few minor units of dust in the vault. -**Worked example:** Outcome A pool 100, Outcome B pool 50, `fee_bps = 200` (2%). A wins. +**Example:** Outcome A pool 100, Outcome B pool 50, `fee_bps = 200` (2%). A wins. `losing_pool = 50`, `fee = 1`, `distributable_losing = 49`. A bettor who staked 40 claims `40 + 40 * 49 / 100 = 59`. ### Instruction handlers -| Handler | Who | What it does | -| --- | --- | --- | -| `initialize_config` | anyone (becomes admin) | One-time setup: sets admin, stake token, fee, fee recipient. | -| `create_event` | admin | Opens a market and creates its vault. | -| `add_outcome` | admin | Adds a possible result. Only before any bet is placed. | -| `place_bet` | bettor | Stakes tokens on one outcome; updates the pools and the user's index. | -| `settle_event` | admin | Resolves to a winning outcome, takes the fee, records the payout figures. | -| `claim_winnings` | winning bettor | Withdraws stake plus pro-rata share of the losing pool. | -| `cancel_event` | admin | Voids an unresolved market. | -| `claim_refund` | bettor | After a cancellation, reclaims the exact stake. | +- `initialize_config` - anyone (the signer becomes admin). One-time setup: sets admin, stake + token, fee, fee recipient. +- `create_event` - admin. Opens a market and creates its vault. +- `add_outcome` - admin. Adds a possible result. Only before any bet is placed. +- `place_bet` - bettor. Stakes tokens on one outcome; updates the pools and adds the Bet to the + user's index (rejected with `TooManyBets` if all `MAX_BETS_PER_USER` slots hold open positions). +- `settle_event` - admin. Resolves to a winning outcome, takes the fee, records the payout figures. +- `claim_winnings` - winning bettor. Withdraws stake plus pro-rata share of the losing pool, then + closes the Bet account and removes it from the user's index. +- `close_losing_bet` - losing bettor. After settlement, closes a worthless Bet to reclaim its rent + and free the slot in the user's index. +- `cancel_event` - admin. Voids an unresolved market. +- `claim_refund` - bettor. After a cancellation, reclaims the exact stake; the Bet account closes + and leaves the user's index. `add_outcome` is locked once betting starts, so the field of choices can't change under existing bettors. `settle_event` rejects a winning outcome with no bets - use `cancel_event` to unwind an @@ -98,8 +106,9 @@ anchor build Tests are Rust integration tests running against [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) with [solana-kite](https://crates.io/crates/solana-kite) helpers. They cover the full lifecycle (bet โ†’ settle โ†’ claim with exact payout and fee assertions), admin authorization, the -bet-after-settle and double-claim guards, settling an outcome with no bets, and the cancel/refund -path. +bet-after-settle and double-claim guards, settling an outcome with no bets, the cancel/refund +path, the `close_losing_bet` guards, and the User index: claims, refunds, and losing-bet closes +remove the Bet's entry, and a wallet whose index is full can bet again after closing a position. ```sh anchor test diff --git a/tokens/betting-market/anchor/programs/betting-market/Cargo.toml b/tokens/betting-market/anchor/programs/betting-market/Cargo.toml index c5ba4119..d5b8919c 100644 --- a/tokens/betting-market/anchor/programs/betting-market/Cargo.toml +++ b/tokens/betting-market/anchor/programs/betting-market/Cargo.toml @@ -25,6 +25,12 @@ anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } anchor-spl = "1.0.0" [dev-dependencies] +# no-entrypoint: solana-kite pulls these SPL program crates into the host test +# build, and their `entrypoint` symbols collide with this program's own +# entrypoint at link time. Feature unification turns their entrypoints off +# across the test build; the dependencies exist only for that. +spl-token = { version = "9.0.0", features = ["no-entrypoint"] } +spl-associated-token-account = { version = "8.0.0", features = ["no-entrypoint"] } litesvm = "0.11.0" solana-signer = "3.0.0" solana-keypair = "3.0.1" diff --git a/tokens/betting-market/anchor/programs/betting-market/src/error.rs b/tokens/betting-market/anchor/programs/betting-market/src/error.rs index fed5a42c..ecf7c14d 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/error.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/error.rs @@ -18,12 +18,16 @@ pub enum BettingError { InvalidWinningOutcome, #[msg("This bet did not win, so there is nothing to claim")] NothingToClaim, - #[msg("This bet has already been claimed")] - AlreadyClaimed, + #[msg("This bet won, so it must be closed via claim_winnings")] + BetWon, #[msg("The bet amount must be greater than zero")] ZeroAmount, - #[msg("This bettor already holds the maximum number of distinct bets")] + #[msg("This bettor already holds the maximum number of open positions")] TooManyBets, + #[msg("This bet is not in the bettor's User index")] + BetNotInUserIndex, + #[msg("Arithmetic overflow")] + MathOverflow, #[msg("Outcomes can only be added before any bets are placed")] BettingAlreadyStarted, #[msg("The event description is too long")] diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_refund.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_refund.rs index 2e3591cb..c922d9cc 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_refund.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_refund.rs @@ -1,12 +1,12 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; -use crate::{error::BettingError, Bet, Event, EventStatus}; +use crate::{error::BettingError, Bet, Event, EventStatus, User}; use super::transfer_tokens_from_vault; #[derive(Accounts)] -pub struct ClaimRefund<'info> { +pub struct ClaimRefundAccountConstraints<'info> { #[account(mut)] pub bettor: Signer<'info>, @@ -19,8 +19,11 @@ pub struct ClaimRefund<'info> { )] pub event: Account<'info, Event>, + // Closing the Bet ends the position: the rent goes back to the bettor and + // a second refund fails because the account no longer exists. #[account( mut, + close = bettor, has_one = bettor, has_one = event, seeds = [b"bet", bet.outcome.as_ref(), bettor.key().as_ref()], @@ -28,6 +31,13 @@ pub struct ClaimRefund<'info> { )] pub bet: Account<'info, Bet>, + #[account( + mut, + seeds = [b"user", bettor.key().as_ref()], + bump = user.bump, + )] + pub user: Account<'info, User>, + #[account( mut, associated_token::mint = token_mint, @@ -47,14 +57,20 @@ pub struct ClaimRefund<'info> { pub token_program: Interface<'info, TokenInterface>, } -pub fn handle_claim_refund(context: Context) -> Result<()> { +pub fn handle_claim_refund(context: Context) -> Result<()> { require!( context.accounts.event.status == EventStatus::Cancelled, BettingError::EventNotCancelled ); - require!(!context.accounts.bet.claimed, BettingError::AlreadyClaimed); let stake = context.accounts.bet.amount; + + // The position is over, so drop the Bet from the bettor's index before the + // transfer (effects before interactions); the Bet account itself closes + // when the instruction finishes. + let bet_key = context.accounts.bet.key(); + context.accounts.user.remove_bet(&bet_key)?; + let event_id = context.accounts.event.event_id; let event_bump = context.accounts.event.bump; transfer_tokens_from_vault( @@ -68,6 +84,5 @@ pub fn handle_claim_refund(context: Context) -> Result<()> { event_bump, )?; - context.accounts.bet.claimed = true; Ok(()) } diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs index 47135bd3..912945d0 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs @@ -1,12 +1,12 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; -use crate::{error::BettingError, Bet, Event, EventStatus}; +use crate::{error::BettingError, Bet, Event, EventStatus, User}; use super::transfer_tokens_from_vault; #[derive(Accounts)] -pub struct ClaimWinnings<'info> { +pub struct ClaimWinningsAccountConstraints<'info> { #[account(mut)] pub bettor: Signer<'info>, @@ -19,8 +19,11 @@ pub struct ClaimWinnings<'info> { )] pub event: Account<'info, Event>, + // Closing the Bet ends the position: the rent goes back to the bettor and + // a second claim fails because the account no longer exists. #[account( mut, + close = bettor, has_one = bettor, has_one = event, seeds = [b"bet", bet.outcome.as_ref(), bettor.key().as_ref()], @@ -28,6 +31,13 @@ pub struct ClaimWinnings<'info> { )] pub bet: Account<'info, Bet>, + #[account( + mut, + seeds = [b"user", bettor.key().as_ref()], + bump = user.bump, + )] + pub user: Account<'info, User>, + #[account( mut, associated_token::mint = token_mint, @@ -47,12 +57,11 @@ pub struct ClaimWinnings<'info> { pub token_program: Interface<'info, TokenInterface>, } -pub fn handle_claim_winnings(context: Context) -> Result<()> { +pub fn handle_claim_winnings(context: Context) -> Result<()> { require!( context.accounts.event.status == EventStatus::Settled, BettingError::EventNotSettled ); - require!(!context.accounts.bet.claimed, BettingError::AlreadyClaimed); require!( context.accounts.bet.outcome_index == context.accounts.event.winning_outcome_index, BettingError::NothingToClaim @@ -66,12 +75,26 @@ pub fn handle_claim_winnings(context: Context) -> Result<()> { // Parimutuel split: winners share the losing pool in proportion to their // own stake. Work in u128 and divide once, after the multiply, so the // result is floored a single time - dividing first would throw away - // precision. The floor leaves at most a few base units of dust in the vault. - let losing_pool_share_numerator = stake as u128 * distributable_losing_pool as u128; - let winnings = (losing_pool_share_numerator / winning_pool as u128) as u64; + // precision. The floor leaves at most a few minor units of dust in the vault. + let losing_pool_share_numerator = (stake as u128) + .checked_mul(distributable_losing_pool as u128) + .ok_or(BettingError::MathOverflow)?; + let winnings: u64 = losing_pool_share_numerator + .checked_div(winning_pool as u128) + .ok_or(BettingError::MathOverflow)? + .try_into() + .map_err(|_| BettingError::MathOverflow)?; // Winners always get their own stake back on top of their winnings. - let payout = stake + winnings; + let payout = stake + .checked_add(winnings) + .ok_or(BettingError::MathOverflow)?; + + // The position is over, so drop the Bet from the bettor's index before the + // transfer (effects before interactions); the Bet account itself closes + // when the instruction finishes. + let bet_key = context.accounts.bet.key(); + context.accounts.user.remove_bet(&bet_key)?; let event_id = context.accounts.event.event_id; let event_bump = context.accounts.event.bump; @@ -86,6 +109,5 @@ pub fn handle_claim_winnings(context: Context) -> Result<()> { event_bump, )?; - context.accounts.bet.claimed = true; Ok(()) } diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/close_losing_bet.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/close_losing_bet.rs new file mode 100644 index 00000000..ed533ddd --- /dev/null +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/close_losing_bet.rs @@ -0,0 +1,51 @@ +use anchor_lang::prelude::*; + +use crate::{error::BettingError, Bet, Event, EventStatus, User}; + +// A losing bet pays nothing, but it still occupies a slot in the bettor's +// User index and holds rent. Closing it frees the slot (so the bettor can +// open a new position) and returns the rent. Winning bets must go through +// claim_winnings instead, which also pays out the stake and winnings. +#[derive(Accounts)] +pub struct CloseLosingBetAccountConstraints<'info> { + #[account(mut)] + pub bettor: Signer<'info>, + + #[account( + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Account<'info, Event>, + + #[account( + mut, + close = bettor, + has_one = bettor, + has_one = event, + seeds = [b"bet", bet.outcome.as_ref(), bettor.key().as_ref()], + bump = bet.bump, + )] + pub bet: Account<'info, Bet>, + + #[account( + mut, + seeds = [b"user", bettor.key().as_ref()], + bump = user.bump, + )] + pub user: Account<'info, User>, +} + +pub fn handle_close_losing_bet(context: Context) -> Result<()> { + require!( + context.accounts.event.status == EventStatus::Settled, + BettingError::EventNotSettled + ); + require!( + context.accounts.bet.outcome_index != context.accounts.event.winning_outcome_index, + BettingError::BetWon + ); + + let bet_key = context.accounts.bet.key(); + context.accounts.user.remove_bet(&bet_key)?; + Ok(()) +} diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/mod.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/mod.rs index 46739370..47ba4600 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/instructions/mod.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/mod.rs @@ -2,6 +2,7 @@ pub mod add_outcome; pub mod cancel_event; pub mod claim_refund; pub mod claim_winnings; +pub mod close_losing_bet; pub mod create_event; pub mod initialize_config; pub mod place_bet; @@ -12,6 +13,7 @@ pub use add_outcome::*; pub use cancel_event::*; pub use claim_refund::*; pub use claim_winnings::*; +pub use close_losing_bet::*; pub use create_event::*; pub use initialize_config::*; pub use place_bet::*; diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/place_bet.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/place_bet.rs index 03a85ee2..b7043e6f 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/instructions/place_bet.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/place_bet.rs @@ -11,7 +11,7 @@ use crate::{ use super::transfer_tokens_to_vault; #[derive(Accounts)] -pub struct PlaceBet<'info> { +pub struct PlaceBetAccountConstraints<'info> { #[account(mut)] pub bettor: Signer<'info>, @@ -79,7 +79,7 @@ pub struct PlaceBet<'info> { pub system_program: Program<'info, System>, } -pub fn handle_place_bet(context: Context, amount: u64) -> Result<()> { +pub fn handle_place_bet(context: Context, amount: u64) -> Result<()> { require!(amount > 0, BettingError::ZeroAmount); require!( context.accounts.event.status == EventStatus::Open, @@ -112,18 +112,30 @@ pub fn handle_place_bet(context: Context, amount: u64) -> Result<()> { bet.event = event_key; bet.outcome = outcome_key; bet.outcome_index = outcome_index; - bet.claimed = false; bet.bump = bet_bump; } - bet.amount += amount; + bet.amount = bet + .amount + .checked_add(amount) + .ok_or(BettingError::MathOverflow)?; let outcome = &mut context.accounts.outcome; - outcome.total_amount += amount; + outcome.total_amount = outcome + .total_amount + .checked_add(amount) + .ok_or(BettingError::MathOverflow)?; if is_new_bet { - outcome.bet_count += 1; + outcome.bet_count = outcome + .bet_count + .checked_add(1) + .ok_or(BettingError::MathOverflow)?; } - context.accounts.event.total_pool += amount; + let event = &mut context.accounts.event; + event.total_pool = event + .total_pool + .checked_add(amount) + .ok_or(BettingError::MathOverflow)?; let user = &mut context.accounts.user; if user.authority == Pubkey::default() { diff --git a/tokens/betting-market/anchor/programs/betting-market/src/lib.rs b/tokens/betting-market/anchor/programs/betting-market/src/lib.rs index 0cf2bec0..26206226 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/lib.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/lib.rs @@ -38,7 +38,7 @@ pub mod betting_market { } // A bettor stakes tokens on one outcome. The stake joins the event's pool. - pub fn place_bet(context: Context, amount: u64) -> Result<()> { + pub fn place_bet(context: Context, amount: u64) -> Result<()> { instructions::place_bet::handle_place_bet(context, amount) } @@ -48,18 +48,26 @@ pub mod betting_market { instructions::settle_event::handle_settle_event(context, winning_outcome_index) } - // A winner withdraws their stake plus their pro-rata share of the losing pool. - pub fn claim_winnings(context: Context) -> Result<()> { + // A winner withdraws their stake plus their pro-rata share of the losing + // pool. The Bet account closes and leaves the bettor's User index. + pub fn claim_winnings(context: Context) -> Result<()> { instructions::claim_winnings::handle_claim_winnings(context) } + // A loser closes their worthless bet after settlement, reclaiming the + // Bet account's rent and freeing the slot in their User index. + pub fn close_losing_bet(context: Context) -> Result<()> { + instructions::close_losing_bet::handle_close_losing_bet(context) + } + // Admin voids an unresolved market so bettors can be made whole. pub fn cancel_event(context: Context) -> Result<()> { instructions::cancel_event::handle_cancel_event(context) } - // After a cancellation, a bettor reclaims their exact stake. - pub fn claim_refund(context: Context) -> Result<()> { + // After a cancellation, a bettor reclaims their exact stake. The Bet + // account closes and leaves the bettor's User index. + pub fn claim_refund(context: Context) -> Result<()> { instructions::claim_refund::handle_claim_refund(context) } } diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/bet.rs b/tokens/betting-market/anchor/programs/betting-market/src/state/bet.rs index c1d0f8fb..65330d78 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/state/bet.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/state/bet.rs @@ -2,7 +2,9 @@ use anchor_lang::prelude::*; // A single bettor's total stake on one outcome. Re-betting the same outcome // adds to `amount` rather than creating a second account, so there is exactly -// one Bet per (outcome, bettor). +// one Bet per (outcome, bettor). The account lives only while the position is +// open: it closes (rent back to the bettor) on claim_winnings, claim_refund, +// or close_losing_bet, which is also what prevents double claims. #[account] #[derive(InitSpace)] pub struct Bet { @@ -11,6 +13,5 @@ pub struct Bet { pub outcome: Pubkey, pub outcome_index: u8, pub amount: u64, - pub claimed: bool, pub bump: u8, } diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/user.rs b/tokens/betting-market/anchor/programs/betting-market/src/state/user.rs index a38cbaec..44e41b0f 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/state/user.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/state/user.rs @@ -1,14 +1,19 @@ use anchor_lang::prelude::*; -// A bettor can hold at most this many distinct bets (one per outcome they back). -// Re-betting an outcome adds to the existing Bet, so this caps the number of -// *different* outcomes a user has staked on, not the number of times they bet. -// A fixed cap keeps the account a constant size - no reallocation on each bet. +use crate::error::BettingError; + +// A bettor can hold at most this many OPEN positions at once (one per outcome +// they currently back). Re-betting an outcome adds to the existing Bet, and +// closing a Bet (claim_winnings, claim_refund, close_losing_bet) removes its +// entry, so this caps concurrent positions, not lifetime bets. A fixed cap +// keeps the account a constant size - no reallocation on each bet. pub const MAX_BETS_PER_USER: usize = 32; -// Per-wallet index of a bettor's bets, so a client can list someone's positions -// without scanning every Bet account on the program. The authoritative stake -// state lives in the Bet accounts; this is a convenience index. +// Per-wallet index of a bettor's open Bet accounts, so a client can list +// someone's positions without scanning every Bet account on the program. The +// authoritative stake state lives in the Bet accounts; this is a convenience +// index. Entries are added by place_bet and removed whenever the Bet account +// closes. #[account] #[derive(InitSpace)] pub struct User { @@ -17,3 +22,17 @@ pub struct User { pub bets: Vec, pub bump: u8, } + +impl User { + // Drop a closed Bet's entry from the index. Order is not meaningful, so a + // swap_remove (move the last entry into the gap) is the cheapest removal. + pub fn remove_bet(&mut self, bet_key: &Pubkey) -> Result<()> { + let index = self + .bets + .iter() + .position(|entry| entry == bet_key) + .ok_or(BettingError::BetNotInUserIndex)?; + self.bets.swap_remove(index); + Ok(()) + } +} diff --git a/tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs b/tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs index 5a6966af..136df782 100644 --- a/tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs +++ b/tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs @@ -1,8 +1,9 @@ use { anchor_lang::{ solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, - InstructionData, ToAccountMetas, + AccountDeserialize, InstructionData, ToAccountMetas, }, + betting_market::{User, MAX_BETS_PER_USER}, litesvm::LiteSVM, solana_keypair::Keypair, solana_kite::{ @@ -176,7 +177,7 @@ fn place_bet_ix( Instruction::new_with_bytes( betting_market::id(), &betting_market::instruction::PlaceBet { amount }.data(), - betting_market::accounts::PlaceBet { + betting_market::accounts::PlaceBetAccountConstraints { bettor: *bettor, config: config_pda(), token_mint: mint, @@ -238,11 +239,12 @@ fn claim_winnings_ix( Instruction::new_with_bytes( betting_market::id(), &betting_market::instruction::ClaimWinnings {}.data(), - betting_market::accounts::ClaimWinnings { + betting_market::accounts::ClaimWinningsAccountConstraints { bettor: *bettor, token_mint: mint, event, bet: bet_pda(&outcome, bettor), + user: user_pda(bettor), bettor_token_account: *bettor_ata, vault: derive_ata(&event, &mint), token_program: token_program_id(), @@ -276,11 +278,12 @@ fn claim_refund_ix( Instruction::new_with_bytes( betting_market::id(), &betting_market::instruction::ClaimRefund {}.data(), - betting_market::accounts::ClaimRefund { + betting_market::accounts::ClaimRefundAccountConstraints { bettor: *bettor, token_mint: mint, event, bet: bet_pda(&outcome, bettor), + user: user_pda(bettor), bettor_token_account: *bettor_ata, vault: derive_ata(&event, &mint), token_program: token_program_id(), @@ -289,12 +292,29 @@ fn claim_refund_ix( ) } -// Decode a User account's `bets` Vec length from raw account data. -// Layout after the 8-byte discriminator: authority (32) + vec_len (4) + entries. -fn read_user_bet_count(market: &Market, bettor: &Pubkey) -> u32 { +fn close_losing_bet_ix(bettor: &Pubkey, event_id: u64, outcome_index: u8) -> Instruction { + let event = event_pda(event_id); + let outcome = outcome_pda(&event, outcome_index); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::CloseLosingBet {}.data(), + betting_market::accounts::CloseLosingBetAccountConstraints { + bettor: *bettor, + event, + bet: bet_pda(&outcome, bettor), + user: user_pda(bettor), + } + .to_account_metas(None), + ) +} + +// Decode a User account so tests can assert exactly which Bet addresses the +// per-wallet index currently holds. +fn read_user_bets(market: &Market, bettor: &Pubkey) -> Vec { let account = market.svm.get_account(&user_pda(bettor)).unwrap(); - let data = &account.data[8..]; - u32::from_le_bytes(data[32..36].try_into().unwrap()) + User::try_deserialize(&mut account.data.as_slice()) + .unwrap() + .bets } fn init_config(market: &mut Market) { @@ -362,7 +382,10 @@ fn test_full_lifecycle() { // Vault holds the entire pool. let vault = derive_ata(&event_pda(event_id), &mint); assert_eq!(get_token_account_balance(&market.svm, &vault).unwrap(), 600); - assert_eq!(read_user_bet_count(&market, &alice.pubkey()), 1); + assert_eq!( + read_user_bets(&market, &alice.pubkey()), + vec![bet_pda(&outcome_pda(&event_pda(event_id), 0), &alice.pubkey())] + ); // Settle to "Yes" (index 0). Losing pool 200, fee = 2% = 4, distributable = 196. let fee_recipient = market.fee_recipient.pubkey(); @@ -406,6 +429,10 @@ fn test_full_lifecycle() { // Pool fully distributed: 400 stakes + 196 winnings + 4 fee = 600. assert_eq!(get_token_account_balance(&market.svm, &vault).unwrap(), 0); + // Claiming closed the winners' Bet accounts and emptied their indexes. + assert!(read_user_bets(&market, &alice.pubkey()).is_empty()); + assert!(read_user_bets(&market, &bob.pubkey()).is_empty()); + // Carol bet the losing outcome, so she has nothing to claim. let carol_claim = send_transaction_from_instructions( &mut market.svm, @@ -414,6 +441,18 @@ fn test_full_lifecycle() { &carol.pubkey(), ); assert!(carol_claim.is_err(), "loser must not be able to claim winnings"); + + // Her losing position stays in the index until she closes it. + let carol_bet = bet_pda(&outcome_pda(&event_pda(event_id), 1), &carol.pubkey()); + assert_eq!(read_user_bets(&market, &carol.pubkey()), vec![carol_bet]); + send_transaction_from_instructions( + &mut market.svm, + vec![close_losing_bet_ix(&carol.pubkey(), event_id, 1)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + assert!(read_user_bets(&market, &carol.pubkey()).is_empty()); } #[test] @@ -626,6 +665,9 @@ fn test_cancel_and_refund() { ) .unwrap(); + let alice_bet = bet_pda(&outcome_pda(&event_pda(event_id), 0), &alice.pubkey()); + assert_eq!(read_user_bets(&market, &alice.pubkey()), vec![alice_bet]); + send_transaction_from_instructions( &mut market.svm, vec![claim_refund_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0)], @@ -633,6 +675,10 @@ fn test_cancel_and_refund() { &alice.pubkey(), ) .unwrap(); + + // The refund closed Alice's Bet account and removed it from her index. + assert!(read_user_bets(&market, &alice.pubkey()).is_empty()); + send_transaction_from_instructions( &mut market.svm, vec![claim_refund_ix(mint, &carol.pubkey(), &carol_ata, event_id, 1)], @@ -647,3 +693,202 @@ fn test_cancel_and_refund() { let vault = derive_ata(&event_pda(event_id), &mint); assert_eq!(get_token_account_balance(&market.svm, &vault).unwrap(), 0); } + +#[test] +fn test_close_losing_bet_only_after_settle_and_only_for_losers() { + let mut market = setup(); + let event_id: u64 = 6; + let (alice, alice_ata) = create_bettor(&mut market, 1_000); + let (carol, carol_ata) = create_bettor(&mut market, 1_000); + + init_config(&mut market); + let admin = market.admin.pubkey(); + let mint = market.mint; + let fee_recipient = market.fee_recipient.pubkey(); + let fee_recipient_ata = market.fee_recipient_ata; + send_transaction_from_instructions( + &mut market.svm, + vec![ + create_event_ix(admin, mint, event_id, "Derby winner"), + add_outcome_ix(admin, event_id, 0, "Red"), + add_outcome_ix(admin, event_id, 1, "Blue"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0, 100)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &carol.pubkey(), &carol_ata, event_id, 1, 100)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + + // The event is still open, so no position is a losing one yet. + let premature_close = send_transaction_from_instructions( + &mut market.svm, + vec![close_losing_bet_ix(&carol.pubkey(), event_id, 1)], + &[&carol], + &carol.pubkey(), + ); + assert!(premature_close.is_err(), "closing before settlement must fail"); + + send_transaction_from_instructions( + &mut market.svm, + vec![settle_event_ix(admin, mint, fee_recipient, fee_recipient_ata, event_id, 0)], + &[&market.admin], + &admin, + ) + .unwrap(); + + // Alice won; her bet must be closed via claim_winnings, not discarded. + let winner_close = send_transaction_from_instructions( + &mut market.svm, + vec![close_losing_bet_ix(&alice.pubkey(), event_id, 0)], + &[&alice], + &alice.pubkey(), + ); + assert!(winner_close.is_err(), "a winning bet must not be closed as losing"); + let alice_bet = bet_pda(&outcome_pda(&event_pda(event_id), 0), &alice.pubkey()); + assert_eq!(read_user_bets(&market, &alice.pubkey()), vec![alice_bet]); + + // Carol lost; closing frees her index slot. A fresh blockhash so this is + // a distinct transaction from her premature attempt above. + market.svm.expire_blockhash(); + send_transaction_from_instructions( + &mut market.svm, + vec![close_losing_bet_ix(&carol.pubkey(), event_id, 1)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + assert!(read_user_bets(&market, &carol.pubkey()).is_empty()); +} + +// Regression test: closing a Bet must free its User index slot, so a wallet +// that fills all MAX_BETS_PER_USER slots can bet again after unwinding a +// position. Without the removal, a full index rejects every future bet on +// every market, permanently. +#[test] +fn test_closing_a_bet_frees_a_slot_for_a_new_bet() { + const STAKE: u64 = 10; + let mut market = setup(); + let full_event_id: u64 = 7; + let second_event_id: u64 = 8; + // Enough outcomes to fill the index and attempt one more bet. + let outcome_count = (MAX_BETS_PER_USER + 1) as u8; + let (alice, alice_ata) = create_bettor(&mut market, outcome_count as u64 * STAKE); + + init_config(&mut market); + let admin = market.admin.pubkey(); + let mint = market.mint; + + send_transaction_from_instructions( + &mut market.svm, + vec![create_event_ix(admin, mint, full_event_id, "Wide field")], + &[&market.admin], + &admin, + ) + .unwrap(); + for index in 0..outcome_count { + send_transaction_from_instructions( + &mut market.svm, + vec![add_outcome_ix(admin, full_event_id, index, &format!("Runner {index}"))], + &[&market.admin], + &admin, + ) + .unwrap(); + } + send_transaction_from_instructions( + &mut market.svm, + vec![ + create_event_ix(admin, mint, second_event_id, "Second market"), + add_outcome_ix(admin, second_event_id, 0, "Yes"), + add_outcome_ix(admin, second_event_id, 1, "No"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + + // Fill every slot in Alice's index. + for index in 0..MAX_BETS_PER_USER as u8 { + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, full_event_id, index, STAKE)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + } + assert_eq!(read_user_bets(&market, &alice.pubkey()).len(), MAX_BETS_PER_USER); + + // With the index full, any new position is rejected - on this event or another. + let one_too_many = send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix( + mint, + &alice.pubkey(), + &alice_ata, + full_event_id, + MAX_BETS_PER_USER as u8, + STAKE, + )], + &[&alice], + &alice.pubkey(), + ); + assert!(one_too_many.is_err(), "a full index must reject a new position"); + let other_market_bet = send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, second_event_id, 0, STAKE)], + &[&alice], + &alice.pubkey(), + ); + assert!(other_market_bet.is_err(), "a full index must reject bets on any market"); + + // Unwind one position: cancel the event and refund the first bet. + send_transaction_from_instructions( + &mut market.svm, + vec![cancel_event_ix(admin, full_event_id)], + &[&market.admin], + &admin, + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![claim_refund_ix(mint, &alice.pubkey(), &alice_ata, full_event_id, 0)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + let bets_after_refund = read_user_bets(&market, &alice.pubkey()); + assert_eq!(bets_after_refund.len(), MAX_BETS_PER_USER - 1); + let refunded_bet = bet_pda(&outcome_pda(&event_pda(full_event_id), 0), &alice.pubkey()); + assert!( + !bets_after_refund.contains(&refunded_bet), + "the refunded bet must leave the index" + ); + + // The freed slot lets the wallet bet again. A fresh blockhash so this is + // a distinct transaction from the rejected attempt above. + market.svm.expire_blockhash(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, second_event_id, 0, STAKE)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + let final_bets = read_user_bets(&market, &alice.pubkey()); + assert_eq!(final_bets.len(), MAX_BETS_PER_USER); + let new_bet = bet_pda(&outcome_pda(&event_pda(second_event_id), 0), &alice.pubkey()); + assert!(final_bets.contains(&new_bet), "the new position must appear in the index"); +} From ed0459937d2bc79fe9d292a2ae0e68d47fd7a922 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 22:16:24 +0000 Subject: [PATCH 065/138] wip: checkpoint of in-progress rename and signer-check sweeps https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- .../quasar/src/instructions/close_user.rs | 16 +- basics/close-account/quasar/src/lib.rs | 2 +- basics/close-account/quasar/src/tests.rs | 48 ++++ .../quasar/src/instructions/initialize.rs | 4 +- .../realloc/quasar/src/instructions/update.rs | 4 +- basics/realloc/quasar/src/lib.rs | 4 +- .../anchor/programs/rent-example/src/lib.rs | 4 +- .../programs/rent-example/tests/test_rent.rs | 2 +- .../src/instructions/create_system_account.rs | 4 +- basics/rent/quasar/src/lib.rs | 2 +- .../anchor/programs/carnival/src/lib.rs | 8 +- .../programs/carnival/tests/test_carnival.rs | 6 +- .../src/instructions/carnival_context.rs | 8 +- basics/repository-layout/quasar/src/lib.rs | 6 +- .../instructions/transfer_sol_with_program.rs | 29 ++- .../anchor/programs/transfer-sol/src/lib.rs | 2 +- .../transfer-sol/tests/test_transfer_sol.rs | 60 ++++- .../native/program/src/instruction.rs | 16 +- .../transfer-sol/native/program/tests/test.rs | 59 +++++ .../tests/fixtures/transfer_sol_program.so | Bin 70416 -> 70680 bytes basics/transfer-sol/quasar/src/tests.rs | 74 ++++++ tokens/create-token/quasar/README.md | 8 +- tokens/create-token/quasar/src/lib.rs | 61 +++-- tokens/create-token/quasar/src/tests.rs | 4 +- .../anchor/programs/mint-nft/src/error.rs | 11 + .../src/instructions/create_collection.rs | 217 +++++++++-------- .../mint-nft/src/instructions/mint_nft.rs | 218 +++++++++--------- .../programs/mint-nft/src/instructions/mod.rs | 34 ++- .../src/instructions/verify_collection.rs | 7 +- .../anchor/programs/mint-nft/src/lib.rs | 38 ++- .../mint-nft/tests/test_nft_operations.rs | 66 ++++-- tokens/pda-mint-authority/quasar/README.md | 2 + tokens/pda-mint-authority/quasar/src/lib.rs | 35 ++- tokens/pda-mint-authority/quasar/src/tests.rs | 16 +- 34 files changed, 751 insertions(+), 324 deletions(-) create mode 100644 tokens/nft-operations/anchor/programs/mint-nft/src/error.rs diff --git a/basics/close-account/quasar/src/instructions/close_user.rs b/basics/close-account/quasar/src/instructions/close_user.rs index 6fdfe490..8f05bf41 100644 --- a/basics/close-account/quasar/src/instructions/close_user.rs +++ b/basics/close-account/quasar/src/instructions/close_user.rs @@ -1,18 +1,22 @@ use {crate::state::User, quasar_lang::prelude::*}; /// Accounts for closing a user account. -/// The `close(dest = user)` attribute mirrors Anchor's `close = user`: at the -/// derive epilogue Quasar zeroes the discriminator, drains lamports to the -/// destination, reassigns the owner to the system program, and resizes to 0. +/// The `address = ...` check binds `user_account` to the signer's own PDA: +/// without it, anyone could pass someone else's user account and pocket its +/// rent. The `close(dest = user)` attribute mirrors Anchor's `close = user`: +/// at the derive epilogue Quasar zeroes the discriminator, drains lamports to +/// the destination, reassigns the owner to the system program, and resizes +/// to 0. #[derive(Accounts)] -pub struct CloseUser { +pub struct CloseUserAccountConstraints { #[account(mut)] pub user: Signer, - #[account(mut, close(dest = user))] + + #[account(mut, close(dest = user), address = User::seeds(user.address()))] pub user_account: Account, } #[inline(always)] -pub fn handle_close_user(_accounts: &mut CloseUser) -> Result<(), ProgramError> { +pub fn handle_close_user(_accounts: &mut CloseUserAccountConstraints) -> Result<(), ProgramError> { Ok(()) } diff --git a/basics/close-account/quasar/src/lib.rs b/basics/close-account/quasar/src/lib.rs index 64af1b7f..776e2e6a 100644 --- a/basics/close-account/quasar/src/lib.rs +++ b/basics/close-account/quasar/src/lib.rs @@ -23,7 +23,7 @@ mod quasar_close_account { /// Close a user account and return lamports to the user. #[instruction(discriminator = 1)] - pub fn close_user(ctx: Ctx) -> Result<(), ProgramError> { + pub fn close_user(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_close_user(&mut ctx.accounts) } } diff --git a/basics/close-account/quasar/src/tests.rs b/basics/close-account/quasar/src/tests.rs index 6bdef45f..60c73d59 100644 --- a/basics/close-account/quasar/src/tests.rs +++ b/basics/close-account/quasar/src/tests.rs @@ -131,3 +131,51 @@ fn test_close_user() { // succeeds (assert_success above). The Anchor twin's LiteSVM suite // verifies the post-close account state (lamports drained, data cleared). } + +#[test] +fn test_close_user_rejects_non_owner() { + let mut svm = setup(); + + let victim = Pubkey::new_unique(); + let attacker = Pubkey::new_unique(); + let system_program = quasar_svm::system_program::ID; + let program_id = Pubkey::from(crate::ID); + + let (victim_account, _) = Pubkey::find_program_address(&[b"USER", victim.as_ref()], &program_id); + + // The victim creates their user account. + let create_ix = Instruction { + program_id, + accounts: vec![ + solana_instruction::AccountMeta::new(Address::from(victim.to_bytes()), true), + solana_instruction::AccountMeta::new(Address::from(victim_account.to_bytes()), false), + solana_instruction::AccountMeta::new_readonly( + Address::from(system_program.to_bytes()), + false, + ), + ], + data: build_create_instruction("Alice"), + }; + let result = svm.process_instruction(&create_ix, &[signer(victim), empty(victim_account)]); + result.assert_success(); + + let victim_account_after_create = result.account(&victim_account).unwrap().clone(); + + // The attacker signs as `user` but passes the victim's account: the + // address constraint must reject it before any lamports move. + let close_ix = Instruction { + program_id, + accounts: vec![ + solana_instruction::AccountMeta::new(Address::from(attacker.to_bytes()), true), + solana_instruction::AccountMeta::new(Address::from(victim_account.to_bytes()), false), + ], + data: vec![1u8], // close_user discriminator + }; + let result = svm.process_instruction( + &close_ix, + &[signer(attacker), victim_account_after_create], + ); + result.assert_error(quasar_svm::ProgramError::Custom( + quasar_lang::prelude::QuasarError::AddressMismatch as u32, + )); +} diff --git a/basics/realloc/quasar/src/instructions/initialize.rs b/basics/realloc/quasar/src/instructions/initialize.rs index 512ce00c..2c1b52db 100644 --- a/basics/realloc/quasar/src/instructions/initialize.rs +++ b/basics/realloc/quasar/src/instructions/initialize.rs @@ -6,7 +6,7 @@ use { /// Accounts for initialising a new message account. /// The message_account is a random keypair (not a PDA) - same as the Anchor version. #[derive(Accounts)] -pub struct Initialize { +pub struct InitializeAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut, init, payer = payer)] @@ -15,7 +15,7 @@ pub struct Initialize { } #[inline(always)] -pub fn handle_initialize(accounts: &mut Initialize, message: &str) -> Result<(), ProgramError> { +pub fn handle_initialize(accounts: &mut InitializeAccountConstraints, message: &str) -> Result<(), ProgramError> { let rent = Rent::get()?; accounts.message_account.set_inner( MessageAccountInner { message }, diff --git a/basics/realloc/quasar/src/instructions/update.rs b/basics/realloc/quasar/src/instructions/update.rs index 88d3bd75..04b7265b 100644 --- a/basics/realloc/quasar/src/instructions/update.rs +++ b/basics/realloc/quasar/src/instructions/update.rs @@ -7,7 +7,7 @@ use { /// Quasar's `set_inner` automatically handles realloc when the new message /// is longer than the current account data. No explicit realloc needed. #[derive(Accounts)] -pub struct Update { +pub struct UpdateAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -16,7 +16,7 @@ pub struct Update { } #[inline(always)] -pub fn handle_update(accounts: &mut Update, message: &str) -> Result<(), ProgramError> { +pub fn handle_update(accounts: &mut UpdateAccountConstraints, message: &str) -> Result<(), ProgramError> { let rent = Rent::get()?; accounts.message_account.set_inner( MessageAccountInner { message }, diff --git a/basics/realloc/quasar/src/lib.rs b/basics/realloc/quasar/src/lib.rs index 6b0a512b..ecd4062a 100644 --- a/basics/realloc/quasar/src/lib.rs +++ b/basics/realloc/quasar/src/lib.rs @@ -16,14 +16,14 @@ mod quasar_realloc { /// Create a message account with an initial message. #[instruction(discriminator = 0)] - pub fn initialize(ctx: Ctx, message: String<1024>) -> Result<(), ProgramError> { + pub fn initialize(ctx: Ctx, message: String<1024>) -> Result<(), ProgramError> { instructions::handle_initialize(&mut ctx.accounts, message) } /// Update the message, reallocating if the new message is longer. /// Quasar's `set_inner` handles realloc transparently. #[instruction(discriminator = 1)] - pub fn update(ctx: Ctx, message: String<1024>) -> Result<(), ProgramError> { + pub fn update(ctx: Ctx, message: String<1024>) -> Result<(), ProgramError> { instructions::handle_update(&mut ctx.accounts, message) } } diff --git a/basics/rent/anchor/programs/rent-example/src/lib.rs b/basics/rent/anchor/programs/rent-example/src/lib.rs index 3e84d6a4..e2d8a840 100644 --- a/basics/rent/anchor/programs/rent-example/src/lib.rs +++ b/basics/rent/anchor/programs/rent-example/src/lib.rs @@ -8,7 +8,7 @@ pub mod rent_example { use super::*; pub fn create_system_account( - context: Context, + context: Context, address_data: AddressData, ) -> Result<()> { msg!("Program invoked. Creating a system account..."); @@ -45,7 +45,7 @@ pub mod rent_example { } #[derive(Accounts)] -pub struct CreateSystemAccount<'info> { +pub struct CreateSystemAccountAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, #[account(mut)] diff --git a/basics/rent/anchor/programs/rent-example/tests/test_rent.rs b/basics/rent/anchor/programs/rent-example/tests/test_rent.rs index 447a1ad0..2451d0dc 100644 --- a/basics/rent/anchor/programs/rent-example/tests/test_rent.rs +++ b/basics/rent/anchor/programs/rent-example/tests/test_rent.rs @@ -48,7 +48,7 @@ fn test_create_system_account() { let instruction = Instruction::new_with_bytes( program_id, &ix_data, - rent_example::accounts::CreateSystemAccount { + rent_example::accounts::CreateSystemAccountAccountConstraints { payer: payer.pubkey(), new_account: new_account.pubkey(), system_program: system_program::id(), diff --git a/basics/rent/quasar/src/instructions/create_system_account.rs b/basics/rent/quasar/src/instructions/create_system_account.rs index 0fbcfb6f..396c98be 100644 --- a/basics/rent/quasar/src/instructions/create_system_account.rs +++ b/basics/rent/quasar/src/instructions/create_system_account.rs @@ -2,7 +2,7 @@ use quasar_lang::{prelude::*, sysvars::Sysvar}; /// Accounts for creating a system account sized for address data. #[derive(Accounts)] -pub struct CreateSystemAccount { +pub struct CreateSystemAccountAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -11,7 +11,7 @@ pub struct CreateSystemAccount { } #[inline(always)] -pub fn handle_create_system_account(accounts: &mut CreateSystemAccount, name: &str, address: &str) -> Result<(), ProgramError> { +pub fn handle_create_system_account(accounts: &mut CreateSystemAccountAccountConstraints, name: &str, address: &str) -> Result<(), ProgramError> { // Calculate space needed for the serialised AddressData: // borsh-style: 4-byte length prefix + bytes for each String field. let space = 4 + name.len() + 4 + address.len(); diff --git a/basics/rent/quasar/src/lib.rs b/basics/rent/quasar/src/lib.rs index 931d0b02..5f17ba84 100644 --- a/basics/rent/quasar/src/lib.rs +++ b/basics/rent/quasar/src/lib.rs @@ -21,7 +21,7 @@ mod quasar_rent { /// (blueshift-gg/quasar#126). We pass the fields individually instead. #[instruction(discriminator = 0)] pub fn create_system_account( - ctx: Ctx, + ctx: Ctx, name: String<50>, address: String<50>, ) -> Result<(), ProgramError> { diff --git a/basics/repository-layout/anchor/programs/carnival/src/lib.rs b/basics/repository-layout/anchor/programs/carnival/src/lib.rs index 5048fed4..9d0bea35 100644 --- a/basics/repository-layout/anchor/programs/carnival/src/lib.rs +++ b/basics/repository-layout/anchor/programs/carnival/src/lib.rs @@ -15,7 +15,7 @@ pub mod carnival { use super::*; pub fn go_on_ride( - _context: Context, + _context: Context, name: String, height: u32, ticket_count: u32, @@ -30,7 +30,7 @@ pub mod carnival { } pub fn play_game( - _context: Context, + _context: Context, name: String, ticket_count: u32, game_name: String, @@ -43,7 +43,7 @@ pub mod carnival { } pub fn eat_food( - _context: Context, + _context: Context, name: String, ticket_count: u32, food_stand_name: String, @@ -57,7 +57,7 @@ pub mod carnival { } #[derive(Accounts)] -pub struct CarnivalContext<'info> { +pub struct CarnivalAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, } diff --git a/basics/repository-layout/anchor/programs/carnival/tests/test_carnival.rs b/basics/repository-layout/anchor/programs/carnival/tests/test_carnival.rs index 7ec028bc..c59114e2 100644 --- a/basics/repository-layout/anchor/programs/carnival/tests/test_carnival.rs +++ b/basics/repository-layout/anchor/programs/carnival/tests/test_carnival.rs @@ -21,7 +21,7 @@ fn go_on_ride_ix( ticket_count: u32, ride_name: &str, ) -> Instruction { - let accounts = carnival::accounts::CarnivalContext { + let accounts = carnival::accounts::CarnivalAccountConstraints { payer: payer.pubkey(), } .to_account_metas(None); @@ -44,7 +44,7 @@ fn play_game_ix( ticket_count: u32, game_name: &str, ) -> Instruction { - let accounts = carnival::accounts::CarnivalContext { + let accounts = carnival::accounts::CarnivalAccountConstraints { payer: payer.pubkey(), } .to_account_metas(None); @@ -66,7 +66,7 @@ fn eat_food_ix( ticket_count: u32, food_stand_name: &str, ) -> Instruction { - let accounts = carnival::accounts::CarnivalContext { + let accounts = carnival::accounts::CarnivalAccountConstraints { payer: payer.pubkey(), } .to_account_metas(None); diff --git a/basics/repository-layout/quasar/src/instructions/carnival_context.rs b/basics/repository-layout/quasar/src/instructions/carnival_context.rs index 0d274dce..c990a8c7 100644 --- a/basics/repository-layout/quasar/src/instructions/carnival_context.rs +++ b/basics/repository-layout/quasar/src/instructions/carnival_context.rs @@ -5,14 +5,14 @@ use super::{eat_food, get_on_ride, play_game}; /// Minimal accounts context - a signer submits the transaction. /// The instructions just process instruction data (no onchain state). #[derive(Accounts)] -pub struct CarnivalContext { +pub struct CarnivalAccountConstraints { #[allow(dead_code)] pub payer: Signer, } #[inline(always)] pub fn handle_go_on_ride( - _accounts: &mut CarnivalContext, + _accounts: &mut CarnivalAccountConstraints, name: &str, height: u32, ticket_count: u32, @@ -23,7 +23,7 @@ pub fn handle_go_on_ride( #[inline(always)] pub fn handle_play_game( - _accounts: &mut CarnivalContext, + _accounts: &mut CarnivalAccountConstraints, name: &str, ticket_count: u32, game_name: &str, @@ -33,7 +33,7 @@ pub fn handle_play_game( #[inline(always)] pub fn handle_eat_food( - _accounts: &mut CarnivalContext, + _accounts: &mut CarnivalAccountConstraints, name: &str, ticket_count: u32, food_stand_name: &str, diff --git a/basics/repository-layout/quasar/src/lib.rs b/basics/repository-layout/quasar/src/lib.rs index a60775c3..65c5c108 100644 --- a/basics/repository-layout/quasar/src/lib.rs +++ b/basics/repository-layout/quasar/src/lib.rs @@ -17,7 +17,7 @@ mod quasar_carnival { /// Ride a carnival ride. Validates height and ticket requirements. #[instruction(discriminator = 0)] pub fn go_on_ride( - ctx: Ctx, + ctx: Ctx, height: u32, ticket_count: u32, name: String<50>, @@ -29,7 +29,7 @@ mod quasar_carnival { /// Play a carnival game. Validates ticket requirements. #[instruction(discriminator = 1)] pub fn play_game( - ctx: Ctx, + ctx: Ctx, ticket_count: u32, name: String<50>, game_name: String<50>, @@ -40,7 +40,7 @@ mod quasar_carnival { /// Eat at a carnival food stand. Validates ticket requirements. #[instruction(discriminator = 2)] pub fn eat_food( - ctx: Ctx, + ctx: Ctx, ticket_count: u32, name: String<50>, food_stand_name: String<50>, diff --git a/basics/transfer-sol/anchor/programs/transfer-sol/src/instructions/transfer_sol_with_program.rs b/basics/transfer-sol/anchor/programs/transfer-sol/src/instructions/transfer_sol_with_program.rs index 3ac2dc00..cb754ed0 100644 --- a/basics/transfer-sol/anchor/programs/transfer-sol/src/instructions/transfer_sol_with_program.rs +++ b/basics/transfer-sol/anchor/programs/transfer-sol/src/instructions/transfer_sol_with_program.rs @@ -1,20 +1,41 @@ use anchor_lang::prelude::*; +#[error_code] +pub enum TransferSolError { + #[msg("The payer does not hold enough lamports for this transfer")] + InsufficientFunds, + #[msg("Adding the amount to the recipient balance would overflow a u64")] + AmountOverflow, +} + #[derive(Accounts)] -pub struct TransferSolWithProgram<'info> { +pub struct TransferSolWithProgramAccountConstraints<'info> { /// CHECK: Use owner constraint to check account is owned by our program #[account( mut, owner = crate::ID // value of declare_id!() )] payer: UncheckedAccount<'info>, + #[account(mut)] recipient: SystemAccount<'info>, } // Directly modifying lamports is only possible if the program is the owner of the account -pub fn handler(context: Context, amount: u64) -> Result<()> { - **context.accounts.payer.try_borrow_mut_lamports()? -= amount; - **context.accounts.recipient.try_borrow_mut_lamports()? += amount; +pub fn handler(context: Context, amount: u64) -> Result<()> { + let payer = &context.accounts.payer; + let recipient = &context.accounts.recipient; + + let new_payer_lamports = payer + .lamports() + .checked_sub(amount) + .ok_or(TransferSolError::InsufficientFunds)?; + let new_recipient_lamports = recipient + .lamports() + .checked_add(amount) + .ok_or(TransferSolError::AmountOverflow)?; + + **payer.try_borrow_mut_lamports()? = new_payer_lamports; + **recipient.try_borrow_mut_lamports()? = new_recipient_lamports; Ok(()) } diff --git a/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs b/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs index 733f346f..aa34c90c 100644 --- a/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs +++ b/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs @@ -14,7 +14,7 @@ pub mod transfer_sol { } pub fn transfer_sol_with_program( - context: Context, + context: Context, amount: u64, ) -> Result<()> { instructions::transfer_sol_with_program::handler(context, amount) diff --git a/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs b/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs index e9482936..facc6009 100644 --- a/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs +++ b/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs @@ -77,7 +77,7 @@ fn test_transfer_sol_with_program() { amount: LAMPORTS_PER_SOL, } .data(), - transfer_sol::accounts::TransferSolWithProgram { + transfer_sol::accounts::TransferSolWithProgramAccountConstraints { payer: payer_account.pubkey(), recipient: recipient.pubkey(), } @@ -90,3 +90,61 @@ fn test_transfer_sol_with_program() { let recipient_balance = svm.get_balance(&recipient.pubkey()).unwrap(); assert_eq!(recipient_balance, LAMPORTS_PER_SOL); } + +#[test] +fn test_transfer_sol_with_program_rejects_insufficient_funds() { + let program_id = transfer_sol::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/transfer_sol.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10 * LAMPORTS_PER_SOL).unwrap(); + + // Create an account owned by our program holding 1 SOL. + let program_owned_account = Keypair::new(); + let create_account_ix = anchor_lang::solana_program::system_instruction::create_account( + &payer.pubkey(), + &program_owned_account.pubkey(), + LAMPORTS_PER_SOL, + 0, + &program_id, + ); + send_transaction_from_instructions( + &mut svm, + vec![create_account_ix], + &[&payer, &program_owned_account], + &payer.pubkey(), + ) + .unwrap(); + + // Ask for more than the account holds: the checked subtraction must + // reject the transfer instead of wrapping. + svm.expire_blockhash(); + let recipient = Keypair::new(); + let instruction = Instruction::new_with_bytes( + program_id, + &transfer_sol::instruction::TransferSolWithProgram { + amount: 2 * LAMPORTS_PER_SOL, + } + .data(), + transfer_sol::accounts::TransferSolWithProgramAccountConstraints { + payer: program_owned_account.pubkey(), + recipient: recipient.pubkey(), + } + .to_account_metas(None), + ); + + let result = send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer], + &payer.pubkey(), + ); + assert!(result.is_err(), "overdrawing the payer must fail"); + + // Balances are untouched. + assert_eq!( + svm.get_balance(&program_owned_account.pubkey()).unwrap(), + LAMPORTS_PER_SOL + ); + assert_eq!(svm.get_balance(&recipient.pubkey()).unwrap_or(0), 0); +} diff --git a/basics/transfer-sol/native/program/src/instruction.rs b/basics/transfer-sol/native/program/src/instruction.rs index 70f2d515..cf6db650 100644 --- a/basics/transfer-sol/native/program/src/instruction.rs +++ b/basics/transfer-sol/native/program/src/instruction.rs @@ -2,6 +2,7 @@ use solana_program::{ account_info::{next_account_info, AccountInfo}, entrypoint::ProgramResult, program::invoke, + program_error::ProgramError, pubkey::Pubkey, }; @@ -28,8 +29,19 @@ pub fn transfer_sol_with_program( let payer = next_account_info(accounts_iter)?; let recipient = next_account_info(accounts_iter)?; - **payer.try_borrow_mut_lamports()? -= amount; - **recipient.try_borrow_mut_lamports()? += amount; + // Checked math: reject an overdraw or a balance overflow instead of + // silently wrapping. + let new_payer_lamports = payer + .lamports() + .checked_sub(amount) + .ok_or(ProgramError::InsufficientFunds)?; + let new_recipient_lamports = recipient + .lamports() + .checked_add(amount) + .ok_or(ProgramError::ArithmeticOverflow)?; + + **payer.try_borrow_mut_lamports()? = new_payer_lamports; + **recipient.try_borrow_mut_lamports()? = new_recipient_lamports; Ok(()) } diff --git a/basics/transfer-sol/native/program/tests/test.rs b/basics/transfer-sol/native/program/tests/test.rs index 09e4abc1..1af39a39 100644 --- a/basics/transfer-sol/native/program/tests/test.rs +++ b/basics/transfer-sol/native/program/tests/test.rs @@ -91,3 +91,62 @@ fn test_transfer_sol() { assert!(svm.send_transaction(tx).is_ok()); } + +#[test] +fn test_program_transfer_rejects_insufficient_funds() { + let mut svm = LiteSVM::new(); + + let program_id = Pubkey::new_unique(); + let program_bytes = include_bytes!("../../tests/fixtures/transfer_sol_program.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + // A program-owned account holding 1 SOL. + let program_owned_account = Keypair::new(); + let recipient = Keypair::new(); + let create_ix = create_account( + &payer.pubkey(), + &program_owned_account.pubkey(), + LAMPORTS_PER_SOL, + 0, + &program_id, + ); + let tx = Transaction::new_signed_with_payer( + &[create_ix], + Some(&payer.pubkey()), + &[&payer, &program_owned_account], + svm.latest_blockhash(), + ); + assert!(svm.send_transaction(tx).is_ok()); + + // Ask for more than the account holds: the checked subtraction must + // reject the transfer instead of wrapping. + let data = borsh::to_vec(&TransferInstruction::ProgramTransfer(2 * LAMPORTS_PER_SOL)).unwrap(); + let ix = Instruction { + program_id, + accounts: vec![ + AccountMeta::new(program_owned_account.pubkey(), false), + AccountMeta::new(recipient.pubkey(), false), + ], + data, + }; + let tx = Transaction::new_signed_with_payer( + &[ix], + Some(&payer.pubkey()), + &[&payer], + svm.latest_blockhash(), + ); + assert!( + svm.send_transaction(tx).is_err(), + "overdrawing the payer must fail" + ); + + // Balances are untouched. + assert_eq!( + svm.get_balance(&program_owned_account.pubkey()).unwrap(), + LAMPORTS_PER_SOL + ); + assert_eq!(svm.get_balance(&recipient.pubkey()).unwrap_or(0), 0); +} diff --git a/basics/transfer-sol/native/tests/fixtures/transfer_sol_program.so b/basics/transfer-sol/native/tests/fixtures/transfer_sol_program.so index e59e7a31668e599614fde269798b3b52fc084b9d..6d26be31bd9b9d278e660f0f4c8a7321ccf6b74e 100755 GIT binary patch delta 10622 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 WxRBYMABB-=fz@WB`K24?;Qs^XW-WgJ diff --git a/basics/transfer-sol/quasar/src/tests.rs b/basics/transfer-sol/quasar/src/tests.rs index 59f1486f..bdeb9c65 100644 --- a/basics/transfer-sol/quasar/src/tests.rs +++ b/basics/transfer-sol/quasar/src/tests.rs @@ -1,6 +1,7 @@ use quasar_svm::{Account, Instruction, Pubkey, QuasarSvm}; use solana_address::Address; +use crate::instructions::TransferSolError; use quasar_transfer_sol_client::{ TransferSolWithCpiInstruction, TransferSolWithProgramInstruction, }; @@ -102,3 +103,76 @@ fn test_transfer_sol_with_program() { let recipient_after = result.account(&recipient).unwrap(); assert_eq!(recipient_after.lamports, 1_000_000_000 + amount); } + +#[test] +fn test_transfer_sol_with_program_rejects_foreign_owned_payer() { + let mut svm = setup(); + + let payer = Pubkey::new_unique(); + let recipient = Pubkey::new_unique(); + let amount = 500_000_000; // 0.5 SOL + + // The payer is owned by the system program, not this program, so the + // owner constraint must reject the transfer before any lamports move. + let payer_account = system_account(payer, 2_000_000_000); + let recipient_account = Account { + address: recipient, + lamports: 1_000_000_000, + data: vec![], + owner: Pubkey::from(crate::ID), + executable: false, + }; + + let instruction: Instruction = TransferSolWithProgramInstruction { + payer: Address::from(payer.to_bytes()), + recipient: Address::from(recipient.to_bytes()), + amount, + } + .into(); + + let result = svm.process_instruction(&instruction, &[payer_account, recipient_account]); + result.assert_error(quasar_svm::ProgramError::Custom( + TransferSolError::PayerNotOwnedByProgram as u32, + )); +} + +#[test] +fn test_transfer_sol_with_program_rejects_insufficient_funds() { + let mut svm = setup(); + + let payer = Pubkey::new_unique(); + let recipient = Pubkey::new_unique(); + let payer_lamports = 100_000_000; // 0.1 SOL + let amount = 500_000_000; // 0.5 SOL, more than the payer holds + + let payer_account = Account { + address: payer, + lamports: payer_lamports, + data: vec![], + owner: Pubkey::from(crate::ID), + executable: false, + }; + let recipient_account = Account { + address: recipient, + lamports: 1_000_000_000, + data: vec![], + owner: Pubkey::from(crate::ID), + executable: false, + }; + + let instruction: Instruction = TransferSolWithProgramInstruction { + payer: Address::from(payer.to_bytes()), + recipient: Address::from(recipient.to_bytes()), + amount, + } + .into(); + + let result = svm.process_instruction(&instruction, &[payer_account, recipient_account]); + result.assert_error(quasar_svm::ProgramError::Custom( + TransferSolError::InsufficientFunds as u32, + )); + + // No lamports moved. + let payer_after = result.account(&payer).unwrap(); + assert_eq!(payer_after.lamports, payer_lamports); +} diff --git a/tokens/create-token/quasar/README.md b/tokens/create-token/quasar/README.md index 80960c39..7d4a9282 100644 --- a/tokens/create-token/quasar/README.md +++ b/tokens/create-token/quasar/README.md @@ -1,13 +1,15 @@ # Create Token (Quasar) -Create a mint with metadata using Token and Metaplex programs. +Create a token mint and mint tokens to a token account. + +The Anchor variant also creates Metaplex metadata; this Quasar variant focuses on the core SPL Token operations. Quasar's metadata crate is demonstrated in the [nft-operations](../../nft-operations/quasar/) example. See also: [Create Token overview](../README.md) and the [repository catalog](../../../README.md). ## Major concepts -- Mint + metadata CPI -- See [tokens/create-token/README.md](../create-token/README.md) +- `create_token` takes a `decimals` instruction argument and initializes the mint with it (create_account + initialize_mint2 CPIs) +- `mint_tokens` takes `amount` in minor units, the raw integer the token program operates on ## Setup diff --git a/tokens/create-token/quasar/src/lib.rs b/tokens/create-token/quasar/src/lib.rs index 9392921c..3ef8fe03 100644 --- a/tokens/create-token/quasar/src/lib.rs +++ b/tokens/create-token/quasar/src/lib.rs @@ -1,13 +1,16 @@ #![cfg_attr(not(test), no_std)] -use quasar_lang::prelude::*; -use quasar_spl::prelude::*; +use quasar_lang::{prelude::*, sysvars::Sysvar}; +use quasar_spl::{initialize_mint2, prelude::*}; #[cfg(test)] mod tests; declare_id!("22222222222222222222222222222222222222222222"); +/// SPL Mint account size in bytes. +const MINT_SPACE: usize = 82; + /// Creates a token mint and mints initial tokens to the creator's token account. /// /// The Anchor version uses Metaplex for onchain metadata. Quasar's metadata @@ -17,8 +20,7 @@ declare_id!("22222222222222222222222222222222222222222222"); mod quasar_create_token { use super::*; - /// Create a new token mint with the caller-supplied number of decimals - /// (account init handled by Quasar's `#[account(init)]`). + /// Create a new token mint with the caller-supplied number of decimals. #[instruction(discriminator = 0)] pub fn create_token( ctx: Ctx, @@ -38,21 +40,18 @@ mod quasar_create_token { } /// Accounts for creating a new token mint. -/// Quasar's `#[account(init)]` handles the create_account + initialize_mint -/// CPI; the `decimals` instruction argument is threaded into the mint init. +/// +/// The mint is created and initialized in the handler (create_account + +/// initialize_mint2 CPIs) rather than through Quasar's `mint(...)` init +/// constraint, because constraint arguments must be account fields or +/// literals and cannot reference the `decimals` instruction argument. #[derive(Accounts)] -#[instruction(decimals: u8)] pub struct CreateTokenAccountConstraints { #[account(mut)] pub payer: Signer, - #[account( - mut, - init, - payer = payer, - mint(decimals = decimals, authority = payer, freeze_authority = None, token_program = token_program), - )] - pub mint: Account, - pub rent: Sysvar, + /// The new mint. Must sign (it is a fresh keypair account). + #[account(mut)] + pub mint: UncheckedAccount, pub token_program: Program, pub system_program: Program, } @@ -71,13 +70,33 @@ pub struct MintTokensAccountConstraints { #[inline(always)] fn handle_create_token( - _accounts: &mut CreateTokenAccountConstraints, - _decimals: u8, + accounts: &mut CreateTokenAccountConstraints, + decimals: u8, ) -> Result<(), ProgramError> { - // Mint account is created and initialised by Quasar's account init, which - // reads `decimals` from the instruction data via the struct-level - // #[instruction(decimals: u8)] declaration. - Ok(()) + let payer_address = *accounts.payer.address(); + + let rent = Rent::get()?; + let lamports = rent.minimum_balance_unchecked(MINT_SPACE); + + accounts + .system_program + .create_account( + &accounts.payer, + &accounts.mint, + lamports, + MINT_SPACE as u64, + accounts.token_program.address(), + ) + .invoke()?; + + initialize_mint2( + accounts.token_program.to_account_view(), + accounts.mint.to_account_view(), + decimals, + &payer_address, + None, + ) + .invoke() } #[inline(always)] diff --git a/tokens/create-token/quasar/src/tests.rs b/tokens/create-token/quasar/src/tests.rs index b5350389..e20dfc04 100644 --- a/tokens/create-token/quasar/src/tests.rs +++ b/tokens/create-token/quasar/src/tests.rs @@ -83,10 +83,9 @@ fn test_create_token() { let mint_address = Pubkey::new_unique(); let token_program = quasar_svm::SPL_TOKEN_PROGRAM_ID; let system_program = quasar_svm::system_program::ID; - let rent = quasar_svm::solana_sdk_ids::sysvar::rent::ID; // Deliberately not 9: proves the decimals instruction argument reaches - // the initialize_mint CPI instead of being hardcoded. + // the initialize_mint2 CPI instead of being hardcoded. let requested_decimals = 6u8; let data = build_create_token_data(requested_decimals); @@ -95,7 +94,6 @@ fn test_create_token() { accounts: vec![ solana_instruction::AccountMeta::new(payer.into(), true), solana_instruction::AccountMeta::new(mint_address.into(), true), - solana_instruction::AccountMeta::new_readonly(rent.into(), false), solana_instruction::AccountMeta::new_readonly(token_program.into(), false), solana_instruction::AccountMeta::new_readonly(system_program.into(), false), ], diff --git a/tokens/nft-operations/anchor/programs/mint-nft/src/error.rs b/tokens/nft-operations/anchor/programs/mint-nft/src/error.rs new file mode 100644 index 00000000..4f538434 --- /dev/null +++ b/tokens/nft-operations/anchor/programs/mint-nft/src/error.rs @@ -0,0 +1,11 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum MintNftError { + #[msg("Metadata name exceeds the Metaplex maximum of 32 bytes")] + NameTooLong, + #[msg("Metadata symbol exceeds the Metaplex maximum of 10 bytes")] + SymbolTooLong, + #[msg("Metadata URI exceeds the Metaplex maximum of 200 bytes")] + UriTooLong, +} diff --git a/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/create_collection.rs b/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/create_collection.rs index b1411b0b..6fd2722c 100644 --- a/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/create_collection.rs +++ b/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/create_collection.rs @@ -1,35 +1,26 @@ use anchor_lang::prelude::*; use anchor_spl::{ - associated_token::AssociatedToken, - metadata::Metadata, - token::{ - mint_to, - Mint, - MintTo, - Token, - TokenAccount, - } + associated_token::AssociatedToken, + metadata::Metadata, + token::{mint_to, Mint, MintTo, Token, TokenAccount}, }; + use anchor_spl::metadata::mpl_token_metadata::{ instructions::{ - CreateMasterEditionV3Cpi, - CreateMasterEditionV3CpiAccounts, - CreateMasterEditionV3InstructionArgs, - CreateMetadataAccountV3Cpi, - CreateMetadataAccountV3CpiAccounts, - CreateMetadataAccountV3InstructionArgs - }, - types::{ - CollectionDetails, - Creator, - DataV2 - } + CreateMasterEditionV3Cpi, CreateMasterEditionV3CpiAccounts, + CreateMasterEditionV3InstructionArgs, CreateMetadataAccountV3Cpi, + CreateMetadataAccountV3CpiAccounts, CreateMetadataAccountV3InstructionArgs, + }, + types::{CollectionDetails, Creator, DataV2}, }; +use super::validate_metadata_strings; + #[derive(Accounts)] -pub struct CreateCollection<'info> { +pub struct CreateCollectionAccountConstraints<'info> { #[account(mut)] user: Signer<'info>, + #[account( init, payer = user, @@ -38,18 +29,22 @@ pub struct CreateCollection<'info> { mint::freeze_authority = mint_authority, )] mint: Account<'info, Mint>, + #[account( seeds = [b"authority"], bump, )] /// CHECK: This account is not initialized and is being used for signing purposes only pub mint_authority: UncheckedAccount<'info>, + #[account(mut)] /// CHECK: This account will be initialized by the metaplex program metadata: UncheckedAccount<'info>, + #[account(mut)] /// CHECK: This account will be initialized by the metaplex program master_edition: UncheckedAccount<'info>, + #[account( init, payer = user, @@ -57,97 +52,101 @@ pub struct CreateCollection<'info> { associated_token::authority = user )] destination: Account<'info, TokenAccount>, + system_program: Program<'info, System>, token_program: Program<'info, Token>, associated_token_program: Program<'info, AssociatedToken>, token_metadata_program: Program<'info, Metadata>, } -pub fn handler(accounts: &mut CreateCollection, bumps: &CreateCollectionBumps) -> Result<()> { - - let metadata = &accounts.metadata.to_account_info(); - let master_edition = &accounts.master_edition.to_account_info(); - let mint = &accounts.mint.to_account_info(); - let authority = &accounts.mint_authority.to_account_info(); - let payer = &accounts.user.to_account_info(); - let system_program = &accounts.system_program.to_account_info(); - let spl_token_program = &accounts.token_program.to_account_info(); - let spl_metadata_program = &accounts.token_metadata_program.to_account_info(); - - let seeds = &[ - &b"authority"[..], - &[bumps.mint_authority] - ]; - let signer_seeds = &[&seeds[..]]; - - let cpi_accounts = MintTo { - mint: accounts.mint.to_account_info(), - to: accounts.destination.to_account_info(), - authority: accounts.mint_authority.to_account_info(), - }; - let cpi_ctx = CpiContext::new_with_signer(accounts.token_program.key(), cpi_accounts, signer_seeds); - mint_to(cpi_ctx, 1)?; - msg!("Collection NFT minted!"); - - let creator = vec![ - Creator { - address: accounts.mint_authority.key().clone(), - verified: true, - share: 100, - }, - ]; - - let metadata_account = CreateMetadataAccountV3Cpi::new( - spl_metadata_program, - CreateMetadataAccountV3CpiAccounts { - metadata, - mint, - mint_authority: authority, - payer, - update_authority: (authority, true), - system_program, - rent: None, - }, - CreateMetadataAccountV3InstructionArgs { - data: DataV2 { - name: "DummyCollection".to_owned(), - symbol: "DC".to_owned(), - uri: "".to_owned(), - seller_fee_basis_points: 0, - creators: Some(creator), - collection: None, - uses: None, - }, - is_mutable: true, - collection_details: Some( - CollectionDetails::V1 { - size: 0 - } - ) - } - ); - metadata_account.invoke_signed(signer_seeds)?; - msg!("Metadata Account created!"); - - let master_edition_account = CreateMasterEditionV3Cpi::new( - spl_metadata_program, - CreateMasterEditionV3CpiAccounts { - edition: master_edition, - update_authority: authority, - mint_authority: authority, - mint, - payer, - metadata, - token_program: spl_token_program, - system_program, - rent: None, +/// Creates a collection NFT with caller-supplied metadata. +/// +/// `name`, `symbol`, and `uri` are validated against the Metaplex Token +/// Metadata limits (32, 10, and 200 bytes respectively). +pub fn handle_create_collection( + accounts: &mut CreateCollectionAccountConstraints, + bumps: &CreateCollectionAccountConstraintsBumps, + name: String, + symbol: String, + uri: String, +) -> Result<()> { + validate_metadata_strings(&name, &symbol, &uri)?; + + let metadata = &accounts.metadata.to_account_info(); + let master_edition = &accounts.master_edition.to_account_info(); + let mint = &accounts.mint.to_account_info(); + let authority = &accounts.mint_authority.to_account_info(); + let payer = &accounts.user.to_account_info(); + let system_program = &accounts.system_program.to_account_info(); + let spl_token_program = &accounts.token_program.to_account_info(); + let spl_metadata_program = &accounts.token_metadata_program.to_account_info(); + + let seeds = &[&b"authority"[..], &[bumps.mint_authority]]; + let signer_seeds = &[&seeds[..]]; + + let cpi_accounts = MintTo { + mint: accounts.mint.to_account_info(), + to: accounts.destination.to_account_info(), + authority: accounts.mint_authority.to_account_info(), + }; + let cpi_ctx = + CpiContext::new_with_signer(accounts.token_program.key(), cpi_accounts, signer_seeds); + mint_to(cpi_ctx, 1)?; + msg!("Collection NFT minted!"); + + let creator = vec![Creator { + address: accounts.mint_authority.key(), + verified: true, + share: 100, + }]; + + let metadata_account = CreateMetadataAccountV3Cpi::new( + spl_metadata_program, + CreateMetadataAccountV3CpiAccounts { + metadata, + mint, + mint_authority: authority, + payer, + update_authority: (authority, true), + system_program, + rent: None, + }, + CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name, + symbol, + uri, + seller_fee_basis_points: 0, + creators: Some(creator), + collection: None, + uses: None, }, - CreateMasterEditionV3InstructionArgs { - max_supply: Some(0), - } - ); - master_edition_account.invoke_signed(signer_seeds)?; - msg!("Master Edition Account created"); - - Ok(()) - } + is_mutable: true, + collection_details: Some(CollectionDetails::V1 { size: 0 }), + }, + ); + metadata_account.invoke_signed(signer_seeds)?; + msg!("Metadata Account created!"); + + let master_edition_account = CreateMasterEditionV3Cpi::new( + spl_metadata_program, + CreateMasterEditionV3CpiAccounts { + edition: master_edition, + update_authority: authority, + mint_authority: authority, + mint, + payer, + metadata, + token_program: spl_token_program, + system_program, + rent: None, + }, + CreateMasterEditionV3InstructionArgs { + max_supply: Some(0), + }, + ); + master_edition_account.invoke_signed(signer_seeds)?; + msg!("Master Edition Account created"); + + Ok(()) +} diff --git a/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/mint_nft.rs b/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/mint_nft.rs index 0ad58138..04023aad 100644 --- a/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/mint_nft.rs +++ b/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/mint_nft.rs @@ -1,35 +1,26 @@ use anchor_lang::prelude::*; use anchor_spl::{ - associated_token::AssociatedToken, - metadata::Metadata, - token::{ - mint_to, - Mint, - MintTo, - Token, - TokenAccount - } + associated_token::AssociatedToken, + metadata::Metadata, + token::{mint_to, Mint, MintTo, Token, TokenAccount}, }; + use anchor_spl::metadata::mpl_token_metadata::{ instructions::{ - CreateMasterEditionV3Cpi, - CreateMasterEditionV3CpiAccounts, - CreateMasterEditionV3InstructionArgs, - CreateMetadataAccountV3Cpi, - CreateMetadataAccountV3CpiAccounts, - CreateMetadataAccountV3InstructionArgs, - }, - types::{ - Collection, - Creator, - DataV2, - } + CreateMasterEditionV3Cpi, CreateMasterEditionV3CpiAccounts, + CreateMasterEditionV3InstructionArgs, CreateMetadataAccountV3Cpi, + CreateMetadataAccountV3CpiAccounts, CreateMetadataAccountV3InstructionArgs, + }, + types::{Collection, Creator, DataV2}, }; +use super::validate_metadata_strings; + #[derive(Accounts)] -pub struct MintNFT<'info> { +pub struct MintNftAccountConstraints<'info> { #[account(mut)] pub owner: Signer<'info>, + #[account( init, payer = owner, @@ -38,6 +29,7 @@ pub struct MintNFT<'info> { mint::freeze_authority = mint_authority, )] pub mint: Account<'info, Mint>, + #[account( init, payer = owner, @@ -45,109 +37,121 @@ pub struct MintNFT<'info> { associated_token::authority = owner )] pub destination: Account<'info, TokenAccount>, + #[account(mut)] /// CHECK: This account will be initialized by the metaplex program pub metadata: UncheckedAccount<'info>, + #[account(mut)] /// CHECK: This account will be initialized by the metaplex program pub master_edition: UncheckedAccount<'info>, + #[account( seeds = [b"authority"], bump, )] /// CHECK: This is account is not initialized and is being used for signing purposes only pub mint_authority: UncheckedAccount<'info>, + #[account(mut)] pub collection_mint: Account<'info, Mint>, + pub system_program: Program<'info, System>, pub token_program: Program<'info, Token>, pub associated_token_program: Program<'info, AssociatedToken>, pub token_metadata_program: Program<'info, Metadata>, } -pub fn handler(accounts: &mut MintNFT, bumps: &MintNFTBumps) -> Result<()> { - - let metadata = &accounts.metadata.to_account_info(); - let master_edition = &accounts.master_edition.to_account_info(); - let mint = &accounts.mint.to_account_info(); - let authority = &accounts.mint_authority.to_account_info(); - let payer = &accounts.owner.to_account_info(); - let system_program = &accounts.system_program.to_account_info(); - let spl_token_program = &accounts.token_program.to_account_info(); - let spl_metadata_program = &accounts.token_metadata_program.to_account_info(); - - let seeds = &[ - &b"authority"[..], - &[bumps.mint_authority] - ]; - let signer_seeds = &[&seeds[..]]; - - let cpi_accounts = MintTo { - mint: accounts.mint.to_account_info(), - to: accounts.destination.to_account_info(), - authority: accounts.mint_authority.to_account_info(), - }; - let cpi_ctx = CpiContext::new_with_signer(accounts.token_program.key(), cpi_accounts, signer_seeds); - mint_to(cpi_ctx, 1)?; - msg!("Collection NFT minted!"); - - let creator = vec![ - Creator { - address: accounts.mint_authority.key(), - verified: true, - share: 100, - }, - ]; - - let metadata_account = CreateMetadataAccountV3Cpi::new( - spl_metadata_program, - CreateMetadataAccountV3CpiAccounts { - metadata, - mint, - mint_authority: authority, - payer, - update_authority: (authority, true), - system_program, - rent: None, - }, - CreateMetadataAccountV3InstructionArgs { - data: DataV2 { - name: "Mint Test".to_string(), - symbol: "YAY".to_string(), - uri: "".to_string(), - seller_fee_basis_points: 0, - creators: Some(creator), - collection: Some(Collection { - verified: false, - key: accounts.collection_mint.key(), - }), - uses: None - }, - is_mutable: true, - collection_details: None, - } - ); - metadata_account.invoke_signed(signer_seeds)?; - - let master_edition_account = CreateMasterEditionV3Cpi::new( - spl_metadata_program, - CreateMasterEditionV3CpiAccounts { - edition: master_edition, - update_authority: authority, - mint_authority: authority, - mint, - payer, - metadata, - token_program: spl_token_program, - system_program, - rent: None, +/// Mints an NFT into the collection with caller-supplied metadata. +/// +/// `name`, `symbol`, and `uri` are validated against the Metaplex Token +/// Metadata limits (32, 10, and 200 bytes respectively). The collection +/// reference starts unverified; call `verify_collection` to verify it. +pub fn handle_mint_nft( + accounts: &mut MintNftAccountConstraints, + bumps: &MintNftAccountConstraintsBumps, + name: String, + symbol: String, + uri: String, +) -> Result<()> { + validate_metadata_strings(&name, &symbol, &uri)?; + + let metadata = &accounts.metadata.to_account_info(); + let master_edition = &accounts.master_edition.to_account_info(); + let mint = &accounts.mint.to_account_info(); + let authority = &accounts.mint_authority.to_account_info(); + let payer = &accounts.owner.to_account_info(); + let system_program = &accounts.system_program.to_account_info(); + let spl_token_program = &accounts.token_program.to_account_info(); + let spl_metadata_program = &accounts.token_metadata_program.to_account_info(); + + let seeds = &[&b"authority"[..], &[bumps.mint_authority]]; + let signer_seeds = &[&seeds[..]]; + + let cpi_accounts = MintTo { + mint: accounts.mint.to_account_info(), + to: accounts.destination.to_account_info(), + authority: accounts.mint_authority.to_account_info(), + }; + let cpi_ctx = + CpiContext::new_with_signer(accounts.token_program.key(), cpi_accounts, signer_seeds); + mint_to(cpi_ctx, 1)?; + msg!("NFT minted!"); + + let creator = vec![Creator { + address: accounts.mint_authority.key(), + verified: true, + share: 100, + }]; + + let metadata_account = CreateMetadataAccountV3Cpi::new( + spl_metadata_program, + CreateMetadataAccountV3CpiAccounts { + metadata, + mint, + mint_authority: authority, + payer, + update_authority: (authority, true), + system_program, + rent: None, + }, + CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name, + symbol, + uri, + seller_fee_basis_points: 0, + creators: Some(creator), + collection: Some(Collection { + verified: false, + key: accounts.collection_mint.key(), + }), + uses: None, }, - CreateMasterEditionV3InstructionArgs { - max_supply: Some(0), - } - ); - master_edition_account.invoke_signed(signer_seeds)?; - - Ok(()) - - } + is_mutable: true, + collection_details: None, + }, + ); + metadata_account.invoke_signed(signer_seeds)?; + + let master_edition_account = CreateMasterEditionV3Cpi::new( + spl_metadata_program, + CreateMasterEditionV3CpiAccounts { + edition: master_edition, + update_authority: authority, + mint_authority: authority, + mint, + payer, + metadata, + token_program: spl_token_program, + system_program, + rent: None, + }, + CreateMasterEditionV3InstructionArgs { + max_supply: Some(0), + }, + ); + master_edition_account.invoke_signed(signer_seeds)?; + + Ok(()) +} diff --git a/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/mod.rs b/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/mod.rs index d4557134..6321509c 100644 --- a/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/mod.rs +++ b/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/mod.rs @@ -1,7 +1,27 @@ -pub mod mint_nft; -pub mod create_collection; -pub mod verify_collection; - -pub use mint_nft::*; -pub use create_collection::*; -pub use verify_collection::*; +pub mod create_collection; +pub mod mint_nft; +pub mod verify_collection; + +pub use create_collection::*; +pub use mint_nft::*; +pub use verify_collection::*; + +use { + crate::error::MintNftError, + anchor_lang::prelude::*, + anchor_spl::metadata::mpl_token_metadata::{ + MAX_NAME_LENGTH, MAX_SYMBOL_LENGTH, MAX_URI_LENGTH, + }, +}; + +/// Rejects metadata strings that exceed the Metaplex Token Metadata limits, +/// so callers get a named error instead of an opaque CPI failure. +pub fn validate_metadata_strings(name: &str, symbol: &str, uri: &str) -> Result<()> { + require!(name.len() <= MAX_NAME_LENGTH, MintNftError::NameTooLong); + require!( + symbol.len() <= MAX_SYMBOL_LENGTH, + MintNftError::SymbolTooLong + ); + require!(uri.len() <= MAX_URI_LENGTH, MintNftError::UriTooLong); + Ok(()) +} diff --git a/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/verify_collection.rs b/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/verify_collection.rs index ec329153..4748ec25 100644 --- a/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/verify_collection.rs +++ b/tokens/nft-operations/anchor/programs/mint-nft/src/instructions/verify_collection.rs @@ -16,7 +16,7 @@ use anchor_spl::{ const INSTRUCTIONS_SYSVAR_ID: Pubkey = anchor_lang::solana_program::pubkey::pubkey!("Sysvar1nstructions1111111111111111111111111"); #[derive(Accounts)] -pub struct VerifyCollectionMint<'info> { +pub struct VerifyCollectionMintAccountConstraints<'info> { pub authority: Signer<'info>, #[account(mut)] pub metadata: Account<'info, MetadataAccount>, @@ -38,7 +38,10 @@ pub struct VerifyCollectionMint<'info> { pub token_metadata_program: Program<'info, Metadata>, } -pub fn handler(accounts: &mut VerifyCollectionMint, bumps: &VerifyCollectionMintBumps) -> Result<()> { +pub fn handle_verify_collection( + accounts: &mut VerifyCollectionMintAccountConstraints, + bumps: &VerifyCollectionMintAccountConstraintsBumps, +) -> Result<()> { let metadata = &accounts.metadata.to_account_info(); let authority = &accounts.mint_authority.to_account_info(); let collection_mint = &accounts.collection_mint.to_account_info(); diff --git a/tokens/nft-operations/anchor/programs/mint-nft/src/lib.rs b/tokens/nft-operations/anchor/programs/mint-nft/src/lib.rs index b36f0ff9..2e1c3eac 100644 --- a/tokens/nft-operations/anchor/programs/mint-nft/src/lib.rs +++ b/tokens/nft-operations/anchor/programs/mint-nft/src/lib.rs @@ -2,6 +2,7 @@ use anchor_lang::prelude::*; declare_id!("3EMcczaGi9ivdLxvvFwRbGYeEUEHpGwabXegARw4jLxa"); +pub mod error; pub mod instructions; pub use instructions::*; @@ -10,15 +11,40 @@ pub use instructions::*; pub mod mint_nft { use super::*; - pub fn create_collection(mut context: Context) -> Result<()> { - instructions::create_collection::handler(&mut context.accounts, &context.bumps) + + /// Create a collection NFT with the given metadata. + pub fn create_collection( + mut context: Context, + name: String, + symbol: String, + uri: String, + ) -> Result<()> { + instructions::create_collection::handle_create_collection( + &mut context.accounts, + &context.bumps, + name, + symbol, + uri, + ) } - pub fn mint_nft(mut context: Context) -> Result<()> { - instructions::mint_nft::handler(&mut context.accounts, &context.bumps) + /// Mint an NFT into the collection with the given metadata. + pub fn mint_nft( + mut context: Context, + name: String, + symbol: String, + uri: String, + ) -> Result<()> { + instructions::mint_nft::handle_mint_nft(&mut context.accounts, &context.bumps, name, symbol, uri) } - pub fn verify_collection(mut context: Context) -> Result<()> { - instructions::verify_collection::handler(&mut context.accounts, &context.bumps) + /// Verify an NFT as a member of the collection. + pub fn verify_collection( + mut context: Context, + ) -> Result<()> { + instructions::verify_collection::handle_verify_collection( + &mut context.accounts, + &context.bumps, + ) } } diff --git a/tokens/nft-operations/anchor/programs/mint-nft/tests/test_nft_operations.rs b/tokens/nft-operations/anchor/programs/mint-nft/tests/test_nft_operations.rs index d22fdcf3..93bb7e51 100644 --- a/tokens/nft-operations/anchor/programs/mint-nft/tests/test_nft_operations.rs +++ b/tokens/nft-operations/anchor/programs/mint-nft/tests/test_nft_operations.rs @@ -66,6 +66,13 @@ fn derive_edition_pda(mint: &Pubkey) -> Pubkey { pda } +/// Returns true if `haystack` contains `needle` anywhere. Used to check that +/// caller-supplied metadata strings landed in the Metaplex metadata account +/// without fully deserializing the Metaplex layout. +fn contains_bytes(haystack: &[u8], needle: &[u8]) -> bool { + haystack.windows(needle.len()).any(|window| window == needle) +} + fn setup() -> (LiteSVM, Pubkey, Keypair) { let program_id = mint_nft::id(); let mut svm = LiteSVM::new(); @@ -94,8 +101,13 @@ fn test_create_collection() { let instruction = Instruction::new_with_bytes( program_id, - &mint_nft::instruction::CreateCollection {}.data(), - mint_nft::accounts::CreateCollection { + &mint_nft::instruction::CreateCollection { + name: "Example Collection".to_string(), + symbol: "EXCO".to_string(), + uri: "https://example.com/collection.json".to_string(), + } + .data(), + mint_nft::accounts::CreateCollectionAccountConstraints { user: payer.pubkey(), mint: collection_keypair.pubkey(), mint_authority, @@ -124,11 +136,15 @@ fn test_create_collection() { .expect("Collection mint should exist"); assert!(!mint_account.data.is_empty()); - // Verify metadata exists + // Verify metadata exists and carries the caller-supplied name let meta_account = svm .get_account(&metadata) .expect("Metadata should exist"); assert!(!meta_account.data.is_empty()); + assert!( + contains_bytes(&meta_account.data, b"Example Collection"), + "Metadata should contain the caller-supplied collection name" + ); // Verify master edition exists let edition_account = svm @@ -155,8 +171,13 @@ fn test_mint_nft_to_collection() { let create_collection_ix = Instruction::new_with_bytes( program_id, - &mint_nft::instruction::CreateCollection {}.data(), - mint_nft::accounts::CreateCollection { + &mint_nft::instruction::CreateCollection { + name: "Example Collection".to_string(), + symbol: "EXCO".to_string(), + uri: "https://example.com/collection.json".to_string(), + } + .data(), + mint_nft::accounts::CreateCollectionAccountConstraints { user: payer.pubkey(), mint: collection_keypair.pubkey(), mint_authority, @@ -188,8 +209,13 @@ fn test_mint_nft_to_collection() { let mint_nft_ix = Instruction::new_with_bytes( program_id, - &mint_nft::instruction::MintNft {}.data(), - mint_nft::accounts::MintNFT { + &mint_nft::instruction::MintNft { + name: "Example NFT #1".to_string(), + symbol: "EXNFT".to_string(), + uri: "https://example.com/nft-1.json".to_string(), + } + .data(), + mint_nft::accounts::MintNftAccountConstraints { owner: payer.pubkey(), mint: nft_keypair.pubkey(), destination: nft_destination, @@ -217,11 +243,15 @@ fn test_mint_nft_to_collection() { let balance = get_token_account_balance(&svm, &nft_destination).unwrap(); assert_eq!(balance, 1, "Should have 1 NFT"); - // Verify NFT metadata exists + // Verify NFT metadata exists and carries the caller-supplied name let nft_meta = svm .get_account(&nft_metadata) .expect("NFT metadata should exist"); assert!(!nft_meta.data.is_empty()); + assert!( + contains_bytes(&nft_meta.data, b"Example NFT #1"), + "Metadata should contain the caller-supplied NFT name" + ); } #[test] @@ -238,8 +268,13 @@ fn test_verify_collection() { let create_collection_ix = Instruction::new_with_bytes( program_id, - &mint_nft::instruction::CreateCollection {}.data(), - mint_nft::accounts::CreateCollection { + &mint_nft::instruction::CreateCollection { + name: "Example Collection".to_string(), + symbol: "EXCO".to_string(), + uri: "https://example.com/collection.json".to_string(), + } + .data(), + mint_nft::accounts::CreateCollectionAccountConstraints { user: payer.pubkey(), mint: collection_keypair.pubkey(), mint_authority, @@ -271,8 +306,13 @@ fn test_verify_collection() { let mint_nft_ix = Instruction::new_with_bytes( program_id, - &mint_nft::instruction::MintNft {}.data(), - mint_nft::accounts::MintNFT { + &mint_nft::instruction::MintNft { + name: "Example NFT #1".to_string(), + symbol: "EXNFT".to_string(), + uri: "https://example.com/nft-1.json".to_string(), + } + .data(), + mint_nft::accounts::MintNftAccountConstraints { owner: payer.pubkey(), mint: nft_keypair.pubkey(), destination: nft_destination, @@ -301,7 +341,7 @@ fn test_verify_collection() { let verify_ix = Instruction::new_with_bytes( program_id, &mint_nft::instruction::VerifyCollection {}.data(), - mint_nft::accounts::VerifyCollectionMint { + mint_nft::accounts::VerifyCollectionMintAccountConstraints { authority: payer.pubkey(), metadata: nft_metadata, mint: nft_keypair.pubkey(), diff --git a/tokens/pda-mint-authority/quasar/README.md b/tokens/pda-mint-authority/quasar/README.md index 092416af..1e3a43e7 100644 --- a/tokens/pda-mint-authority/quasar/README.md +++ b/tokens/pda-mint-authority/quasar/README.md @@ -8,6 +8,8 @@ See also: [Pda Mint Authority overview](../README.md) and the [repository catalo - PDA mint authority - mint_to CPI +- `create_mint` takes a `decimals` instruction argument and initializes the mint with it +- `mint_tokens` takes `amount` in minor units, the raw integer the token program operates on ## Setup diff --git a/tokens/pda-mint-authority/quasar/src/lib.rs b/tokens/pda-mint-authority/quasar/src/lib.rs index 650a9ccb..9a7dfc68 100644 --- a/tokens/pda-mint-authority/quasar/src/lib.rs +++ b/tokens/pda-mint-authority/quasar/src/lib.rs @@ -26,15 +26,22 @@ pub struct MintPda; mod quasar_pda_mint_authority { use super::*; - /// Create a token mint at a PDA. The PDA is its own mint authority. + /// Create a token mint at a PDA with the caller-supplied number of + /// decimals. The PDA is its own mint authority. #[instruction(discriminator = 0)] - pub fn create_mint(ctx: Ctx, _decimals: u8) -> Result<(), ProgramError> { - handle_create_mint(&mut ctx.accounts, ctx.bumps.mint) + pub fn create_mint( + ctx: Ctx, + decimals: u8, + ) -> Result<(), ProgramError> { + handle_create_mint(&mut ctx.accounts, decimals, ctx.bumps.mint) } - /// Mint tokens using the PDA mint authority. + /// Mint `amount` minor units using the PDA mint authority. #[instruction(discriminator = 1)] - pub fn mint_tokens(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { + pub fn mint_tokens( + ctx: Ctx, + amount: u64, + ) -> Result<(), ProgramError> { handle_mint_tokens(&mut ctx.accounts, amount, ctx.bumps.mint) } } @@ -42,7 +49,7 @@ mod quasar_pda_mint_authority { /// Create the mint at a PDA. Manually created and initialized to avoid /// a borrow conflict from `mint(authority = mint)` in the init constraint. #[derive(Accounts)] -pub struct CreateMint { +pub struct CreateMintAccountConstraints { #[account(mut)] pub payer: Signer, /// The PDA that will become the mint (and its own authority). @@ -53,7 +60,11 @@ pub struct CreateMint { } #[inline(always)] -fn handle_create_mint(accounts: &mut CreateMint, bump: u8) -> Result<(), ProgramError> { +fn handle_create_mint( + accounts: &mut CreateMintAccountConstraints, + decimals: u8, + bump: u8, +) -> Result<(), ProgramError> { let mint_address = *accounts.mint.address(); let bump_bytes = [bump]; let seeds: &[Seed] = &[ @@ -77,7 +88,7 @@ fn handle_create_mint(accounts: &mut CreateMint, bump: u8) -> Result<(), Program initialize_mint2( accounts.token_program.to_account_view(), accounts.mint.to_account_view(), - 9, + decimals, &mint_address, None, ) @@ -86,7 +97,7 @@ fn handle_create_mint(accounts: &mut CreateMint, bump: u8) -> Result<(), Program /// Mint tokens to a token account, signing with the PDA mint authority. #[derive(Accounts)] -pub struct MintTokens { +pub struct MintTokensAccountConstraints { #[account(mut)] pub payer: Signer, /// The PDA mint whose authority is itself. @@ -105,7 +116,11 @@ pub struct MintTokens { } #[inline(always)] -fn handle_mint_tokens(accounts: &mut MintTokens, amount: u64, mint_bump: u8) -> Result<(), ProgramError> { +fn handle_mint_tokens( + accounts: &mut MintTokensAccountConstraints, + amount: u64, + mint_bump: u8, +) -> Result<(), ProgramError> { let bump = [mint_bump]; let seeds: &[Seed] = &[ Seed::from(b"mint" as &[u8]), diff --git a/tokens/pda-mint-authority/quasar/src/tests.rs b/tokens/pda-mint-authority/quasar/src/tests.rs index 1fa3244b..3f9cbb81 100644 --- a/tokens/pda-mint-authority/quasar/src/tests.rs +++ b/tokens/pda-mint-authority/quasar/src/tests.rs @@ -76,9 +76,12 @@ fn test_create_mint() { let token_program = quasar_svm::SPL_TOKEN_PROGRAM_ID; let system_program = quasar_svm::system_program::ID; - let data = build_create_mint_data(9); + // Deliberately not 9: proves the decimals instruction argument reaches + // the initialize_mint2 CPI instead of being hardcoded. + let requested_decimals = 6u8; + let data = build_create_mint_data(requested_decimals); - // Account order matches the `CreateMint` Accounts struct: + // Account order matches the `CreateMintAccountConstraints` struct: // payer, mint, token_program, system_program. let instruction = Instruction { program_id: crate::ID, @@ -93,6 +96,15 @@ fn test_create_mint() { let result = svm.process_instruction(&instruction, &[signer(payer), empty(mint_pda)]); assert!(result.is_ok(), "create_mint failed: {:?}", result.raw_result); + + // The created mint must carry the requested decimals, and be its own + // mint authority. + let created_mint = result.account(&mint_pda).expect("mint should exist"); + let mint_state = + ::unpack(&created_mint.data).expect("valid mint"); + assert_eq!(mint_state.decimals, requested_decimals); + assert_eq!(mint_state.mint_authority, Some(mint_pda).into()); + println!(" CREATE MINT CU: {}", result.compute_units_consumed); } From 4bbbc7ffbb182d9045809087c701aa8552ad6f13 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 22:44:27 +0000 Subject: [PATCH 066/138] shank-and-codama, close-account, transfer-sol, pyth: signer/owner checks, full-lamport closes, oracle validation shank-and-codama/native: - pick_up_car/return_car never checked payer.is_signer while deriving the rental PDA from payer.key: anyone could flip anyone's rental status. Signer, owner, and canonical-PDA checks added with named errors - status transitions enforced (Created -> PickedUp -> Returned); assert! account validation replaced with proper errors; IDL and generated client updated; attack-path TS tests added close-account: - native and pinocchio closed accounts by moving lamports minus minimum_balance(0), stranding ~890k lamports at an unsignable PDA, with no signer check and no PDA-ownership check: anyone could close anyone's account. All lamports now move, payer must sign, and the target must be the payer's own User PDA - pinocchio additionally trusted a client-supplied bump and panicked on short instruction data; bump verified, data bounds-checked - quasar twin had the same unbound-account hole in close_user; PDA-bound - native TS suite migrated from bankrun (cannot execute current platform-tools binaries, pre-existing) to LiteSVM transfer-sol: - quasar's doc comment claimed an owner constraint that did not exist; the real constraint is now enforced, and all three variants use checked lamport arithmetic with named errors and rejection tests pyth: - quasar accepted any account with plausible bytes as a price update; owner now checked against the Pyth Receiver program - both variants gained a 60-second freshness check on publish_time (the only freshness signal the Pyth message carries; commented per the oracle rules) with boundary tests in both suites https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- basics/close-account/quasar/README.md | 1 + basics/close-account/quasar/src/tests.rs | 4 +- basics/pyth/anchor/README.md | 2 + .../anchor/programs/pythexample/Cargo.toml | 6 + .../anchor/programs/pythexample/src/lib.rs | 26 +++++ .../programs/pythexample/tests/test_pyth.rs | 82 +++++++++++--- basics/pyth/quasar/README.md | 2 + .../quasar/src/instructions/read_price.rs | 52 ++++++++- basics/pyth/quasar/src/lib.rs | 2 +- basics/pyth/quasar/src/tests.rs | 103 +++++++++++++----- basics/transfer-sol/quasar/README.md | 1 + 11 files changed, 230 insertions(+), 51 deletions(-) diff --git a/basics/close-account/quasar/README.md b/basics/close-account/quasar/README.md index 6989dfeb..154f4789 100644 --- a/basics/close-account/quasar/README.md +++ b/basics/close-account/quasar/README.md @@ -8,6 +8,7 @@ See also: the [repository catalog](../../../README.md). - PDA init and close - Rent reclamation +- `close_user` binds the user account to the signer's own PDA, so only the account's owner can close it ## Setup diff --git a/basics/close-account/quasar/src/tests.rs b/basics/close-account/quasar/src/tests.rs index 60c73d59..3ef71dc0 100644 --- a/basics/close-account/quasar/src/tests.rs +++ b/basics/close-account/quasar/src/tests.rs @@ -162,7 +162,7 @@ fn test_close_user_rejects_non_owner() { let victim_account_after_create = result.account(&victim_account).unwrap().clone(); // The attacker signs as `user` but passes the victim's account: the - // address constraint must reject it before any lamports move. + // PDA derivation check must reject it before any lamports move. let close_ix = Instruction { program_id, accounts: vec![ @@ -176,6 +176,6 @@ fn test_close_user_rejects_non_owner() { &[signer(attacker), victim_account_after_create], ); result.assert_error(quasar_svm::ProgramError::Custom( - quasar_lang::prelude::QuasarError::AddressMismatch as u32, + quasar_lang::prelude::QuasarError::InvalidPda as u32, )); } diff --git a/basics/pyth/anchor/README.md b/basics/pyth/anchor/README.md index c26f49dc..f5cc8650 100644 --- a/basics/pyth/anchor/README.md +++ b/basics/pyth/anchor/README.md @@ -21,6 +21,8 @@ See also: [Pyth overview](../README.md) and the [repository catalog](../../../RE - Oracle price accounts - Consuming external onchain data in a program +- Oracle account validation: `Account` enforces that the price account is owned by the Pyth Receiver program (`rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ`) +- Price freshness: `read_price` rejects updates older than `MAXIMUM_PRICE_AGE_SECONDS` (compared against `publish_time`, a unix timestamp in seconds, mirroring the SDK's `get_price_no_older_than`) ## Setup diff --git a/basics/pyth/anchor/programs/pythexample/Cargo.toml b/basics/pyth/anchor/programs/pythexample/Cargo.toml index 2acfd580..ff98f3e7 100644 --- a/basics/pyth/anchor/programs/pythexample/Cargo.toml +++ b/basics/pyth/anchor/programs/pythexample/Cargo.toml @@ -24,6 +24,12 @@ custom-panic = [] anchor-lang = "1.0.0" [dev-dependencies] +# Self-dependency with no-entrypoint: host test builds otherwise export a +# #[no_mangle] `entrypoint` symbol from this crate AND from spl-token (via +# solana-kite), and the linker rejects the duplicate. The SBF build +# (cargo build-sbf) ignores dev-dependencies, so the deployed program keeps +# its entrypoint. +pythexample = { path = ".", features = ["no-entrypoint"] } litesvm = "0.11.0" solana-signer = "3.0.0" solana-keypair = "3.0.1" diff --git a/basics/pyth/anchor/programs/pythexample/src/lib.rs b/basics/pyth/anchor/programs/pythexample/src/lib.rs index 3e1fe8b2..30a46024 100644 --- a/basics/pyth/anchor/programs/pythexample/src/lib.rs +++ b/basics/pyth/anchor/programs/pythexample/src/lib.rs @@ -5,12 +5,38 @@ declare_id!("GUkjQmrLPFXXNK1bFLKt8XQi6g3TjxcHVspbjDoHvMG2"); /// The Pyth Receiver program that owns `PriceUpdateV2` accounts on devnet/mainnet. pub const PYTH_RECEIVER_PROGRAM_ID: Pubkey = pubkey!("rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ"); +/// Maximum allowed age of a price update before it is rejected as stale. +/// Pyth's `publish_time` is a unix timestamp in seconds, so the age check +/// uses unix time rather than slots: seconds are the only freshness signal +/// the price message carries (this mirrors the official +/// `pyth-solana-receiver-sdk`'s `get_price_no_older_than`). +pub const MAXIMUM_PRICE_AGE_SECONDS: i64 = 60; + +#[error_code] +pub enum PythExampleError { + #[msg("The price update is older than the maximum allowed age")] + PriceTooOld, + #[msg("Computing the price update's age overflowed an i64")] + MathOverflow, +} + #[program] pub mod anchor_test { use super::*; pub fn read_price(context: Context) -> Result<()> { let price_update = &context.accounts.price_update; + + // Reject stale prices: a price that stopped updating is wrong. + let price_age_seconds = Clock::get()? + .unix_timestamp + .checked_sub(price_update.price_message.publish_time) + .ok_or(PythExampleError::MathOverflow)?; + require!( + price_age_seconds <= MAXIMUM_PRICE_AGE_SECONDS, + PythExampleError::PriceTooOld + ); + msg!("Price feed id: {:?}", price_update.price_message.feed_id); msg!("Price: {:?}", price_update.price_message.price); msg!("Confidence: {:?}", price_update.price_message.conf); diff --git a/basics/pyth/anchor/programs/pythexample/tests/test_pyth.rs b/basics/pyth/anchor/programs/pythexample/tests/test_pyth.rs index 03fb9a4f..fd91f7ec 100644 --- a/basics/pyth/anchor/programs/pythexample/tests/test_pyth.rs +++ b/basics/pyth/anchor/programs/pythexample/tests/test_pyth.rs @@ -1,11 +1,18 @@ use { - anchor_lang::{solana_program::instruction::Instruction, InstructionData, ToAccountMetas}, + anchor_lang::{ + solana_program::{clock::Clock, instruction::Instruction}, + InstructionData, ToAccountMetas, + }, litesvm::LiteSVM, + pythexample::MAXIMUM_PRICE_AGE_SECONDS, solana_keypair::Keypair, solana_kite::{create_wallet, send_transaction_from_instructions}, solana_signer::Signer, }; +/// The `publish_time` baked into the mock price update below. +const MOCK_PUBLISH_TIME: i64 = 1_700_000_000; + /// Pyth Receiver program ID (rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ) fn pyth_receiver_program_id() -> anchor_lang::solana_program::pubkey::Pubkey { pythexample::PYTH_RECEIVER_PROGRAM_ID @@ -47,8 +54,7 @@ fn build_mock_price_update_account( data.extend_from_slice(&exponent.to_le_bytes()); // publish_time: i64 - let publish_time: i64 = 1_700_000_000; - data.extend_from_slice(&publish_time.to_le_bytes()); + data.extend_from_slice(&MOCK_PUBLISH_TIME.to_le_bytes()); // prev_publish_time: i64 let prev_publish_time: i64 = 1_699_999_999; @@ -69,20 +75,25 @@ fn build_mock_price_update_account( data } -#[test] -fn test_read_price() { +/// Set the test clock so the mock price update is `age_seconds` old. +fn set_clock_to_price_age(svm: &mut LiteSVM, age_seconds: i64) { + let mut clock: Clock = svm.get_sysvar(); + clock.unix_timestamp = MOCK_PUBLISH_TIME + age_seconds; + svm.set_sysvar(&clock); +} + +fn setup_with_price_account( + owner: anchor_lang::solana_program::pubkey::Pubkey, +) -> (LiteSVM, solana_keypair::Keypair, Keypair) { let program_id = pythexample::id(); let mut svm = LiteSVM::new(); let bytes = include_bytes!("../../../target/deploy/pythexample.so"); svm.add_program(program_id, bytes).unwrap(); let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); - // Create a mock PriceUpdateV2 account + // Create a mock PriceUpdateV2 account with the given owner. let price_update_key = Keypair::new(); let account_data = build_mock_price_update_account(&payer.pubkey()); - - // Set the account in LiteSVM with the Pyth Receiver program as owner - let pyth_receiver_id = pyth_receiver_program_id(); let rent = svm.minimum_balance_for_rent_exemption(account_data.len()); svm.set_account( @@ -90,23 +101,62 @@ fn test_read_price() { solana_account::Account { lamports: rent, data: account_data, - owner: pyth_receiver_id, + owner, executable: false, rent_epoch: 0, }, ) .unwrap(); - // Call read_price - program just reads the account and logs the price info + (svm, payer, price_update_key) +} + +fn read_price_instruction(price_update: anchor_lang::solana_program::pubkey::Pubkey) -> Instruction { let ix_data = pythexample::instruction::ReadPrice {}.data(); + let accounts = pythexample::accounts::ReadPrice { price_update }.to_account_metas(None); + Instruction::new_with_bytes(pythexample::id(), &ix_data, accounts) +} - let accounts = pythexample::accounts::ReadPrice { - price_update: price_update_key.pubkey(), - } - .to_account_metas(None); +#[test] +fn test_read_price() { + let (mut svm, payer, price_update_key) = setup_with_price_account(pyth_receiver_program_id()); - let instruction = Instruction::new_with_bytes(program_id, &ix_data, accounts); + // A price exactly at the maximum allowed age is still accepted. + set_clock_to_price_age(&mut svm, MAXIMUM_PRICE_AGE_SECONDS); + let instruction = read_price_instruction(price_update_key.pubkey()); send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()) .unwrap(); } + +#[test] +fn test_read_price_rejects_stale_price() { + let (mut svm, payer, price_update_key) = setup_with_price_account(pyth_receiver_program_id()); + + // One second past the maximum age: rejected as stale. + set_clock_to_price_age(&mut svm, MAXIMUM_PRICE_AGE_SECONDS + 1); + + let instruction = read_price_instruction(price_update_key.pubkey()); + let result = + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()); + assert!(result.is_err(), "a stale price update must be rejected"); +} + +#[test] +fn test_read_price_rejects_wrong_owner() { + // Plausible price data, but the account is owned by some random program + // instead of the Pyth Receiver: Anchor's Account owner + // check must reject it. + let fake_owner = Keypair::new().pubkey(); + let (mut svm, payer, price_update_key) = setup_with_price_account(fake_owner); + + set_clock_to_price_age(&mut svm, 0); + + let instruction = read_price_instruction(price_update_key.pubkey()); + let result = + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "a price account not owned by the Pyth Receiver must be rejected" + ); +} diff --git a/basics/pyth/quasar/README.md b/basics/pyth/quasar/README.md index 4b7fba4f..feaeb88e 100644 --- a/basics/pyth/quasar/README.md +++ b/basics/pyth/quasar/README.md @@ -8,6 +8,8 @@ See also: [Pyth overview](../README.md) and the [repository catalog](../../../RE - Oracle accounts - Price feed layout +- Oracle account validation: `read_price` only accepts accounts owned by the Pyth Receiver program (`rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ`) +- Price freshness: updates older than `MAXIMUM_PRICE_AGE_SECONDS` are rejected (compared against `publish_time`, a unix timestamp in seconds) ## Setup diff --git a/basics/pyth/quasar/src/instructions/read_price.rs b/basics/pyth/quasar/src/instructions/read_price.rs index 9c28d901..7da158b9 100644 --- a/basics/pyth/quasar/src/instructions/read_price.rs +++ b/basics/pyth/quasar/src/instructions/read_price.rs @@ -1,4 +1,29 @@ -use quasar_lang::prelude::*; +use quasar_lang::{prelude::*, sysvars::Sysvar}; + +/// The Pyth Receiver program that owns `PriceUpdateV2` accounts on +/// devnet/mainnet (same constant as the Anchor twin). +pub const PYTH_RECEIVER_PROGRAM_ID: Address = + address!("rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ"); + +/// Maximum allowed age of a price update before it is rejected as stale. +/// Pyth's `publish_time` is a unix timestamp in seconds, so the age check +/// uses unix time rather than slots: seconds are the only freshness signal +/// the price message carries (this mirrors the official +/// `pyth-solana-receiver-sdk`'s `get_price_no_older_than`). +pub const MAXIMUM_PRICE_AGE_SECONDS: i64 = 60; + +/// Errors for reading Pyth price updates. Codes start at 6000, the same +/// offset Anchor uses for custom errors. +#[error_code] +pub enum PythExampleError { + /// The price update account is not owned by the Pyth Receiver program, + /// so its bytes cannot be trusted as a `PriceUpdateV2`. + PriceUpdateNotOwnedByPythReceiver = 6000, + /// The price update is older than `MAXIMUM_PRICE_AGE_SECONDS`. + PriceTooOld, + /// Computing the price update's age overflowed an i64. + MathOverflow, +} /// Byte layout offsets for a Pyth PriceUpdateV2 account: /// [0..8] Anchor discriminator @@ -16,16 +41,22 @@ const PUBLISH_TIME_OFFSET: usize = 93; const MIN_DATA_LEN: usize = 101; /// Accounts for reading a Pyth PriceUpdateV2 account. -/// Uses `UncheckedAccount` because Quasar does not have a built-in Pyth account type; -/// the caller is responsible for passing a valid PriceUpdateV2 account. +/// Uses `UncheckedAccount` because Quasar does not have a built-in Pyth +/// account type; the `constraints(...)` check below enforces that the +/// account is owned by the Pyth Receiver program, so an attacker cannot +/// substitute an arbitrary account with plausible bytes. #[derive(Accounts)] -pub struct ReadPrice { +pub struct ReadPriceAccountConstraints { /// The Pyth PriceUpdateV2 price update account. + #[account( + constraints(price_update.to_account_view().owner() == &PYTH_RECEIVER_PROGRAM_ID) + @ PythExampleError::PriceUpdateNotOwnedByPythReceiver + )] pub price_update: UncheckedAccount, } #[inline(always)] -pub fn handle_read_price(accounts: &mut ReadPrice) -> Result<(), ProgramError> { +pub fn handle_read_price(accounts: &mut ReadPriceAccountConstraints) -> Result<(), ProgramError> { let view = accounts.price_update.to_account_view(); let data = unsafe { core::slice::from_raw_parts(view.data_ptr(), view.data_len()) }; @@ -48,12 +79,21 @@ pub fn handle_read_price(accounts: &mut ReadPrice) -> Result<(), ProgramError> { .try_into() .map_err(|_| ProgramError::InvalidAccountData)?, ); - let _publish_time = i64::from_le_bytes( + let publish_time = i64::from_le_bytes( data[PUBLISH_TIME_OFFSET..PUBLISH_TIME_OFFSET + 8] .try_into() .map_err(|_| ProgramError::InvalidAccountData)?, ); + // Reject stale prices: a price that stopped updating is wrong. + let now: i64 = Clock::get()?.unix_timestamp.into(); + let price_age_seconds = now + .checked_sub(publish_time) + .ok_or(PythExampleError::MathOverflow)?; + if price_age_seconds > MAXIMUM_PRICE_AGE_SECONDS { + return Err(PythExampleError::PriceTooOld.into()); + } + log("Pyth price feed data read successfully."); Ok(()) diff --git a/basics/pyth/quasar/src/lib.rs b/basics/pyth/quasar/src/lib.rs index 87c23f22..e52d3c74 100644 --- a/basics/pyth/quasar/src/lib.rs +++ b/basics/pyth/quasar/src/lib.rs @@ -15,7 +15,7 @@ mod quasar_pyth_example { /// Read and log Pyth price feed data from a PriceUpdateV2 account. #[instruction(discriminator = 0)] - pub fn read_price(ctx: Ctx) -> Result<(), ProgramError> { + pub fn read_price(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_read_price(&mut ctx.accounts) } } diff --git a/basics/pyth/quasar/src/tests.rs b/basics/pyth/quasar/src/tests.rs index 03b53c82..f71a2517 100644 --- a/basics/pyth/quasar/src/tests.rs +++ b/basics/pyth/quasar/src/tests.rs @@ -1,6 +1,13 @@ use quasar_svm::{Account, Instruction, Pubkey, QuasarSvm}; use solana_address::Address; +use crate::instructions::{ + PythExampleError, MAXIMUM_PRICE_AGE_SECONDS, PYTH_RECEIVER_PROGRAM_ID, +}; + +/// The `publish_time` baked into the mock price update below. +const MOCK_PUBLISH_TIME: i64 = 1_700_000_000; + fn setup() -> QuasarSvm { let elf = include_bytes!("../target/deploy/quasar_pyth_example.so"); QuasarSvm::new().with_program(&Pubkey::from(crate::ID), elf) @@ -16,8 +23,8 @@ fn setup() -> QuasarSvm { /// [73..81] price = 15_000_000_000 i64 LE (150.00 USD @ exponent -8) /// [81..89] conf = 100_000 u64 LE /// [89..93] exponent = -8 i32 LE -/// [93..101] publish_time = 1_700_000_000 i64 LE -/// [101..109] prev_publish_time = 1_699_999_999 i64 LE +/// [93..101] publish_time = MOCK_PUBLISH_TIME i64 LE +/// [101..109] prev_publish_time = MOCK_PUBLISH_TIME - 1 i64 LE /// [109..117] ema_price = 14_900_000_000 i64 LE /// [117..125] ema_conf = 120_000 u64 LE /// [125..133] posted_slot = 42 u64 LE @@ -27,45 +34,89 @@ fn build_mock_price_update_account() -> Vec { data.extend_from_slice(&discriminator); data.extend_from_slice(&[0u8; 32]); // write_authority - data.push(1u8); // verification_level: Full + data.push(1u8); // verification_level: Full data.extend_from_slice(&[0xEFu8; 32]); // feed_id data.extend_from_slice(&15_000_000_000i64.to_le_bytes()); // price - data.extend_from_slice(&100_000u64.to_le_bytes()); // conf - data.extend_from_slice(&(-8i32).to_le_bytes()); // exponent - data.extend_from_slice(&1_700_000_000i64.to_le_bytes()); // publish_time - data.extend_from_slice(&1_699_999_999i64.to_le_bytes()); // prev_publish_time + data.extend_from_slice(&100_000u64.to_le_bytes()); // conf + data.extend_from_slice(&(-8i32).to_le_bytes()); // exponent + data.extend_from_slice(&MOCK_PUBLISH_TIME.to_le_bytes()); // publish_time + data.extend_from_slice(&(MOCK_PUBLISH_TIME - 1).to_le_bytes()); // prev_publish_time data.extend_from_slice(&14_900_000_000i64.to_le_bytes()); // ema_price - data.extend_from_slice(&120_000u64.to_le_bytes()); // ema_conf - data.extend_from_slice(&42u64.to_le_bytes()); // posted_slot + data.extend_from_slice(&120_000u64.to_le_bytes()); // ema_conf + data.extend_from_slice(&42u64.to_le_bytes()); // posted_slot data } -#[test] -fn test_read_price() { - let mut svm = setup(); - - let price_update = Pubkey::new_unique(); - let account_data = build_mock_price_update_account(); - - let price_account = Account { - address: price_update, +fn price_update_account(address: Pubkey, owner: Pubkey) -> Account { + Account { + address, lamports: 1_000_000_000, - data: account_data, - owner: Pubkey::new_unique(), // UncheckedAccount - no owner validation + data: build_mock_price_update_account(), + owner, executable: false, - }; + } +} - // Instruction data: discriminator = 0, no args. - let instruction = Instruction { +fn read_price_instruction(price_update: Pubkey) -> Instruction { + Instruction { program_id: Pubkey::from(crate::ID), accounts: vec![solana_instruction::AccountMeta::new_readonly( Address::from(price_update.to_bytes()), false, )], - data: vec![0u8], - }; + data: vec![0u8], // read_price discriminator + } +} + +#[test] +fn test_read_price() { + let mut svm = setup(); + + // A price exactly at the maximum allowed age is still accepted. + svm.warp_to_timestamp(MOCK_PUBLISH_TIME + MAXIMUM_PRICE_AGE_SECONDS); + + let price_update = Pubkey::new_unique(); + let price_account = + price_update_account(price_update, Pubkey::from(PYTH_RECEIVER_PROGRAM_ID)); - let result = svm.process_instruction(&instruction, &[price_account]); + let result = + svm.process_instruction(&read_price_instruction(price_update), &[price_account]); result.assert_success(); } + +#[test] +fn test_read_price_rejects_stale_price() { + let mut svm = setup(); + + // One second past the maximum age: rejected as stale. + svm.warp_to_timestamp(MOCK_PUBLISH_TIME + MAXIMUM_PRICE_AGE_SECONDS + 1); + + let price_update = Pubkey::new_unique(); + let price_account = + price_update_account(price_update, Pubkey::from(PYTH_RECEIVER_PROGRAM_ID)); + + let result = + svm.process_instruction(&read_price_instruction(price_update), &[price_account]); + result.assert_error(quasar_svm::ProgramError::Custom( + PythExampleError::PriceTooOld as u32, + )); +} + +#[test] +fn test_read_price_rejects_wrong_owner() { + let mut svm = setup(); + + svm.warp_to_timestamp(MOCK_PUBLISH_TIME); + + // Plausible price bytes, but the account is owned by some random program + // instead of the Pyth Receiver: the owner constraint must reject it. + let price_update = Pubkey::new_unique(); + let price_account = price_update_account(price_update, Pubkey::new_unique()); + + let result = + svm.process_instruction(&read_price_instruction(price_update), &[price_account]); + result.assert_error(quasar_svm::ProgramError::Custom( + PythExampleError::PriceUpdateNotOwnedByPythReceiver as u32, + )); +} diff --git a/basics/transfer-sol/quasar/README.md b/basics/transfer-sol/quasar/README.md index 26ff05fb..b285cc07 100644 --- a/basics/transfer-sol/quasar/README.md +++ b/basics/transfer-sol/quasar/README.md @@ -8,6 +8,7 @@ See also: [Transfer Sol overview](../README.md) and the [repository catalog](../ - System transfer CPI - Signer-funded lamports +- Direct lamport moves (`transfer_sol_with_program`) require the payer to be owned by this program, enforced by an account constraint, with checked balance math ## Setup From 11e1998517baadf2e8efbfdf32bc6a5be44aabe8 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 11 Jun 2026 13:59:52 +0000 Subject: [PATCH 067/138] wip: checkpoint of in-progress rename and ID-alignment sweeps Snapshot so agent work survives container recycling; verified states land in the following commits. https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- .../src/instructions/transfer_sol_with_cpi.rs | 4 ++-- basics/transfer-sol/quasar/src/lib.rs | 4 ++-- .../src/instructions/admin/withdraw_fees.rs | 6 +++--- .../order-book/src/instructions/cancel_order.rs | 4 ++-- .../src/instructions/create_market_user.rs | 4 ++-- .../src/instructions/initialize_market.rs | 4 ++-- .../order-book/src/instructions/place_order.rs | 6 +++--- .../order-book/src/instructions/settle_funds.rs | 6 +++--- .../anchor/programs/order-book/src/lib.rs | 12 ++++++------ .../programs/order-book/tests/test_order_book.rs | 16 ++++++++-------- 10 files changed, 33 insertions(+), 33 deletions(-) diff --git a/basics/transfer-sol/quasar/src/instructions/transfer_sol_with_cpi.rs b/basics/transfer-sol/quasar/src/instructions/transfer_sol_with_cpi.rs index 26d7ea62..03aae247 100644 --- a/basics/transfer-sol/quasar/src/instructions/transfer_sol_with_cpi.rs +++ b/basics/transfer-sol/quasar/src/instructions/transfer_sol_with_cpi.rs @@ -2,7 +2,7 @@ use quasar_lang::prelude::*; /// Accounts for transferring SOL via system program CPI. #[derive(Accounts)] -pub struct TransferSolWithCpi { +pub struct TransferSolWithCpiAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -11,7 +11,7 @@ pub struct TransferSolWithCpi { } #[inline(always)] -pub fn handle_transfer_sol_with_cpi(accounts: &mut TransferSolWithCpi, amount: u64) -> Result<(), ProgramError> { +pub fn handle_transfer_sol_with_cpi(accounts: &mut TransferSolWithCpiAccountConstraints, amount: u64) -> Result<(), ProgramError> { accounts.system_program .transfer(&accounts.payer, &accounts.recipient, amount) .invoke() diff --git a/basics/transfer-sol/quasar/src/lib.rs b/basics/transfer-sol/quasar/src/lib.rs index ce4c113a..ca73e5ad 100644 --- a/basics/transfer-sol/quasar/src/lib.rs +++ b/basics/transfer-sol/quasar/src/lib.rs @@ -7,7 +7,7 @@ use instructions::*; #[cfg(test)] mod tests; -declare_id!("G4eCqMUNnR2q7Ej9Ep2rURUM4gXdZ7RswqU9QPjgSGrz"); +declare_id!("4fQVnLWKKKYxtxgGn7Haw8v2g2Hzbu8K61JvWKvqAi7W"); #[program] mod quasar_transfer_sol { @@ -16,7 +16,7 @@ mod quasar_transfer_sol { /// Transfer SOL from payer to recipient via system program CPI. #[instruction(discriminator = 0)] pub fn transfer_sol_with_cpi( - ctx: Ctx, + ctx: Ctx, amount: u64, ) -> Result<(), ProgramError> { instructions::handle_transfer_sol_with_cpi(&mut ctx.accounts, amount) diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/admin/withdraw_fees.rs b/finance/order-book/anchor/programs/order-book/src/instructions/admin/withdraw_fees.rs index c8f9a8cc..2afc3183 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/admin/withdraw_fees.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/admin/withdraw_fees.rs @@ -11,7 +11,7 @@ use crate::state::{Market, MARKET_SEED}; /// the fee vault. Transfers the current balance of the fee vault in full; /// a partial-withdraw flavour could take an amount parameter, left out here /// to keep the example focused. -pub fn handle_withdraw_fees(context: Context) -> Result<()> { +pub fn handle_withdraw_fees(context: Context) -> Result<()> { let market = &context.accounts.market; require!( @@ -55,14 +55,14 @@ pub fn handle_withdraw_fees(context: Context) -> Result<()> { } #[derive(Accounts)] -pub struct WithdrawFees<'info> { +pub struct WithdrawFeesAccountConstraints<'info> { #[account( mut, has_one = fee_vault @ ErrorCode::InvalidFeeVault, )] pub market: Account<'info, Market>, - // Boxed to keep the struct under the BPF stack limit (see PlaceOrder). + // Boxed to keep the struct under the BPF stack limit (see PlaceOrderAccountConstraints). #[account(mut)] pub fee_vault: Box>, diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs b/finance/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs index 1759cd74..e03064d1 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/cancel_order.rs @@ -6,7 +6,7 @@ use crate::state::{ MarketUser, ORDER_SEED, MARKET_USER_SEED, }; -pub fn handle_cancel_order(context: Context) -> Result<()> { +pub fn handle_cancel_order(context: Context) -> Result<()> { let order = &mut context.accounts.order; require!( @@ -72,7 +72,7 @@ pub fn handle_cancel_order(context: Context) -> Result<()> { } #[derive(Accounts)] -pub struct CancelOrder<'info> { +pub struct CancelOrderAccountConstraints<'info> { #[account(has_one = order_book @ ErrorCode::InvalidOrderBook)] pub market: Account<'info, Market>, diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/create_market_user.rs b/finance/order-book/anchor/programs/order-book/src/instructions/create_market_user.rs index 25d28665..11fcf316 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/create_market_user.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/create_market_user.rs @@ -2,7 +2,7 @@ use anchor_lang::prelude::*; use crate::state::{Market, MarketUser, MARKET_USER_SEED}; -pub fn handle_create_market_user(context: Context) -> Result<()> { +pub fn handle_create_market_user(context: Context) -> Result<()> { let market_user = &mut context.accounts.market_user; market_user.market = context.accounts.market.key(); market_user.owner = context.accounts.owner.key(); @@ -15,7 +15,7 @@ pub fn handle_create_market_user(context: Context) -> Result<( } #[derive(Accounts)] -pub struct CreateMarketUser<'info> { +pub struct CreateMarketUserAccountConstraints<'info> { #[account( init, payer = owner, diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs b/finance/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs index 384a2432..99f56a5b 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs @@ -9,7 +9,7 @@ use crate::state::{Market, OrderBook, MARKET_SEED}; const MAX_FEE_BASIS_POINTS: u16 = 10_000; pub fn handle_initialize_market( - context: Context, + context: Context, fee_basis_points: u16, tick_size: u64, base_lot_size: u64, @@ -52,7 +52,7 @@ pub fn handle_initialize_market( } #[derive(Accounts)] -pub struct InitializeMarket<'info> { +pub struct InitializeMarketAccountConstraints<'info> { #[account( init, payer = authority, diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/place_order.rs b/finance/order-book/anchor/programs/order-book/src/instructions/place_order.rs index 3c63baea..a00ccfbf 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/place_order.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/place_order.rs @@ -10,7 +10,7 @@ use crate::state::{ }; // Mirror of MarketUser.open_orders max_len. Kept as a constant so the -// PlaceOrder check reads clearly and the limit is documented in one place. +// PlaceOrderAccountConstraints check reads clearly and the limit is documented in one place. const MAX_OPEN_ORDERS_PER_USER: usize = 20; // Basis-points denominator. 10_000 bps == 100% - the universal rate convention @@ -26,7 +26,7 @@ const BASIS_POINTS_DENOMINATOR: u128 = 10_000; const ACCOUNTS_PER_MAKER: usize = 2; pub fn handle_place_order<'info>( - context: Context<'info, PlaceOrder<'info>>, + context: Context<'info, PlaceOrderAccountConstraints<'info>>, side: OrderSide, price: u64, quantity: u64, @@ -429,7 +429,7 @@ pub fn handle_place_order<'info>( #[derive(Accounts)] #[instruction(side: OrderSide, price: u64, quantity: u64)] -pub struct PlaceOrder<'info> { +pub struct PlaceOrderAccountConstraints<'info> { // `has_one` ties every market-owned account on this struct to the // addresses recorded on the Market PDA. Crucially, without // has_one on base_vault / quote_vault / base_mint / quote_mint a caller diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/settle_funds.rs b/finance/order-book/anchor/programs/order-book/src/instructions/settle_funds.rs index 5081fd3a..4a9f53ad 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/settle_funds.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/settle_funds.rs @@ -6,7 +6,7 @@ use anchor_spl::token_interface::{ use crate::errors::ErrorCode; use crate::state::{Market, MarketUser, MARKET_SEED, MARKET_USER_SEED}; -pub fn handle_settle_funds(context: Context) -> Result<()> { +pub fn handle_settle_funds(context: Context) -> Result<()> { let market_user = &mut context.accounts.market_user; let market = &context.accounts.market; @@ -71,7 +71,7 @@ pub fn handle_settle_funds(context: Context) -> Result<()> { } #[derive(Accounts)] -pub struct SettleFunds<'info> { +pub struct SettleFundsAccountConstraints<'info> { // `has_one` constraints bind these vaults/mints to the addresses stored // on the Market PDA at initialise_market time. Without them a caller // could substitute the fee_vault (same mint + same authority as @@ -94,7 +94,7 @@ pub struct SettleFunds<'info> { )] pub market_user: Account<'info, MarketUser>, - // Boxed for the same reason as in PlaceOrder - + // Boxed for the same reason as in PlaceOrderAccountConstraints - // InterfaceAccount is too large to keep on the BPF stack in bulk. #[account(mut)] pub base_vault: Box>, diff --git a/finance/order-book/anchor/programs/order-book/src/lib.rs b/finance/order-book/anchor/programs/order-book/src/lib.rs index 66549dda..c1583185 100644 --- a/finance/order-book/anchor/programs/order-book/src/lib.rs +++ b/finance/order-book/anchor/programs/order-book/src/lib.rs @@ -16,7 +16,7 @@ pub mod order_book { /// the order book PDA, and the two PDA-authority vaults that hold locked /// funds while orders are open. pub fn initialize_market( - context: Context, + context: Context, fee_basis_points: u16, tick_size: u64, base_lot_size: u64, @@ -35,7 +35,7 @@ pub mod order_book { /// Create a per-user, per-market account that tracks a user's open orders /// and unsettled balances. - pub fn create_market_user(context: Context) -> Result<()> { + pub fn create_market_user(context: Context) -> Result<()> { instructions::create_market_user::handle_create_market_user(context) } @@ -51,7 +51,7 @@ pub mod order_book { /// `(maker_order_pda, maker_user_account_pda)`, ordered by the /// book's price-time priority (i.e. best ask first for a taker bid). pub fn place_order<'info>( - context: Context<'info, PlaceOrder<'info>>, + context: Context<'info, PlaceOrderAccountConstraints<'info>>, side: state::OrderSide, price: u64, quantity: u64, @@ -62,19 +62,19 @@ pub mod order_book { /// Cancel an open (or partially filled) order. Credits the remaining /// locked amount back to the owner's unsettled balance; the actual token /// transfer happens on settle_funds. - pub fn cancel_order(context: Context) -> Result<()> { + pub fn cancel_order(context: Context) -> Result<()> { instructions::cancel_order::handle_cancel_order(context) } /// Move accumulated unsettled balances out of the market vault and into /// the user's token accounts. No-op if both balances are zero. - pub fn settle_funds(context: Context) -> Result<()> { + pub fn settle_funds(context: Context) -> Result<()> { instructions::settle_funds::handle_settle_funds(context) } /// Drain the fee vault into the market authority's token account. /// Authority-gated - only the market's stored `authority` may call this. - pub fn withdraw_fees(context: Context) -> Result<()> { + pub fn withdraw_fees(context: Context) -> Result<()> { instructions::withdraw_fees::handle_withdraw_fees(context) } } diff --git a/finance/order-book/anchor/programs/order-book/tests/test_order_book.rs b/finance/order-book/anchor/programs/order-book/tests/test_order_book.rs index 4d6ebdb5..00daf4c2 100644 --- a/finance/order-book/anchor/programs/order-book/tests/test_order_book.rs +++ b/finance/order-book/anchor/programs/order-book/tests/test_order_book.rs @@ -273,7 +273,7 @@ fn build_initialize_market_ix( min_order_size, } .data(), - order_book::accounts::InitializeMarket { + order_book::accounts::InitializeMarketAccountConstraints { market: sc.market, order_book: sc.order_book.pubkey(), base_mint: sc.base_mint, @@ -294,7 +294,7 @@ fn build_create_market_user_ix(sc: &Scenario, owner: &Pubkey) -> Instruction { Instruction::new_with_bytes( sc.program_id, &order_book::instruction::CreateMarketUser {}.data(), - order_book::accounts::CreateMarketUser { + order_book::accounts::CreateMarketUserAccountConstraints { market_user, market: sc.market, owner: *owner, @@ -325,7 +325,7 @@ fn build_place_order_ix( quantity, } .data(), - order_book::accounts::PlaceOrder { + order_book::accounts::PlaceOrderAccountConstraints { market: sc.market, order_book: sc.order_book.pubkey(), order, @@ -395,7 +395,7 @@ fn build_withdraw_fees_ix( Instruction::new_with_bytes( sc.program_id, &order_book::instruction::WithdrawFees {}.data(), - order_book::accounts::WithdrawFees { + order_book::accounts::WithdrawFeesAccountConstraints { market: sc.market, fee_vault: sc.fee_vault.pubkey(), authority_quote_account, @@ -417,7 +417,7 @@ fn build_cancel_order_ix( Instruction::new_with_bytes( sc.program_id, &order_book::instruction::CancelOrder {}.data(), - order_book::accounts::CancelOrder { + order_book::accounts::CancelOrderAccountConstraints { market: sc.market, order_book: sc.order_book.pubkey(), order, @@ -438,7 +438,7 @@ fn build_settle_funds_ix( Instruction::new_with_bytes( sc.program_id, &order_book::instruction::SettleFunds {}.data(), - order_book::accounts::SettleFunds { + order_book::accounts::SettleFundsAccountConstraints { market: sc.market, market_user, base_vault: sc.base_vault.pubkey(), @@ -1013,7 +1013,7 @@ fn cancel_and_settle_bid_refunds_full_quote() { } // Regression test for the fee-drain attack on settle_funds. Pre-fix, -// `SettleFunds` did not bind `quote_vault` to `market.quote_vault` via +// `SettleFundsAccountConstraints` did not bind `quote_vault` to `market.quote_vault` via // `has_one`, so a caller could pass `market.fee_vault` (same mint and // same authority) where `quote_vault` was expected and drain accumulated // taker fees while spending their own unsettled_quote credit. The @@ -1061,7 +1061,7 @@ fn settle_funds_rejects_fee_vault_substituted_for_quote_vault() { let attack_ix = Instruction::new_with_bytes( sc.program_id, &order_book::instruction::SettleFunds {}.data(), - order_book::accounts::SettleFunds { + order_book::accounts::SettleFundsAccountConstraints { market: sc.market, market_user: sc.buyer_market_user, base_vault: sc.base_vault.pubkey(), From ac0c6d201e9bd0171a1c4404d3db2d0821536de4 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 11 Jun 2026 14:17:06 +0000 Subject: [PATCH 068/138] transfer-sol/quasar: adopt anchor sibling's program ID; finish quasar AccountConstraints renames in counter, hello-solana, transfer-sol https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- basics/counter/quasar/src/instructions/increment.rs | 4 ++-- basics/counter/quasar/src/instructions/initialize_counter.rs | 4 ++-- basics/counter/quasar/src/lib.rs | 4 ++-- basics/hello-solana/quasar/src/instructions/hello.rs | 4 ++-- basics/hello-solana/quasar/src/lib.rs | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/basics/counter/quasar/src/instructions/increment.rs b/basics/counter/quasar/src/instructions/increment.rs index 4a44065b..a8c1a9d6 100644 --- a/basics/counter/quasar/src/instructions/increment.rs +++ b/basics/counter/quasar/src/instructions/increment.rs @@ -5,13 +5,13 @@ use { /// Accounts for incrementing a counter. #[derive(Accounts)] -pub struct Increment { +pub struct IncrementAccountConstraints { #[account(mut)] pub counter: Account, } #[inline(always)] -pub fn handle_increment(accounts: &mut Increment) -> Result<(), ProgramError> { +pub fn handle_increment(accounts: &mut IncrementAccountConstraints) -> Result<(), ProgramError> { let current: u64 = accounts.counter.count.into(); let next = current .checked_add(1) diff --git a/basics/counter/quasar/src/instructions/initialize_counter.rs b/basics/counter/quasar/src/instructions/initialize_counter.rs index d438f127..666951e8 100644 --- a/basics/counter/quasar/src/instructions/initialize_counter.rs +++ b/basics/counter/quasar/src/instructions/initialize_counter.rs @@ -4,7 +4,7 @@ use quasar_lang::prelude::*; /// Accounts for creating a new counter. /// The counter is derived as a PDA from ["counter", payer] seeds. #[derive(Accounts)] -pub struct InitializeCounter { +pub struct InitializeCounterAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut, init, payer = payer, address = Counter::seeds(payer.address()))] @@ -13,7 +13,7 @@ pub struct InitializeCounter { } #[inline(always)] -pub fn handle_initialize_counter(accounts: &mut InitializeCounter) -> Result<(), ProgramError> { +pub fn handle_initialize_counter(accounts: &mut InitializeCounterAccountConstraints) -> Result<(), ProgramError> { accounts.counter.set_inner(CounterInner { count: 0 }); Ok(()) } diff --git a/basics/counter/quasar/src/lib.rs b/basics/counter/quasar/src/lib.rs index 6dde8851..c1bf1ce2 100644 --- a/basics/counter/quasar/src/lib.rs +++ b/basics/counter/quasar/src/lib.rs @@ -16,12 +16,12 @@ mod quasar_counter { use super::*; #[instruction(discriminator = 0)] - pub fn initialize_counter(ctx: Ctx) -> Result<(), ProgramError> { + pub fn initialize_counter(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_initialize_counter(&mut ctx.accounts) } #[instruction(discriminator = 1)] - pub fn increment(ctx: Ctx) -> Result<(), ProgramError> { + pub fn increment(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_increment(&mut ctx.accounts) } } diff --git a/basics/hello-solana/quasar/src/instructions/hello.rs b/basics/hello-solana/quasar/src/instructions/hello.rs index ae2a3128..410c3b68 100644 --- a/basics/hello-solana/quasar/src/instructions/hello.rs +++ b/basics/hello-solana/quasar/src/instructions/hello.rs @@ -4,13 +4,13 @@ use quasar_lang::prelude::*; /// A payer (signer) is required to submit the transaction, but the program /// simply logs a greeting and the program ID. #[derive(Accounts)] -pub struct Hello { +pub struct HelloAccountConstraints { #[allow(dead_code)] pub payer: Signer, } #[inline(always)] -pub fn handle_hello(_accounts: &mut Hello) -> Result<(), ProgramError> { +pub fn handle_hello(_accounts: &mut HelloAccountConstraints) -> Result<(), ProgramError> { log("Hello, Solana!"); log("Our program's Program ID: 2phbC62wekpw95XuBk4i1KX4uA8zBUWmYbiTMhicSuBV"); Ok(()) diff --git a/basics/hello-solana/quasar/src/lib.rs b/basics/hello-solana/quasar/src/lib.rs index 73239ff0..9a9fbb4e 100644 --- a/basics/hello-solana/quasar/src/lib.rs +++ b/basics/hello-solana/quasar/src/lib.rs @@ -14,7 +14,7 @@ mod quasar_hello_solana { use super::*; #[instruction(discriminator = 0)] - pub fn hello(ctx: Ctx) -> Result<(), ProgramError> { + pub fn hello(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_hello(&mut ctx.accounts) } } From ec58c709f4b1c9d235112b98fecf5b734380f473 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 11 Jun 2026 14:17:30 +0000 Subject: [PATCH 069/138] wip: checkpoint of in-progress rename and ID-alignment sweeps Snapshot so agent work survives container recycling; verified states land in the following commits. https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- .../src/instructions/create.rs | 4 ++-- .../programs/anchor-program-example/src/lib.rs | 2 +- .../tests/test_account_data.rs | 2 +- .../account-data/quasar/src/instructions/create.rs | 4 ++-- basics/account-data/quasar/src/lib.rs | 2 +- .../programs/anchor-program-example/src/lib.rs | 4 ++-- .../tests/test_checking_accounts.rs | 2 +- .../quasar/src/instructions/check_accounts.rs | 4 ++-- basics/checking-accounts/quasar/src/lib.rs | 2 +- .../close-account/src/instructions/close_user.rs | 4 ++-- .../close-account/src/instructions/create_user.rs | 4 ++-- .../anchor/programs/close-account/src/lib.rs | 4 ++-- .../close-account/tests/test_close_account.rs | 4 ++-- .../quasar/src/instructions/create_user.rs | 4 ++-- basics/close-account/quasar/src/lib.rs | 2 +- .../anchor/programs/create-system-account/src/lib.rs | 4 ++-- .../tests/test_create_account.rs | 2 +- .../quasar/src/instructions/create_system_account.rs | 4 ++-- basics/create-account/quasar/src/lib.rs | 2 +- .../anchor/programs/hand/src/lib.rs | 4 ++-- .../anchor/programs/hand/tests/test_hand.rs | 4 ++-- .../programs/lever/src/instructions/initialize.rs | 4 ++-- .../programs/lever/src/instructions/switch_power.rs | 4 ++-- .../anchor/programs/lever/src/lib.rs | 4 ++-- .../anchor/programs/lever/tests/test_lever.rs | 8 ++++---- .../quasar/hand/src/instructions/pull_lever.rs | 4 ++-- .../cross-program-invocation/quasar/hand/src/lib.rs | 2 +- .../quasar/lever/src/instructions/initialize.rs | 4 ++-- .../quasar/lever/src/instructions/switch_power.rs | 4 ++-- .../cross-program-invocation/quasar/lever/src/lib.rs | 4 ++-- .../favorites/anchor/programs/favorites/src/lib.rs | 4 ++-- .../programs/favorites/tests/test_favorites.rs | 6 +++--- .../quasar/src/instructions/set_favorites.rs | 4 ++-- basics/favorites/quasar/src/lib.rs | 2 +- .../anchor/programs/hello-solana/src/lib.rs | 4 ++-- .../anchor/programs/hello-solana/tests/test_hello.rs | 2 +- .../src/instructions/create_new_account.rs | 4 ++-- .../src/instructions/init_rent_vault.rs | 4 ++-- .../programs/anchor-program-example/src/lib.rs | 4 ++-- .../tests/test_pda_rent_payer.rs | 6 +++--- .../quasar/src/instructions/create_new_account.rs | 4 ++-- .../quasar/src/instructions/init_rent_vault.rs | 4 ++-- basics/pda-rent-payer/quasar/src/lib.rs | 4 ++-- .../programs/processing-instructions/src/lib.rs | 4 ++-- .../tests/test_processing_instructions.rs | 4 ++-- .../quasar/src/instructions/go_to_park.rs | 4 ++-- basics/processing-instructions/quasar/src/lib.rs | 2 +- .../quasar/src/instructions/create.rs | 4 ++-- .../quasar/src/instructions/increment.rs | 4 ++-- basics/program-derived-addresses/quasar/src/lib.rs | 4 ++-- basics/pyth/anchor/programs/pythexample/src/lib.rs | 4 ++-- .../anchor/programs/pythexample/tests/test_pyth.rs | 2 +- .../cnft-burn/quasar/src/instructions/burn_cnft.rs | 4 ++-- compression/cnft-burn/quasar/src/lib.rs | 2 +- compression/cutils/quasar/src/instructions/mint.rs | 4 ++-- compression/cutils/quasar/src/instructions/verify.rs | 4 ++-- compression/cutils/quasar/src/lib.rs | 4 ++-- .../quasar/src/instructions/check_contributions.rs | 6 +++--- .../quasar/src/instructions/contribute.rs | 6 +++--- .../quasar/src/instructions/initialize.rs | 4 ++-- .../quasar/src/instructions/refund.rs | 4 ++-- finance/token-fundraiser/quasar/src/lib.rs | 8 ++++---- .../quasar/src/instructions/claim_admin_fees.rs | 6 +++--- .../quasar/src/instructions/create_config.rs | 4 ++-- .../quasar/src/instructions/create_pool.rs | 4 ++-- .../quasar/src/instructions/deposit_liquidity.rs | 6 +++--- .../quasar/src/instructions/swap_tokens.rs | 6 +++--- .../quasar/src/instructions/withdraw_liquidity.rs | 6 +++--- finance/token-swap/quasar/src/lib.rs | 12 ++++++------ .../betting-market/src/instructions/add_outcome.rs | 4 ++-- .../betting-market/src/instructions/cancel_event.rs | 4 ++-- .../betting-market/src/instructions/create_event.rs | 4 ++-- .../src/instructions/initialize_config.rs | 4 ++-- .../betting-market/src/instructions/settle_event.rs | 4 ++-- .../anchor/programs/betting-market/src/lib.rs | 10 +++++----- .../betting-market/tests/test_betting_market.rs | 10 +++++----- .../anchor/programs/create-token/src/lib.rs | 4 ++-- .../programs/create-token/tests/test_create_token.rs | 4 ++-- tokens/create-token/quasar/src/lib.rs | 2 +- tokens/create-token/quasar/src/tests.rs | 12 ++++++++++++ tokens/nft-operations/quasar/src/lib.rs | 2 +- .../programs/token-minter/src/instructions/create.rs | 4 ++-- .../anchor/programs/token-minter/src/lib.rs | 2 +- .../programs/token-minter/tests/test_pda_mint.rs | 4 ++-- tokens/pda-mint-authority/quasar/src/lib.rs | 2 +- tokens/pda-mint-authority/quasar/src/tests.rs | 12 ++++++++++++ .../instructions/create_associated_token_account.rs | 4 ++-- .../programs/basics/src/instructions/create_token.rs | 4 ++-- .../basics/src/instructions/create_token_account.rs | 4 ++-- .../programs/basics/src/instructions/mint_token.rs | 4 ++-- .../basics/src/instructions/transfer_token.rs | 4 ++-- .../basics/anchor/programs/basics/src/lib.rs | 10 +++++----- .../anchor/programs/basics/tests/test_basics.rs | 8 ++++---- tokens/token-extensions/basics/quasar/src/lib.rs | 12 ++++++------ .../programs/token-minter/src/instructions/create.rs | 4 ++-- .../anchor/programs/token-minter/src/lib.rs | 2 +- .../programs/token-minter/tests/test_token_minter.rs | 6 +++--- tokens/token-minter/quasar/src/lib.rs | 2 +- tokens/transfer-tokens/quasar/src/lib.rs | 2 +- 99 files changed, 229 insertions(+), 205 deletions(-) diff --git a/basics/account-data/anchor/programs/anchor-program-example/src/instructions/create.rs b/basics/account-data/anchor/programs/anchor-program-example/src/instructions/create.rs index 727a70f5..535efc85 100644 --- a/basics/account-data/anchor/programs/anchor-program-example/src/instructions/create.rs +++ b/basics/account-data/anchor/programs/anchor-program-example/src/instructions/create.rs @@ -2,7 +2,7 @@ use crate::state::AddressInfo; use anchor_lang::prelude::*; #[derive(Accounts)] -pub struct CreateAddressInfo<'info> { +pub struct CreateAddressInfoAccountConstraints<'info> { #[account(mut)] payer: Signer<'info>, @@ -16,7 +16,7 @@ pub struct CreateAddressInfo<'info> { } pub fn handle_create_address_info( - context: Context, + context: Context, name: String, house_number: u8, street: String, diff --git a/basics/account-data/anchor/programs/anchor-program-example/src/lib.rs b/basics/account-data/anchor/programs/anchor-program-example/src/lib.rs index d0e056d8..f5fd99da 100644 --- a/basics/account-data/anchor/programs/anchor-program-example/src/lib.rs +++ b/basics/account-data/anchor/programs/anchor-program-example/src/lib.rs @@ -11,7 +11,7 @@ pub mod account_data_anchor_program { use super::*; pub fn create_address_info( - context: Context, + context: Context, name: String, house_number: u8, street: String, diff --git a/basics/account-data/anchor/programs/anchor-program-example/tests/test_account_data.rs b/basics/account-data/anchor/programs/anchor-program-example/tests/test_account_data.rs index df3bac0a..567a816a 100644 --- a/basics/account-data/anchor/programs/anchor-program-example/tests/test_account_data.rs +++ b/basics/account-data/anchor/programs/anchor-program-example/tests/test_account_data.rs @@ -39,7 +39,7 @@ fn test_create_address_info() { city: "Solana Beach".to_string(), } .data(), - account_data_anchor_program::accounts::CreateAddressInfo { + account_data_anchor_program::accounts::CreateAddressInfoAccountConstraints { payer: payer.pubkey(), address_info: address_info_keypair.pubkey(), system_program: system_program::id(), diff --git a/basics/account-data/quasar/src/instructions/create.rs b/basics/account-data/quasar/src/instructions/create.rs index efd4fe73..423caa4f 100644 --- a/basics/account-data/quasar/src/instructions/create.rs +++ b/basics/account-data/quasar/src/instructions/create.rs @@ -5,7 +5,7 @@ use { /// Accounts for creating a new address info account. #[derive(Accounts)] -pub struct CreateAddressInfo { +pub struct CreateAddressInfoAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut, init, payer = payer, address = AddressInfo::seeds(payer.address()))] @@ -15,7 +15,7 @@ pub struct CreateAddressInfo { #[inline(always)] pub fn handle_create_address_info( - accounts: &mut CreateAddressInfo, + accounts: &mut CreateAddressInfoAccountConstraints, name: &str, house_number: u8, street: &str, diff --git a/basics/account-data/quasar/src/lib.rs b/basics/account-data/quasar/src/lib.rs index cc6bb40c..5063a4bd 100644 --- a/basics/account-data/quasar/src/lib.rs +++ b/basics/account-data/quasar/src/lib.rs @@ -24,7 +24,7 @@ mod quasar_account_data { /// pass them directly (not by reference) to the handler. #[instruction(discriminator = 0)] pub fn create_address_info( - ctx: Ctx, + ctx: Ctx, house_number: u8, name: String<50>, street: String<50>, diff --git a/basics/checking-accounts/anchor/programs/anchor-program-example/src/lib.rs b/basics/checking-accounts/anchor/programs/anchor-program-example/src/lib.rs index 7781ebdf..5cd90a85 100644 --- a/basics/checking-accounts/anchor/programs/anchor-program-example/src/lib.rs +++ b/basics/checking-accounts/anchor/programs/anchor-program-example/src/lib.rs @@ -6,7 +6,7 @@ declare_id!("ECWPhR3rJbaPfyNFgphnjxSEexbTArc7vxD8fnW6tgKw"); pub mod checking_account_program { use super::*; - pub fn check_accounts(_context: Context) -> Result<()> { + pub fn check_accounts(_context: Context) -> Result<()> { Ok(()) } } @@ -14,7 +14,7 @@ pub mod checking_account_program { // Account validation in Anchor is done using the types and constraints specified in the #[derive(Accounts)] structs // This is a simple example and does not include all possible constraints and types #[derive(Accounts)] -pub struct CheckingAccounts<'info> { +pub struct CheckingAccountsAccountConstraints<'info> { payer: Signer<'info>, // checks account is signer /// CHECK: No checks performed, example of an unchecked account diff --git a/basics/checking-accounts/anchor/programs/anchor-program-example/tests/test_checking_accounts.rs b/basics/checking-accounts/anchor/programs/anchor-program-example/tests/test_checking_accounts.rs index 33de2b6b..15cb4485 100644 --- a/basics/checking-accounts/anchor/programs/anchor-program-example/tests/test_checking_accounts.rs +++ b/basics/checking-accounts/anchor/programs/anchor-program-example/tests/test_checking_accounts.rs @@ -43,7 +43,7 @@ fn test_check_accounts() { let check_accounts_ix = Instruction::new_with_bytes( program_id, &checking_account_program::instruction::CheckAccounts {}.data(), - checking_account_program::accounts::CheckingAccounts { + checking_account_program::accounts::CheckingAccountsAccountConstraints { payer: payer.pubkey(), account_to_create: account_to_create.pubkey(), account_to_change: account_to_change.pubkey(), diff --git a/basics/checking-accounts/quasar/src/instructions/check_accounts.rs b/basics/checking-accounts/quasar/src/instructions/check_accounts.rs index 8a1f0f1b..8de395b3 100644 --- a/basics/checking-accounts/quasar/src/instructions/check_accounts.rs +++ b/basics/checking-accounts/quasar/src/instructions/check_accounts.rs @@ -8,7 +8,7 @@ use quasar_lang::prelude::*; /// Note: Anchor's `#[account(owner = id())]` owner constraint is not directly available /// in Quasar. Owner checks can be done manually in the instruction body if needed. #[derive(Accounts)] -pub struct CheckAccounts { +pub struct CheckAccountsAccountConstraints { /// Checks that this account signed the transaction. pub payer: Signer, /// No checks performed - the caller is responsible for validation. @@ -22,7 +22,7 @@ pub struct CheckAccounts { } #[inline(always)] -pub fn handle_check_accounts(_accounts: &mut CheckAccounts) -> Result<(), ProgramError> { +pub fn handle_check_accounts(_accounts: &mut CheckAccountsAccountConstraints) -> Result<(), ProgramError> { // All validation happens declaratively via the account types above. // If any check fails, the runtime rejects the transaction before this runs. Ok(()) diff --git a/basics/checking-accounts/quasar/src/lib.rs b/basics/checking-accounts/quasar/src/lib.rs index 43d52319..289910bb 100644 --- a/basics/checking-accounts/quasar/src/lib.rs +++ b/basics/checking-accounts/quasar/src/lib.rs @@ -18,7 +18,7 @@ mod quasar_checking_accounts { /// - UncheckedAccount: no validation (opt-in to unchecked access) /// - Program: checks account is executable and is the system program #[instruction(discriminator = 0)] - pub fn check_accounts(ctx: Ctx) -> Result<(), ProgramError> { + pub fn check_accounts(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_check_accounts(&mut ctx.accounts) } } diff --git a/basics/close-account/anchor/programs/close-account/src/instructions/close_user.rs b/basics/close-account/anchor/programs/close-account/src/instructions/close_user.rs index 978cfe24..6606fe22 100644 --- a/basics/close-account/anchor/programs/close-account/src/instructions/close_user.rs +++ b/basics/close-account/anchor/programs/close-account/src/instructions/close_user.rs @@ -2,7 +2,7 @@ use crate::state::*; use anchor_lang::prelude::*; #[derive(Accounts)] -pub struct CloseUserContext<'info> { +pub struct CloseUserAccountConstraints<'info> { #[account(mut)] pub user: Signer<'info>, @@ -18,6 +18,6 @@ pub struct CloseUserContext<'info> { pub user_account: Account<'info, User>, } -pub fn handle_close_user(_context: Context) -> Result<()> { +pub fn handle_close_user(_context: Context) -> Result<()> { Ok(()) } diff --git a/basics/close-account/anchor/programs/close-account/src/instructions/create_user.rs b/basics/close-account/anchor/programs/close-account/src/instructions/create_user.rs index 6e54fb96..22efd2ec 100644 --- a/basics/close-account/anchor/programs/close-account/src/instructions/create_user.rs +++ b/basics/close-account/anchor/programs/close-account/src/instructions/create_user.rs @@ -2,7 +2,7 @@ use crate::state::*; use anchor_lang::prelude::*; #[derive(Accounts)] -pub struct CreateUserContext<'info> { +pub struct CreateUserAccountConstraints<'info> { #[account(mut)] pub user: Signer<'info>, @@ -20,7 +20,7 @@ pub struct CreateUserContext<'info> { pub system_program: Program<'info, System>, } -pub fn handle_create_user(context: Context, name: String) -> Result<()> { +pub fn handle_create_user(context: Context, name: String) -> Result<()> { *context.accounts.user_account = User { bump: context.bumps.user_account, user: context.accounts.user.key(), diff --git a/basics/close-account/anchor/programs/close-account/src/lib.rs b/basics/close-account/anchor/programs/close-account/src/lib.rs index 4e18972d..0819ae85 100644 --- a/basics/close-account/anchor/programs/close-account/src/lib.rs +++ b/basics/close-account/anchor/programs/close-account/src/lib.rs @@ -9,11 +9,11 @@ declare_id!("99TQtoDdQ5NS2v5Ppha93aqEmv3vV9VZVfHTP5rGST3c"); pub mod close_account_program { use super::*; - pub fn create_user(context: Context, name: String) -> Result<()> { + pub fn create_user(context: Context, name: String) -> Result<()> { create_user::handle_create_user(context, name) } - pub fn close_user(context: Context) -> Result<()> { + pub fn close_user(context: Context) -> Result<()> { close_user::handle_close_user(context) } } diff --git a/basics/close-account/anchor/programs/close-account/tests/test_close_account.rs b/basics/close-account/anchor/programs/close-account/tests/test_close_account.rs index cbc2952d..f7189df6 100644 --- a/basics/close-account/anchor/programs/close-account/tests/test_close_account.rs +++ b/basics/close-account/anchor/programs/close-account/tests/test_close_account.rs @@ -34,7 +34,7 @@ fn test_create_and_close_user() { name: "John Doe".to_string(), } .data(), - close_account_program::accounts::CreateUserContext { + close_account_program::accounts::CreateUserAccountConstraints { user: payer.pubkey(), user_account: user_account_pda, system_program: system_program::id(), @@ -56,7 +56,7 @@ fn test_create_and_close_user() { let close_ix = Instruction::new_with_bytes( program_id, &close_account_program::instruction::CloseUser {}.data(), - close_account_program::accounts::CloseUserContext { + close_account_program::accounts::CloseUserAccountConstraints { user: payer.pubkey(), user_account: user_account_pda, } diff --git a/basics/close-account/quasar/src/instructions/create_user.rs b/basics/close-account/quasar/src/instructions/create_user.rs index 94c131c8..efa28322 100644 --- a/basics/close-account/quasar/src/instructions/create_user.rs +++ b/basics/close-account/quasar/src/instructions/create_user.rs @@ -5,7 +5,7 @@ use { /// Accounts for creating a new user. #[derive(Accounts)] -pub struct CreateUser { +pub struct CreateUserAccountConstraints { #[account(mut)] pub user: Signer, #[account(mut, init, payer = user, address = User::seeds(user.address()))] @@ -15,7 +15,7 @@ pub struct CreateUser { #[inline(always)] pub fn handle_create_user( - accounts: &mut CreateUser, + accounts: &mut CreateUserAccountConstraints, name: &str, bump: u8, ) -> Result<(), ProgramError> { diff --git a/basics/close-account/quasar/src/lib.rs b/basics/close-account/quasar/src/lib.rs index 776e2e6a..7abb5f8a 100644 --- a/basics/close-account/quasar/src/lib.rs +++ b/basics/close-account/quasar/src/lib.rs @@ -16,7 +16,7 @@ mod quasar_close_account { /// Create a user account with a name. #[instruction(discriminator = 0)] - pub fn create_user(ctx: Ctx, name: String<50>) -> Result<(), ProgramError> { + pub fn create_user(ctx: Ctx, name: String<50>) -> Result<(), ProgramError> { let bump = ctx.bumps.user_account; instructions::handle_create_user(&mut ctx.accounts, name, bump) } diff --git a/basics/create-account/anchor/programs/create-system-account/src/lib.rs b/basics/create-account/anchor/programs/create-system-account/src/lib.rs index 8323b4d2..07b21a30 100644 --- a/basics/create-account/anchor/programs/create-system-account/src/lib.rs +++ b/basics/create-account/anchor/programs/create-system-account/src/lib.rs @@ -7,7 +7,7 @@ declare_id!("ARVNCsYKDQsCLHbwUTJLpFXVrJdjhWZStyzvxmKe2xHi"); pub mod create_system_account { use super::*; - pub fn create_system_account(context: Context) -> Result<()> { + pub fn create_system_account(context: Context) -> Result<()> { msg!("Program invoked. Creating a system account..."); msg!( " New public key will be: {}", @@ -36,7 +36,7 @@ pub mod create_system_account { } #[derive(Accounts)] -pub struct CreateSystemAccount<'info> { +pub struct CreateSystemAccountAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, #[account(mut)] diff --git a/basics/create-account/anchor/programs/create-system-account/tests/test_create_account.rs b/basics/create-account/anchor/programs/create-system-account/tests/test_create_account.rs index 7c1bcd4f..70fe47ec 100644 --- a/basics/create-account/anchor/programs/create-system-account/tests/test_create_account.rs +++ b/basics/create-account/anchor/programs/create-system-account/tests/test_create_account.rs @@ -22,7 +22,7 @@ fn test_create_the_account() { let instruction = Instruction::new_with_bytes( program_id, &create_system_account::instruction::CreateSystemAccount {}.data(), - create_system_account::accounts::CreateSystemAccount { + create_system_account::accounts::CreateSystemAccountAccountConstraints { payer: payer.pubkey(), new_account: new_account.pubkey(), system_program: system_program::id(), diff --git a/basics/create-account/quasar/src/instructions/create_system_account.rs b/basics/create-account/quasar/src/instructions/create_system_account.rs index c28253a9..80e6d92d 100644 --- a/basics/create-account/quasar/src/instructions/create_system_account.rs +++ b/basics/create-account/quasar/src/instructions/create_system_account.rs @@ -3,7 +3,7 @@ use quasar_lang::{prelude::*, sysvars::Sysvar}; /// Accounts for creating a new system-owned account. /// Both payer and new_account must sign the transaction. #[derive(Accounts)] -pub struct CreateSystemAccount { +pub struct CreateSystemAccountAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -13,7 +13,7 @@ pub struct CreateSystemAccount { #[inline(always)] pub fn handle_create_system_account( - accounts: &mut CreateSystemAccount, + accounts: &mut CreateSystemAccountAccountConstraints, ) -> Result<(), ProgramError> { let system_program_address = Address::default(); let rent = Rent::get()?; diff --git a/basics/create-account/quasar/src/lib.rs b/basics/create-account/quasar/src/lib.rs index 8f71eeba..ae8ad033 100644 --- a/basics/create-account/quasar/src/lib.rs +++ b/basics/create-account/quasar/src/lib.rs @@ -15,7 +15,7 @@ mod quasar_create_account { /// Create a new system-owned account via CPI to the system program. #[instruction(discriminator = 0)] - pub fn create_system_account(ctx: Ctx) -> Result<(), ProgramError> { + pub fn create_system_account(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_create_system_account(&mut ctx.accounts) } } diff --git a/basics/cross-program-invocation/anchor/programs/hand/src/lib.rs b/basics/cross-program-invocation/anchor/programs/hand/src/lib.rs index 591fc493..2efa0b06 100644 --- a/basics/cross-program-invocation/anchor/programs/hand/src/lib.rs +++ b/basics/cross-program-invocation/anchor/programs/hand/src/lib.rs @@ -13,7 +13,7 @@ use lever::program::Lever; pub mod hand { use super::*; - pub fn pull_lever(context: Context, name: String) -> Result<()> { + pub fn pull_lever(context: Context, name: String) -> Result<()> { let cpi_ctx = CpiContext::new( context.accounts.lever_program.key(), SwitchPower { @@ -26,7 +26,7 @@ pub mod hand { } #[derive(Accounts)] -pub struct PullLever<'info> { +pub struct PullLeverAccountConstraints<'info> { #[account(mut)] pub power: Account<'info, PowerStatus>, pub lever_program: Program<'info, Lever>, diff --git a/basics/cross-program-invocation/anchor/programs/hand/tests/test_hand.rs b/basics/cross-program-invocation/anchor/programs/hand/tests/test_hand.rs index 7c97448e..e9c7c64a 100644 --- a/basics/cross-program-invocation/anchor/programs/hand/tests/test_hand.rs +++ b/basics/cross-program-invocation/anchor/programs/hand/tests/test_hand.rs @@ -90,7 +90,7 @@ fn test_pull_lever_cpi() { name: "Jacob".to_string(), } .data(), - hand::accounts::PullLever { + hand::accounts::PullLeverAccountConstraints { power: power_keypair.pubkey(), lever_program: lever_program_id, } @@ -113,7 +113,7 @@ fn test_pull_lever_cpi() { name: "sol-warrior".to_string(), } .data(), - hand::accounts::PullLever { + hand::accounts::PullLeverAccountConstraints { power: power_keypair.pubkey(), lever_program: lever_program_id, } diff --git a/basics/cross-program-invocation/anchor/programs/lever/src/instructions/initialize.rs b/basics/cross-program-invocation/anchor/programs/lever/src/instructions/initialize.rs index 90f72182..025fc5b7 100644 --- a/basics/cross-program-invocation/anchor/programs/lever/src/instructions/initialize.rs +++ b/basics/cross-program-invocation/anchor/programs/lever/src/instructions/initialize.rs @@ -3,7 +3,7 @@ use anchor_lang::prelude::*; use crate::PowerStatus; #[derive(Accounts)] -pub struct InitializeLever<'info> { +pub struct InitializeLeverAccountConstraints<'info> { #[account(init, payer = user, space = PowerStatus::DISCRIMINATOR.len() + PowerStatus::INIT_SPACE)] pub power: Account<'info, PowerStatus>, #[account(mut)] @@ -11,6 +11,6 @@ pub struct InitializeLever<'info> { pub system_program: Program<'info, System>, } -pub fn handler(_context: Context) -> Result<()> { +pub fn handler(_context: Context) -> Result<()> { Ok(()) } diff --git a/basics/cross-program-invocation/anchor/programs/lever/src/instructions/switch_power.rs b/basics/cross-program-invocation/anchor/programs/lever/src/instructions/switch_power.rs index 53ec109c..55674ab6 100644 --- a/basics/cross-program-invocation/anchor/programs/lever/src/instructions/switch_power.rs +++ b/basics/cross-program-invocation/anchor/programs/lever/src/instructions/switch_power.rs @@ -3,12 +3,12 @@ use anchor_lang::prelude::*; use crate::PowerStatus; #[derive(Accounts)] -pub struct SetPowerStatus<'info> { +pub struct SetPowerStatusAccountConstraints<'info> { #[account(mut)] pub power: Account<'info, PowerStatus>, } -pub fn handler(context: Context, name: String) -> Result<()> { +pub fn handler(context: Context, name: String) -> Result<()> { let power = &mut context.accounts.power; power.is_on = !power.is_on; diff --git a/basics/cross-program-invocation/anchor/programs/lever/src/lib.rs b/basics/cross-program-invocation/anchor/programs/lever/src/lib.rs index eac17651..f57709b9 100644 --- a/basics/cross-program-invocation/anchor/programs/lever/src/lib.rs +++ b/basics/cross-program-invocation/anchor/programs/lever/src/lib.rs @@ -9,11 +9,11 @@ declare_id!("E64FVeubGC4NPNF2UBJYX4AkrVowf74fRJD9q6YhwstN"); pub mod lever { use super::*; - pub fn initialize(context: Context) -> Result<()> { + pub fn initialize(context: Context) -> Result<()> { instructions::initialize::handler(context) } - pub fn switch_power(context: Context, name: String) -> Result<()> { + pub fn switch_power(context: Context, name: String) -> Result<()> { instructions::switch_power::handler(context, name) } } diff --git a/basics/cross-program-invocation/anchor/programs/lever/tests/test_lever.rs b/basics/cross-program-invocation/anchor/programs/lever/tests/test_lever.rs index 4cd3aec7..47d32a63 100644 --- a/basics/cross-program-invocation/anchor/programs/lever/tests/test_lever.rs +++ b/basics/cross-program-invocation/anchor/programs/lever/tests/test_lever.rs @@ -29,7 +29,7 @@ fn test_initialize_lever() { let instruction = Instruction::new_with_bytes( program_id, &lever::instruction::Initialize {}.data(), - lever::accounts::InitializeLever { + lever::accounts::InitializeLeverAccountConstraints { power: power_keypair.pubkey(), user: payer.pubkey(), system_program: system_program::id(), @@ -65,7 +65,7 @@ fn test_switch_power() { let init_ix = Instruction::new_with_bytes( program_id, &lever::instruction::Initialize {}.data(), - lever::accounts::InitializeLever { + lever::accounts::InitializeLeverAccountConstraints { power: power_keypair.pubkey(), user: payer.pubkey(), system_program: system_program::id(), @@ -87,7 +87,7 @@ fn test_switch_power() { name: "Alice".to_string(), } .data(), - lever::accounts::SetPowerStatus { + lever::accounts::SetPowerStatusAccountConstraints { power: power_keypair.pubkey(), } .to_account_metas(None), @@ -108,7 +108,7 @@ fn test_switch_power() { name: "Bob".to_string(), } .data(), - lever::accounts::SetPowerStatus { + lever::accounts::SetPowerStatusAccountConstraints { power: power_keypair.pubkey(), } .to_account_metas(None), diff --git a/basics/cross-program-invocation/quasar/hand/src/instructions/pull_lever.rs b/basics/cross-program-invocation/quasar/hand/src/instructions/pull_lever.rs index 8132228c..8e0cb25d 100644 --- a/basics/cross-program-invocation/quasar/hand/src/instructions/pull_lever.rs +++ b/basics/cross-program-invocation/quasar/hand/src/instructions/pull_lever.rs @@ -5,14 +5,14 @@ use quasar_lang::prelude::*; /// that implements `Id` - this lets Quasar verify the program address and /// the executable flag during account parsing. #[derive(Accounts)] -pub struct PullLever { +pub struct PullLeverAccountConstraints { #[account(mut)] pub power: UncheckedAccount, pub lever_program: Program, } #[inline(always)] -pub fn handle_pull_lever(accounts: &PullLever, name: &str) -> Result<(), ProgramError> { +pub fn handle_pull_lever(accounts: &PullLeverAccountConstraints, name: &str) -> Result<(), ProgramError> { log("Hand is pulling the lever!"); // Build the switch_power instruction data for the lever program. diff --git a/basics/cross-program-invocation/quasar/hand/src/lib.rs b/basics/cross-program-invocation/quasar/hand/src/lib.rs index 37fc35c1..6fa7e61c 100644 --- a/basics/cross-program-invocation/quasar/hand/src/lib.rs +++ b/basics/cross-program-invocation/quasar/hand/src/lib.rs @@ -26,7 +26,7 @@ mod quasar_hand { /// Pull the lever by invoking the lever program's switch_power via CPI. #[instruction(discriminator = 0)] - pub fn pull_lever(ctx: Ctx, name: String<50>) -> Result<(), ProgramError> { + pub fn pull_lever(ctx: Ctx, name: String<50>) -> Result<(), ProgramError> { instructions::handle_pull_lever(&mut ctx.accounts, name) } } diff --git a/basics/cross-program-invocation/quasar/lever/src/instructions/initialize.rs b/basics/cross-program-invocation/quasar/lever/src/instructions/initialize.rs index e820b851..a7c19715 100644 --- a/basics/cross-program-invocation/quasar/lever/src/instructions/initialize.rs +++ b/basics/cross-program-invocation/quasar/lever/src/instructions/initialize.rs @@ -5,7 +5,7 @@ use { /// Accounts for initialising the power status (PDA seeded by "power"). #[derive(Accounts)] -pub struct InitializeLever { +pub struct InitializeLeverAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut, init, payer = payer, address = PowerStatus::seeds())] @@ -14,7 +14,7 @@ pub struct InitializeLever { } #[inline(always)] -pub fn handle_initialize(accounts: &mut InitializeLever) -> Result<(), ProgramError> { +pub fn handle_initialize(accounts: &mut InitializeLeverAccountConstraints) -> Result<(), ProgramError> { // Power starts off (false). Counter-style fixed-size set_inner takes only the inner value. accounts.power.set_inner(PowerStatusInner { is_on: PodBool::from(false) }); Ok(()) diff --git a/basics/cross-program-invocation/quasar/lever/src/instructions/switch_power.rs b/basics/cross-program-invocation/quasar/lever/src/instructions/switch_power.rs index 0f29c1c4..a4cccf07 100644 --- a/basics/cross-program-invocation/quasar/lever/src/instructions/switch_power.rs +++ b/basics/cross-program-invocation/quasar/lever/src/instructions/switch_power.rs @@ -5,13 +5,13 @@ use { /// Accounts for toggling the power switch. #[derive(Accounts)] -pub struct SwitchPower { +pub struct SwitchPowerAccountConstraints { #[account(mut)] pub power: Account, } #[inline(always)] -pub fn handle_switch_power(accounts: &mut SwitchPower, name: &str) -> Result<(), ProgramError> { +pub fn handle_switch_power(accounts: &mut SwitchPowerAccountConstraints, name: &str) -> Result<(), ProgramError> { let current: bool = accounts.power.is_on.into(); let new_state = !current; accounts.power.is_on = PodBool::from(new_state); diff --git a/basics/cross-program-invocation/quasar/lever/src/lib.rs b/basics/cross-program-invocation/quasar/lever/src/lib.rs index 1922feca..644cd868 100644 --- a/basics/cross-program-invocation/quasar/lever/src/lib.rs +++ b/basics/cross-program-invocation/quasar/lever/src/lib.rs @@ -16,13 +16,13 @@ mod quasar_lever { /// Initialize the power status account (off by default). #[instruction(discriminator = 0)] - pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { + pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_initialize(&mut ctx.accounts) } /// Toggle the power switch. Logs who is pulling the lever. #[instruction(discriminator = 1)] - pub fn switch_power(ctx: Ctx, name: String<50>) -> Result<(), ProgramError> { + pub fn switch_power(ctx: Ctx, name: String<50>) -> Result<(), ProgramError> { instructions::handle_switch_power(&mut ctx.accounts, name) } } diff --git a/basics/favorites/anchor/programs/favorites/src/lib.rs b/basics/favorites/anchor/programs/favorites/src/lib.rs index 198d484a..6f4fabc8 100644 --- a/basics/favorites/anchor/programs/favorites/src/lib.rs +++ b/basics/favorites/anchor/programs/favorites/src/lib.rs @@ -10,7 +10,7 @@ pub mod favorites { // Our instruction handler! It sets the user's favorite number and color pub fn set_favorites( - context: Context, + context: Context, number: u64, color: String, hobbies: Vec, @@ -51,7 +51,7 @@ pub struct Favorites { } // When people call the set_favorites instruction, they will need to provide the accounts that will be modifed. This keeps Solana fast! #[derive(Accounts)] -pub struct SetFavorites<'info> { +pub struct SetFavoritesAccountConstraints<'info> { #[account(mut)] pub user: Signer<'info>, diff --git a/basics/favorites/anchor/programs/favorites/tests/test_favorites.rs b/basics/favorites/anchor/programs/favorites/tests/test_favorites.rs index 8a9cf7ae..6f217c0d 100644 --- a/basics/favorites/anchor/programs/favorites/tests/test_favorites.rs +++ b/basics/favorites/anchor/programs/favorites/tests/test_favorites.rs @@ -83,7 +83,7 @@ fn test_set_favorites() { ], } .data(), - favorites::accounts::SetFavorites { + favorites::accounts::SetFavoritesAccountConstraints { user: payer.pubkey(), favorites: pda, system_program: system_program::id(), @@ -118,7 +118,7 @@ fn test_update_favorites() { ], } .data(), - favorites::accounts::SetFavorites { + favorites::accounts::SetFavoritesAccountConstraints { user: payer.pubkey(), favorites: pda, system_program: system_program::id(), @@ -143,7 +143,7 @@ fn test_update_favorites() { ], } .data(), - favorites::accounts::SetFavorites { + favorites::accounts::SetFavoritesAccountConstraints { user: payer.pubkey(), favorites: pda, system_program: system_program::id(), diff --git a/basics/favorites/quasar/src/instructions/set_favorites.rs b/basics/favorites/quasar/src/instructions/set_favorites.rs index ebb60bee..0abe21d8 100644 --- a/basics/favorites/quasar/src/instructions/set_favorites.rs +++ b/basics/favorites/quasar/src/instructions/set_favorites.rs @@ -6,7 +6,7 @@ use { /// Accounts for setting user favourites. Uses `init_if_needed` so the same /// instruction can create or update the favourites PDA. #[derive(Accounts)] -pub struct SetFavorites { +pub struct SetFavoritesAccountConstraints { #[account(mut)] pub user: Signer, #[account(mut, init(idempotent), payer = user, address = Favorites::seeds(user.address()))] @@ -15,7 +15,7 @@ pub struct SetFavorites { } #[inline(always)] -pub fn handle_set_favorites(accounts: &mut SetFavorites, number: u64, color: &str) -> Result<(), ProgramError> { +pub fn handle_set_favorites(accounts: &mut SetFavoritesAccountConstraints, number: u64, color: &str) -> Result<(), ProgramError> { let rent = Rent::get()?; accounts.favorites.set_inner( FavoritesInner { number, color }, diff --git a/basics/favorites/quasar/src/lib.rs b/basics/favorites/quasar/src/lib.rs index e716772f..d188a08f 100644 --- a/basics/favorites/quasar/src/lib.rs +++ b/basics/favorites/quasar/src/lib.rs @@ -20,7 +20,7 @@ mod quasar_favorites { /// support nested dynamic types. See state.rs for details. #[instruction(discriminator = 0)] pub fn set_favorites( - ctx: Ctx, + ctx: Ctx, number: u64, color: String<50>, ) -> Result<(), ProgramError> { diff --git a/basics/hello-solana/anchor/programs/hello-solana/src/lib.rs b/basics/hello-solana/anchor/programs/hello-solana/src/lib.rs index b0f36828..54fc73ec 100644 --- a/basics/hello-solana/anchor/programs/hello-solana/src/lib.rs +++ b/basics/hello-solana/anchor/programs/hello-solana/src/lib.rs @@ -6,7 +6,7 @@ declare_id!("2phbC62wekpw95XuBk4i1KX4uA8zBUWmYbiTMhicSuBV"); pub mod hello_solana { use super::*; - pub fn hello(_context: Context) -> Result<()> { + pub fn hello(_context: Context) -> Result<()> { msg!("Hello, Solana!"); msg!("Our program's Program ID: {}", &id()); @@ -16,4 +16,4 @@ pub mod hello_solana { } #[derive(Accounts)] -pub struct Hello {} +pub struct HelloAccountConstraints {} diff --git a/basics/hello-solana/anchor/programs/hello-solana/tests/test_hello.rs b/basics/hello-solana/anchor/programs/hello-solana/tests/test_hello.rs index 815d051a..095a59e9 100644 --- a/basics/hello-solana/anchor/programs/hello-solana/tests/test_hello.rs +++ b/basics/hello-solana/anchor/programs/hello-solana/tests/test_hello.rs @@ -16,7 +16,7 @@ fn test_say_hello() { let instruction = Instruction::new_with_bytes( program_id, &hello_solana::instruction::Hello {}.data(), - hello_solana::accounts::Hello {}.to_account_metas(None), + hello_solana::accounts::HelloAccountConstraints {}.to_account_metas(None), ); send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()) diff --git a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/create_new_account.rs b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/create_new_account.rs index 5069c0d2..8c6730a7 100644 --- a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/create_new_account.rs +++ b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/create_new_account.rs @@ -2,7 +2,7 @@ use anchor_lang::prelude::*; use anchor_lang::system_program::{create_account, CreateAccount}; #[derive(Accounts)] -pub struct CreateNewAccount<'info> { +pub struct CreateNewAccountAccountConstraints<'info> { #[account(mut)] new_account: Signer<'info>, @@ -17,7 +17,7 @@ pub struct CreateNewAccount<'info> { system_program: Program<'info, System>, } -pub fn handle_create_new_account(context: Context) -> Result<()> { +pub fn handle_create_new_account(context: Context) -> Result<()> { // PDA signer seeds let signer_seeds: &[&[&[u8]]] = &[&[b"rent_vault", &[context.bumps.rent_vault]]]; diff --git a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/init_rent_vault.rs b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/init_rent_vault.rs index 46fa1b4d..2d80e676 100644 --- a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/init_rent_vault.rs +++ b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/init_rent_vault.rs @@ -2,7 +2,7 @@ use anchor_lang::prelude::*; use anchor_lang::system_program::{transfer, Transfer}; #[derive(Accounts)] -pub struct InitRentVault<'info> { +pub struct InitRentVaultAccountConstraints<'info> { #[account(mut)] payer: Signer<'info>, @@ -19,7 +19,7 @@ pub struct InitRentVault<'info> { // When lamports are transferred to a new address (without and existing account), // An account owned by the system program is created by default -pub fn handle_init_rent_vault(context: Context, fund_lamports: u64) -> Result<()> { +pub fn handle_init_rent_vault(context: Context, fund_lamports: u64) -> Result<()> { transfer( CpiContext::new( context.accounts.system_program.key(), diff --git a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/lib.rs b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/lib.rs index c6759041..fa7eef61 100644 --- a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/lib.rs +++ b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/lib.rs @@ -8,11 +8,11 @@ declare_id!("7Hm9nsYVuBZ9rf8z9AMUHreZRv8Q4vLhqwdVTCawRZtA"); pub mod pda_rent_payer { use super::*; - pub fn init_rent_vault(context: Context, fund_lamports: u64) -> Result<()> { + pub fn init_rent_vault(context: Context, fund_lamports: u64) -> Result<()> { init_rent_vault::handle_init_rent_vault(context, fund_lamports) } - pub fn create_new_account(context: Context) -> Result<()> { + pub fn create_new_account(context: Context) -> Result<()> { create_new_account::handle_create_new_account(context) } } diff --git a/basics/pda-rent-payer/anchor/programs/anchor-program-example/tests/test_pda_rent_payer.rs b/basics/pda-rent-payer/anchor/programs/anchor-program-example/tests/test_pda_rent_payer.rs index 3bc8c1f5..650d7186 100644 --- a/basics/pda-rent-payer/anchor/programs/anchor-program-example/tests/test_pda_rent_payer.rs +++ b/basics/pda-rent-payer/anchor/programs/anchor-program-example/tests/test_pda_rent_payer.rs @@ -33,7 +33,7 @@ fn test_init_rent_vault() { fund_lamports: fund_amount, } .data(), - pda_rent_payer::accounts::InitRentVault { + pda_rent_payer::accounts::InitRentVaultAccountConstraints { payer: payer.pubkey(), rent_vault: rent_vault_pda, system_program: system_program::id(), @@ -68,7 +68,7 @@ fn test_create_new_account_from_rent_vault() { fund_lamports: fund_amount, } .data(), - pda_rent_payer::accounts::InitRentVault { + pda_rent_payer::accounts::InitRentVaultAccountConstraints { payer: payer.pubkey(), rent_vault: rent_vault_pda, system_program: system_program::id(), @@ -85,7 +85,7 @@ fn test_create_new_account_from_rent_vault() { let create_ix = Instruction::new_with_bytes( program_id, &pda_rent_payer::instruction::CreateNewAccount {}.data(), - pda_rent_payer::accounts::CreateNewAccount { + pda_rent_payer::accounts::CreateNewAccountAccountConstraints { new_account: new_account.pubkey(), rent_vault: rent_vault_pda, system_program: system_program::id(), diff --git a/basics/pda-rent-payer/quasar/src/instructions/create_new_account.rs b/basics/pda-rent-payer/quasar/src/instructions/create_new_account.rs index da30f590..0da52274 100644 --- a/basics/pda-rent-payer/quasar/src/instructions/create_new_account.rs +++ b/basics/pda-rent-payer/quasar/src/instructions/create_new_account.rs @@ -6,7 +6,7 @@ use { /// Accounts for creating a new account funded by the rent vault PDA. /// The rent vault signs the create_account CPI via PDA seeds. #[derive(Accounts)] -pub struct CreateNewAccount { +pub struct CreateNewAccountAccountConstraints { #[account(mut)] pub new_account: Signer, #[account(mut, address = RentVault::seeds())] @@ -15,7 +15,7 @@ pub struct CreateNewAccount { } #[inline(always)] -pub fn handle_create_new_account(accounts: &mut CreateNewAccount, rent_vault_bump: u8) -> Result<(), ProgramError> { +pub fn handle_create_new_account(accounts: &mut CreateNewAccountAccountConstraints, rent_vault_bump: u8) -> Result<(), ProgramError> { // Build PDA signer seeds: ["rent_vault", bump]. let bump_bytes = [rent_vault_bump]; let seeds: &[Seed] = &[ diff --git a/basics/pda-rent-payer/quasar/src/instructions/init_rent_vault.rs b/basics/pda-rent-payer/quasar/src/instructions/init_rent_vault.rs index 66f25283..c452f40a 100644 --- a/basics/pda-rent-payer/quasar/src/instructions/init_rent_vault.rs +++ b/basics/pda-rent-payer/quasar/src/instructions/init_rent_vault.rs @@ -12,7 +12,7 @@ pub struct RentVault; /// When lamports are sent to a new address, the system program creates /// a system-owned account automatically. #[derive(Accounts)] -pub struct InitRentVault { +pub struct InitRentVaultAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut, address = RentVault::seeds())] @@ -21,7 +21,7 @@ pub struct InitRentVault { } #[inline(always)] -pub fn handle_init_rent_vault(accounts: &mut InitRentVault, fund_lamports: u64) -> Result<(), ProgramError> { +pub fn handle_init_rent_vault(accounts: &mut InitRentVaultAccountConstraints, fund_lamports: u64) -> Result<(), ProgramError> { accounts.system_program .transfer(&accounts.payer, &accounts.rent_vault, fund_lamports) .invoke() diff --git a/basics/pda-rent-payer/quasar/src/lib.rs b/basics/pda-rent-payer/quasar/src/lib.rs index 925379a5..4ad3b689 100644 --- a/basics/pda-rent-payer/quasar/src/lib.rs +++ b/basics/pda-rent-payer/quasar/src/lib.rs @@ -15,14 +15,14 @@ mod quasar_pda_rent_payer { /// Fund a PDA "rent vault" by transferring lamports from the payer. #[instruction(discriminator = 0)] - pub fn init_rent_vault(ctx: Ctx, fund_lamports: u64) -> Result<(), ProgramError> { + pub fn init_rent_vault(ctx: Ctx, fund_lamports: u64) -> Result<(), ProgramError> { instructions::handle_init_rent_vault(&mut ctx.accounts, fund_lamports) } /// Create a new account using the rent vault PDA as the funding source. /// The vault signs the CPI via PDA seeds. #[instruction(discriminator = 1)] - pub fn create_new_account(ctx: Ctx) -> Result<(), ProgramError> { + pub fn create_new_account(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_create_new_account(&mut ctx.accounts, ctx.bumps.rent_vault) } } diff --git a/basics/processing-instructions/anchor/programs/processing-instructions/src/lib.rs b/basics/processing-instructions/anchor/programs/processing-instructions/src/lib.rs index 2083ad08..2fbf5a53 100644 --- a/basics/processing-instructions/anchor/programs/processing-instructions/src/lib.rs +++ b/basics/processing-instructions/anchor/programs/processing-instructions/src/lib.rs @@ -8,7 +8,7 @@ pub mod processing_instructions { // With Anchor, we just put instruction data in the function signature! // - pub fn go_to_park(_context: Context, name: String, height: u32) -> Result<()> { + pub fn go_to_park(_context: Context, name: String, height: u32) -> Result<()> { msg!("Welcome to the park, {}!", name); if height > 5 { msg!("You are tall enough to ride this ride. Congratulations."); @@ -21,4 +21,4 @@ pub mod processing_instructions { } #[derive(Accounts)] -pub struct Park {} +pub struct ParkAccountConstraints {} diff --git a/basics/processing-instructions/anchor/programs/processing-instructions/tests/test_processing_instructions.rs b/basics/processing-instructions/anchor/programs/processing-instructions/tests/test_processing_instructions.rs index 5e5d26b1..413688cc 100644 --- a/basics/processing-instructions/anchor/programs/processing-instructions/tests/test_processing_instructions.rs +++ b/basics/processing-instructions/anchor/programs/processing-instructions/tests/test_processing_instructions.rs @@ -27,7 +27,7 @@ fn test_go_to_park() { height: 3, } .data(), - processing_instructions::accounts::Park {}.to_account_metas(None), + processing_instructions::accounts::ParkAccountConstraints {}.to_account_metas(None), ); send_transaction_from_instructions(&mut svm, vec![ix_short], &[&payer], &payer.pubkey()) .unwrap(); @@ -42,7 +42,7 @@ fn test_go_to_park() { height: 10, } .data(), - processing_instructions::accounts::Park {}.to_account_metas(None), + processing_instructions::accounts::ParkAccountConstraints {}.to_account_metas(None), ); send_transaction_from_instructions(&mut svm, vec![ix_tall], &[&payer], &payer.pubkey()) .unwrap(); diff --git a/basics/processing-instructions/quasar/src/instructions/go_to_park.rs b/basics/processing-instructions/quasar/src/instructions/go_to_park.rs index a02f38bc..90260386 100644 --- a/basics/processing-instructions/quasar/src/instructions/go_to_park.rs +++ b/basics/processing-instructions/quasar/src/instructions/go_to_park.rs @@ -3,13 +3,13 @@ use quasar_lang::prelude::*; /// Minimal accounts context - a signer is needed to submit the transaction. /// The instruction just processes instruction data (name + height). #[derive(Accounts)] -pub struct Park { +pub struct ParkAccountConstraints { #[allow(dead_code)] pub signer: Signer, } #[inline(always)] -pub fn handle_go_to_park(_accounts: &mut Park, _name: &str, height: u32) -> Result<(), ProgramError> { +pub fn handle_go_to_park(_accounts: &mut ParkAccountConstraints, _name: &str, height: u32) -> Result<(), ProgramError> { // Quasar's `log()` takes &str, no format! macro available in no_std. // We can't interpolate the name or height into the log message, so // we use static messages - same logic as the Anchor version, just diff --git a/basics/processing-instructions/quasar/src/lib.rs b/basics/processing-instructions/quasar/src/lib.rs index 653b403d..10518496 100644 --- a/basics/processing-instructions/quasar/src/lib.rs +++ b/basics/processing-instructions/quasar/src/lib.rs @@ -17,7 +17,7 @@ mod quasar_processing_instructions { /// Quasar can parse String instruction args (u32-prefixed wire format) but /// can't interpolate them into log messages (no format! in no_std). #[instruction(discriminator = 0)] - pub fn go_to_park(ctx: Ctx, height: u32, name: String<50>) -> Result<(), ProgramError> { + pub fn go_to_park(ctx: Ctx, height: u32, name: String<50>) -> Result<(), ProgramError> { instructions::handle_go_to_park(&mut ctx.accounts, name, height) } } diff --git a/basics/program-derived-addresses/quasar/src/instructions/create.rs b/basics/program-derived-addresses/quasar/src/instructions/create.rs index 3088b422..2df91ade 100644 --- a/basics/program-derived-addresses/quasar/src/instructions/create.rs +++ b/basics/program-derived-addresses/quasar/src/instructions/create.rs @@ -6,7 +6,7 @@ use { /// Accounts for creating a new page visits counter. /// The counter is derived as a PDA from ["page_visits", payer] seeds. #[derive(Accounts)] -pub struct CreatePageVisits { +pub struct CreatePageVisitsAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut, init, payer = payer, address = PageVisits::seeds(payer.address()))] @@ -15,7 +15,7 @@ pub struct CreatePageVisits { } #[inline(always)] -pub fn handle_create_page_visits(accounts: &mut CreatePageVisits) -> Result<(), ProgramError> { +pub fn handle_create_page_visits(accounts: &mut CreatePageVisitsAccountConstraints) -> Result<(), ProgramError> { accounts.page_visits.set_inner(PageVisitsInner { page_visits: 0 }); Ok(()) } diff --git a/basics/program-derived-addresses/quasar/src/instructions/increment.rs b/basics/program-derived-addresses/quasar/src/instructions/increment.rs index 0e81e1ec..f3aaa56a 100644 --- a/basics/program-derived-addresses/quasar/src/instructions/increment.rs +++ b/basics/program-derived-addresses/quasar/src/instructions/increment.rs @@ -6,14 +6,14 @@ use { /// Accounts for incrementing page visits. /// The user account is needed to derive the PDA seeds for validation. #[derive(Accounts)] -pub struct IncrementPageVisits { +pub struct IncrementPageVisitsAccountConstraints { pub user: UncheckedAccount, #[account(mut)] pub page_visits: Account, } #[inline(always)] -pub fn handle_increment_page_visits(accounts: &mut IncrementPageVisits) -> Result<(), ProgramError> { +pub fn handle_increment_page_visits(accounts: &mut IncrementPageVisitsAccountConstraints) -> Result<(), ProgramError> { let current: u64 = accounts.page_visits.page_visits.into(); let next = current .checked_add(1) diff --git a/basics/program-derived-addresses/quasar/src/lib.rs b/basics/program-derived-addresses/quasar/src/lib.rs index 6546737f..b729cbf0 100644 --- a/basics/program-derived-addresses/quasar/src/lib.rs +++ b/basics/program-derived-addresses/quasar/src/lib.rs @@ -17,13 +17,13 @@ mod quasar_program_derived_addresses { /// Create a PDA-based page visits counter for the payer. #[instruction(discriminator = 0)] - pub fn create_page_visits(ctx: Ctx) -> Result<(), ProgramError> { + pub fn create_page_visits(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_create_page_visits(&mut ctx.accounts) } /// Increment the page visits counter. #[instruction(discriminator = 1)] - pub fn increment_page_visits(ctx: Ctx) -> Result<(), ProgramError> { + pub fn increment_page_visits(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_increment_page_visits(&mut ctx.accounts) } } diff --git a/basics/pyth/anchor/programs/pythexample/src/lib.rs b/basics/pyth/anchor/programs/pythexample/src/lib.rs index 30a46024..013b6882 100644 --- a/basics/pyth/anchor/programs/pythexample/src/lib.rs +++ b/basics/pyth/anchor/programs/pythexample/src/lib.rs @@ -24,7 +24,7 @@ pub enum PythExampleError { pub mod anchor_test { use super::*; - pub fn read_price(context: Context) -> Result<()> { + pub fn read_price(context: Context) -> Result<()> { let price_update = &context.accounts.price_update; // Reject stale prices: a price that stopped updating is wrong. @@ -50,7 +50,7 @@ pub mod anchor_test { } #[derive(Accounts)] -pub struct ReadPrice<'info> { +pub struct ReadPriceAccountConstraints<'info> { pub price_update: Account<'info, PriceUpdateV2>, } diff --git a/basics/pyth/anchor/programs/pythexample/tests/test_pyth.rs b/basics/pyth/anchor/programs/pythexample/tests/test_pyth.rs index fd91f7ec..5071866a 100644 --- a/basics/pyth/anchor/programs/pythexample/tests/test_pyth.rs +++ b/basics/pyth/anchor/programs/pythexample/tests/test_pyth.rs @@ -113,7 +113,7 @@ fn setup_with_price_account( fn read_price_instruction(price_update: anchor_lang::solana_program::pubkey::Pubkey) -> Instruction { let ix_data = pythexample::instruction::ReadPrice {}.data(); - let accounts = pythexample::accounts::ReadPrice { price_update }.to_account_metas(None); + let accounts = pythexample::accounts::ReadPriceAccountConstraints { price_update }.to_account_metas(None); Instruction::new_with_bytes(pythexample::id(), &ix_data, accounts) } diff --git a/compression/cnft-burn/quasar/src/instructions/burn_cnft.rs b/compression/cnft-burn/quasar/src/instructions/burn_cnft.rs index cf7ca87a..ae23e28f 100644 --- a/compression/cnft-burn/quasar/src/instructions/burn_cnft.rs +++ b/compression/cnft-burn/quasar/src/instructions/burn_cnft.rs @@ -10,7 +10,7 @@ const MAX_CPI_ACCOUNTS: usize = 7 + MAX_PROOF_NODES; /// Accounts for burning a compressed NFT via mpl-bubblegum CPI. #[derive(Accounts)] -pub struct BurnCnft { +pub struct BurnCnftAccountConstraints { #[account(mut)] pub leaf_owner: Signer, /// Tree authority PDA (seeds checked by Bubblegum). @@ -30,7 +30,7 @@ pub struct BurnCnft { pub system_program: Program, } -pub fn handle_burn_cnft(accounts: &mut BurnCnft, data: &[u8], remaining: RemainingAccounts<'_>) -> Result<(), ProgramError> { +pub fn handle_burn_cnft(accounts: &mut BurnCnftAccountConstraints, data: &[u8], remaining: RemainingAccounts<'_>) -> Result<(), ProgramError> { // Parse instruction args from raw data: // root(32) + data_hash(32) + creator_hash(32) + nonce(8) + index(4) = 108 bytes if data.len() < 108 { diff --git a/compression/cnft-burn/quasar/src/lib.rs b/compression/cnft-burn/quasar/src/lib.rs index f2427eef..980d7095 100644 --- a/compression/cnft-burn/quasar/src/lib.rs +++ b/compression/cnft-burn/quasar/src/lib.rs @@ -31,7 +31,7 @@ mod quasar_cnft_burn { use super::*; #[instruction(discriminator = 0)] - pub fn burn_cnft(ctx: CtxWithRemaining) -> Result<(), ProgramError> { + pub fn burn_cnft(ctx: CtxWithRemaining) -> Result<(), ProgramError> { let data = ctx.data; let remaining = ctx.remaining_accounts(); instructions::handle_burn_cnft(&mut ctx.accounts, data, remaining) diff --git a/compression/cutils/quasar/src/instructions/mint.rs b/compression/cutils/quasar/src/instructions/mint.rs index 1864e346..3f9aff15 100644 --- a/compression/cutils/quasar/src/instructions/mint.rs +++ b/compression/cutils/quasar/src/instructions/mint.rs @@ -13,7 +13,7 @@ const MAX_IX_DATA: usize = 400; /// Accounts for minting a compressed NFT to a collection. #[derive(Accounts)] -pub struct Mint { +pub struct MintAccountConstraints { pub payer: Signer, /// Tree authority PDA (seeds checked by Bubblegum). #[account(mut)] @@ -53,7 +53,7 @@ pub struct Mint { pub system_program: Program, } -pub fn handle_mint(accounts: &mut Mint, data: &[u8]) -> Result<(), ProgramError> { +pub fn handle_mint(accounts: &mut MintAccountConstraints, data: &[u8]) -> Result<(), ProgramError> { // Parse URI from instruction data: u32 length prefix + utf8 bytes (borsh String) if data.len() < 4 { return Err(ProgramError::InvalidInstructionData); diff --git a/compression/cutils/quasar/src/instructions/verify.rs b/compression/cutils/quasar/src/instructions/verify.rs index c6051b38..a970ad72 100644 --- a/compression/cutils/quasar/src/instructions/verify.rs +++ b/compression/cutils/quasar/src/instructions/verify.rs @@ -13,7 +13,7 @@ const VERIFY_LEAF_DISCRIMINATOR: [u8; 8] = [0x7c, 0xdc, 0x16, 0xdf, 0x68, 0x0a, /// Accounts for verifying a compressed NFT leaf in the merkle tree. #[derive(Accounts)] -pub struct Verify { +pub struct VerifyAccountConstraints { pub leaf_owner: Signer, /// Leaf delegate. pub leaf_delegate: UncheckedAccount, @@ -24,7 +24,7 @@ pub struct Verify { pub compression_program: UncheckedAccount, } -pub fn handle_verify(accounts: &mut Verify, data: &[u8], remaining: RemainingAccounts<'_>) -> Result<(), ProgramError> { +pub fn handle_verify(accounts: &mut VerifyAccountConstraints, data: &[u8], remaining: RemainingAccounts<'_>) -> Result<(), ProgramError> { // Parse verify params from instruction data: // root(32) + data_hash(32) + creator_hash(32) + nonce(8) + index(4) = 108 bytes if data.len() < 108 { diff --git a/compression/cutils/quasar/src/lib.rs b/compression/cutils/quasar/src/lib.rs index b272dac2..d06eba8c 100644 --- a/compression/cutils/quasar/src/lib.rs +++ b/compression/cutils/quasar/src/lib.rs @@ -30,14 +30,14 @@ mod quasar_cutils { /// Mint a compressed NFT to a collection via MintToCollectionV1. #[instruction(discriminator = 0)] - pub fn mint(ctx: Ctx) -> Result<(), ProgramError> { + pub fn mint(ctx: Ctx) -> Result<(), ProgramError> { let data = ctx.data; instructions::handle_mint(&mut ctx.accounts, data) } /// Verify a compressed NFT leaf exists in the merkle tree. #[instruction(discriminator = 1)] - pub fn verify(ctx: CtxWithRemaining) -> Result<(), ProgramError> { + pub fn verify(ctx: CtxWithRemaining) -> Result<(), ProgramError> { let data = ctx.data; let remaining = ctx.remaining_accounts(); instructions::handle_verify(&mut ctx.accounts, data, remaining) diff --git a/finance/token-fundraiser/quasar/src/instructions/check_contributions.rs b/finance/token-fundraiser/quasar/src/instructions/check_contributions.rs index 01febbf9..a78d770d 100644 --- a/finance/token-fundraiser/quasar/src/instructions/check_contributions.rs +++ b/finance/token-fundraiser/quasar/src/instructions/check_contributions.rs @@ -5,7 +5,7 @@ use { }; #[derive(Accounts)] -pub struct CheckContributions { +pub struct CheckContributionsAccountConstraints { #[account(mut)] pub maker: Signer, @@ -29,8 +29,8 @@ pub struct CheckContributions { #[inline(always)] pub fn handle_check_contributions( - accounts: &mut CheckContributions, - bumps: &CheckContributionsBumps, + accounts: &mut CheckContributionsAccountConstraints, + bumps: &CheckContributionsAccountConstraintsBumps, ) -> Result<(), ProgramError> { let current_amount: u64 = accounts.fundraiser.current_amount.into(); let amount_to_raise: u64 = accounts.fundraiser.amount_to_raise.into(); diff --git a/finance/token-fundraiser/quasar/src/instructions/contribute.rs b/finance/token-fundraiser/quasar/src/instructions/contribute.rs index 9b78bd82..7aa78ddf 100644 --- a/finance/token-fundraiser/quasar/src/instructions/contribute.rs +++ b/finance/token-fundraiser/quasar/src/instructions/contribute.rs @@ -8,7 +8,7 @@ use { }; #[derive(Accounts)] -pub struct Contribute { +pub struct ContributeAccountConstraints { #[account(mut)] pub contributor: Signer, @@ -43,9 +43,9 @@ pub struct Contribute { #[inline(always)] pub fn handle_contribute( - accounts: &mut Contribute, + accounts: &mut ContributeAccountConstraints, amount: u64, - bumps: &ContributeBumps, + bumps: &ContributeAccountConstraintsBumps, ) -> Result<(), ProgramError> { require!(amount > 0, FundraiserError::InvalidAmount); diff --git a/finance/token-fundraiser/quasar/src/instructions/initialize.rs b/finance/token-fundraiser/quasar/src/instructions/initialize.rs index a9205673..5e3a49fc 100644 --- a/finance/token-fundraiser/quasar/src/instructions/initialize.rs +++ b/finance/token-fundraiser/quasar/src/instructions/initialize.rs @@ -8,7 +8,7 @@ use { }; #[derive(Accounts)] -pub struct Initialize { +pub struct InitializeAccountConstraints { #[account(mut)] pub maker: Signer, @@ -34,7 +34,7 @@ pub struct Initialize { #[inline(always)] pub fn handle_initialize( - accounts: &mut Initialize, + accounts: &mut InitializeAccountConstraints, amount_to_raise: u64, duration: u16, bump: u8, diff --git a/finance/token-fundraiser/quasar/src/instructions/refund.rs b/finance/token-fundraiser/quasar/src/instructions/refund.rs index e117ca84..02023dcd 100644 --- a/finance/token-fundraiser/quasar/src/instructions/refund.rs +++ b/finance/token-fundraiser/quasar/src/instructions/refund.rs @@ -8,7 +8,7 @@ use { }; #[derive(Accounts)] -pub struct Refund { +pub struct RefundAccountConstraints { #[account(mut)] pub contributor: Signer, @@ -39,7 +39,7 @@ pub struct Refund { } #[inline(always)] -pub fn handle_refund(accounts: &mut Refund, bumps: &RefundBumps) -> Result<(), ProgramError> { +pub fn handle_refund(accounts: &mut RefundAccountConstraints, bumps: &RefundAccountConstraintsBumps) -> Result<(), ProgramError> { // Refunds are allowed only after the deadline (now >= start + duration). let now: i64 = Clock::get()?.unix_timestamp.into(); let deadline = fundraiser_deadline( diff --git a/finance/token-fundraiser/quasar/src/lib.rs b/finance/token-fundraiser/quasar/src/lib.rs index 39453ba4..630876cd 100644 --- a/finance/token-fundraiser/quasar/src/lib.rs +++ b/finance/token-fundraiser/quasar/src/lib.rs @@ -21,7 +21,7 @@ mod quasar_token_fundraiser { /// Create a new fundraiser with a target amount and duration. #[instruction(discriminator = 0)] pub fn initialize( - ctx: Ctx, + ctx: Ctx, amount_to_raise: u64, duration: u16, ) -> Result<(), ProgramError> { @@ -31,20 +31,20 @@ mod quasar_token_fundraiser { /// Contribute tokens to the fundraiser while its window is open. Creates /// the contributor's tracking account on first contribution. #[instruction(discriminator = 1)] - pub fn contribute(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { + pub fn contribute(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { instructions::handle_contribute(&mut ctx.accounts, amount, &ctx.bumps) } /// Maker withdraws all funds once the target is met. #[instruction(discriminator = 2)] - pub fn check_contributions(ctx: Ctx) -> Result<(), ProgramError> { + pub fn check_contributions(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_check_contributions(&mut ctx.accounts, &ctx.bumps) } /// Contributors reclaim their tokens after the deadline if the target /// was not met. #[instruction(discriminator = 3)] - pub fn refund(ctx: Ctx) -> Result<(), ProgramError> { + pub fn refund(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_refund(&mut ctx.accounts, &ctx.bumps) } } diff --git a/finance/token-swap/quasar/src/instructions/claim_admin_fees.rs b/finance/token-swap/quasar/src/instructions/claim_admin_fees.rs index 5df262f4..2ab330b0 100644 --- a/finance/token-swap/quasar/src/instructions/claim_admin_fees.rs +++ b/finance/token-swap/quasar/src/instructions/claim_admin_fees.rs @@ -12,7 +12,7 @@ use { /// enforce that explicitly in the handler since quasar doesn't have an /// Anchor-style `has_one` constraint. #[derive(Accounts)] -pub struct ClaimAdminFeesAccounts { +pub struct ClaimAdminFeesAccountConstraints { #[account(address = ConfigPda::seeds())] pub config: Account, #[account( @@ -47,8 +47,8 @@ pub struct ClaimAdminFeesAccounts { #[inline(always)] pub fn handle_claim_admin_fees( - accounts: &mut ClaimAdminFeesAccounts, - bumps: &ClaimAdminFeesAccountsBumps, + accounts: &mut ClaimAdminFeesAccountConstraints, + bumps: &ClaimAdminFeesAccountConstraintsBumps, ) -> Result<(), ProgramError> { // Authorisation: only the address stored in `Config.admin` may call this. if *accounts.admin.address() != *accounts.config.admin() { diff --git a/finance/token-swap/quasar/src/instructions/create_config.rs b/finance/token-swap/quasar/src/instructions/create_config.rs index a70afc8a..b986ff1c 100644 --- a/finance/token-swap/quasar/src/instructions/create_config.rs +++ b/finance/token-swap/quasar/src/instructions/create_config.rs @@ -7,7 +7,7 @@ use { /// at the fixed seed `b"config"`. There is no `id` parameter - calling this /// twice for the same program will fail because the account already exists. #[derive(Accounts)] -pub struct CreateConfigAccounts { +pub struct CreateConfigAccountConstraints { #[account(mut, init, payer = payer, address = ConfigPda::seeds())] pub config: Account, /// Admin authority for the AMM. @@ -19,7 +19,7 @@ pub struct CreateConfigAccounts { #[inline(always)] pub fn handle_create_config( - accounts: &mut CreateConfigAccounts, + accounts: &mut CreateConfigAccountConstraints, fee: u16, admin_share_bps: u16, ) -> Result<(), ProgramError> { diff --git a/finance/token-swap/quasar/src/instructions/create_pool.rs b/finance/token-swap/quasar/src/instructions/create_pool.rs index 55b46ae9..5f1d9042 100644 --- a/finance/token-swap/quasar/src/instructions/create_pool.rs +++ b/finance/token-swap/quasar/src/instructions/create_pool.rs @@ -16,7 +16,7 @@ use { /// onchain addresses than the Anchor sibling because `#[derive(Seeds)]` /// emits the literal prefix first. Internally consistent within this program. #[derive(Accounts)] -pub struct CreatePoolAccounts { +pub struct CreatePoolAccountConstraints { #[account(address = ConfigPda::seeds())] pub config: Account, #[account( @@ -66,7 +66,7 @@ pub struct CreatePoolAccounts { } #[inline(always)] -pub fn handle_create_pool(accounts: &mut CreatePoolAccounts) -> Result<(), ProgramError> { +pub fn handle_create_pool(accounts: &mut CreatePoolAccountConstraints) -> Result<(), ProgramError> { accounts.pool_config.set_inner(PoolConfigInner { config: *accounts.config.address(), mint_a: *accounts.mint_a.address(), diff --git a/finance/token-swap/quasar/src/instructions/deposit_liquidity.rs b/finance/token-swap/quasar/src/instructions/deposit_liquidity.rs index 5905f982..881e5173 100644 --- a/finance/token-swap/quasar/src/instructions/deposit_liquidity.rs +++ b/finance/token-swap/quasar/src/instructions/deposit_liquidity.rs @@ -11,7 +11,7 @@ use { /// Seeds reference the `config`, `mint_a`, and `mint_b` account addresses, /// which must be provided as separate account inputs. #[derive(Accounts)] -pub struct DepositLiquidityAccounts { +pub struct DepositLiquidityAccountConstraints { #[account(address = ConfigPda::seeds())] pub config: Account, #[account(address = PoolPda::seeds(config.address(), mint_a.address(), mint_b.address()))] @@ -76,11 +76,11 @@ fn isqrt(n: u128) -> u128 { #[inline(always)] pub fn handle_deposit_liquidity( - accounts: &mut DepositLiquidityAccounts, + accounts: &mut DepositLiquidityAccountConstraints, amount_a: u64, amount_b: u64, minimum_lp_tokens_out: u64, - bumps: &DepositLiquidityAccountsBumps, + bumps: &DepositLiquidityAccountConstraintsBumps, ) -> Result<(), ProgramError> { // Fail fast if the depositor lacks the requested balance. Never silently // clamp to the available balance: callers expect their requested amount to diff --git a/finance/token-swap/quasar/src/instructions/swap_tokens.rs b/finance/token-swap/quasar/src/instructions/swap_tokens.rs index 77e71c56..2dcc4319 100644 --- a/finance/token-swap/quasar/src/instructions/swap_tokens.rs +++ b/finance/token-swap/quasar/src/instructions/swap_tokens.rs @@ -11,7 +11,7 @@ use { /// `pool_config` is mutable because each swap accumulates the admin's slice /// of the trading fee into `admin_fees_owed_a` / `admin_fees_owed_b`. #[derive(Accounts)] -pub struct SwapTokensAccounts { +pub struct SwapTokensAccountConstraints { #[account(address = ConfigPda::seeds())] pub config: Account, #[account( @@ -51,11 +51,11 @@ pub struct SwapTokensAccounts { #[inline(always)] pub fn handle_swap_tokens( - accounts: &mut SwapTokensAccounts, + accounts: &mut SwapTokensAccountConstraints, input_is_token_a: bool, input_amount: u64, min_output_amount: u64, - bumps: &SwapTokensAccountsBumps, + bumps: &SwapTokensAccountConstraintsBumps, ) -> Result<(), ProgramError> { // Never silently clamp the input to the trader's balance: the trader's // min_output_amount is computed against the input they requested, so diff --git a/finance/token-swap/quasar/src/instructions/withdraw_liquidity.rs b/finance/token-swap/quasar/src/instructions/withdraw_liquidity.rs index b98ca5e5..8bfc03df 100644 --- a/finance/token-swap/quasar/src/instructions/withdraw_liquidity.rs +++ b/finance/token-swap/quasar/src/instructions/withdraw_liquidity.rs @@ -9,7 +9,7 @@ use { }; #[derive(Accounts)] -pub struct WithdrawLiquidityAccounts { +pub struct WithdrawLiquidityAccountConstraints { #[account(address = ConfigPda::seeds())] pub config: Account, #[account(address = PoolPda::seeds(config.address(), mint_a.address(), mint_b.address()))] @@ -59,11 +59,11 @@ pub struct WithdrawLiquidityAccounts { #[inline(always)] pub fn handle_withdraw_liquidity( - accounts: &mut WithdrawLiquidityAccounts, + accounts: &mut WithdrawLiquidityAccountConstraints, amount: u64, minimum_token_a_out: u64, minimum_token_b_out: u64, - bumps: &WithdrawLiquidityAccountsBumps, + bumps: &WithdrawLiquidityAccountConstraintsBumps, ) -> Result<(), ProgramError> { // Seed order matches PoolAuthorityPda: [b"authority", config, mint_a, mint_b, bump]. let bump = [bumps.pool_authority]; diff --git a/finance/token-swap/quasar/src/lib.rs b/finance/token-swap/quasar/src/lib.rs index 4861fde6..197d63bf 100644 --- a/finance/token-swap/quasar/src/lib.rs +++ b/finance/token-swap/quasar/src/lib.rs @@ -71,7 +71,7 @@ mod quasar_token_swap { #[instruction(discriminator = 0)] pub fn create_config( - ctx: Ctx, + ctx: Ctx, fee: u16, admin_share_bps: u16, ) -> Result<(), ProgramError> { @@ -79,13 +79,13 @@ mod quasar_token_swap { } #[instruction(discriminator = 1)] - pub fn create_pool(ctx: Ctx) -> Result<(), ProgramError> { + pub fn create_pool(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_create_pool(&mut ctx.accounts) } #[instruction(discriminator = 2)] pub fn deposit_liquidity( - ctx: Ctx, + ctx: Ctx, amount_a: u64, amount_b: u64, minimum_lp_tokens_out: u64, @@ -101,7 +101,7 @@ mod quasar_token_swap { #[instruction(discriminator = 3)] pub fn withdraw_liquidity( - ctx: Ctx, + ctx: Ctx, amount: u64, minimum_token_a_out: u64, minimum_token_b_out: u64, @@ -117,7 +117,7 @@ mod quasar_token_swap { #[instruction(discriminator = 4)] pub fn swap_tokens( - ctx: Ctx, + ctx: Ctx, input_is_token_a: bool, input_amount: u64, min_output_amount: u64, @@ -133,7 +133,7 @@ mod quasar_token_swap { #[instruction(discriminator = 5)] pub fn claim_admin_fees( - ctx: Ctx, + ctx: Ctx, ) -> Result<(), ProgramError> { instructions::handle_claim_admin_fees(&mut ctx.accounts, &ctx.bumps) } diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/add_outcome.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/add_outcome.rs index 1eaeb47a..0095688c 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/instructions/add_outcome.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/add_outcome.rs @@ -5,7 +5,7 @@ use crate::{error::BettingError, Config, Event, EventStatus, Outcome}; pub const MAX_LABEL_LEN: usize = 64; #[derive(Accounts)] -pub struct AddOutcome<'info> { +pub struct AddOutcomeAccountConstraints<'info> { #[account(mut)] pub admin: Signer<'info>, @@ -35,7 +35,7 @@ pub struct AddOutcome<'info> { pub system_program: Program<'info, System>, } -pub fn handle_add_outcome(context: Context, label: String) -> Result<()> { +pub fn handle_add_outcome(context: Context, label: String) -> Result<()> { require!(label.len() <= MAX_LABEL_LEN, BettingError::LabelTooLong); require!( context.accounts.event.status == EventStatus::Open, diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/cancel_event.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/cancel_event.rs index bde8cd8b..2bec2049 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/instructions/cancel_event.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/cancel_event.rs @@ -5,7 +5,7 @@ use crate::{error::BettingError, Config, Event, EventStatus}; // Abandon an event that can't be resolved (e.g. the real-world result is void). // Bettors then reclaim their exact stakes via `claim_refund`; no fee is taken. #[derive(Accounts)] -pub struct CancelEvent<'info> { +pub struct CancelEventAccountConstraints<'info> { pub admin: Signer<'info>, #[account( @@ -23,7 +23,7 @@ pub struct CancelEvent<'info> { pub event: Account<'info, Event>, } -pub fn handle_cancel_event(context: Context) -> Result<()> { +pub fn handle_cancel_event(context: Context) -> Result<()> { require!( context.accounts.event.status == EventStatus::Open, BettingError::EventNotOpen diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/create_event.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/create_event.rs index ce7ea4ce..1ea59b71 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/instructions/create_event.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/create_event.rs @@ -10,7 +10,7 @@ pub const MAX_DESCRIPTION_LEN: usize = 200; #[derive(Accounts)] #[instruction(event_id: u64)] -pub struct CreateEvent<'info> { +pub struct CreateEventAccountConstraints<'info> { #[account(mut)] pub admin: Signer<'info>, @@ -51,7 +51,7 @@ pub struct CreateEvent<'info> { } pub fn handle_create_event( - context: Context, + context: Context, event_id: u64, description: String, ) -> Result<()> { diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/initialize_config.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/initialize_config.rs index 8a6eec0c..ed66deaf 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/instructions/initialize_config.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/initialize_config.rs @@ -6,7 +6,7 @@ use crate::{error::BettingError, Config}; pub const MAX_FEE_BPS: u16 = 10_000; #[derive(Accounts)] -pub struct InitializeConfig<'info> { +pub struct InitializeConfigAccountConstraints<'info> { #[account(mut)] pub admin: Signer<'info>, @@ -27,7 +27,7 @@ pub struct InitializeConfig<'info> { } pub fn handle_initialize_config( - context: Context, + context: Context, fee_bps: u16, fee_recipient: Pubkey, ) -> Result<()> { diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/settle_event.rs b/tokens/betting-market/anchor/programs/betting-market/src/instructions/settle_event.rs index c8f3a103..debfae8e 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/instructions/settle_event.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/instructions/settle_event.rs @@ -12,7 +12,7 @@ const BPS_DENOMINATOR: u128 = 10_000; #[derive(Accounts)] #[instruction(winning_outcome_index: u8)] -pub struct SettleEvent<'info> { +pub struct SettleEventAccountConstraints<'info> { #[account(mut)] pub admin: Signer<'info>, @@ -68,7 +68,7 @@ pub struct SettleEvent<'info> { } pub fn handle_settle_event( - context: Context, + context: Context, winning_outcome_index: u8, ) -> Result<()> { require!( diff --git a/tokens/betting-market/anchor/programs/betting-market/src/lib.rs b/tokens/betting-market/anchor/programs/betting-market/src/lib.rs index 26206226..c38cdaaf 100644 --- a/tokens/betting-market/anchor/programs/betting-market/src/lib.rs +++ b/tokens/betting-market/anchor/programs/betting-market/src/lib.rs @@ -16,7 +16,7 @@ pub mod betting_market { // One-time setup: the signer becomes the admin and fixes the stake token and // the settlement fee (basis points) for every market in this deployment. pub fn initialize_config( - context: Context, + context: Context, fee_bps: u16, fee_recipient: Pubkey, ) -> Result<()> { @@ -25,7 +25,7 @@ pub mod betting_market { // Admin opens a new market and creates its pool vault. pub fn create_event( - context: Context, + context: Context, event_id: u64, description: String, ) -> Result<()> { @@ -33,7 +33,7 @@ pub mod betting_market { } // Admin adds a possible result. Only allowed before betting starts. - pub fn add_outcome(context: Context, label: String) -> Result<()> { + pub fn add_outcome(context: Context, label: String) -> Result<()> { instructions::add_outcome::handle_add_outcome(context, label) } @@ -44,7 +44,7 @@ pub mod betting_market { // Admin resolves the market: takes the fee from the losing pool and records // the figures winners need to claim their share. - pub fn settle_event(context: Context, winning_outcome_index: u8) -> Result<()> { + pub fn settle_event(context: Context, winning_outcome_index: u8) -> Result<()> { instructions::settle_event::handle_settle_event(context, winning_outcome_index) } @@ -61,7 +61,7 @@ pub mod betting_market { } // Admin voids an unresolved market so bettors can be made whole. - pub fn cancel_event(context: Context) -> Result<()> { + pub fn cancel_event(context: Context) -> Result<()> { instructions::cancel_event::handle_cancel_event(context) } diff --git a/tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs b/tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs index 136df782..e47d0644 100644 --- a/tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs +++ b/tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs @@ -111,7 +111,7 @@ fn initialize_config_ix(admin: Pubkey, mint: Pubkey, fee_recipient: Pubkey) -> I fee_recipient, } .data(), - betting_market::accounts::InitializeConfig { + betting_market::accounts::InitializeConfigAccountConstraints { admin, token_mint: mint, config: config_pda(), @@ -131,7 +131,7 @@ fn create_event_ix(admin: Pubkey, mint: Pubkey, event_id: u64, description: &str description: description.to_string(), } .data(), - betting_market::accounts::CreateEvent { + betting_market::accounts::CreateEventAccountConstraints { admin, config: config_pda(), token_mint: mint, @@ -153,7 +153,7 @@ fn add_outcome_ix(admin: Pubkey, event_id: u64, index: u8, label: &str) -> Instr label: label.to_string(), } .data(), - betting_market::accounts::AddOutcome { + betting_market::accounts::AddOutcomeAccountConstraints { admin, config: config_pda(), event, @@ -210,7 +210,7 @@ fn settle_event_ix( winning_outcome_index, } .data(), - betting_market::accounts::SettleEvent { + betting_market::accounts::SettleEventAccountConstraints { admin, config: config_pda(), token_mint: mint, @@ -257,7 +257,7 @@ fn cancel_event_ix(admin: Pubkey, event_id: u64) -> Instruction { Instruction::new_with_bytes( betting_market::id(), &betting_market::instruction::CancelEvent {}.data(), - betting_market::accounts::CancelEvent { + betting_market::accounts::CancelEventAccountConstraints { admin, config: config_pda(), event: event_pda(event_id), diff --git a/tokens/create-token/anchor/programs/create-token/src/lib.rs b/tokens/create-token/anchor/programs/create-token/src/lib.rs index 1596b45a..59173b77 100644 --- a/tokens/create-token/anchor/programs/create-token/src/lib.rs +++ b/tokens/create-token/anchor/programs/create-token/src/lib.rs @@ -16,7 +16,7 @@ pub mod create_token { use super::*; pub fn create_token_mint( - context: Context, + context: Context, _token_decimals: u8, token_name: String, token_symbol: String, @@ -65,7 +65,7 @@ pub mod create_token { #[derive(Accounts)] #[instruction(_token_decimals: u8)] -pub struct CreateTokenMint<'info> { +pub struct CreateTokenMintAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, diff --git a/tokens/create-token/anchor/programs/create-token/tests/test_create_token.rs b/tokens/create-token/anchor/programs/create-token/tests/test_create_token.rs index 8acc0195..11e7bf7a 100644 --- a/tokens/create-token/anchor/programs/create-token/tests/test_create_token.rs +++ b/tokens/create-token/anchor/programs/create-token/tests/test_create_token.rs @@ -66,7 +66,7 @@ fn test_create_spl_token() { token_uri: "https://example.com/token.json".to_string(), } .data(), - create_token::accounts::CreateTokenMint { + create_token::accounts::CreateTokenMintAccountConstraints { payer: payer.pubkey(), metadata_account, mint_account: mint_keypair.pubkey(), @@ -117,7 +117,7 @@ fn test_create_nft() { token_uri: "https://example.com/nft.json".to_string(), } .data(), - create_token::accounts::CreateTokenMint { + create_token::accounts::CreateTokenMintAccountConstraints { payer: payer.pubkey(), metadata_account, mint_account: mint_keypair.pubkey(), diff --git a/tokens/create-token/quasar/src/lib.rs b/tokens/create-token/quasar/src/lib.rs index 3ef8fe03..bbbb486f 100644 --- a/tokens/create-token/quasar/src/lib.rs +++ b/tokens/create-token/quasar/src/lib.rs @@ -6,7 +6,7 @@ use quasar_spl::{initialize_mint2, prelude::*}; #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("GwvQ53QTu1xz3XXYfG5m5jEqwhMBvVBudPS8TUuFYnhT"); /// SPL Mint account size in bytes. const MINT_SPACE: usize = 82; diff --git a/tokens/create-token/quasar/src/tests.rs b/tokens/create-token/quasar/src/tests.rs index e20dfc04..8aba68d9 100644 --- a/tokens/create-token/quasar/src/tests.rs +++ b/tokens/create-token/quasar/src/tests.rs @@ -150,5 +150,17 @@ fn test_mint_tokens() { ); assert!(result.is_ok(), "mint_tokens failed: {:?}", result.raw_result); + + // The handler mints exactly the minor-unit amount passed: no decimal scaling. + let token_after = result.account(&token_addr).expect("token account exists"); + let token_state = ::unpack(&token_after.data) + .expect("valid token account"); + assert_eq!(token_state.amount, amount); + + let mint_after = result.account(&mint_address).expect("mint exists"); + let mint_state = + ::unpack(&mint_after.data).expect("valid mint"); + assert_eq!(mint_state.supply, amount); + println!(" MINT TOKENS CU: {}", result.compute_units_consumed); } diff --git a/tokens/nft-operations/quasar/src/lib.rs b/tokens/nft-operations/quasar/src/lib.rs index 58185ce9..2c8552ee 100644 --- a/tokens/nft-operations/quasar/src/lib.rs +++ b/tokens/nft-operations/quasar/src/lib.rs @@ -7,7 +7,7 @@ use instructions::*; #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("3EMcczaGi9ivdLxvvFwRbGYeEUEHpGwabXegARw4jLxa"); /// Marker carrying the seeds for the shared PDA mint authority used as /// both mint and update authority. PR #195 removed inline diff --git a/tokens/pda-mint-authority/anchor/programs/token-minter/src/instructions/create.rs b/tokens/pda-mint-authority/anchor/programs/token-minter/src/instructions/create.rs index baeaedbe..75891fe9 100644 --- a/tokens/pda-mint-authority/anchor/programs/token-minter/src/instructions/create.rs +++ b/tokens/pda-mint-authority/anchor/programs/token-minter/src/instructions/create.rs @@ -12,7 +12,7 @@ use { }; #[derive(Accounts)] -pub struct CreateToken<'info> { +pub struct CreateTokenAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -46,7 +46,7 @@ pub struct CreateToken<'info> { } pub fn handle_create_token( - context: Context, + context: Context, token_name: String, token_symbol: String, token_uri: String, diff --git a/tokens/pda-mint-authority/anchor/programs/token-minter/src/lib.rs b/tokens/pda-mint-authority/anchor/programs/token-minter/src/lib.rs index bea8707d..fb5ba679 100644 --- a/tokens/pda-mint-authority/anchor/programs/token-minter/src/lib.rs +++ b/tokens/pda-mint-authority/anchor/programs/token-minter/src/lib.rs @@ -9,7 +9,7 @@ pub mod token_minter { use super::*; pub fn create_token( - context: Context, + context: Context, token_name: String, token_symbol: String, token_uri: String, diff --git a/tokens/pda-mint-authority/anchor/programs/token-minter/tests/test_pda_mint.rs b/tokens/pda-mint-authority/anchor/programs/token-minter/tests/test_pda_mint.rs index 9a7488c8..f451e5a0 100644 --- a/tokens/pda-mint-authority/anchor/programs/token-minter/tests/test_pda_mint.rs +++ b/tokens/pda-mint-authority/anchor/programs/token-minter/tests/test_pda_mint.rs @@ -12,7 +12,7 @@ use { }; /// Decimals configured by the program's `mint::decimals` constraint in -/// `CreateToken`. +/// `CreateTokenAccountConstraints`. const MINT_DECIMALS: u32 = 9; /// Converts a whole-token (major unit) count to minor units, the form the @@ -98,7 +98,7 @@ fn test_create_token_and_mint() { token_uri: "https://example.com/token.json".to_string(), } .data(), - token_minter::accounts::CreateToken { + token_minter::accounts::CreateTokenAccountConstraints { payer: payer.pubkey(), mint_account: mint_pda, metadata_account, diff --git a/tokens/pda-mint-authority/quasar/src/lib.rs b/tokens/pda-mint-authority/quasar/src/lib.rs index 9a7dfc68..dc218121 100644 --- a/tokens/pda-mint-authority/quasar/src/lib.rs +++ b/tokens/pda-mint-authority/quasar/src/lib.rs @@ -6,7 +6,7 @@ use quasar_spl::{initialize_mint2, prelude::*}; #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("3LFrPHqwk5jMrmiz48BFj6NV2k4NjobgTe1jChzx3JGD"); /// SPL Mint account size in bytes. const MINT_SPACE: usize = 82; diff --git a/tokens/pda-mint-authority/quasar/src/tests.rs b/tokens/pda-mint-authority/quasar/src/tests.rs index 3f9cbb81..2d51ded0 100644 --- a/tokens/pda-mint-authority/quasar/src/tests.rs +++ b/tokens/pda-mint-authority/quasar/src/tests.rs @@ -142,5 +142,17 @@ fn test_mint_with_pda_authority() { ); assert!(result.is_ok(), "mint_tokens failed: {:?}", result.raw_result); + + // The handler mints exactly the minor-unit amount passed: no decimal scaling. + let token_after = result.account(&token_addr).expect("token account exists"); + let token_state = ::unpack(&token_after.data) + .expect("valid token account"); + assert_eq!(token_state.amount, amount); + + let mint_after = result.account(&mint_pda).expect("mint exists"); + let mint_state = + ::unpack(&mint_after.data).expect("valid mint"); + assert_eq!(mint_state.supply, amount); + println!(" MINT WITH PDA CU: {}", result.compute_units_consumed); } diff --git a/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/create_associated_token_account.rs b/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/create_associated_token_account.rs index f007b187..9c00f4be 100644 --- a/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/create_associated_token_account.rs +++ b/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/create_associated_token_account.rs @@ -3,7 +3,7 @@ use anchor_spl::associated_token::AssociatedToken; use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; #[derive(Accounts)] -pub struct CreateAssociatedTokenAccount<'info> { +pub struct CreateAssociatedTokenAccountAccountConstraints<'info> { #[account(mut)] pub signer: Signer<'info>, pub mint: InterfaceAccount<'info, Mint>, @@ -19,7 +19,7 @@ pub struct CreateAssociatedTokenAccount<'info> { pub associated_token_program: Program<'info, AssociatedToken>, } -pub fn handler(_context: Context) -> Result<()> { +pub fn handler(_context: Context) -> Result<()> { msg!("Create Associated Token Account"); Ok(()) } diff --git a/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/create_token.rs b/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/create_token.rs index c68ad0ec..bc08105a 100644 --- a/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/create_token.rs +++ b/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/create_token.rs @@ -3,7 +3,7 @@ use anchor_spl::token_interface::{Mint, TokenInterface}; #[derive(Accounts)] #[instruction(token_name: String)] -pub struct CreateToken<'info> { +pub struct CreateTokenAccountConstraints<'info> { #[account(mut)] pub signer: Signer<'info>, #[account( @@ -19,7 +19,7 @@ pub struct CreateToken<'info> { pub token_program: Interface<'info, TokenInterface>, } -pub fn handler(_context: Context, _token_name: String) -> Result<()> { +pub fn handler(_context: Context, _token_name: String) -> Result<()> { msg!("Create Token"); Ok(()) } diff --git a/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/create_token_account.rs b/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/create_token_account.rs index eda53708..d5e87541 100644 --- a/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/create_token_account.rs +++ b/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/create_token_account.rs @@ -2,7 +2,7 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; #[derive(Accounts)] -pub struct CreateTokenAccount<'info> { +pub struct CreateTokenAccountAccountConstraints<'info> { #[account(mut)] pub signer: Signer<'info>, pub mint: InterfaceAccount<'info, Mint>, @@ -19,7 +19,7 @@ pub struct CreateTokenAccount<'info> { pub token_program: Interface<'info, TokenInterface>, } -pub fn handler(_context: Context) -> Result<()> { +pub fn handler(_context: Context) -> Result<()> { msg!("Create Token Account"); Ok(()) } diff --git a/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/mint_token.rs b/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/mint_token.rs index 2027bb21..26798f21 100644 --- a/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/mint_token.rs +++ b/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/mint_token.rs @@ -2,7 +2,7 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::{self, Mint, MintTo, TokenAccount, TokenInterface}; #[derive(Accounts)] -pub struct MintToken<'info> { +pub struct MintTokenAccountConstraints<'info> { #[account(mut)] pub signer: Signer<'info>, #[account(mut)] @@ -12,7 +12,7 @@ pub struct MintToken<'info> { pub token_program: Interface<'info, TokenInterface>, } -pub fn handler(context: Context, amount: u64) -> Result<()> { +pub fn handler(context: Context, amount: u64) -> Result<()> { let cpi_accounts = MintTo { mint: context.accounts.mint.to_account_info().clone(), to: context.accounts.receiver.to_account_info().clone(), diff --git a/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/transfer_token.rs b/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/transfer_token.rs index aeecb560..57ce4168 100644 --- a/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/transfer_token.rs +++ b/tokens/token-extensions/basics/anchor/programs/basics/src/instructions/transfer_token.rs @@ -3,7 +3,7 @@ use anchor_spl::associated_token::AssociatedToken; use anchor_spl::token_interface::{self, Mint, TokenAccount, TokenInterface, TransferChecked}; #[derive(Accounts)] -pub struct TransferToken<'info> { +pub struct TransferTokenAccountConstraints<'info> { #[account(mut)] pub signer: Signer<'info>, #[account(mut)] @@ -23,7 +23,7 @@ pub struct TransferToken<'info> { pub associated_token_program: Program<'info, AssociatedToken>, } -pub fn handler(context: Context, amount: u64) -> Result<()> { +pub fn handler(context: Context, amount: u64) -> Result<()> { let cpi_accounts = TransferChecked { from: context.accounts.from.to_account_info().clone(), mint: context.accounts.mint.to_account_info().clone(), diff --git a/tokens/token-extensions/basics/anchor/programs/basics/src/lib.rs b/tokens/token-extensions/basics/anchor/programs/basics/src/lib.rs index 03c4a8bf..0eb3bbf0 100644 --- a/tokens/token-extensions/basics/anchor/programs/basics/src/lib.rs +++ b/tokens/token-extensions/basics/anchor/programs/basics/src/lib.rs @@ -10,25 +10,25 @@ pub mod anchor { use super::*; - pub fn create_token(context: Context, token_name: String) -> Result<()> { + pub fn create_token(context: Context, token_name: String) -> Result<()> { instructions::create_token::handler(context, token_name) } - pub fn create_token_account(context: Context) -> Result<()> { + pub fn create_token_account(context: Context) -> Result<()> { instructions::create_token_account::handler(context) } pub fn create_associated_token_account( - context: Context, + context: Context, ) -> Result<()> { instructions::create_associated_token_account::handler(context) } - pub fn transfer_token(context: Context, amount: u64) -> Result<()> { + pub fn transfer_token(context: Context, amount: u64) -> Result<()> { instructions::transfer_token::handler(context, amount) } - pub fn mint_token(context: Context, amount: u64) -> Result<()> { + pub fn mint_token(context: Context, amount: u64) -> Result<()> { instructions::mint_token::handler(context, amount) } } diff --git a/tokens/token-extensions/basics/anchor/programs/basics/tests/test_basics.rs b/tokens/token-extensions/basics/anchor/programs/basics/tests/test_basics.rs index e1a244b5..21b5218c 100644 --- a/tokens/token-extensions/basics/anchor/programs/basics/tests/test_basics.rs +++ b/tokens/token-extensions/basics/anchor/programs/basics/tests/test_basics.rs @@ -54,7 +54,7 @@ fn test_create_token_and_mint_and_transfer() { token_name: token_name.clone(), } .data(), - anchor::accounts::CreateToken { + anchor::accounts::CreateTokenAccountConstraints { signer: payer.pubkey(), mint, system_program: system_program::id(), @@ -77,7 +77,7 @@ fn test_create_token_and_mint_and_transfer() { let create_ata_ix = Instruction::new_with_bytes( program_id, &anchor::instruction::CreateAssociatedTokenAccount {}.data(), - anchor::accounts::CreateAssociatedTokenAccount { + anchor::accounts::CreateAssociatedTokenAccountAccountConstraints { signer: payer.pubkey(), mint, token_account: payer_ata, @@ -107,7 +107,7 @@ fn test_create_token_and_mint_and_transfer() { amount: mint_amount, } .data(), - anchor::accounts::MintToken { + anchor::accounts::MintTokenAccountConstraints { signer: payer.pubkey(), mint, receiver: payer_ata, @@ -139,7 +139,7 @@ fn test_create_token_and_mint_and_transfer() { amount: transfer_amount, } .data(), - anchor::accounts::TransferToken { + anchor::accounts::TransferTokenAccountConstraints { signer: payer.pubkey(), from: payer_ata, to: receiver.pubkey(), diff --git a/tokens/token-extensions/basics/quasar/src/lib.rs b/tokens/token-extensions/basics/quasar/src/lib.rs index 6b0e8ba7..2611ae08 100644 --- a/tokens/token-extensions/basics/quasar/src/lib.rs +++ b/tokens/token-extensions/basics/quasar/src/lib.rs @@ -33,20 +33,20 @@ mod quasar_token_2022_basics { /// Mint tokens to a recipient's token account. #[instruction(discriminator = 0)] - pub fn mint_token(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { + pub fn mint_token(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { handle_mint_token(&mut ctx.accounts, amount) } /// Transfer tokens using transfer_checked (required for Token Extensions). #[instruction(discriminator = 1)] - pub fn transfer_token(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { + pub fn transfer_token(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { handle_transfer_token(&mut ctx.accounts, amount) } } /// Accounts for minting tokens via Token Extensions. #[derive(Accounts)] -pub struct MintToken { +pub struct MintTokenAccountConstraints { #[account(mut)] pub authority: Signer, #[account(mut)] @@ -57,7 +57,7 @@ pub struct MintToken { } #[inline(always)] -fn handle_mint_token(accounts: &mut MintToken, amount: u64) -> Result<(), ProgramError> { +fn handle_mint_token(accounts: &mut MintTokenAccountConstraints, amount: u64) -> Result<(), ProgramError> { // SPL Token MintTo instruction: opcode 7, amount as u64 LE. let data = build_u64_data(7, amount); CpiCall::new( @@ -79,7 +79,7 @@ fn handle_mint_token(accounts: &mut MintToken, amount: u64) -> Result<(), Progra /// Accounts for transferring tokens via Token Extensions transfer_checked. #[derive(Accounts)] -pub struct TransferToken { +pub struct TransferTokenAccountConstraints { #[account(mut)] pub sender: Signer, #[account(mut)] @@ -91,7 +91,7 @@ pub struct TransferToken { } #[inline(always)] -fn handle_transfer_token(accounts: &mut TransferToken, amount: u64) -> Result<(), ProgramError> { +fn handle_transfer_token(accounts: &mut TransferTokenAccountConstraints, amount: u64) -> Result<(), ProgramError> { // SPL Token TransferChecked instruction: opcode 12, amount as u64 LE, decimals as u8. let data = build_transfer_checked_data(amount, 6); CpiCall::new( diff --git a/tokens/token-minter/anchor/programs/token-minter/src/instructions/create.rs b/tokens/token-minter/anchor/programs/token-minter/src/instructions/create.rs index cc363ef6..95be34e0 100644 --- a/tokens/token-minter/anchor/programs/token-minter/src/instructions/create.rs +++ b/tokens/token-minter/anchor/programs/token-minter/src/instructions/create.rs @@ -10,7 +10,7 @@ use { }; #[derive(Accounts)] -pub struct CreateToken<'info> { +pub struct CreateTokenAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -39,7 +39,7 @@ pub struct CreateToken<'info> { } pub fn handle_create_token( - context: Context, + context: Context, token_name: String, token_symbol: String, token_uri: String, diff --git a/tokens/token-minter/anchor/programs/token-minter/src/lib.rs b/tokens/token-minter/anchor/programs/token-minter/src/lib.rs index 3b20bac5..8033bddb 100644 --- a/tokens/token-minter/anchor/programs/token-minter/src/lib.rs +++ b/tokens/token-minter/anchor/programs/token-minter/src/lib.rs @@ -10,7 +10,7 @@ pub mod token_minter { use super::*; pub fn create_token( - context: Context, + context: Context, token_name: String, token_symbol: String, token_uri: String, diff --git a/tokens/token-minter/anchor/programs/token-minter/tests/test_token_minter.rs b/tokens/token-minter/anchor/programs/token-minter/tests/test_token_minter.rs index 3249c297..487a185f 100644 --- a/tokens/token-minter/anchor/programs/token-minter/tests/test_token_minter.rs +++ b/tokens/token-minter/anchor/programs/token-minter/tests/test_token_minter.rs @@ -12,7 +12,7 @@ use { }; /// Decimals configured by the program's `mint::decimals` constraint in -/// `CreateToken`. +/// `CreateTokenAccountConstraints`. const MINT_DECIMALS: u32 = 9; /// Converts a whole-token (major unit) count to minor units, the form the @@ -95,7 +95,7 @@ fn test_create_token() { token_uri: "https://example.com/token.json".to_string(), } .data(), - token_minter::accounts::CreateToken { + token_minter::accounts::CreateTokenAccountConstraints { payer: payer.pubkey(), mint_account: mint_keypair.pubkey(), metadata_account, @@ -142,7 +142,7 @@ fn test_create_and_mint_tokens() { token_uri: "https://example.com/token.json".to_string(), } .data(), - token_minter::accounts::CreateToken { + token_minter::accounts::CreateTokenAccountConstraints { payer: payer.pubkey(), mint_account: mint_keypair.pubkey(), metadata_account, diff --git a/tokens/token-minter/quasar/src/lib.rs b/tokens/token-minter/quasar/src/lib.rs index 1c004ee1..aadb98a5 100644 --- a/tokens/token-minter/quasar/src/lib.rs +++ b/tokens/token-minter/quasar/src/lib.rs @@ -7,7 +7,7 @@ use instructions::*; #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("3of89Z9jwek9zrFgpCWc9jZvQvitpVMxpZNsrAD2vQUD"); /// Token minter with Metaplex metadata. /// diff --git a/tokens/transfer-tokens/quasar/src/lib.rs b/tokens/transfer-tokens/quasar/src/lib.rs index bec0f28c..3c33cf09 100644 --- a/tokens/transfer-tokens/quasar/src/lib.rs +++ b/tokens/transfer-tokens/quasar/src/lib.rs @@ -6,7 +6,7 @@ use quasar_spl::prelude::*; #[cfg(test)] mod tests; -declare_id!("22222222222222222222222222222222222222222222"); +declare_id!("nHi9DdNjuupjQ3c8AJU9sChB5gLbZvTLsJQouY4hU67"); /// Demonstrates creating a mint, minting tokens, and transferring between accounts. /// From f24722d6c4e6f7492d0a1929d721943a74f3b2d2 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 11 Jun 2026 14:46:30 +0000 Subject: [PATCH 070/138] transfer-sol/anchor: rename TransferSolWithCpi to TransferSolWithCpiAccountConstraints https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- .../transfer-sol/src/instructions/transfer_sol_with_cpi.rs | 4 ++-- basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs | 2 +- .../anchor/programs/transfer-sol/tests/test_transfer_sol.rs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/basics/transfer-sol/anchor/programs/transfer-sol/src/instructions/transfer_sol_with_cpi.rs b/basics/transfer-sol/anchor/programs/transfer-sol/src/instructions/transfer_sol_with_cpi.rs index e9059286..4aa9ed0a 100644 --- a/basics/transfer-sol/anchor/programs/transfer-sol/src/instructions/transfer_sol_with_cpi.rs +++ b/basics/transfer-sol/anchor/programs/transfer-sol/src/instructions/transfer_sol_with_cpi.rs @@ -2,7 +2,7 @@ use anchor_lang::prelude::*; use anchor_lang::system_program; #[derive(Accounts)] -pub struct TransferSolWithCpi<'info> { +pub struct TransferSolWithCpiAccountConstraints<'info> { #[account(mut)] payer: Signer<'info>, #[account(mut)] @@ -10,7 +10,7 @@ pub struct TransferSolWithCpi<'info> { system_program: Program<'info, System>, } -pub fn handler(context: Context, amount: u64) -> Result<()> { +pub fn handler(context: Context, amount: u64) -> Result<()> { system_program::transfer( CpiContext::new( context.accounts.system_program.key(), diff --git a/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs b/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs index aa34c90c..e330ec7b 100644 --- a/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs +++ b/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs @@ -9,7 +9,7 @@ declare_id!("4fQVnLWKKKYxtxgGn7Haw8v2g2Hzbu8K61JvWKvqAi7W"); pub mod transfer_sol { use super::*; - pub fn transfer_sol_with_cpi(context: Context, amount: u64) -> Result<()> { + pub fn transfer_sol_with_cpi(context: Context, amount: u64) -> Result<()> { instructions::transfer_sol_with_cpi::handler(context, amount) } diff --git a/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs b/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs index facc6009..f370b7d2 100644 --- a/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs +++ b/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs @@ -27,7 +27,7 @@ fn test_transfer_sol_with_cpi() { amount: LAMPORTS_PER_SOL, } .data(), - transfer_sol::accounts::TransferSolWithCpi { + transfer_sol::accounts::TransferSolWithCpiAccountConstraints { payer: payer.pubkey(), recipient: recipient.pubkey(), system_program: system_program::id(), From 8f09488cab686a2844fe3de9d28843fb8496330e Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 11 Jun 2026 14:49:14 +0000 Subject: [PATCH 071/138] wip: checkpoint of in-progress rename and ID-alignment sweeps Snapshot so agent work survives container recycling; verified states land in the following commits. https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- tokens/create-token/quasar/src/tests.rs | 8 - .../anchor/programs/nft-minter/src/lib.rs | 4 +- .../nft-minter/tests/test_nft_minter.rs | 2 +- tokens/nft-minter/quasar/src/lib.rs | 6 +- tokens/nft-operations/anchor/Anchor.toml | 6 +- tokens/nft-operations/anchor/README.md | 213 ++++------- tokens/nft-operations/anchor/prepare.mjs | 3 +- tokens/nft-operations/quasar/README.md | 13 +- .../src/instructions/create_collection.rs | 58 +-- .../quasar/src/instructions/mint_nft.rs | 62 ++-- .../quasar/src/instructions/mod.rs | 182 ++++++++++ .../src/instructions/verify_collection.rs | 73 +++- tokens/nft-operations/quasar/src/lib.rs | 33 +- tokens/nft-operations/quasar/src/tests.rs | 333 +++++++++++++++++- .../anchor/programs/cpi-guard/src/lib.rs | 4 +- .../cpi-guard/tests/test_cpi_guard.rs | 4 +- .../cpi-guard/quasar/src/lib.rs | 6 +- .../src/instructions/initialize.rs | 4 +- .../src/instructions/update_default_state.rs | 4 +- .../programs/default-account-state/src/lib.rs | 4 +- .../tests/test_default_account_state.rs | 4 +- .../default-account-state/quasar/src/lib.rs | 12 +- .../quasar/src/instructions/create.rs | 4 +- .../quasar/src/instructions/mint.rs | 19 +- tokens/token-minter/quasar/src/lib.rs | 8 +- tokens/token-minter/quasar/src/tests.rs | 22 +- tokens/transfer-tokens/quasar/src/lib.rs | 37 +- 27 files changed, 836 insertions(+), 292 deletions(-) diff --git a/tokens/create-token/quasar/src/tests.rs b/tokens/create-token/quasar/src/tests.rs index 8aba68d9..8e99ad1a 100644 --- a/tokens/create-token/quasar/src/tests.rs +++ b/tokens/create-token/quasar/src/tests.rs @@ -53,14 +53,6 @@ fn token_account(address: Pubkey, mint: Pubkey, owner: Pubkey, amount: u64) -> A ) } -/// Mark specific account indices as signers. -fn with_signers(mut ix: Instruction, indices: &[usize]) -> Instruction { - for &i in indices { - ix.accounts[i].is_signer = true; - } - ix -} - /// Build create_token instruction data. /// Wire format: [discriminator: u8 = 0] [decimals: u8] fn build_create_token_data(decimals: u8) -> Vec { diff --git a/tokens/nft-minter/anchor/programs/nft-minter/src/lib.rs b/tokens/nft-minter/anchor/programs/nft-minter/src/lib.rs index d64e6470..134a07cb 100644 --- a/tokens/nft-minter/anchor/programs/nft-minter/src/lib.rs +++ b/tokens/nft-minter/anchor/programs/nft-minter/src/lib.rs @@ -18,7 +18,7 @@ pub mod nft_minter { use super::*; pub fn mint_nft( - context: Context, + context: Context, nft_name: String, nft_symbol: String, nft_uri: String, @@ -96,7 +96,7 @@ pub mod nft_minter { } #[derive(Accounts)] -pub struct CreateToken<'info> { +pub struct MintNftAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, diff --git a/tokens/nft-minter/anchor/programs/nft-minter/tests/test_nft_minter.rs b/tokens/nft-minter/anchor/programs/nft-minter/tests/test_nft_minter.rs index a619ac93..733c91af 100644 --- a/tokens/nft-minter/anchor/programs/nft-minter/tests/test_nft_minter.rs +++ b/tokens/nft-minter/anchor/programs/nft-minter/tests/test_nft_minter.rs @@ -98,7 +98,7 @@ fn test_mint_nft() { nft_uri: "https://example.com/nft.json".to_string(), } .data(), - nft_minter::accounts::CreateToken { + nft_minter::accounts::MintNftAccountConstraints { payer: payer.pubkey(), metadata_account, edition_account, diff --git a/tokens/nft-minter/quasar/src/lib.rs b/tokens/nft-minter/quasar/src/lib.rs index 5320a50c..c288d576 100644 --- a/tokens/nft-minter/quasar/src/lib.rs +++ b/tokens/nft-minter/quasar/src/lib.rs @@ -19,7 +19,7 @@ mod quasar_nft_minter { // PR #195 made the capacity bound on `String` mandatory. #[instruction(discriminator = 0)] pub fn mint_nft( - ctx: Ctx, + ctx: Ctx, nft_name: String<32>, nft_symbol: String<10>, nft_uri: String<200>, @@ -30,7 +30,7 @@ mod quasar_nft_minter { /// All accounts needed to mint an NFT in one transaction. #[derive(Accounts)] -pub struct MintNft { +pub struct MintNftAccountConstraints { #[account(mut)] pub payer: Signer, @@ -76,7 +76,7 @@ pub struct MintNft { #[inline(always)] fn handle_mint_nft( - accounts: &mut MintNft, + accounts: &mut MintNftAccountConstraints, nft_name: &str, nft_symbol: &str, nft_uri: &str, diff --git a/tokens/nft-operations/anchor/Anchor.toml b/tokens/nft-operations/anchor/Anchor.toml index bcc5d063..a5d70849 100644 --- a/tokens/nft-operations/anchor/Anchor.toml +++ b/tokens/nft-operations/anchor/Anchor.toml @@ -16,7 +16,7 @@ cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests - the validator tests (mint-nft.ts) need Metaplex Token -# Metadata cloned from mainnet which is too slow/unreliable in CI. -# bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). +# Rust + LiteSVM tests; they load Metaplex Token Metadata from the local +# fixture (tests/fixtures/mpl_token_metadata.so) instead of cloning it from +# mainnet, which is too slow/unreliable in CI. test = "cargo test" diff --git a/tokens/nft-operations/anchor/README.md b/tokens/nft-operations/anchor/README.md index 6113c1ac..f60df0ab 100644 --- a/tokens/nft-operations/anchor/README.md +++ b/tokens/nft-operations/anchor/README.md @@ -4,17 +4,7 @@ Create an NFT collection, mint an NFT, and verify an NFT as part of a collection ## Program setup -This example clones the Metaplex Token Metadata [program](https://solana.com/docs/terminology#program) from mainnet. See `Anchor.toml`: - -```toml -[test.validator] -url = "https://api.mainnet-beta.solana.com" - -[[test.validator.clone]] -address = "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" -``` - -The program is needed for [CPIs](https://solana.com/docs/terminology#cross-program-invocation-cpi) that create metadata [accounts](https://solana.com/docs/terminology#account) and master edition accounts, and to verify NFTs as part of a collection. +The [CPIs](https://solana.com/docs/terminology#cross-program-invocation-cpi) that create metadata [accounts](https://solana.com/docs/terminology#account) and master edition accounts, and that verify NFTs as part of a collection, all target the Metaplex Token Metadata program. The Rust test suite loads a dump of that program from `tests/fixtures/mpl_token_metadata.so` into LiteSVM. To refresh the dump from mainnet, run `prepare.mjs` (requires [zx](https://github.com/google/zx)). ## Create an NFT collection @@ -22,9 +12,10 @@ The accounts needed to create an NFT collection are: ```rust #[derive(Accounts)] -pub struct CreateCollection<'info> { +pub struct CreateCollectionAccountConstraints<'info> { #[account(mut)] user: Signer<'info>, + #[account( init, payer = user, @@ -33,18 +24,22 @@ pub struct CreateCollection<'info> { mint::freeze_authority = mint_authority, )] mint: Account<'info, Mint>, + #[account( seeds = [b"authority"], bump, )] /// CHECK: This account is not initialized and is being used for signing purposes only pub mint_authority: UncheckedAccount<'info>, + #[account(mut)] /// CHECK: This account will be initialized by the metaplex program metadata: UncheckedAccount<'info>, + #[account(mut)] /// CHECK: This account will be initialized by the metaplex program master_edition: UncheckedAccount<'info>, + #[account( init, payer = user, @@ -52,6 +47,7 @@ pub struct CreateCollection<'info> { associated_token::authority = user )] destination: Account<'info, TokenAccount>, + system_program: Program<'info, System>, token_program: Program<'info, Token>, associated_token_program: Program<'info, AssociatedToken>, @@ -71,30 +67,32 @@ pub struct CreateCollection<'info> { - `token_program` / `associated_token_program`: create new [ATAs](https://solana.com/docs/terminology#associated-token-account-ata) and mint tokens. - `token_metadata_program`: the MPL Token Metadata program, used to create the metadata and master edition accounts. -Both `metadata` and `master_edition` are `UncheckedAccount` because they are uninitialized at the start of the [instruction](https://solana.com/docs/terminology#instruction) - the Token Metadata program initializes them via CPI. - -Had we written: +The `metadata` and `master_edition` accounts are `UncheckedAccount` because the Metaplex program initializes them during the CPI. If instead we wrote: ```rust -#[derive(Accounts)] -pub struct CreateCollection<'info> { - #[account(mut)] - metadata: Account<'info, MetadataAccount>, - #[account(mut)] - master_edition: Account<'info, MasterEditionAccount>, -} +#[account(mut)] +metadata: Account<'info, MetadataAccount>, +#[account(mut)] +master_edition: Account<'info, MasterEditionAccount>, ``` the instruction would fail because [Anchor](https://solana.com/docs/terminology#anchor) would expect the accounts to already be initialized. When an account *is* already initialized (as in the verify-collection flow below), use the specific account types. -### Implementation for `CreateCollection` +### Implementation for `create_collection` -Each [instruction handler](https://solana.com/docs/terminology#instruction-handler) is a free function (`pub fn handler(accounts: &mut X, bumps: &XBumps)`) called from the `#[program]` module in `lib.rs`. The account-validation struct lives in the same file as the handler. +Each [instruction handler](https://solana.com/docs/terminology#instruction-handler) is a free function called from the `#[program]` module in `lib.rs`. The account constraints struct lives in the same file as the handler. The metadata `name`, `symbol`, and `uri` are instruction arguments, validated against the Metaplex limits (32, 10, and 200 bytes) by `validate_metadata_strings`, which returns the named errors `NameTooLong` / `SymbolTooLong` / `UriTooLong` instead of an opaque CPI failure. ```rust -pub fn handler(accounts: &mut CreateCollection, bumps: &CreateCollectionBumps) -> Result<()> { +pub fn handle_create_collection( + accounts: &mut CreateCollectionAccountConstraints, + bumps: &CreateCollectionAccountConstraintsBumps, + name: String, + symbol: String, + uri: String, +) -> Result<()> { + validate_metadata_strings(&name, &symbol, &uri)?; let metadata = &accounts.metadata.to_account_info(); let master_edition = &accounts.master_edition.to_account_info(); @@ -113,12 +111,13 @@ pub fn handler(accounts: &mut CreateCollection, bumps: &CreateCollectionBumps) - to: accounts.destination.to_account_info(), authority: accounts.mint_authority.to_account_info(), }; - let cpi_ctx = CpiContext::new_with_signer(accounts.token_program.key(), cpi_accounts, signer_seeds); + let cpi_ctx = + CpiContext::new_with_signer(accounts.token_program.key(), cpi_accounts, signer_seeds); mint_to(cpi_ctx, 1)?; msg!("Collection NFT minted!"); let creator = vec![Creator { - address: accounts.mint_authority.key().clone(), + address: accounts.mint_authority.key(), verified: true, share: 100, }]; @@ -126,16 +125,19 @@ pub fn handler(accounts: &mut CreateCollection, bumps: &CreateCollectionBumps) - let metadata_account = CreateMetadataAccountV3Cpi::new( spl_metadata_program, CreateMetadataAccountV3CpiAccounts { - metadata, mint, mint_authority: authority, payer, + metadata, + mint, + mint_authority: authority, + payer, update_authority: (authority, true), system_program, rent: None, }, CreateMetadataAccountV3InstructionArgs { data: DataV2 { - name: "DummyCollection".to_owned(), - symbol: "DC".to_owned(), - uri: "".to_owned(), + name, + symbol, + uri, seller_fee_basis_points: 0, creators: Some(creator), collection: None, @@ -154,12 +156,16 @@ pub fn handler(accounts: &mut CreateCollection, bumps: &CreateCollectionBumps) - edition: master_edition, update_authority: authority, mint_authority: authority, - mint, payer, metadata, + mint, + payer, + metadata, token_program: spl_token_program, system_program, rent: None, }, - CreateMasterEditionV3InstructionArgs { max_supply: Some(0) }, + CreateMasterEditionV3InstructionArgs { + max_supply: Some(0), + }, ); master_edition_account.invoke_signed(signer_seeds)?; msg!("Master Edition Account created"); @@ -182,9 +188,10 @@ The accounts needed to mint an NFT: ```rust #[derive(Accounts)] -pub struct MintNFT<'info> { +pub struct MintNftAccountConstraints<'info> { #[account(mut)] pub owner: Signer<'info>, + #[account( init, payer = owner, @@ -193,6 +200,7 @@ pub struct MintNFT<'info> { mint::freeze_authority = mint_authority, )] pub mint: Account<'info, Mint>, + #[account( init, payer = owner, @@ -200,20 +208,25 @@ pub struct MintNFT<'info> { associated_token::authority = owner )] pub destination: Account<'info, TokenAccount>, + #[account(mut)] /// CHECK: This account will be initialized by the metaplex program pub metadata: UncheckedAccount<'info>, + #[account(mut)] /// CHECK: This account will be initialized by the metaplex program pub master_edition: UncheckedAccount<'info>, + #[account( seeds = [b"authority"], bump, )] /// CHECK: This is account is not initialized and is being used for signing purposes only pub mint_authority: UncheckedAccount<'info>, + #[account(mut)] pub collection_mint: Account<'info, Mint>, + pub system_program: Program<'info, System>, pub token_program: Program<'info, Token>, pub associated_token_program: Program<'info, AssociatedToken>, @@ -234,135 +247,53 @@ pub struct MintNFT<'info> { Apart from `collection_mint`, the accounts are the same as the collection creation flow. A collection is just a regular NFT with the `collection_details` field set and the `collection` field on `data` set to `None`. An NFT belonging to a collection has `collection_details` set to `None` and the `collection` field on `data` set to a `Collection` struct with the collection's key and a `verified` boolean. `verified` starts false and flips to true once the NFT is verified as part of the collection. -That's where the `collection` account comes from - it provides the address that goes into the `Collection` struct on the NFT's metadata. - -### Implementation for `MintNFT` - -```rust -pub fn handler(accounts: &mut MintNFT, bumps: &MintNFTBumps) -> Result<()> { - - let metadata = &accounts.metadata.to_account_info(); - let master_edition = &accounts.master_edition.to_account_info(); - let mint = &accounts.mint.to_account_info(); - let authority = &accounts.mint_authority.to_account_info(); - let payer = &accounts.owner.to_account_info(); - let system_program = &accounts.system_program.to_account_info(); - let spl_token_program = &accounts.token_program.to_account_info(); - let spl_metadata_program = &accounts.token_metadata_program.to_account_info(); - - let seeds = &[&b"authority"[..], &[bumps.mint_authority]]; - let signer_seeds = &[&seeds[..]]; - - let cpi_accounts = MintTo { - mint: accounts.mint.to_account_info(), - to: accounts.destination.to_account_info(), - authority: accounts.mint_authority.to_account_info(), - }; - let cpi_ctx = CpiContext::new_with_signer(accounts.token_program.key(), cpi_accounts, signer_seeds); - mint_to(cpi_ctx, 1)?; - msg!("Collection NFT minted!"); - - let creator = vec![Creator { - address: accounts.mint_authority.key(), - verified: true, - share: 100, - }]; - - let metadata_account = CreateMetadataAccountV3Cpi::new( - spl_metadata_program, - CreateMetadataAccountV3CpiAccounts { - metadata, mint, mint_authority: authority, payer, - update_authority: (authority, true), - system_program, - rent: None, - }, - CreateMetadataAccountV3InstructionArgs { - data: DataV2 { - name: "Mint Test".to_string(), - symbol: "YAY".to_string(), - uri: "".to_string(), - seller_fee_basis_points: 0, - creators: Some(creator), - collection: Some(Collection { - verified: false, - key: accounts.collection_mint.key(), - }), - uses: None, - }, - is_mutable: true, - collection_details: None, - }, - ); - metadata_account.invoke_signed(signer_seeds)?; - - let master_edition_account = CreateMasterEditionV3Cpi::new( - spl_metadata_program, - CreateMasterEditionV3CpiAccounts { - edition: master_edition, - update_authority: authority, - mint_authority: authority, - mint, payer, metadata, - token_program: spl_token_program, - system_program, - rent: None, - }, - CreateMasterEditionV3InstructionArgs { max_supply: Some(0) }, - ); - master_edition_account.invoke_signed(signer_seeds)?; +That's where the `collection_mint` account comes from - it provides the address that goes into the `Collection` struct on the NFT's metadata. - Ok(()) -} -``` - -Because a collection NFT is just a regular NFT with special metadata, the implementation mirrors `CreateCollection`. The same three steps: - -1. Mint one token to the destination via a Classic Token Program CPI. -2. Create a metadata account via a Token Metadata CPI (signed with the PDA seeds). -3. Create a master edition account via a Token Metadata CPI (signed with the PDA seeds). +### Implementation for `mint_nft` -The difference is in the data on the metadata account. +`handle_mint_nft` (in `mint_nft.rs`) mirrors `handle_create_collection`: the same caller-supplied `name` / `symbol` / `uri` arguments, the same validation, and the same three CPIs (mint one token, create metadata, create master edition). The difference is in the data on the metadata account. For the collection NFT: + ```rust CreateMetadataAccountV3InstructionArgs { data: DataV2 { - name: "DummyCollection".to_owned(), - symbol: "DC".to_owned(), - uri: "".to_owned(), + name, + symbol, + uri, seller_fee_basis_points: 0, creators: Some(creator), collection: None, uses: None, }, is_mutable: true, - collection_details: Some( - CollectionDetails::V1 { - size: 0 - } - ) + collection_details: Some(CollectionDetails::V1 { size: 0 }), } ``` + We set `collection_details`. For a regular NFT: + ```rust CreateMetadataAccountV3InstructionArgs { data: DataV2 { - name: "Mint Test".to_string(), - symbol: "YAY".to_string(), - uri: "".to_string(), + name, + symbol, + uri, seller_fee_basis_points: 0, creators: Some(creator), collection: Some(Collection { verified: false, - key: self.collection_mint.key(), + key: accounts.collection_mint.key(), }), - uses: None + uses: None, }, is_mutable: true, collection_details: None, } ``` + We set the `collection` field with the key of the collection. `verified` starts false until the NFT is verified. ## Verify an NFT as part of a collection @@ -371,7 +302,7 @@ The accounts needed to verify an NFT as part of a collection: ```rust #[derive(Accounts)] -pub struct VerifyCollectionMint<'info> { +pub struct VerifyCollectionMintAccountConstraints<'info> { pub authority: Signer<'info>, #[account(mut)] pub metadata: Account<'info, MetadataAccount>, @@ -409,10 +340,13 @@ pub struct VerifyCollectionMint<'info> { Only the NFT and collection NFT metadata accounts need to be mutable - both are updated. The NFT metadata gets its `verified` boolean flipped to true, and the collection NFT metadata has its collection size incremented. -### Implementation for `VerifyCollectionMint` +### Implementation for `verify_collection` ```rust -pub fn handler(accounts: &mut VerifyCollectionMint, bumps: &VerifyCollectionMintBumps) -> Result<()> { +pub fn handle_verify_collection( + accounts: &mut VerifyCollectionMintAccountConstraints, + bumps: &VerifyCollectionMintAccountConstraintsBumps, +) -> Result<()> { let metadata = &accounts.metadata.to_account_info(); let authority = &accounts.mint_authority.to_account_info(); let collection_mint = &accounts.collection_mint.to_account_info(); @@ -449,4 +383,13 @@ pub fn handler(accounts: &mut VerifyCollectionMint, bumps: &VerifyCollectionMint `verify_collection` performs a CPI to the Token Metadata program with the right accounts. The collection NFT's mint authority signs the CPI, and the NFT is verified as part of the collection. +## Testing + +Rust + LiteSVM tests live in `programs/mint-nft/tests/test_nft_operations.rs`. They load the program binary and the Metaplex fixture, then run the full lifecycle - create a collection, mint an NFT into it, verify membership - asserting token balances and that the caller-supplied metadata strings land in the metadata accounts. + +```bash +cargo build-sbf +cargo test +``` + Use this as a starting point for your own collections, NFTs, and verification flows. diff --git a/tokens/nft-operations/anchor/prepare.mjs b/tokens/nft-operations/anchor/prepare.mjs index fb6b2622..7b58d3ea 100644 --- a/tokens/nft-operations/anchor/prepare.mjs +++ b/tokens/nft-operations/anchor/prepare.mjs @@ -7,7 +7,8 @@ import { $ } from "zx"; const programs = [ { id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", - name: "token_metadata.so", + // Must match the fixture filename the tests load via include_bytes!. + name: "mpl_token_metadata.so", }, ]; diff --git a/tokens/nft-operations/quasar/README.md b/tokens/nft-operations/quasar/README.md index bc17d65f..ee014bdf 100644 --- a/tokens/nft-operations/quasar/README.md +++ b/tokens/nft-operations/quasar/README.md @@ -1,13 +1,16 @@ # NFT Operations (Quasar) -Collection mint, NFT mint, and collection verification via Metaplex. +Collection mint, NFT mint, and collection verification via Metaplex. The Quasar twin of the [Anchor](../anchor/) variant, sharing its program ID and instruction surface. See also: the [repository catalog](../../../README.md). ## Major concepts -- Collection NFTs -- Verification CPI +- A PDA at seeds `["authority"]` is the mint authority and update authority for the collection and every NFT. +- `create_collection` mints a **collection NFT**: it mints one token, creates the Metaplex metadata account (marked as a sized collection via `CollectionDetails`), and creates the master edition. Metadata `name`, `symbol`, and `uri` are instruction arguments, bounded to the Metaplex limits by their types (`String<32>`, `String<10>`, `String<200>`), so oversized values are rejected at instruction decoding. +- `mint_nft` mints an individual NFT the same way, with an unverified reference to the collection in its metadata. +- `verify_collection` verifies the NFT's collection membership through a `VerifySizedCollectionItem` CPI signed by the PDA authority. +- The metadata-creation and verification CPIs are built in the program (`src/instructions/mod.rs` and `verify_collection.rs`) rather than with `quasar_metadata`'s helpers, because the helpers cannot encode creators, collection references, or sized-collection details, and mark the collection metadata readonly during verification. ## Setup @@ -27,8 +30,8 @@ In-process tests via **Quasar SVM** (`quasar-svm` in `Quasar.toml`): cargo test ``` -Tests invoke instruction handlers and assert onchain state. No local validator. +The suite loads the Metaplex Token Metadata program from the fixture shared with the Anchor twin (`../anchor/tests/fixtures/mpl_token_metadata.so`) and exercises the full lifecycle: create the collection, mint an NFT into it, and verify membership, asserting token balances and metadata contents. No local validator. ## Usage -Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant in the same example where present. +Read `src/` and `Quasar.toml`. Compare with the [Anchor](../anchor/) variant of the same example. diff --git a/tokens/nft-operations/quasar/src/instructions/create_collection.rs b/tokens/nft-operations/quasar/src/instructions/create_collection.rs index d9baa4f9..ac7c4b1c 100644 --- a/tokens/nft-operations/quasar/src/instructions/create_collection.rs +++ b/tokens/nft-operations/quasar/src/instructions/create_collection.rs @@ -9,7 +9,7 @@ use { /// /// The PDA `["authority"]` acts as mint authority and update authority. #[derive(Accounts)] -pub struct CreateCollection { +pub struct CreateCollectionAccountConstraints { #[account(mut)] pub user: Signer, #[account( @@ -47,42 +47,54 @@ pub struct CreateCollection { pub rent: Sysvar, } +/// Creates a collection NFT with caller-supplied metadata: mints one token, +/// then creates the metadata account (with sized collection details) and the +/// master edition, all signed by the PDA authority. #[inline(always)] -pub fn handle_create_collection(accounts: &mut CreateCollection, bumps: &CreateCollectionBumps) -> Result<(), ProgramError> { +pub fn handle_create_collection( + accounts: &mut CreateCollectionAccountConstraints, + bumps: &CreateCollectionAccountConstraintsBumps, + name: &str, + symbol: &str, + uri: &str, +) -> Result<(), ProgramError> { let bump = [bumps.mint_authority]; let seeds: &[Seed] = &[ Seed::from(b"authority" as &[u8]), Seed::from(&bump as &[u8]), ]; - // Mint 1 token to the destination. - accounts.token_program + // Mint 1 token (the collection NFT) to the destination. + accounts + .token_program .mint_to(&accounts.mint, &accounts.destination, &accounts.mint_authority, 1u64) .invoke_signed(seeds)?; log("Collection NFT minted!"); - // Create metadata account. - accounts.token_metadata_program - .create_metadata_accounts_v3( - &accounts.metadata, - &accounts.mint, - &accounts.mint_authority, - &accounts.user, - &accounts.mint_authority, - &accounts.system_program, - &accounts.rent, - "DummyCollection", - "DC", - "", - 0, // seller_fee_basis_points - true, // is_mutable - true, // update_authority_is_signer - )? - .invoke_signed(seeds)?; + // Create the metadata account, marked as a sized collection + // (CollectionDetails::V1) so NFTs can be verified into it. + super::create_metadata_account_v3( + &accounts.token_metadata_program, + &accounts.metadata, + &accounts.mint, + &accounts.mint_authority, + &accounts.user, + &accounts.mint_authority, + &accounts.system_program, + &accounts.rent, + name, + symbol, + uri, + accounts.mint_authority.address(), + None, + true, + )? + .invoke_signed(seeds)?; log("Metadata Account created!"); // Create master edition. - accounts.token_metadata_program + accounts + .token_metadata_program .create_master_edition_v3( &accounts.master_edition, &accounts.mint, diff --git a/tokens/nft-operations/quasar/src/instructions/mint_nft.rs b/tokens/nft-operations/quasar/src/instructions/mint_nft.rs index ec6a757b..71c392c6 100644 --- a/tokens/nft-operations/quasar/src/instructions/mint_nft.rs +++ b/tokens/nft-operations/quasar/src/instructions/mint_nft.rs @@ -7,7 +7,7 @@ use { /// Accounts for minting an individual NFT with a collection reference. #[derive(Accounts)] -pub struct MintNft { +pub struct MintNftAccountConstraints { #[account(mut)] pub owner: Signer, #[account( @@ -48,43 +48,54 @@ pub struct MintNft { pub rent: Sysvar, } +/// Mints an NFT into the collection with caller-supplied metadata. The +/// collection reference starts unverified; call `verify_collection` to +/// verify it. #[inline(always)] -pub fn handle_mint_nft(accounts: &mut MintNft, bumps: &MintNftBumps) -> Result<(), ProgramError> { +pub fn handle_mint_nft( + accounts: &mut MintNftAccountConstraints, + bumps: &MintNftAccountConstraintsBumps, + name: &str, + symbol: &str, + uri: &str, +) -> Result<(), ProgramError> { let bump = [bumps.mint_authority]; let seeds: &[Seed] = &[ Seed::from(b"authority" as &[u8]), Seed::from(&bump as &[u8]), ]; - // Mint 1 token to the destination. - accounts.token_program + // Mint 1 token (the NFT) to the destination. + accounts + .token_program .mint_to(&accounts.mint, &accounts.destination, &accounts.mint_authority, 1u64) .invoke_signed(seeds)?; log("NFT minted!"); - // Create metadata with collection reference. - // Note: The collection is set as unverified here; call verify_collection - // separately to verify it. - accounts.token_metadata_program - .create_metadata_accounts_v3( - &accounts.metadata, - &accounts.mint, - &accounts.mint_authority, - &accounts.owner, - &accounts.mint_authority, - &accounts.system_program, - &accounts.rent, - "Mint Test", - "YAY", - "", - 0, // seller_fee_basis_points - true, // is_mutable - true, // update_authority_is_signer - )? - .invoke_signed(seeds)?; + // Create the metadata account with an unverified collection reference. + let collection_mint_address = *accounts.collection_mint.to_account_view().address(); + super::create_metadata_account_v3( + &accounts.token_metadata_program, + &accounts.metadata, + &accounts.mint, + &accounts.mint_authority, + &accounts.owner, + &accounts.mint_authority, + &accounts.system_program, + &accounts.rent, + name, + symbol, + uri, + accounts.mint_authority.address(), + Some(&collection_mint_address), + false, + )? + .invoke_signed(seeds)?; + log("Metadata Account created!"); // Create master edition. - accounts.token_metadata_program + accounts + .token_metadata_program .create_master_edition_v3( &accounts.master_edition, &accounts.mint, @@ -98,6 +109,7 @@ pub fn handle_mint_nft(accounts: &mut MintNft, bumps: &MintNftBumps) -> Result<( Some(0), // max_supply = 0 means unique 1/1 ) .invoke_signed(seeds)?; + log("Master Edition Account created"); Ok(()) } diff --git a/tokens/nft-operations/quasar/src/instructions/mod.rs b/tokens/nft-operations/quasar/src/instructions/mod.rs index a2f6758e..63ea854c 100644 --- a/tokens/nft-operations/quasar/src/instructions/mod.rs +++ b/tokens/nft-operations/quasar/src/instructions/mod.rs @@ -5,3 +5,185 @@ mod verify_collection; pub use create_collection::*; pub use mint_nft::*; pub use verify_collection::*; + +use quasar_lang::{cpi::CpiDynamic, prelude::*}; + +// Byte sizes of the Borsh encoding used by the Metaplex +// CreateMetadataAccountV3 instruction, used to size the CPI data buffer. +const BORSH_STRING_PREFIX: usize = core::mem::size_of::(); +const BORSH_OPTION_TAG: usize = 1; +const BORSH_VEC_PREFIX: usize = core::mem::size_of::(); +const BORSH_ENUM_TAG: usize = 1; +const BORSH_BOOL: usize = 1; +/// Creator = address (32) + verified (bool) + share (u8). +const CREATOR_SIZE: usize = core::mem::size_of::

() + BORSH_BOOL + 1; +/// Collection = verified (bool) + key (32). +const COLLECTION_SIZE: usize = BORSH_BOOL + core::mem::size_of::
(); +/// CollectionDetails::V1 = enum tag + size (u64). +const COLLECTION_DETAILS_SIZE: usize = BORSH_ENUM_TAG + core::mem::size_of::(); + +/// Metaplex Token Metadata field limits, in bytes. These match the +/// `String` capacities on the instruction arguments, so oversized +/// values are rejected at instruction decoding. +pub const MAX_NAME_LENGTH: usize = 32; +pub const MAX_SYMBOL_LENGTH: usize = 10; +pub const MAX_URI_LENGTH: usize = 200; + +/// Instruction discriminator of CreateMetadataAccountV3 within the Metaplex +/// Token Metadata program. +const CREATE_METADATA_ACCOUNTS_V3_DISCRIMINATOR: u8 = 33; + +/// Accounts taken by CreateMetadataAccountV3: metadata, mint, mint +/// authority, payer, update authority, system program, rent. +const CREATE_METADATA_ACCOUNT_COUNT: usize = 7; + +/// Worst-case CreateMetadataAccountV3 instruction data length: +/// discriminator + DataV2 (name, symbol, uri, seller fee, one creator, +/// collection, uses) + is_mutable + collection_details. +const CREATE_METADATA_MAX_DATA: usize = 1 + + BORSH_STRING_PREFIX + + MAX_NAME_LENGTH + + BORSH_STRING_PREFIX + + MAX_SYMBOL_LENGTH + + BORSH_STRING_PREFIX + + MAX_URI_LENGTH + + core::mem::size_of::() + + BORSH_OPTION_TAG + + BORSH_VEC_PREFIX + + CREATOR_SIZE + + BORSH_OPTION_TAG + + COLLECTION_SIZE + + BORSH_OPTION_TAG + + BORSH_BOOL + + BORSH_OPTION_TAG + + COLLECTION_DETAILS_SIZE; + +const BORSH_OPTION_NONE: u8 = 0; +const BORSH_OPTION_SOME: u8 = 1; +/// CollectionDetails::V1 is the first enum variant. +const COLLECTION_DETAILS_V1_VARIANT: u8 = 0; +/// The PDA authority is the sole creator and receives the full royalty share. +const FULL_CREATOR_SHARE_PERCENT: u8 = 100; + +/// Sequential writer over the fixed CPI data buffer. All writes are bounded +/// by `CREATE_METADATA_MAX_DATA` because the string arguments are capped by +/// their `String` capacities and every other field is fixed size. +struct BorshWriter { + buffer: [u8; CREATE_METADATA_MAX_DATA], + offset: usize, +} + +impl BorshWriter { + fn new() -> Self { + Self { + buffer: [0; CREATE_METADATA_MAX_DATA], + offset: 0, + } + } + + fn write_byte(&mut self, value: u8) { + self.buffer[self.offset] = value; + self.offset += 1; + } + + fn write_slice(&mut self, bytes: &[u8]) { + let end = self.offset + bytes.len(); + self.buffer[self.offset..end].copy_from_slice(bytes); + self.offset = end; + } + + fn write_string(&mut self, value: &str) { + self.write_slice(&(value.len() as u32).to_le_bytes()); + self.write_slice(value.as_bytes()); + } + + fn data(&self) -> &[u8] { + &self.buffer[..self.offset] + } +} + +/// Builds a Metaplex CreateMetadataAccountV3 CPI. +/// +/// `quasar_metadata`'s `create_metadata_accounts_v3` helper always encodes +/// `creators`, `collection`, and `collection_details` as `None`. This program +/// needs all three (the PDA authority as verified creator, a collection +/// reference on minted NFTs, and sized collection details on the collection +/// NFT), so the instruction data is built here instead. +#[allow(clippy::too_many_arguments)] +#[inline(always)] +pub fn create_metadata_account_v3<'a>( + token_metadata_program: &'a impl AsAccountView, + metadata: &'a impl AsAccountView, + mint: &'a impl AsAccountView, + mint_authority: &'a impl AsAccountView, + payer: &'a impl AsAccountView, + update_authority: &'a impl AsAccountView, + system_program: &'a impl AsAccountView, + rent: &'a impl AsAccountView, + name: &str, + symbol: &str, + uri: &str, + creator: &Address, + collection_mint: Option<&Address>, + is_sized_collection: bool, +) -> Result, ProgramError> { + let mut cpi = CpiDynamic::::new( + token_metadata_program.to_account_view().address(), + ); + + cpi.push_account(metadata.to_account_view(), false, true)?; + cpi.push_account(mint.to_account_view(), false, false)?; + cpi.push_account(mint_authority.to_account_view(), true, false)?; + cpi.push_account(payer.to_account_view(), true, true)?; + cpi.push_account(update_authority.to_account_view(), true, false)?; + cpi.push_account(system_program.to_account_view(), false, false)?; + cpi.push_account(rent.to_account_view(), false, false)?; + + let mut writer = BorshWriter::new(); + writer.write_byte(CREATE_METADATA_ACCOUNTS_V3_DISCRIMINATOR); + + // DataV2.name / symbol / uri + writer.write_string(name); + writer.write_string(symbol); + writer.write_string(uri); + + // DataV2.seller_fee_basis_points + writer.write_slice(&0u16.to_le_bytes()); + + // DataV2.creators: Some([creator]) - verified, full share. Verified is + // allowed because the creator (the PDA authority) signs the CPI. + writer.write_byte(BORSH_OPTION_SOME); + writer.write_slice(&1u32.to_le_bytes()); + writer.write_slice(creator.as_ref()); + writer.write_byte(true as u8); + writer.write_byte(FULL_CREATOR_SHARE_PERCENT); + + // DataV2.collection: the (unverified) collection reference, if any. + // Verification happens later via verify_collection. + match collection_mint { + Some(collection_key) => { + writer.write_byte(BORSH_OPTION_SOME); + writer.write_byte(false as u8); + writer.write_slice(collection_key.as_ref()); + } + None => writer.write_byte(BORSH_OPTION_NONE), + } + + // DataV2.uses: None + writer.write_byte(BORSH_OPTION_NONE); + + // is_mutable + writer.write_byte(true as u8); + + // collection_details: Some(V1 { size: 0 }) marks a sized collection NFT. + if is_sized_collection { + writer.write_byte(BORSH_OPTION_SOME); + writer.write_byte(COLLECTION_DETAILS_V1_VARIANT); + writer.write_slice(&0u64.to_le_bytes()); + } else { + writer.write_byte(BORSH_OPTION_NONE); + } + + cpi.set_data(writer.data())?; + Ok(cpi) +} diff --git a/tokens/nft-operations/quasar/src/instructions/verify_collection.rs b/tokens/nft-operations/quasar/src/instructions/verify_collection.rs index 5c254570..3d8683e7 100644 --- a/tokens/nft-operations/quasar/src/instructions/verify_collection.rs +++ b/tokens/nft-operations/quasar/src/instructions/verify_collection.rs @@ -1,20 +1,29 @@ use { crate::MintAuthorityPda, - quasar_lang::prelude::*, + quasar_lang::{ + cpi::{CpiCall, InstructionAccount}, + prelude::*, + }, quasar_metadata::prelude::*, }; +/// Instruction discriminator of VerifySizedCollectionItem within the +/// Metaplex Token Metadata program - the verify instruction for sized +/// collections (the collection NFT carries `CollectionDetails::V1`). +const VERIFY_SIZED_COLLECTION_ITEM_DISCRIMINATOR: u8 = 30; + +/// Accounts taken by VerifySizedCollectionItem. +const VERIFY_ACCOUNT_COUNT: usize = 6; + /// Accounts for verifying an NFT as part of a collection. /// -/// Uses `verify_sized_collection_item` which is the Metaplex Token Metadata -/// instruction for verifying collection membership on sized collections. -/// /// The Anchor version uses typed `MetadataAccount` / `MasterEditionAccount` /// wrappers for owner and discriminant validation. In Quasar we use /// `UncheckedAccount` and rely on the Metaplex program itself to validate /// the accounts during CPI - the onchain program enforces correctness. #[derive(Accounts)] -pub struct VerifyCollectionMint { +pub struct VerifyCollectionMintAccountConstraints { + #[account(mut)] pub authority: Signer, /// The NFT's metadata account (will be updated with verified=true). #[account(mut)] @@ -24,33 +33,61 @@ pub struct VerifyCollectionMint { pub mint_authority: UncheckedAccount, /// The collection mint. pub collection_mint: UncheckedAccount, - /// The collection's metadata account. + /// The collection's metadata account. Writable: verifying a sized + /// collection item increments the stored collection size. #[account(mut)] pub collection_metadata: UncheckedAccount, /// The collection's master edition account. pub collection_master_edition: UncheckedAccount, - pub system_program: Program, pub token_metadata_program: Program, } +/// Verifies the NFT's collection membership via a VerifySizedCollectionItem +/// CPI signed by the PDA collection authority. +/// +/// The CPI is built here rather than with `quasar_metadata`'s +/// `verify_sized_collection_item` helper because the helper marks +/// `collection_metadata` readonly, while the Metaplex program writes the +/// incremented collection size to it. #[inline(always)] -pub fn handle_verify_collection(accounts: &mut VerifyCollectionMint, bumps: &VerifyCollectionMintBumps) -> Result<(), ProgramError> { +pub fn handle_verify_collection( + accounts: &mut VerifyCollectionMintAccountConstraints, + bumps: &VerifyCollectionMintAccountConstraintsBumps, +) -> Result<(), ProgramError> { let bump = [bumps.mint_authority]; let seeds: &[Seed] = &[ Seed::from(b"authority" as &[u8]), Seed::from(&bump as &[u8]), ]; - accounts.token_metadata_program - .verify_sized_collection_item( - &accounts.metadata, - &accounts.mint_authority, - &accounts.authority, // payer - &accounts.collection_mint, - &accounts.collection_metadata, - &accounts.collection_master_edition, - ) - .invoke_signed(seeds)?; + let metadata = accounts.metadata.to_account_view(); + let collection_authority = accounts.mint_authority.to_account_view(); + let payer = accounts.authority.to_account_view(); + let collection_mint = accounts.collection_mint.to_account_view(); + let collection_metadata = accounts.collection_metadata.to_account_view(); + let collection_master_edition = accounts.collection_master_edition.to_account_view(); + + CpiCall::::new( + accounts.token_metadata_program.to_account_view().address(), + [ + InstructionAccount::writable(metadata.address()), + InstructionAccount::readonly_signer(collection_authority.address()), + InstructionAccount::writable_signer(payer.address()), + InstructionAccount::readonly(collection_mint.address()), + InstructionAccount::writable(collection_metadata.address()), + InstructionAccount::readonly(collection_master_edition.address()), + ], + [ + metadata, + collection_authority, + payer, + collection_mint, + collection_metadata, + collection_master_edition, + ], + [VERIFY_SIZED_COLLECTION_ITEM_DISCRIMINATOR], + ) + .invoke_signed(seeds)?; log("Collection Verified!"); Ok(()) diff --git a/tokens/nft-operations/quasar/src/lib.rs b/tokens/nft-operations/quasar/src/lib.rs index 2c8552ee..f68d4ad3 100644 --- a/tokens/nft-operations/quasar/src/lib.rs +++ b/tokens/nft-operations/quasar/src/lib.rs @@ -10,9 +10,8 @@ mod tests; declare_id!("3EMcczaGi9ivdLxvvFwRbGYeEUEHpGwabXegARw4jLxa"); /// Marker carrying the seeds for the shared PDA mint authority used as -/// both mint and update authority. PR #195 removed inline -/// `seeds = [...]`; derivation now happens through a `#[derive(Seeds)]` -/// type referenced by `address = T::seeds()`. +/// both mint and update authority. Quasar derives PDA addresses through a +/// `#[derive(Seeds)]` type referenced by `address = T::seeds()`. #[derive(Seeds)] #[seeds(b"authority")] pub struct MintAuthorityPda; @@ -26,21 +25,37 @@ pub struct MintAuthorityPda; mod quasar_nft_operations { use super::*; + // String capacities follow the Metaplex Token Metadata limits: + // name <= 32, symbol <= 10, uri <= 200 bytes. The bounded types reject + // oversized values at instruction decoding. + /// Create a collection NFT: mint, metadata, and master edition. #[instruction(discriminator = 0)] - pub fn create_collection(ctx: Ctx) -> Result<(), ProgramError> { - instructions::handle_create_collection(&mut ctx.accounts, &ctx.bumps) + pub fn create_collection( + ctx: Ctx, + name: String<32>, + symbol: String<10>, + uri: String<200>, + ) -> Result<(), ProgramError> { + instructions::handle_create_collection(&mut ctx.accounts, &ctx.bumps, &name, &symbol, &uri) } - /// Mint an individual NFT with a reference to the collection. + /// Mint an individual NFT with an unverified reference to the collection. #[instruction(discriminator = 1)] - pub fn mint_nft(ctx: Ctx) -> Result<(), ProgramError> { - instructions::handle_mint_nft(&mut ctx.accounts, &ctx.bumps) + pub fn mint_nft( + ctx: Ctx, + name: String<32>, + symbol: String<10>, + uri: String<200>, + ) -> Result<(), ProgramError> { + instructions::handle_mint_nft(&mut ctx.accounts, &ctx.bumps, &name, &symbol, &uri) } /// Verify the NFT as a member of the collection. #[instruction(discriminator = 2)] - pub fn verify_collection(ctx: Ctx) -> Result<(), ProgramError> { + pub fn verify_collection( + ctx: Ctx, + ) -> Result<(), ProgramError> { instructions::handle_verify_collection(&mut ctx.accounts, &ctx.bumps) } } diff --git a/tokens/nft-operations/quasar/src/tests.rs b/tokens/nft-operations/quasar/src/tests.rs index 5d57bab2..21e1d252 100644 --- a/tokens/nft-operations/quasar/src/tests.rs +++ b/tokens/nft-operations/quasar/src/tests.rs @@ -1,24 +1,333 @@ +//! QuasarSVM integration tests, ported from the Anchor twin's LiteSVM suite. +//! +//! The SVM loads this program, the SPL Token program, and the Metaplex Token +//! Metadata fixture shared with the Anchor twin +//! (`../anchor/tests/fixtures/mpl_token_metadata.so`), then exercises the +//! full collection lifecycle: create_collection, mint_nft, verify_collection. + extern crate std; use { - quasar_svm::QuasarSvm, - std::println, + quasar_svm::{Account, AccountMeta, Instruction, Pubkey, QuasarSvm}, + solana_program_pack::Pack, + spl_token_interface::state::Account as TokenAccount, + std::{vec, vec::Vec}, }; +const METADATA_PROGRAM_ID: Pubkey = + Pubkey::from_str_const("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); + +/// Comfortably above rent exemption for every account size used here. +const FUNDING_LAMPORTS: u64 = 10_000_000_000; + +const CREATE_COLLECTION_DISCRIMINATOR: u8 = 0; +const MINT_NFT_DISCRIMINATOR: u8 = 1; +const VERIFY_COLLECTION_DISCRIMINATOR: u8 = 2; + +fn program_id() -> Pubkey { + Pubkey::from(crate::ID) +} + fn setup() -> QuasarSvm { - let elf = std::fs::read("target/deploy/quasar_nft_operations.so").unwrap(); + let program_elf = std::fs::read("target/deploy/quasar_nft_operations.so").unwrap(); + // The fixture binary is shared with the Anchor twin's LiteSVM suite. + let metadata_elf = std::fs::read("../anchor/tests/fixtures/mpl_token_metadata.so").unwrap(); QuasarSvm::new() - .with_program(&crate::ID, &elf) + .with_program(&program_id(), &program_elf) + .with_program(&METADATA_PROGRAM_ID, &metadata_elf) .with_token_program() } -// Note: All three instructions (create_collection, mint_nft, verify_collection) -// require the Metaplex Token Metadata program deployed in the SVM. The -// quasar-svm harness does not currently include it, so we verify the program -// builds and loads. Full integration testing requires a localnet deploy with -// the Metaplex program. +fn signer(address: Pubkey) -> Account { + quasar_svm::token::create_keyed_system_account(&address, FUNDING_LAMPORTS) +} + +/// A not-yet-created account: empty and system-owned. +fn empty(address: Pubkey) -> Account { + Account { + address, + lamports: 0, + data: vec![], + owner: quasar_svm::system_program::ID, + executable: false, + } +} + +fn derive_mint_authority() -> Pubkey { + let (mint_authority, _) = Pubkey::find_program_address(&[b"authority"], &program_id()); + mint_authority +} + +fn derive_metadata_pda(mint: &Pubkey) -> Pubkey { + let (pda, _) = Pubkey::find_program_address( + &[b"metadata", METADATA_PROGRAM_ID.as_ref(), mint.as_ref()], + &METADATA_PROGRAM_ID, + ); + pda +} + +fn derive_edition_pda(mint: &Pubkey) -> Pubkey { + let (pda, _) = Pubkey::find_program_address( + &[ + b"metadata", + METADATA_PROGRAM_ID.as_ref(), + mint.as_ref(), + b"edition", + ], + &METADATA_PROGRAM_ID, + ); + pda +} + +/// Instruction data for create_collection / mint_nft. Quasar's compact +/// argument encoding packs the dynamic `String` arguments as a header of +/// per-field length prefixes (u8 each) followed by the packed string bytes. +fn metadata_instruction_data(discriminator: u8, name: &str, symbol: &str, uri: &str) -> Vec { + let mut data = vec![ + discriminator, + name.len() as u8, + symbol.len() as u8, + uri.len() as u8, + ]; + data.extend_from_slice(name.as_bytes()); + data.extend_from_slice(symbol.as_bytes()); + data.extend_from_slice(uri.as_bytes()); + data +} + +/// Returns true if `haystack` contains `needle` anywhere. Used to check that +/// caller-supplied metadata strings landed in the Metaplex metadata account +/// without fully deserializing the Metaplex layout. +fn contains_bytes(haystack: &[u8], needle: &[u8]) -> bool { + haystack + .windows(needle.len()) + .any(|window| window == needle) +} + +fn token_amount(account: &Account) -> u64 { + TokenAccount::unpack(&account.data).unwrap().amount +} + +/// Addresses for one NFT (or collection NFT): mint, its Metaplex PDAs, and +/// the holding token account. +struct NftAccounts { + mint: Pubkey, + metadata: Pubkey, + master_edition: Pubkey, + destination: Pubkey, +} + +impl NftAccounts { + fn new() -> Self { + let mint = Pubkey::new_unique(); + Self { + mint, + metadata: derive_metadata_pda(&mint), + master_edition: derive_edition_pda(&mint), + destination: Pubkey::new_unique(), + } + } +} + +const COLLECTION_NAME: &str = "Quasar Collection"; +const COLLECTION_SYMBOL: &str = "QCOL"; +const COLLECTION_URI: &str = "https://example.com/collection.json"; +const NFT_NAME: &str = "Quasar NFT #1"; +const NFT_SYMBOL: &str = "QNFT"; +const NFT_URI: &str = "https://example.com/nft-1.json"; + +fn build_create_collection_instruction(payer: Pubkey, collection: &NftAccounts) -> Instruction { + Instruction { + program_id: program_id(), + accounts: vec![ + AccountMeta::new(payer, true), + // The mint and destination accounts are created by the + // instruction, so they sign (fresh keypair accounts). + AccountMeta::new(collection.mint, true), + AccountMeta::new_readonly(derive_mint_authority(), false), + AccountMeta::new(collection.metadata, false), + AccountMeta::new(collection.master_edition, false), + AccountMeta::new(collection.destination, true), + AccountMeta::new_readonly(quasar_svm::system_program::ID, false), + AccountMeta::new_readonly(quasar_svm::SPL_TOKEN_PROGRAM_ID, false), + AccountMeta::new_readonly(METADATA_PROGRAM_ID, false), + AccountMeta::new_readonly(quasar_svm::solana_sdk_ids::sysvar::rent::ID, false), + ], + data: metadata_instruction_data( + CREATE_COLLECTION_DISCRIMINATOR, + COLLECTION_NAME, + COLLECTION_SYMBOL, + COLLECTION_URI, + ), + } +} + +fn build_mint_nft_instruction( + payer: Pubkey, + nft: &NftAccounts, + collection_mint: Pubkey, +) -> Instruction { + Instruction { + program_id: program_id(), + accounts: vec![ + AccountMeta::new(payer, true), + AccountMeta::new(nft.mint, true), + AccountMeta::new(nft.destination, true), + AccountMeta::new(nft.metadata, false), + AccountMeta::new(nft.master_edition, false), + AccountMeta::new_readonly(derive_mint_authority(), false), + AccountMeta::new(collection_mint, false), + AccountMeta::new_readonly(quasar_svm::system_program::ID, false), + AccountMeta::new_readonly(quasar_svm::SPL_TOKEN_PROGRAM_ID, false), + AccountMeta::new_readonly(METADATA_PROGRAM_ID, false), + AccountMeta::new_readonly(quasar_svm::solana_sdk_ids::sysvar::rent::ID, false), + ], + data: metadata_instruction_data(MINT_NFT_DISCRIMINATOR, NFT_NAME, NFT_SYMBOL, NFT_URI), + } +} + +fn build_verify_collection_instruction( + payer: Pubkey, + nft: &NftAccounts, + collection: &NftAccounts, +) -> Instruction { + Instruction { + program_id: program_id(), + accounts: vec![ + // The Metaplex verify CPI takes the payer as writable signer. + AccountMeta::new(payer, true), + AccountMeta::new(nft.metadata, false), + AccountMeta::new_readonly(derive_mint_authority(), false), + AccountMeta::new_readonly(collection.mint, false), + AccountMeta::new(collection.metadata, false), + AccountMeta::new_readonly(collection.master_edition, false), + AccountMeta::new_readonly(METADATA_PROGRAM_ID, false), + ], + data: vec![VERIFY_COLLECTION_DISCRIMINATOR], + } +} + +/// New (not-yet-created) accounts an NFT mint touches. +fn new_nft_accounts(nft: &NftAccounts) -> [Account; 4] { + [ + empty(nft.mint), + empty(nft.metadata), + empty(nft.master_edition), + empty(nft.destination), + ] +} + +#[test] +fn test_create_collection() { + let mut svm = setup(); + let payer = Pubkey::new_unique(); + let collection = NftAccounts::new(); + + let mut accounts = vec![signer(payer), empty(derive_mint_authority())]; + accounts.extend(new_nft_accounts(&collection)); + + let result = svm.process_instruction( + &build_create_collection_instruction(payer, &collection), + &accounts, + ); + result.assert_success(); + + // The collection mint exists and 1 token was minted to the destination. + let mint_account = result.account(&collection.mint).unwrap(); + assert!(!mint_account.data.is_empty()); + assert_eq!( + token_amount(&result.account(&collection.destination).unwrap()), + 1, + "Should hold 1 collection token" + ); + + // The metadata account carries the caller-supplied name, and the master + // edition exists. + let metadata_account = result.account(&collection.metadata).unwrap(); + assert!( + contains_bytes(&metadata_account.data, COLLECTION_NAME.as_bytes()), + "Metadata should contain the caller-supplied collection name" + ); + assert!(!result.account(&collection.master_edition).unwrap().data.is_empty()); +} #[test] -fn test_program_builds() { - let _svm = setup(); - println!(" NFT operations program loaded successfully"); +fn test_mint_nft_to_collection() { + let mut svm = setup(); + let payer = Pubkey::new_unique(); + let collection = NftAccounts::new(); + + let mut create_accounts = vec![signer(payer), empty(derive_mint_authority())]; + create_accounts.extend(new_nft_accounts(&collection)); + svm.process_instruction( + &build_create_collection_instruction(payer, &collection), + &create_accounts, + ) + .assert_success(); + + // Mint an NFT into the collection. Only the NFT's own accounts are new; + // the payer, authority PDA, and collection mint persist in the SVM. + let nft = NftAccounts::new(); + let result = svm.process_instruction( + &build_mint_nft_instruction(payer, &nft, collection.mint), + &new_nft_accounts(&nft), + ); + result.assert_success(); + + assert_eq!( + token_amount(&result.account(&nft.destination).unwrap()), + 1, + "Should hold 1 NFT" + ); + let nft_metadata_account = result.account(&nft.metadata).unwrap(); + assert!( + contains_bytes(&nft_metadata_account.data, NFT_NAME.as_bytes()), + "Metadata should contain the caller-supplied NFT name" + ); + // The metadata carries the (unverified) collection reference. + assert!( + contains_bytes(&nft_metadata_account.data, collection.mint.as_ref()), + "Metadata should reference the collection mint" + ); +} + +#[test] +fn test_verify_collection() { + let mut svm = setup(); + let payer = Pubkey::new_unique(); + let collection = NftAccounts::new(); + + let mut create_accounts = vec![signer(payer), empty(derive_mint_authority())]; + create_accounts.extend(new_nft_accounts(&collection)); + svm.process_instruction( + &build_create_collection_instruction(payer, &collection), + &create_accounts, + ) + .assert_success(); + + let nft = NftAccounts::new(); + svm.process_instruction( + &build_mint_nft_instruction(payer, &nft, collection.mint), + &new_nft_accounts(&nft), + ) + .assert_success(); + + let unverified_metadata = svm.get_account(&nft.metadata).unwrap().data; + + let result = svm.process_instruction( + &build_verify_collection_instruction(payer, &nft, &collection), + &[], + ); + result.assert_success(); + + // Verification flips the collection's `verified` flag in the NFT's + // metadata, so the account data must have changed. + let verified_metadata = result.account(&nft.metadata).unwrap().data.clone(); + assert!( + contains_bytes(&verified_metadata, collection.mint.as_ref()), + "Metadata should still reference the collection mint" + ); + assert_ne!( + unverified_metadata, verified_metadata, + "verify_collection should update the NFT metadata" + ); } diff --git a/tokens/token-extensions/cpi-guard/anchor/programs/cpi-guard/src/lib.rs b/tokens/token-extensions/cpi-guard/anchor/programs/cpi-guard/src/lib.rs index 715ddc22..23f51a37 100644 --- a/tokens/token-extensions/cpi-guard/anchor/programs/cpi-guard/src/lib.rs +++ b/tokens/token-extensions/cpi-guard/anchor/programs/cpi-guard/src/lib.rs @@ -12,7 +12,7 @@ declare_id!("6tU3MEowU6oxxeDZLSxEwzcEZsZrhBJsfUR6xECvShid"); pub mod cpi_guard { use super::*; - pub fn cpi_transfer(context: Context) -> Result<()> { + pub fn cpi_transfer(context: Context) -> Result<()> { transfer_checked( CpiContext::new( context.accounts.token_program.key(), @@ -31,7 +31,7 @@ pub mod cpi_guard { } #[derive(Accounts)] -pub struct CpiTransfer<'info> { +pub struct CpiTransferAccountConstraints<'info> { #[account(mut)] pub sender: Signer<'info>, diff --git a/tokens/token-extensions/cpi-guard/anchor/programs/cpi-guard/tests/test_cpi_guard.rs b/tokens/token-extensions/cpi-guard/anchor/programs/cpi-guard/tests/test_cpi_guard.rs index dd1b81b5..6f2145cc 100644 --- a/tokens/token-extensions/cpi-guard/anchor/programs/cpi-guard/tests/test_cpi_guard.rs +++ b/tokens/token-extensions/cpi-guard/anchor/programs/cpi-guard/tests/test_cpi_guard.rs @@ -161,7 +161,7 @@ fn test_cpi_guard_prevents_transfer_then_allows_after_disable() { let transfer_ix = Instruction::new_with_bytes( program_id, &cpi_guard::instruction::CpiTransfer {}.data(), - cpi_guard::accounts::CpiTransfer { + cpi_guard::accounts::CpiTransferAccountConstraints { sender: payer.pubkey(), sender_token_account: token_keypair.pubkey(), recipient_token_account, @@ -188,7 +188,7 @@ fn test_cpi_guard_prevents_transfer_then_allows_after_disable() { let transfer_ix2 = Instruction::new_with_bytes( program_id, &cpi_guard::instruction::CpiTransfer {}.data(), - cpi_guard::accounts::CpiTransfer { + cpi_guard::accounts::CpiTransferAccountConstraints { sender: payer.pubkey(), sender_token_account: token_keypair.pubkey(), recipient_token_account, diff --git a/tokens/token-extensions/cpi-guard/quasar/src/lib.rs b/tokens/token-extensions/cpi-guard/quasar/src/lib.rs index 7bb40d7d..29e935dc 100644 --- a/tokens/token-extensions/cpi-guard/quasar/src/lib.rs +++ b/tokens/token-extensions/cpi-guard/quasar/src/lib.rs @@ -29,13 +29,13 @@ mod quasar_cpi_guard { /// Attempt a CPI transfer_checked. Will fail if CPI Guard is enabled /// on the sender's token account. #[instruction(discriminator = 0)] - pub fn cpi_transfer(ctx: Ctx) -> Result<(), ProgramError> { + pub fn cpi_transfer(ctx: Ctx) -> Result<(), ProgramError> { handle_cpi_transfer(&mut ctx.accounts) } } #[derive(Accounts)] -pub struct CpiTransfer { +pub struct CpiTransferAccountConstraints { #[account(mut)] pub sender: Signer, #[account(mut)] @@ -47,7 +47,7 @@ pub struct CpiTransfer { } #[inline(always)] -fn handle_cpi_transfer(accounts: &mut CpiTransfer) -> Result<(), ProgramError> { +fn handle_cpi_transfer(accounts: &mut CpiTransferAccountConstraints) -> Result<(), ProgramError> { // TransferChecked: opcode 12, amount=1, decimals=9 let mut data = [0u8; 10]; data[0] = 12; diff --git a/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/src/instructions/initialize.rs b/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/src/instructions/initialize.rs index ecb4703a..939241ab 100644 --- a/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/src/instructions/initialize.rs +++ b/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/src/instructions/initialize.rs @@ -12,7 +12,7 @@ use anchor_spl::{ }; #[derive(Accounts)] -pub struct Initialize<'info> { +pub struct InitializeAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, #[account(mut)] @@ -24,7 +24,7 @@ pub struct Initialize<'info> { // There is currently not an anchor constraint to automatically initialize the DefaultAccountState extension // We can manually create and initialize the mint account via CPIs in the instruction handler -pub fn handler(context: Context) -> Result<()> { +pub fn handler(context: Context) -> Result<()> { // Calculate space required for mint and extension data let mint_size = ExtensionType::try_calculate_account_len::(&[ ExtensionType::DefaultAccountState, diff --git a/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/src/instructions/update_default_state.rs b/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/src/instructions/update_default_state.rs index 2e20cd62..7ed0ec0d 100644 --- a/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/src/instructions/update_default_state.rs +++ b/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/src/instructions/update_default_state.rs @@ -6,7 +6,7 @@ use anchor_spl::token_interface::{ use crate::AnchorAccountState; #[derive(Accounts)] -pub struct UpdateDefaultState<'info> { +pub struct UpdateDefaultStateAccountConstraints<'info> { #[account(mut)] pub freeze_authority: Signer<'info>, #[account( @@ -20,7 +20,7 @@ pub struct UpdateDefaultState<'info> { } pub fn handler( - context: Context, + context: Context, account_state: AnchorAccountState, ) -> Result<()> { // Convert AnchorAccountState to spl_token_2022::state::AccountState diff --git a/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/src/lib.rs b/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/src/lib.rs index 0efe20c3..8d6ef76c 100644 --- a/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/src/lib.rs +++ b/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/src/lib.rs @@ -10,12 +10,12 @@ declare_id!("5LdYbHiUsFxVG8bfqoeBkhBYMRmWZb3BoLuABgYW7coB"); pub mod default_account_state { use super::*; - pub fn initialize(context: Context) -> Result<()> { + pub fn initialize(context: Context) -> Result<()> { instructions::initialize::handler(context) } pub fn update_default_state( - context: Context, + context: Context, account_state: AnchorAccountState, ) -> Result<()> { instructions::update_default_state::handler(context, account_state) diff --git a/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/tests/test_default_account_state.rs b/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/tests/test_default_account_state.rs index 9fccce6d..c23a86ef 100644 --- a/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/tests/test_default_account_state.rs +++ b/tokens/token-extensions/default-account-state/anchor/programs/default-account-state/tests/test_default_account_state.rs @@ -69,7 +69,7 @@ fn test_default_account_state() { let initialize_ix = Instruction::new_with_bytes( program_id, &default_account_state::instruction::Initialize {}.data(), - default_account_state::accounts::Initialize { + default_account_state::accounts::InitializeAccountConstraints { payer: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, @@ -123,7 +123,7 @@ fn test_default_account_state() { account_state: default_account_state::AnchorAccountState::Initialized, } .data(), - default_account_state::accounts::UpdateDefaultState { + default_account_state::accounts::UpdateDefaultStateAccountConstraints { freeze_authority: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, diff --git a/tokens/token-extensions/default-account-state/quasar/src/lib.rs b/tokens/token-extensions/default-account-state/quasar/src/lib.rs index e33f8d5e..866e8a4e 100644 --- a/tokens/token-extensions/default-account-state/quasar/src/lib.rs +++ b/tokens/token-extensions/default-account-state/quasar/src/lib.rs @@ -29,7 +29,7 @@ mod quasar_default_account_state { /// Create a new mint with DefaultAccountState extension set to frozen. /// The mint account must be a signer (keypair created client-side). #[instruction(discriminator = 0)] - pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { + pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { handle_initialize(&mut ctx.accounts) } @@ -37,7 +37,7 @@ mod quasar_default_account_state { /// 0 = Uninitialized, 1 = Initialized, 2 = Frozen #[instruction(discriminator = 1)] pub fn update_default_state( - ctx: Ctx, + ctx: Ctx, account_state: u8, ) -> Result<(), ProgramError> { handle_update_default_state(&mut ctx.accounts, account_state) @@ -45,7 +45,7 @@ mod quasar_default_account_state { } #[derive(Accounts)] -pub struct Initialize { +pub struct InitializeAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -55,7 +55,7 @@ pub struct Initialize { } #[inline(always)] -fn handle_initialize(accounts: &mut Initialize) -> Result<(), ProgramError> { +fn handle_initialize(accounts: &mut InitializeAccountConstraints) -> Result<(), ProgramError> { // 165 (base account) + 1 (account type) + 4 (TLV header) + 1 (DefaultAccountState data) = 171 bytes let mint_size: u64 = 171; let lamports = Rent::get()?.try_minimum_balance(mint_size as usize)?; @@ -107,7 +107,7 @@ fn handle_initialize(accounts: &mut Initialize) -> Result<(), ProgramError> { } #[derive(Accounts)] -pub struct UpdateDefaultState { +pub struct UpdateDefaultStateAccountConstraints { #[account(mut)] pub freeze_authority: Signer, #[account(mut)] @@ -117,7 +117,7 @@ pub struct UpdateDefaultState { #[inline(always)] fn handle_update_default_state( - accounts: &mut UpdateDefaultState, + accounts: &mut UpdateDefaultStateAccountConstraints, account_state: u8, ) -> Result<(), ProgramError> { // DefaultAccountState Update: opcode 28, sub-opcode 1, new state diff --git a/tokens/token-minter/quasar/src/instructions/create.rs b/tokens/token-minter/quasar/src/instructions/create.rs index 55d25c3f..5b787f7f 100644 --- a/tokens/token-minter/quasar/src/instructions/create.rs +++ b/tokens/token-minter/quasar/src/instructions/create.rs @@ -12,7 +12,7 @@ use { /// constants for `name` / `symbol` / `uri`; this instruction takes them at /// runtime. #[derive(Accounts)] -pub struct CreateToken { +pub struct CreateTokenAccountConstraints { #[account(mut)] pub payer: Signer, #[account( @@ -38,7 +38,7 @@ pub struct CreateToken { #[inline(always)] pub fn handle_create_token( - accounts: &mut CreateToken, + accounts: &mut CreateTokenAccountConstraints, token_name: &str, token_symbol: &str, token_uri: &str, diff --git a/tokens/token-minter/quasar/src/instructions/mint.rs b/tokens/token-minter/quasar/src/instructions/mint.rs index 029658dd..59e3e054 100644 --- a/tokens/token-minter/quasar/src/instructions/mint.rs +++ b/tokens/token-minter/quasar/src/instructions/mint.rs @@ -3,7 +3,7 @@ use quasar_spl::prelude::*; /// Accounts for minting tokens to a recipient's token account. #[derive(Accounts)] -pub struct MintToken { +pub struct MintTokenAccountConstraints { #[account(mut)] pub mint_authority: Signer, pub recipient: UncheckedAccount, @@ -20,21 +20,24 @@ pub struct MintToken { pub system_program: Program, } +/// Mints `amount` tokens to the recipient's associated token account. +/// +/// `amount` is in minor units (the raw integer the token program operates +/// on). Clients convert from major units, e.g. 1 token with 9 decimals is +/// `1 * 10u64.pow(9)` minor units. #[inline(always)] -pub fn handle_mint_token(accounts: &mut MintToken, amount: u64) -> Result<(), ProgramError> { +pub fn handle_mint_token( + accounts: &mut MintTokenAccountConstraints, + amount: u64, +) -> Result<(), ProgramError> { log("Minting tokens to associated token account..."); - let decimals = accounts.mint_account.decimals(); - let adjusted_amount = amount - .checked_mul(10u64.pow(decimals as u32)) - .ok_or(ProgramError::ArithmeticOverflow)?; - accounts.token_program .mint_to( &accounts.mint_account, &accounts.associated_token_account, &accounts.mint_authority, - adjusted_amount, + amount, ) .invoke()?; diff --git a/tokens/token-minter/quasar/src/lib.rs b/tokens/token-minter/quasar/src/lib.rs index aadb98a5..7d6e83a1 100644 --- a/tokens/token-minter/quasar/src/lib.rs +++ b/tokens/token-minter/quasar/src/lib.rs @@ -23,7 +23,7 @@ mod quasar_token_minter { // capacity - bare `String` (no ) is not accepted. #[instruction(discriminator = 0)] pub fn create_token( - ctx: Ctx, + ctx: Ctx, token_name: String<32>, token_symbol: String<10>, token_uri: String<200>, @@ -36,8 +36,12 @@ mod quasar_token_minter { ) } + /// Mint `amount` minor units of the token to the recipient. #[instruction(discriminator = 1)] - pub fn mint_token(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { + pub fn mint_token( + ctx: Ctx, + amount: u64, + ) -> Result<(), ProgramError> { instructions::handle_mint_token(&mut ctx.accounts, amount) } } diff --git a/tokens/token-minter/quasar/src/tests.rs b/tokens/token-minter/quasar/src/tests.rs index 14433ac3..41398aa7 100644 --- a/tokens/token-minter/quasar/src/tests.rs +++ b/tokens/token-minter/quasar/src/tests.rs @@ -2,6 +2,7 @@ extern crate std; use { alloc::vec, quasar_svm::{Account, Instruction, Pubkey, QuasarSvm}, + solana_program_pack::Pack, spl_token_interface::state::{Account as TokenAccount, AccountState, Mint}, std::println, }; @@ -43,8 +44,18 @@ fn token_account(address: Pubkey, mint_address: Pubkey, owner: Pubkey, amount: u ) } +/// Decimals configured by the mint fixture above, matching the program's +/// `mint(decimals = 9)` constraint in `CreateTokenAccountConstraints`. +const MINT_DECIMALS: u32 = 9; + +/// Converts a whole-token (major unit) count to minor units, the form the +/// program's `mint_token` handler takes amounts in. +fn to_minor_units(major_units: u64) -> u64 { + major_units.checked_mul(10u64.pow(MINT_DECIMALS)).unwrap() +} + /// Build mint_token instruction data. -/// Wire format: [disc=1] [amount: u64 LE] +/// Wire format: [disc=1] [amount: u64 LE, in minor units] fn build_mint_token_data(amount: u64) -> Vec { let mut data = vec![1u8]; data.extend_from_slice(&amount.to_le_bytes()); @@ -66,7 +77,7 @@ fn test_mint_token() { let token_program = quasar_svm::SPL_TOKEN_PROGRAM_ID; let system_program = quasar_svm::system_program::ID; - let amount = 100u64; + let amount = to_minor_units(100); let data = build_mint_token_data(amount); let instruction = Instruction { @@ -97,5 +108,12 @@ fn test_mint_token() { "mint_token failed: {:?}", result.raw_result ); + + // The recipient's token account balance is the exact minor-unit amount + // requested - the program performs no onchain scaling. + let token_account_after = result.account(&token_addr).unwrap(); + let token_account_state = TokenAccount::unpack_from_slice(&token_account_after.data).unwrap(); + assert_eq!(token_account_state.amount, amount); + println!(" MINT TOKEN CU: {}", result.compute_units_consumed); } diff --git a/tokens/transfer-tokens/quasar/src/lib.rs b/tokens/transfer-tokens/quasar/src/lib.rs index 3c33cf09..a7690222 100644 --- a/tokens/transfer-tokens/quasar/src/lib.rs +++ b/tokens/transfer-tokens/quasar/src/lib.rs @@ -8,31 +8,38 @@ mod tests; declare_id!("nHi9DdNjuupjQ3c8AJU9sChB5gLbZvTLsJQouY4hU67"); -/// Demonstrates creating a mint, minting tokens, and transferring between accounts. +/// Demonstrates minting tokens and transferring them between accounts. /// -/// The Anchor version uses Metaplex for onchain metadata. Quasar does not have -/// a Metaplex integration crate, so this example focuses on the core SPL Token -/// operations: minting and transferring. +/// The Anchor variant also creates Metaplex metadata for the mint; this +/// variant focuses on the core token operations - minting and transferring - +/// and leaves metadata out. Both handlers take `amount` in minor units (the +/// raw integer the token program operates on); no scaling happens onchain. #[program] mod quasar_transfer_tokens { use super::*; - /// Mint tokens to a recipient's token account. + /// Mint `amount` minor units to a recipient's token account. #[instruction(discriminator = 0)] - pub fn mint_tokens(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { + pub fn mint_tokens( + ctx: Ctx, + amount: u64, + ) -> Result<(), ProgramError> { handle_mint_tokens(&mut ctx.accounts, amount) } - /// Transfer tokens from sender to recipient. + /// Transfer `amount` minor units from sender to recipient. #[instruction(discriminator = 1)] - pub fn transfer_tokens(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { + pub fn transfer_tokens( + ctx: Ctx, + amount: u64, + ) -> Result<(), ProgramError> { handle_transfer_tokens(&mut ctx.accounts, amount) } } /// Accounts for minting tokens to a recipient. #[derive(Accounts)] -pub struct MintTokens { +pub struct MintTokensAccountConstraints { #[account(mut)] pub mint_authority: Signer, #[account(mut)] @@ -44,7 +51,10 @@ pub struct MintTokens { } #[inline(always)] -fn handle_mint_tokens(accounts: &mut MintTokens, amount: u64) -> Result<(), ProgramError> { +fn handle_mint_tokens( + accounts: &mut MintTokensAccountConstraints, + amount: u64, +) -> Result<(), ProgramError> { accounts.token_program .mint_to(&accounts.mint, &accounts.recipient_token_account, &accounts.mint_authority, amount) .invoke() @@ -52,7 +62,7 @@ fn handle_mint_tokens(accounts: &mut MintTokens, amount: u64) -> Result<(), Prog /// Accounts for transferring tokens between two token accounts. #[derive(Accounts)] -pub struct TransferTokens { +pub struct TransferTokensAccountConstraints { #[account(mut)] pub sender: Signer, #[account(mut)] @@ -63,7 +73,10 @@ pub struct TransferTokens { } #[inline(always)] -fn handle_transfer_tokens(accounts: &mut TransferTokens, amount: u64) -> Result<(), ProgramError> { +fn handle_transfer_tokens( + accounts: &mut TransferTokensAccountConstraints, + amount: u64, +) -> Result<(), ProgramError> { accounts.token_program .transfer(&accounts.sender_token_account, &accounts.recipient_token_account, &accounts.sender, amount) .invoke() From 3e10c8a82882fb78c05db64a58f19182adc04d71 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 11 Jun 2026 15:13:47 +0000 Subject: [PATCH 072/138] wip: checkpoint of in-progress token-extensions rename sweep Snapshot so agent work survives container recycling; verified states land in the following commits. https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- .../group/src/instructions/test_initialize_group.rs | 6 +++--- .../group/anchor/programs/group/src/lib.rs | 2 +- .../group/anchor/programs/group/tests/test_group.rs | 2 +- tokens/token-extensions/group/quasar/src/lib.rs | 6 +++--- .../anchor/programs/immutable-owner/src/lib.rs | 4 ++-- .../immutable-owner/tests/test_immutable_owner.rs | 2 +- .../immutable-owner/quasar/src/lib.rs | 6 +++--- .../interest-bearing/src/instructions/initialize.rs | 4 ++-- .../interest-bearing/src/instructions/update_rate.rs | 4 ++-- .../anchor/programs/interest-bearing/src/lib.rs | 4 ++-- .../interest-bearing/tests/test_interest_bearing.rs | 4 ++-- .../interest-bearing/quasar/src/lib.rs | 12 ++++++------ 12 files changed, 28 insertions(+), 28 deletions(-) diff --git a/tokens/token-extensions/group/anchor/programs/group/src/instructions/test_initialize_group.rs b/tokens/token-extensions/group/anchor/programs/group/src/instructions/test_initialize_group.rs index d707e12d..d7b992a0 100644 --- a/tokens/token-extensions/group/anchor/programs/group/src/instructions/test_initialize_group.rs +++ b/tokens/token-extensions/group/anchor/programs/group/src/instructions/test_initialize_group.rs @@ -9,7 +9,7 @@ use anchor_spl::token_interface::{ }; #[derive(Accounts)] -pub struct InitializeGroup<'info> { +pub struct InitializeGroupAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -29,7 +29,7 @@ pub struct InitializeGroup<'info> { pub system_program: Program<'info, System>, } -fn check_mint_data(accounts: &mut InitializeGroup) -> Result<()> { +fn check_mint_data(accounts: &mut InitializeGroupAccountConstraints) -> Result<()> { let mint = &accounts.mint_account.to_account_info(); let mint_data = mint.data.borrow(); let mint_with_extension = StateWithExtensions::::unpack(&mint_data)?; @@ -40,7 +40,7 @@ fn check_mint_data(accounts: &mut InitializeGroup) -> Result<()> { Ok(()) } -pub fn handler(mut context: Context) -> Result<()> { +pub fn handler(mut context: Context) -> Result<()> { check_mint_data(&mut context.accounts)?; // // Token Group and Token Member extensions features not enabled yet on the Token2022 program diff --git a/tokens/token-extensions/group/anchor/programs/group/src/lib.rs b/tokens/token-extensions/group/anchor/programs/group/src/lib.rs index ef5fa47a..4c221923 100644 --- a/tokens/token-extensions/group/anchor/programs/group/src/lib.rs +++ b/tokens/token-extensions/group/anchor/programs/group/src/lib.rs @@ -10,7 +10,7 @@ pub mod group { use super::*; - pub fn test_initialize_group(context: Context) -> Result<()> { + pub fn test_initialize_group(context: Context) -> Result<()> { instructions::test_initialize_group::handler(context) } } diff --git a/tokens/token-extensions/group/anchor/programs/group/tests/test_group.rs b/tokens/token-extensions/group/anchor/programs/group/tests/test_group.rs index 4d6135a0..331ca1fb 100644 --- a/tokens/token-extensions/group/anchor/programs/group/tests/test_group.rs +++ b/tokens/token-extensions/group/anchor/programs/group/tests/test_group.rs @@ -27,7 +27,7 @@ fn test_initialize_group() { let instruction = Instruction::new_with_bytes( program_id, &group::instruction::TestInitializeGroup {}.data(), - group::accounts::InitializeGroup { + group::accounts::InitializeGroupAccountConstraints { payer: payer.pubkey(), mint_account, token_program: TOKEN_EXTENSIONS_PROGRAM_ID, diff --git a/tokens/token-extensions/group/quasar/src/lib.rs b/tokens/token-extensions/group/quasar/src/lib.rs index 438b3dac..3529fde3 100644 --- a/tokens/token-extensions/group/quasar/src/lib.rs +++ b/tokens/token-extensions/group/quasar/src/lib.rs @@ -30,13 +30,13 @@ mod quasar_group { use super::*; #[instruction(discriminator = 0)] - pub fn initialize_group(ctx: Ctx) -> Result<(), ProgramError> { + pub fn initialize_group(ctx: Ctx) -> Result<(), ProgramError> { handle_initialize_group(&mut ctx.accounts) } } #[derive(Accounts)] -pub struct InitializeGroup { +pub struct InitializeGroupAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -46,7 +46,7 @@ pub struct InitializeGroup { } #[inline(always)] -fn handle_initialize_group(accounts: &mut InitializeGroup) -> Result<(), ProgramError> { +fn handle_initialize_group(accounts: &mut InitializeGroupAccountConstraints) -> Result<(), ProgramError> { // Mint + GroupPointer extension = 234 bytes // (base mint padded to 165 + account_type byte + GroupPointer TLV [2 type + 2 len + 64 data]) let mint_size: u64 = 234; diff --git a/tokens/token-extensions/immutable-owner/anchor/programs/immutable-owner/src/lib.rs b/tokens/token-extensions/immutable-owner/anchor/programs/immutable-owner/src/lib.rs index c24c5860..e21a5e71 100644 --- a/tokens/token-extensions/immutable-owner/anchor/programs/immutable-owner/src/lib.rs +++ b/tokens/token-extensions/immutable-owner/anchor/programs/immutable-owner/src/lib.rs @@ -17,7 +17,7 @@ pub mod immutable_owner { // There is currently not an anchor constraint to automatically initialize the ImmutableOwner extension // We can manually create and initialize the token account via CPIs in the instruction handler - pub fn initialize(context: Context) -> Result<()> { + pub fn initialize(context: Context) -> Result<()> { // Calculate space required for token and extension data let token_account_size = ExtensionType::try_calculate_account_len::(&[ ExtensionType::ImmutableOwner, @@ -63,7 +63,7 @@ pub mod immutable_owner { } #[derive(Accounts)] -pub struct Initialize<'info> { +pub struct InitializeAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, diff --git a/tokens/token-extensions/immutable-owner/anchor/programs/immutable-owner/tests/test_immutable_owner.rs b/tokens/token-extensions/immutable-owner/anchor/programs/immutable-owner/tests/test_immutable_owner.rs index 50e30db9..90710e4c 100644 --- a/tokens/token-extensions/immutable-owner/anchor/programs/immutable-owner/tests/test_immutable_owner.rs +++ b/tokens/token-extensions/immutable-owner/anchor/programs/immutable-owner/tests/test_immutable_owner.rs @@ -68,7 +68,7 @@ fn test_create_token_account_with_immutable_owner() { let initialize_ix = Instruction::new_with_bytes( program_id, &immutable_owner::instruction::Initialize {}.data(), - immutable_owner::accounts::Initialize { + immutable_owner::accounts::InitializeAccountConstraints { payer: payer.pubkey(), token_account: token_keypair.pubkey(), mint_account: mint, diff --git a/tokens/token-extensions/immutable-owner/quasar/src/lib.rs b/tokens/token-extensions/immutable-owner/quasar/src/lib.rs index 2c1420ca..6ec0b52b 100644 --- a/tokens/token-extensions/immutable-owner/quasar/src/lib.rs +++ b/tokens/token-extensions/immutable-owner/quasar/src/lib.rs @@ -26,13 +26,13 @@ mod quasar_immutable_owner { use super::*; #[instruction(discriminator = 0)] - pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { + pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { handle_initialize(&mut ctx.accounts) } } #[derive(Accounts)] -pub struct Initialize { +pub struct InitializeAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -43,7 +43,7 @@ pub struct Initialize { } #[inline(always)] -fn handle_initialize(accounts: &mut Initialize) -> Result<(), ProgramError> { +fn handle_initialize(accounts: &mut InitializeAccountConstraints) -> Result<(), ProgramError> { // 165 (base) + 1 (account type) + 4 (TLV header, ImmutableOwner is zero-size) = 170 bytes let account_size: u64 = 170; let lamports = Rent::get()?.try_minimum_balance(account_size as usize)?; diff --git a/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/src/instructions/initialize.rs b/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/src/instructions/initialize.rs index 00be5c73..cb34219a 100644 --- a/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/src/instructions/initialize.rs +++ b/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/src/instructions/initialize.rs @@ -12,7 +12,7 @@ use anchor_spl::{ use crate::check_mint_data; #[derive(Accounts)] -pub struct Initialize<'info> { +pub struct InitializeAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, #[account(mut)] @@ -22,7 +22,7 @@ pub struct Initialize<'info> { pub system_program: Program<'info, System>, } -pub fn handler(context: Context, rate: i16) -> Result<()> { +pub fn handler(context: Context, rate: i16) -> Result<()> { // Calculate space required for mint and extension data let mint_size = ExtensionType::try_calculate_account_len::(&[ ExtensionType::InterestBearingConfig, diff --git a/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/src/instructions/update_rate.rs b/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/src/instructions/update_rate.rs index 357082b6..87da6338 100644 --- a/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/src/instructions/update_rate.rs +++ b/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/src/instructions/update_rate.rs @@ -6,7 +6,7 @@ use anchor_spl::token_interface::{ use crate::check_mint_data; #[derive(Accounts)] -pub struct UpdateRate<'info> { +pub struct UpdateRateAccountConstraints<'info> { #[account(mut)] pub authority: Signer<'info>, #[account(mut)] @@ -16,7 +16,7 @@ pub struct UpdateRate<'info> { pub system_program: Program<'info, System>, } -pub fn handler(context: Context, rate: i16) -> Result<()> { +pub fn handler(context: Context, rate: i16) -> Result<()> { interest_bearing_mint_update_rate( CpiContext::new( context.accounts.token_program.key(), diff --git a/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/src/lib.rs b/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/src/lib.rs index a8da9cc5..b0978218 100644 --- a/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/src/lib.rs +++ b/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/src/lib.rs @@ -18,11 +18,11 @@ pub mod interest_bearing { use super::*; - pub fn initialize(context: Context, rate: i16) -> Result<()> { + pub fn initialize(context: Context, rate: i16) -> Result<()> { instructions::initialize::handler(context, rate) } - pub fn update_rate(context: Context, rate: i16) -> Result<()> { + pub fn update_rate(context: Context, rate: i16) -> Result<()> { instructions::update_rate::handler(context, rate) } } diff --git a/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/tests/test_interest_bearing.rs b/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/tests/test_interest_bearing.rs index c354d3ba..c9954bcc 100644 --- a/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/tests/test_interest_bearing.rs +++ b/tokens/token-extensions/interest-bearing/anchor/programs/interest-bearing/tests/test_interest_bearing.rs @@ -32,7 +32,7 @@ fn test_initialize_and_update_rate() { let initialize_ix = Instruction::new_with_bytes( program_id, &interest_bearing::instruction::Initialize { rate: 0 }.data(), - interest_bearing::accounts::Initialize { + interest_bearing::accounts::InitializeAccountConstraints { payer: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, @@ -54,7 +54,7 @@ fn test_initialize_and_update_rate() { let update_rate_ix = Instruction::new_with_bytes( program_id, &interest_bearing::instruction::UpdateRate { rate: 100 }.data(), - interest_bearing::accounts::UpdateRate { + interest_bearing::accounts::UpdateRateAccountConstraints { authority: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, diff --git a/tokens/token-extensions/interest-bearing/quasar/src/lib.rs b/tokens/token-extensions/interest-bearing/quasar/src/lib.rs index af2124c1..356dbcaa 100644 --- a/tokens/token-extensions/interest-bearing/quasar/src/lib.rs +++ b/tokens/token-extensions/interest-bearing/quasar/src/lib.rs @@ -26,18 +26,18 @@ mod quasar_interest_bearing { use super::*; #[instruction(discriminator = 0)] - pub fn initialize(ctx: Ctx, rate: i16) -> Result<(), ProgramError> { + pub fn initialize(ctx: Ctx, rate: i16) -> Result<(), ProgramError> { handle_initialize(&mut ctx.accounts, rate) } #[instruction(discriminator = 1)] - pub fn update_rate(ctx: Ctx, rate: i16) -> Result<(), ProgramError> { + pub fn update_rate(ctx: Ctx, rate: i16) -> Result<(), ProgramError> { handle_update_rate(&mut ctx.accounts, rate) } } #[derive(Accounts)] -pub struct Initialize { +pub struct InitializeAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -47,7 +47,7 @@ pub struct Initialize { } #[inline(always)] -fn handle_initialize(accounts: &mut Initialize, rate: i16) -> Result<(), ProgramError> { +fn handle_initialize(accounts: &mut InitializeAccountConstraints, rate: i16) -> Result<(), ProgramError> { // 165 (base) + 1 (account type) + 4 (TLV header) + 52 (InterestBearingConfig data) = 222 bytes let mint_size: u64 = 222; let lamports = Rent::get()?.try_minimum_balance(mint_size as usize)?; @@ -101,7 +101,7 @@ fn handle_initialize(accounts: &mut Initialize, rate: i16) -> Result<(), Program } #[derive(Accounts)] -pub struct UpdateRate { +pub struct UpdateRateAccountConstraints { #[account(mut)] pub authority: Signer, #[account(mut)] @@ -110,7 +110,7 @@ pub struct UpdateRate { } #[inline(always)] -fn handle_update_rate(accounts: &mut UpdateRate, rate: i16) -> Result<(), ProgramError> { +fn handle_update_rate(accounts: &mut UpdateRateAccountConstraints, rate: i16) -> Result<(), ProgramError> { // InterestBearingMintUpdateRate: opcode 33, sub-opcode 1, rate (i16 LE) let mut data = [0u8; 4]; data[0] = 33; From f0e332e6e80c60e6e1eba7c6785587973e669403 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 11 Jun 2026 16:23:57 +0000 Subject: [PATCH 073/138] token-extensions: finish AccountConstraints rename sweep across all 33 anchor and quasar variants Every #[derive(Accounts)] struct now carries the AccountConstraints suffix; handler names, generated instruction-data names, and program IDs unchanged. Each project rebuilt and its tests run green after the rename. https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- .../memo-transfer/src/instructions/disable.rs | 4 ++-- .../src/instructions/initialize.rs | 4 ++-- .../anchor/programs/memo-transfer/src/lib.rs | 4 ++-- .../memo-transfer/tests/test_memo_transfer.rs | 4 ++-- .../memo-transfer/quasar/src/lib.rs | 12 +++++----- .../metadata/src/instructions/emit.rs | 4 ++-- .../metadata/src/instructions/initialize.rs | 4 ++-- .../metadata/src/instructions/remove_key.rs | 4 ++-- .../src/instructions/update_authority.rs | 4 ++-- .../metadata/src/instructions/update_field.rs | 4 ++-- .../anchor/programs/metadata/src/lib.rs | 10 ++++---- .../programs/metadata/tests/test_metadata.rs | 12 +++++----- .../src/instructions/close.rs | 4 ++-- .../src/instructions/initialize.rs | 6 ++--- .../programs/mint-close-authority/src/lib.rs | 4 ++-- .../tests/test_mint_close_authority.rs | 6 ++--- .../mint-close-authority/quasar/src/lib.rs | 12 +++++----- .../src/instructions/init_player.rs | 4 ++-- .../src/instructions/mint_nft.rs | 4 ++-- .../anchor/programs/extension_nft/src/lib.rs | 4 ++-- .../extension_nft/tests/test_extension_nft.rs | 4 ++-- .../programs/non-transferable/src/lib.rs | 4 ++-- .../tests/test_non_transferable.rs | 2 +- .../non-transferable/quasar/src/lib.rs | 6 ++--- .../src/instructions/initialize.rs | 6 ++--- .../programs/permanent-delegate/src/lib.rs | 2 +- .../tests/test_permanent_delegate.rs | 2 +- .../permanent-delegate/quasar/src/lib.rs | 6 ++--- .../transfer-fee/src/instructions/harvest.rs | 4 ++-- .../src/instructions/initialize.rs | 6 ++--- .../transfer-fee/src/instructions/transfer.rs | 4 ++-- .../src/instructions/update_fee.rs | 4 ++-- .../transfer-fee/src/instructions/withdraw.rs | 4 ++-- .../anchor/programs/transfer-fee/src/lib.rs | 10 ++++---- .../transfer-fee/tests/test_transfer_fee.rs | 12 +++++----- .../transfer-fee/quasar/src/lib.rs | 24 +++++++++---------- .../initialize_extra_account_meta_list.rs | 4 ++-- .../src/instructions/transfer_hook.rs | 4 ++-- .../anchor/programs/transfer-hook/src/lib.rs | 6 ++--- .../transfer-hook/tests/test_transfer_hook.rs | 4 ++-- .../account-data-as-seed/quasar/src/lib.rs | 12 +++++----- .../src/instructions/attach_to_mint.rs | 4 ++-- .../abl-token/src/instructions/change_mode.rs | 4 ++-- .../abl-token/src/instructions/init_config.rs | 4 ++-- .../abl-token/src/instructions/init_mint.rs | 4 ++-- .../abl-token/src/instructions/init_wallet.rs | 4 ++-- .../src/instructions/remove_wallet.rs | 4 ++-- .../abl-token/src/instructions/tx_hook.rs | 4 ++-- .../anchor/programs/abl-token/src/lib.rs | 14 +++++------ .../abl-token/tests/test_abl_token.rs | 4 ++-- .../anchor/tests-rs/test.rs | 6 ++--- .../quasar/src/instructions/attach_to_mint.rs | 4 ++-- .../quasar/src/instructions/change_mode.rs | 8 +++---- .../quasar/src/instructions/init_config.rs | 4 ++-- .../quasar/src/instructions/init_mint.rs | 10 ++++---- .../quasar/src/instructions/init_wallet.rs | 4 ++-- .../quasar/src/instructions/remove_wallet.rs | 4 ++-- .../quasar/src/instructions/tx_hook.rs | 6 ++--- .../allow-block-list-token/quasar/src/lib.rs | 14 +++++------ .../initialize_extra_account_meta_list.rs | 4 ++-- .../src/instructions/transfer_hook.rs | 4 ++-- .../anchor/programs/transfer-hook/src/lib.rs | 6 ++--- .../tests/test_transfer_hook_counter.rs | 4 ++-- .../transfer-hook/counter/quasar/src/lib.rs | 12 +++++----- .../src/instructions/initialize.rs | 6 ++--- .../initialize_extra_account_meta_list.rs | 4 ++-- .../src/instructions/transfer_hook.rs | 4 ++-- .../anchor/programs/transfer-hook/src/lib.rs | 8 +++---- .../transfer-hook/tests/test_transfer_hook.rs | 6 ++--- .../hello-world/quasar/src/lib.rs | 18 +++++++------- .../initialize_extra_account_meta_list.rs | 4 ++-- .../src/instructions/transfer_hook.rs | 4 ++-- .../anchor/programs/transfer-hook/src/lib.rs | 6 ++--- .../transfer-hook/tests/test_transfer_hook.rs | 2 +- .../transfer-cost/quasar/src/lib.rs | 12 +++++----- .../src/instructions/configure_admin.rs | 6 ++--- .../initialise_extra_account_metas_list.rs | 4 ++-- .../src/instructions/switch.rs | 4 ++-- .../src/instructions/transfer_hook.rs | 6 ++--- .../programs/transfer-switch/src/lib.rs | 8 +++---- .../tests/test_transfer_switch.rs | 8 +++---- .../transfer-switch/quasar/src/lib.rs | 24 +++++++++---------- .../src/instructions/add_to_whitelist.rs | 4 ++-- .../initialize_extra_account_meta_list.rs | 4 ++-- .../src/instructions/transfer_hook.rs | 4 ++-- .../anchor/programs/transfer-hook/src/lib.rs | 8 +++---- .../transfer-hook/tests/test_transfer_hook.rs | 4 ++-- .../transfer-hook/whitelist/quasar/src/lib.rs | 18 +++++++------- 88 files changed, 278 insertions(+), 278 deletions(-) diff --git a/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/src/instructions/disable.rs b/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/src/instructions/disable.rs index b1d35d98..f38442c0 100644 --- a/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/src/instructions/disable.rs +++ b/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/src/instructions/disable.rs @@ -2,7 +2,7 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::{memo_transfer_disable, MemoTransfer, Token2022, TokenAccount}; #[derive(Accounts)] -pub struct Disable<'info> { +pub struct DisableAccountConstraints<'info> { #[account(mut)] pub owner: Signer<'info>, @@ -14,7 +14,7 @@ pub struct Disable<'info> { pub token_program: Program<'info, Token2022>, } -pub fn handler(context: Context) -> Result<()> { +pub fn handler(context: Context) -> Result<()> { memo_transfer_disable(CpiContext::new( context.accounts.token_program.key(), MemoTransfer { diff --git a/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/src/instructions/initialize.rs b/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/src/instructions/initialize.rs index da389ad6..b465e542 100644 --- a/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/src/instructions/initialize.rs +++ b/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/src/instructions/initialize.rs @@ -10,7 +10,7 @@ use anchor_spl::{ }; #[derive(Accounts)] -pub struct Initialize<'info> { +pub struct InitializeAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -21,7 +21,7 @@ pub struct Initialize<'info> { pub system_program: Program<'info, System>, } -pub fn handler(context: Context) -> Result<()> { +pub fn handler(context: Context) -> Result<()> { // Calculate space required for token and extension data let token_account_size = ExtensionType::try_calculate_account_len::(&[ExtensionType::MemoTransfer])?; diff --git a/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/src/lib.rs b/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/src/lib.rs index b85b27fe..d9e71f05 100644 --- a/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/src/lib.rs +++ b/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/src/lib.rs @@ -9,11 +9,11 @@ declare_id!("5BQyC7y2Pc283woThq11uZRqsgcRbBRLKz4yQ8BJadi2"); pub mod memo_transfer { use super::*; - pub fn initialize(context: Context) -> Result<()> { + pub fn initialize(context: Context) -> Result<()> { instructions::initialize::handler(context) } - pub fn disable(context: Context) -> Result<()> { + pub fn disable(context: Context) -> Result<()> { instructions::disable::handler(context) } } diff --git a/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/tests/test_memo_transfer.rs b/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/tests/test_memo_transfer.rs index be4e6fb9..e410f234 100644 --- a/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/tests/test_memo_transfer.rs +++ b/tokens/token-extensions/memo-transfer/anchor/programs/memo-transfer/tests/test_memo_transfer.rs @@ -119,7 +119,7 @@ fn test_memo_transfer() { let initialize_ix = Instruction::new_with_bytes( program_id, &memo_transfer::instruction::Initialize {}.data(), - memo_transfer::accounts::Initialize { + memo_transfer::accounts::InitializeAccountConstraints { payer: payer.pubkey(), token_account: token_keypair.pubkey(), mint_account: mint, @@ -192,7 +192,7 @@ fn test_memo_transfer() { let disable_ix = Instruction::new_with_bytes( program_id, &memo_transfer::instruction::Disable {}.data(), - memo_transfer::accounts::Disable { + memo_transfer::accounts::DisableAccountConstraints { owner: payer.pubkey(), token_account: token_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, diff --git a/tokens/token-extensions/memo-transfer/quasar/src/lib.rs b/tokens/token-extensions/memo-transfer/quasar/src/lib.rs index 35005349..9b214cd0 100644 --- a/tokens/token-extensions/memo-transfer/quasar/src/lib.rs +++ b/tokens/token-extensions/memo-transfer/quasar/src/lib.rs @@ -26,18 +26,18 @@ mod quasar_memo_transfer { use super::*; #[instruction(discriminator = 0)] - pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { + pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { handle_initialize(&mut ctx.accounts) } #[instruction(discriminator = 1)] - pub fn disable(ctx: Ctx) -> Result<(), ProgramError> { + pub fn disable(ctx: Ctx) -> Result<(), ProgramError> { handle_disable(&mut ctx.accounts) } } #[derive(Accounts)] -pub struct Initialize { +pub struct InitializeAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -48,7 +48,7 @@ pub struct Initialize { } #[inline(always)] -fn handle_initialize(accounts: &mut Initialize) -> Result<(), ProgramError> { +fn handle_initialize(accounts: &mut InitializeAccountConstraints) -> Result<(), ProgramError> { // Token account + MemoTransfer extension = 300 bytes let account_size: u64 = 300; let lamports = Rent::get()?.try_minimum_balance(account_size as usize)?; @@ -100,7 +100,7 @@ fn handle_initialize(accounts: &mut Initialize) -> Result<(), ProgramError> { } #[derive(Accounts)] -pub struct Disable { +pub struct DisableAccountConstraints { #[account(mut)] pub owner: Signer, #[account(mut)] @@ -109,7 +109,7 @@ pub struct Disable { } #[inline(always)] -fn handle_disable(accounts: &mut Disable) -> Result<(), ProgramError> { +fn handle_disable(accounts: &mut DisableAccountConstraints) -> Result<(), ProgramError> { // MemoTransfer disable: opcode 30, sub-opcode 1 CpiCall::new( accounts.token_program.to_account_view().address(), diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/emit.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/emit.rs index 72749e2f..b849ab82 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/emit.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/emit.rs @@ -4,14 +4,14 @@ use anchor_spl::token_interface::{Mint, Token2022}; use spl_token_metadata_interface::instruction::emit; #[derive(Accounts)] -pub struct Emit<'info> { +pub struct EmitAccountConstraints<'info> { pub mint_account: InterfaceAccount<'info, Mint>, pub token_program: Program<'info, Token2022>, } // Invoke the emit instruction from spl_token_metadata_interface directly // There is not an anchor CpiContext for this instruction -pub fn process_emit(context: Context) -> Result<()> { +pub fn process_emit(context: Context) -> Result<()> { invoke( &emit( &context.accounts.token_program.key(), // token program id diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/initialize.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/initialize.rs index 9f57330f..740b61ba 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/initialize.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/initialize.rs @@ -7,7 +7,7 @@ use spl_token_metadata_interface::state::TokenMetadata; use spl_type_length_value::variable_len_pack::VariableLenPack; #[derive(Accounts)] -pub struct Initialize<'info> { +pub struct InitializeAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -24,7 +24,7 @@ pub struct Initialize<'info> { pub system_program: Program<'info, System>, } -pub fn process_initialize(context: Context, args: TokenMetadataArgs) -> Result<()> { +pub fn process_initialize(context: Context, args: TokenMetadataArgs) -> Result<()> { let TokenMetadataArgs { name, symbol, uri } = args; // Define token metadata diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/remove_key.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/remove_key.rs index d171e18d..0114a4b2 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/remove_key.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/remove_key.rs @@ -4,7 +4,7 @@ use anchor_spl::token_interface::{Mint, Token2022}; use spl_token_metadata_interface::instruction::remove_key; #[derive(Accounts)] -pub struct RemoveKey<'info> { +pub struct RemoveKeyAccountConstraints<'info> { #[account(mut)] pub update_authority: Signer<'info>, @@ -19,7 +19,7 @@ pub struct RemoveKey<'info> { // Invoke the remove_key instruction from spl_token_metadata_interface directly // There is not an anchor CpiContext for this instruction -pub fn process_remove_key(context: Context, key: String) -> Result<()> { +pub fn process_remove_key(context: Context, key: String) -> Result<()> { invoke( &remove_key( &context.accounts.token_program.key(), // token program id diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_authority.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_authority.rs index 92a8ac1e..ded7b65f 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_authority.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_authority.rs @@ -5,7 +5,7 @@ use anchor_spl::token_interface::{ }; #[derive(Accounts)] -pub struct UpdateAuthority<'info> { +pub struct UpdateAuthorityAccountConstraints<'info> { pub current_authority: Signer<'info>, pub new_authority: Option>, @@ -18,7 +18,7 @@ pub struct UpdateAuthority<'info> { pub system_program: Program<'info, System>, } -pub fn process_update_authority(context: Context) -> Result<()> { +pub fn process_update_authority(context: Context) -> Result<()> { let new_authority_key = match &context.accounts.new_authority { Some(account) => OptionalNonZeroPubkey::try_from(Some(account.key()))?, None => OptionalNonZeroPubkey::try_from(None)?, diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_field.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_field.rs index cdd5504a..754fb809 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_field.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_field.rs @@ -10,7 +10,7 @@ use anchor_spl::{ use spl_token_metadata_interface::state::{Field, TokenMetadata}; #[derive(Accounts)] -pub struct UpdateField<'info> { +pub struct UpdateFieldAccountConstraints<'info> { #[account(mut)] pub authority: Signer<'info>, @@ -23,7 +23,7 @@ pub struct UpdateField<'info> { pub system_program: Program<'info, System>, } -pub fn process_update_field(context: Context, args: UpdateFieldArgs) -> Result<()> { +pub fn process_update_field(context: Context, args: UpdateFieldArgs) -> Result<()> { let UpdateFieldArgs { field, value } = args; // Convert to Field type from spl_token_metadata_interface diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/src/lib.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/src/lib.rs index 1496bd5e..e086f704 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/src/lib.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/src/lib.rs @@ -11,23 +11,23 @@ declare_id!("BJHEDXSQfD9kBFvhw8ZCGmPFRihzvbMoxoHUKpXdpn4D"); pub mod metadata { use super::*; - pub fn initialize(context: Context, args: TokenMetadataArgs) -> Result<()> { + pub fn initialize(context: Context, args: TokenMetadataArgs) -> Result<()> { process_initialize(context, args) } - pub fn update_field(context: Context, args: UpdateFieldArgs) -> Result<()> { + pub fn update_field(context: Context, args: UpdateFieldArgs) -> Result<()> { process_update_field(context, args) } - pub fn remove_key(context: Context, key: String) -> Result<()> { + pub fn remove_key(context: Context, key: String) -> Result<()> { process_remove_key(context, key) } - pub fn emit(context: Context) -> Result<()> { + pub fn emit(context: Context) -> Result<()> { process_emit(context) } - pub fn update_authority(context: Context) -> Result<()> { + pub fn update_authority(context: Context) -> Result<()> { process_update_authority(context) } } diff --git a/tokens/token-extensions/metadata/anchor/programs/metadata/tests/test_metadata.rs b/tokens/token-extensions/metadata/anchor/programs/metadata/tests/test_metadata.rs index 3b34a126..8439e9d3 100644 --- a/tokens/token-extensions/metadata/anchor/programs/metadata/tests/test_metadata.rs +++ b/tokens/token-extensions/metadata/anchor/programs/metadata/tests/test_metadata.rs @@ -39,7 +39,7 @@ fn test_metadata_full_flow() { }, } .data(), - metadata::accounts::Initialize { + metadata::accounts::InitializeAccountConstraints { payer: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, @@ -73,7 +73,7 @@ fn test_metadata_full_flow() { }, } .data(), - metadata::accounts::UpdateField { + metadata::accounts::UpdateFieldAccountConstraints { authority: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, @@ -95,7 +95,7 @@ fn test_metadata_full_flow() { }, } .data(), - metadata::accounts::UpdateField { + metadata::accounts::UpdateFieldAccountConstraints { authority: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, @@ -119,7 +119,7 @@ fn test_metadata_full_flow() { key: "color".to_string(), } .data(), - metadata::accounts::RemoveKey { + metadata::accounts::RemoveKeyAccountConstraints { update_authority: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, @@ -135,7 +135,7 @@ fn test_metadata_full_flow() { let update_authority_ix = Instruction::new_with_bytes( program_id, &metadata::instruction::UpdateAuthority {}.data(), - metadata::accounts::UpdateAuthority { + metadata::accounts::UpdateAuthorityAccountConstraints { current_authority: payer.pubkey(), new_authority: None, mint_account: mint_keypair.pubkey(), @@ -157,7 +157,7 @@ fn test_metadata_full_flow() { let emit_ix = Instruction::new_with_bytes( program_id, &metadata::instruction::Emit {}.data(), - metadata::accounts::Emit { + metadata::accounts::EmitAccountConstraints { mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, } diff --git a/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/src/instructions/close.rs b/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/src/instructions/close.rs index 1d591763..f87c3ccb 100644 --- a/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/src/instructions/close.rs +++ b/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/src/instructions/close.rs @@ -5,7 +5,7 @@ use anchor_spl::{ }; #[derive(Accounts)] -pub struct Close<'info> { +pub struct CloseAccountConstraints<'info> { #[account(mut)] pub authority: Signer<'info>, @@ -17,7 +17,7 @@ pub struct Close<'info> { pub token_program: Program<'info, Token2022>, } -pub fn handler(context: Context) -> Result<()> { +pub fn handler(context: Context) -> Result<()> { // cpi to token extensions programs to close mint account // alternatively, this can also be done in the client close_account(CpiContext::new( diff --git a/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/src/instructions/initialize.rs b/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/src/instructions/initialize.rs index ea19148f..ba2f2a47 100644 --- a/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/src/instructions/initialize.rs +++ b/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/src/instructions/initialize.rs @@ -12,7 +12,7 @@ use anchor_spl::token_interface::{ }; #[derive(Accounts)] -pub struct Initialize<'info> { +pub struct InitializeAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -28,13 +28,13 @@ pub struct Initialize<'info> { pub system_program: Program<'info, System>, } -pub fn handler(mut context: Context) -> Result<()> { +pub fn handler(mut context: Context) -> Result<()> { handle_check_mint_data(&mut context.accounts)?; Ok(()) } // helper to check mint data, and demonstrate how to read mint extension data within a program -fn handle_check_mint_data(accounts: &mut Initialize) -> Result<()> { +fn handle_check_mint_data(accounts: &mut InitializeAccountConstraints) -> Result<()> { let mint = &accounts.mint_account.to_account_info(); let mint_data = mint.data.borrow(); let mint_with_extension = StateWithExtensions::::unpack(&mint_data)?; diff --git a/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/src/lib.rs b/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/src/lib.rs index f4d21dc7..c5ac6ba4 100644 --- a/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/src/lib.rs +++ b/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/src/lib.rs @@ -9,11 +9,11 @@ declare_id!("AcfQLsYKuzprcCNH1n96pKKgAbAnZchwpbr3gbVN742n"); pub mod mint_close_authority { use super::*; - pub fn initialize(context: Context) -> Result<()> { + pub fn initialize(context: Context) -> Result<()> { instructions::initialize::handler(context) } - pub fn close(context: Context) -> Result<()> { + pub fn close(context: Context) -> Result<()> { instructions::close::handler(context) } } diff --git a/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/tests/test_mint_close_authority.rs b/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/tests/test_mint_close_authority.rs index 2530914f..156c9204 100644 --- a/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/tests/test_mint_close_authority.rs +++ b/tokens/token-extensions/mint-close-authority/anchor/programs/mint-close-authority/tests/test_mint_close_authority.rs @@ -32,7 +32,7 @@ fn test_create_and_close_mint() { let initialize_ix = Instruction::new_with_bytes( program_id, &mint_close_authority::instruction::Initialize {}.data(), - mint_close_authority::accounts::Initialize { + mint_close_authority::accounts::InitializeAccountConstraints { payer: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, @@ -54,7 +54,7 @@ fn test_create_and_close_mint() { let close_ix = Instruction::new_with_bytes( program_id, &mint_close_authority::instruction::Close {}.data(), - mint_close_authority::accounts::Close { + mint_close_authority::accounts::CloseAccountConstraints { authority: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, @@ -76,7 +76,7 @@ fn test_create_and_close_mint() { let initialize_ix2 = Instruction::new_with_bytes( program_id, &mint_close_authority::instruction::Initialize {}.data(), - mint_close_authority::accounts::Initialize { + mint_close_authority::accounts::InitializeAccountConstraints { payer: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, diff --git a/tokens/token-extensions/mint-close-authority/quasar/src/lib.rs b/tokens/token-extensions/mint-close-authority/quasar/src/lib.rs index 299242a4..b02a8b38 100644 --- a/tokens/token-extensions/mint-close-authority/quasar/src/lib.rs +++ b/tokens/token-extensions/mint-close-authority/quasar/src/lib.rs @@ -27,19 +27,19 @@ mod quasar_mint_close_authority { /// Create a mint with the MintCloseAuthority extension. #[instruction(discriminator = 0)] - pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { + pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { handle_initialize(&mut ctx.accounts) } /// Close the mint account, reclaiming lamports to the authority. #[instruction(discriminator = 1)] - pub fn close(ctx: Ctx) -> Result<(), ProgramError> { + pub fn close(ctx: Ctx) -> Result<(), ProgramError> { handle_close(&mut ctx.accounts) } } #[derive(Accounts)] -pub struct Initialize { +pub struct InitializeAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -49,7 +49,7 @@ pub struct Initialize { } #[inline(always)] -fn handle_initialize(accounts: &mut Initialize) -> Result<(), ProgramError> { +fn handle_initialize(accounts: &mut InitializeAccountConstraints) -> Result<(), ProgramError> { // 165 (base) + 1 (account type) + 4 (TLV header) + 32 (MintCloseAuthority data) = 202 bytes let mint_size: u64 = 202; let lamports = Rent::get()?.try_minimum_balance(mint_size as usize)?; @@ -100,7 +100,7 @@ fn handle_initialize(accounts: &mut Initialize) -> Result<(), ProgramError> { } #[derive(Accounts)] -pub struct Close { +pub struct CloseAccountConstraints { #[account(mut)] pub authority: Signer, #[account(mut)] @@ -109,7 +109,7 @@ pub struct Close { } #[inline(always)] -fn handle_close(accounts: &mut Close) -> Result<(), ProgramError> { +fn handle_close(accounts: &mut CloseAccountConstraints) -> Result<(), ProgramError> { // CloseAccount: opcode 9 CpiCall::new( accounts.token_program.to_account_view().address(), diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/init_player.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/init_player.rs index f75b6c86..c38c3ba6 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/init_player.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/init_player.rs @@ -3,7 +3,7 @@ use crate::state::player_data::PlayerData; use crate::{constants::MAX_ENERGY, GameData}; use anchor_lang::prelude::*; -pub fn handle_init_player(context: Context) -> Result<()> { +pub fn handle_init_player(context: Context) -> Result<()> { context.accounts.player.energy = MAX_ENERGY; context.accounts.player.last_login = Clock::get()?.unix_timestamp; context.accounts.player.authority = context.accounts.signer.key(); @@ -20,7 +20,7 @@ pub fn handle_init_player(context: Context) -> Result<()> { #[derive(Accounts)] #[instruction(level_seed: String)] -pub struct InitPlayer<'info> { +pub struct InitPlayerAccountConstraints<'info> { #[account( init, payer = signer, diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/mint_nft.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/mint_nft.rs index 980e6ad7..22fa0c98 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/mint_nft.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/mint_nft.rs @@ -13,7 +13,7 @@ use anchor_spl::{ }, }; -pub fn handle_mint_nft(context: Context) -> Result<()> { +pub fn handle_mint_nft(context: Context) -> Result<()> { msg!("Mint nft with meta data extension and additional meta data"); let space = @@ -187,7 +187,7 @@ pub fn handle_mint_nft(context: Context) -> Result<()> { } #[derive(Accounts)] -pub struct MintNft<'info> { +pub struct MintNftAccountConstraints<'info> { #[account(mut)] pub signer: Signer<'info>, pub system_program: Program<'info, System>, diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs index 02ea5493..f7ae4953 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs @@ -24,7 +24,7 @@ declare_id!("9aZZ7TJ2fQZxY8hMtWXywp5y6BgqC4N2BPcr9FDT47sW"); pub mod extension_nft { use super::*; - pub fn init_player(context: Context, _level_seed: String) -> Result<()> { + pub fn init_player(context: Context, _level_seed: String) -> Result<()> { init_player::handle_init_player(context) } @@ -43,7 +43,7 @@ pub mod extension_nft { chop_tree::chop_tree(ctx, counter, 1) } - pub fn mint_nft(context: Context) -> Result<()> { + pub fn mint_nft(context: Context) -> Result<()> { mint_nft::handle_mint_nft(context) } } diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs index 050764db..1a7ef075 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs @@ -79,7 +79,7 @@ fn associated_token_address(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { fn init_player_ix(program_id: &Pubkey, signer: &Pubkey) -> Instruction { Instruction { program_id: *program_id, - accounts: extension_nft::accounts::InitPlayer { + accounts: extension_nft::accounts::InitPlayerAccountConstraints { player: player_pda(program_id, signer), game_data: game_data_pda(program_id, LEVEL_SEED), signer: *signer, @@ -96,7 +96,7 @@ fn init_player_ix(program_id: &Pubkey, signer: &Pubkey) -> Instruction { fn mint_nft_ix(program_id: &Pubkey, signer: &Pubkey, mint: &Pubkey) -> Instruction { Instruction { program_id: *program_id, - accounts: extension_nft::accounts::MintNft { + accounts: extension_nft::accounts::MintNftAccountConstraints { signer: *signer, system_program: system_program::id(), token_program: TOKEN_2022_ID, diff --git a/tokens/token-extensions/non-transferable/anchor/programs/non-transferable/src/lib.rs b/tokens/token-extensions/non-transferable/anchor/programs/non-transferable/src/lib.rs index 3094931f..6e3447b0 100644 --- a/tokens/token-extensions/non-transferable/anchor/programs/non-transferable/src/lib.rs +++ b/tokens/token-extensions/non-transferable/anchor/programs/non-transferable/src/lib.rs @@ -17,7 +17,7 @@ pub mod non_transferable { // There is currently not an anchor constraint to automatically initialize the NonTransferable extension // We can manually create and initialize the mint account via CPIs in the instruction handler - pub fn initialize(context: Context) -> Result<()> { + pub fn initialize(context: Context) -> Result<()> { // Calculate space required for mint and extension data let mint_size = ExtensionType::try_calculate_account_len::(&[ExtensionType::NonTransferable])?; @@ -66,7 +66,7 @@ pub mod non_transferable { } #[derive(Accounts)] -pub struct Initialize<'info> { +pub struct InitializeAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, #[account(mut)] diff --git a/tokens/token-extensions/non-transferable/anchor/programs/non-transferable/tests/test_non_transferable.rs b/tokens/token-extensions/non-transferable/anchor/programs/non-transferable/tests/test_non_transferable.rs index 06d0eabe..65f05d6a 100644 --- a/tokens/token-extensions/non-transferable/anchor/programs/non-transferable/tests/test_non_transferable.rs +++ b/tokens/token-extensions/non-transferable/anchor/programs/non-transferable/tests/test_non_transferable.rs @@ -40,7 +40,7 @@ fn test_create_non_transferable_mint_and_attempt_transfer() { let initialize_ix = Instruction::new_with_bytes( program_id, &non_transferable::instruction::Initialize {}.data(), - non_transferable::accounts::Initialize { + non_transferable::accounts::InitializeAccountConstraints { payer: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, diff --git a/tokens/token-extensions/non-transferable/quasar/src/lib.rs b/tokens/token-extensions/non-transferable/quasar/src/lib.rs index cfc176da..4e1e6221 100644 --- a/tokens/token-extensions/non-transferable/quasar/src/lib.rs +++ b/tokens/token-extensions/non-transferable/quasar/src/lib.rs @@ -26,13 +26,13 @@ mod quasar_non_transferable { use super::*; #[instruction(discriminator = 0)] - pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { + pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { handle_initialize(&mut ctx.accounts) } } #[derive(Accounts)] -pub struct Initialize { +pub struct InitializeAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -42,7 +42,7 @@ pub struct Initialize { } #[inline(always)] -fn handle_initialize(accounts: &mut Initialize) -> Result<(), ProgramError> { +fn handle_initialize(accounts: &mut InitializeAccountConstraints) -> Result<(), ProgramError> { // Mint + NonTransferable extension = 170 bytes let mint_size: u64 = 170; let lamports = Rent::get()?.try_minimum_balance(mint_size as usize)?; diff --git a/tokens/token-extensions/permanent-delegate/anchor/programs/permanent-delegate/src/instructions/initialize.rs b/tokens/token-extensions/permanent-delegate/anchor/programs/permanent-delegate/src/instructions/initialize.rs index 9f87ad3c..0879e5e5 100644 --- a/tokens/token-extensions/permanent-delegate/anchor/programs/permanent-delegate/src/instructions/initialize.rs +++ b/tokens/token-extensions/permanent-delegate/anchor/programs/permanent-delegate/src/instructions/initialize.rs @@ -12,7 +12,7 @@ use anchor_spl::{ }; #[derive(Accounts)] -pub struct Initialize<'info> { +pub struct InitializeAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -29,7 +29,7 @@ pub struct Initialize<'info> { } // helper to check mint data, and demonstrate how to read mint extension data within a program -fn check_mint_data(accounts: &mut Initialize) -> Result<()> { +fn check_mint_data(accounts: &mut InitializeAccountConstraints) -> Result<()> { let mint = &accounts.mint_account.to_account_info(); let mint_data = mint.data.borrow(); let mint_with_extension = StateWithExtensions::::unpack(&mint_data)?; @@ -44,7 +44,7 @@ fn check_mint_data(accounts: &mut Initialize) -> Result<()> { Ok(()) } -pub fn handler(mut context: Context) -> Result<()> { +pub fn handler(mut context: Context) -> Result<()> { check_mint_data(&mut context.accounts)?; Ok(()) } diff --git a/tokens/token-extensions/permanent-delegate/anchor/programs/permanent-delegate/src/lib.rs b/tokens/token-extensions/permanent-delegate/anchor/programs/permanent-delegate/src/lib.rs index 6124a33d..5c2005fa 100644 --- a/tokens/token-extensions/permanent-delegate/anchor/programs/permanent-delegate/src/lib.rs +++ b/tokens/token-extensions/permanent-delegate/anchor/programs/permanent-delegate/src/lib.rs @@ -9,7 +9,7 @@ declare_id!("A9rxKS84ZoJVyeTfQbCEfxME2vvAM4uwSMjkmhR5XWb1"); pub mod permanent_delegate { use super::*; - pub fn initialize(context: Context) -> Result<()> { + pub fn initialize(context: Context) -> Result<()> { instructions::initialize::handler(context) } } diff --git a/tokens/token-extensions/permanent-delegate/anchor/programs/permanent-delegate/tests/test_permanent_delegate.rs b/tokens/token-extensions/permanent-delegate/anchor/programs/permanent-delegate/tests/test_permanent_delegate.rs index 894f3f17..034ac53f 100644 --- a/tokens/token-extensions/permanent-delegate/anchor/programs/permanent-delegate/tests/test_permanent_delegate.rs +++ b/tokens/token-extensions/permanent-delegate/anchor/programs/permanent-delegate/tests/test_permanent_delegate.rs @@ -87,7 +87,7 @@ fn test_create_mint_with_permanent_delegate_and_burn() { let initialize_ix = Instruction::new_with_bytes( program_id, &permanent_delegate::instruction::Initialize {}.data(), - permanent_delegate::accounts::Initialize { + permanent_delegate::accounts::InitializeAccountConstraints { payer: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, diff --git a/tokens/token-extensions/permanent-delegate/quasar/src/lib.rs b/tokens/token-extensions/permanent-delegate/quasar/src/lib.rs index ef734e9e..b60702f2 100644 --- a/tokens/token-extensions/permanent-delegate/quasar/src/lib.rs +++ b/tokens/token-extensions/permanent-delegate/quasar/src/lib.rs @@ -26,13 +26,13 @@ mod quasar_permanent_delegate { use super::*; #[instruction(discriminator = 0)] - pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { + pub fn initialize(ctx: Ctx) -> Result<(), ProgramError> { handle_initialize(&mut ctx.accounts) } } #[derive(Accounts)] -pub struct Initialize { +pub struct InitializeAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -42,7 +42,7 @@ pub struct Initialize { } #[inline(always)] -fn handle_initialize(accounts: &mut Initialize) -> Result<(), ProgramError> { +fn handle_initialize(accounts: &mut InitializeAccountConstraints) -> Result<(), ProgramError> { // 165 (base) + 1 (account type) + 4 (TLV header) + 32 (PermanentDelegate data) = 202 bytes let mint_size: u64 = 202; let lamports = Rent::get()?.try_minimum_balance(mint_size as usize)?; diff --git a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/harvest.rs b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/harvest.rs index c6cf62e2..870e2947 100644 --- a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/harvest.rs +++ b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/harvest.rs @@ -4,7 +4,7 @@ use anchor_spl::token_interface::{ }; #[derive(Accounts)] -pub struct Harvest<'info> { +pub struct HarvestAccountConstraints<'info> { #[account(mut)] pub mint_account: InterfaceAccount<'info, Mint>, pub token_program: Program<'info, Token2022>, @@ -12,7 +12,7 @@ pub struct Harvest<'info> { // transfer fees are stored directly on the recipient token account and must be "harvested" // "harvesting" transfers fees accumulated on token accounts to the mint account -pub fn process_harvest<'info>(context: Context<'info, Harvest<'info>>) -> Result<()> { +pub fn process_harvest<'info>(context: Context<'info, HarvestAccountConstraints<'info>>) -> Result<()> { // Using remaining accounts to allow for passing in an unknown number of token accounts to harvest from // Check that remaining accounts are token accounts for the mint to harvest to let sources = context diff --git a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/initialize.rs b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/initialize.rs index 4dd0b522..1ce45637 100644 --- a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/initialize.rs +++ b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/initialize.rs @@ -20,7 +20,7 @@ use anchor_spl::{ }; #[derive(Accounts)] -pub struct Initialize<'info> { +pub struct InitializeAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, #[account(mut)] @@ -33,7 +33,7 @@ pub struct Initialize<'info> { // There is currently not an anchor constraint to automatically initialize the TransferFeeConfig extension // We can manually create and initialize the mint account via CPIs in the instruction handler pub fn handle_process_initialize( - context: Context, + context: Context, transfer_fee_basis_points: u16, maximum_fee: u64, ) -> Result<()> { @@ -92,7 +92,7 @@ pub fn handle_process_initialize( } // helper to demonstrate how to read mint extension data within a program -pub fn handle_check_mint_data(accounts: &Initialize) -> Result<()> { +pub fn handle_check_mint_data(accounts: &InitializeAccountConstraints) -> Result<()> { let mint = &accounts.mint_account.to_account_info(); let mint_data = mint.data.borrow(); let mint_with_extension = StateWithExtensions::::unpack(&mint_data)?; diff --git a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/transfer.rs b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/transfer.rs index 4bff1ce6..20846e2e 100644 --- a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/transfer.rs +++ b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/transfer.rs @@ -13,7 +13,7 @@ use anchor_spl::{ }; #[derive(Accounts)] -pub struct Transfer<'info> { +pub struct TransferAccountConstraints<'info> { #[account(mut)] pub sender: Signer<'info>, pub recipient: SystemAccount<'info>, @@ -43,7 +43,7 @@ pub struct Transfer<'info> { // transfer fees are automatically deducted from the transfer amount // recipients receives (transfer amount - fees) // transfer fees are stored directly on the recipient token account and must be "harvested" -pub fn handle_process_transfer(context: Context, amount: u64) -> Result<()> { +pub fn handle_process_transfer(context: Context, amount: u64) -> Result<()> { // read mint account extension data let mint = &context.accounts.mint_account.to_account_info(); let mint_data = mint.data.borrow(); diff --git a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/update_fee.rs b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/update_fee.rs index a0f8b81d..da0646bb 100644 --- a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/update_fee.rs +++ b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/update_fee.rs @@ -2,7 +2,7 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::{transfer_fee_set, Mint, Token2022, TransferFeeSetTransferFee}; #[derive(Accounts)] -pub struct UpdateFee<'info> { +pub struct UpdateFeeAccountConstraints<'info> { pub authority: Signer<'info>, #[account(mut)] @@ -14,7 +14,7 @@ pub struct UpdateFee<'info> { // This is a safely feature built into the extension // https://github.com/solana-program/token-2022/blob/2d18d97f083627d3f13ce43b16fa4305cbfac4de/program/src/extension/transfer_fee/processor.rs#L92-L109 pub fn handle_process_update_fee( - context: Context, + context: Context, transfer_fee_basis_points: u16, maximum_fee: u64, ) -> Result<()> { diff --git a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/withdraw.rs b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/withdraw.rs index f3cbd1b5..ba9fb665 100644 --- a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/withdraw.rs +++ b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/instructions/withdraw.rs @@ -5,7 +5,7 @@ use anchor_spl::token_interface::{ }; #[derive(Accounts)] -pub struct Withdraw<'info> { +pub struct WithdrawAccountConstraints<'info> { pub authority: Signer<'info>, #[account(mut)] @@ -17,7 +17,7 @@ pub struct Withdraw<'info> { // transfer fees "harvested" to the mint account can then be withdraw by the withdraw authority // this transfers fees on the mint account to the specified token account -pub fn handle_process_withdraw(context: Context) -> Result<()> { +pub fn handle_process_withdraw(context: Context) -> Result<()> { withdraw_withheld_tokens_from_mint(CpiContext::new( context.accounts.token_program.key(), WithdrawWithheldTokensFromMint { diff --git a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/lib.rs b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/lib.rs index cd27f2ce..81138535 100644 --- a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/lib.rs +++ b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/src/lib.rs @@ -10,27 +10,27 @@ pub mod transfer_fee { use super::*; pub fn initialize( - context: Context, + context: Context, transfer_fee_basis_points: u16, maximum_fee: u64, ) -> Result<()> { handle_process_initialize(context, transfer_fee_basis_points, maximum_fee) } - pub fn transfer(context: Context, amount: u64) -> Result<()> { + pub fn transfer(context: Context, amount: u64) -> Result<()> { handle_process_transfer(context, amount) } - pub fn harvest<'info>(context: Context<'info, Harvest<'info>>) -> Result<()> { + pub fn harvest<'info>(context: Context<'info, HarvestAccountConstraints<'info>>) -> Result<()> { process_harvest(context) } - pub fn withdraw(context: Context) -> Result<()> { + pub fn withdraw(context: Context) -> Result<()> { handle_process_withdraw(context) } pub fn update_fee( - context: Context, + context: Context, transfer_fee_basis_points: u16, maximum_fee: u64, ) -> Result<()> { diff --git a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/tests/test_transfer_fee.rs b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/tests/test_transfer_fee.rs index 5a734aa5..087f1ae6 100644 --- a/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/tests/test_transfer_fee.rs +++ b/tokens/token-extensions/transfer-fee/anchor/programs/transfer-fee/tests/test_transfer_fee.rs @@ -54,7 +54,7 @@ fn test_transfer_fee_full_flow() { maximum_fee: 1, } .data(), - transfer_fee::accounts::Initialize { + transfer_fee::accounts::InitializeAccountConstraints { payer: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, @@ -87,7 +87,7 @@ fn test_transfer_fee_full_flow() { let transfer_ix = Instruction::new_with_bytes( program_id, &transfer_fee::instruction::Transfer { amount: 100 }.data(), - transfer_fee::accounts::Transfer { + transfer_fee::accounts::TransferAccountConstraints { sender: payer.pubkey(), recipient: recipient.pubkey(), mint_account: mint_keypair.pubkey(), @@ -106,7 +106,7 @@ fn test_transfer_fee_full_flow() { let transfer_ix2 = Instruction::new_with_bytes( program_id, &transfer_fee::instruction::Transfer { amount: 200 }.data(), - transfer_fee::accounts::Transfer { + transfer_fee::accounts::TransferAccountConstraints { sender: payer.pubkey(), recipient: recipient.pubkey(), mint_account: mint_keypair.pubkey(), @@ -126,7 +126,7 @@ fn test_transfer_fee_full_flow() { program_id, &transfer_fee::instruction::Harvest {}.data(), { - let mut metas = transfer_fee::accounts::Harvest { + let mut metas = transfer_fee::accounts::HarvestAccountConstraints { mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, } @@ -142,7 +142,7 @@ fn test_transfer_fee_full_flow() { let withdraw_ix = Instruction::new_with_bytes( program_id, &transfer_fee::instruction::Withdraw {}.data(), - transfer_fee::accounts::Withdraw { + transfer_fee::accounts::WithdrawAccountConstraints { authority: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_account: sender_ata, @@ -161,7 +161,7 @@ fn test_transfer_fee_full_flow() { maximum_fee: 0, } .data(), - transfer_fee::accounts::UpdateFee { + transfer_fee::accounts::UpdateFeeAccountConstraints { authority: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, diff --git a/tokens/token-extensions/transfer-fee/quasar/src/lib.rs b/tokens/token-extensions/transfer-fee/quasar/src/lib.rs index 48cbbabc..f74923a4 100644 --- a/tokens/token-extensions/transfer-fee/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-fee/quasar/src/lib.rs @@ -28,7 +28,7 @@ mod quasar_transfer_fee { /// Create a mint with the TransferFeeConfig extension. #[instruction(discriminator = 0)] pub fn initialize( - ctx: Ctx, + ctx: Ctx, transfer_fee_basis_points: u16, maximum_fee: u64, ) -> Result<(), ProgramError> { @@ -37,14 +37,14 @@ mod quasar_transfer_fee { /// Transfer tokens with fee. #[instruction(discriminator = 1)] - pub fn transfer(ctx: Ctx, amount: u64, fee: u64) -> Result<(), ProgramError> { + pub fn transfer(ctx: Ctx, amount: u64, fee: u64) -> Result<(), ProgramError> { handle_transfer(&mut ctx.accounts, amount, fee) } /// Update the transfer fee (takes effect after 2 epochs). #[instruction(discriminator = 2)] pub fn update_fee( - ctx: Ctx, + ctx: Ctx, transfer_fee_basis_points: u16, maximum_fee: u64, ) -> Result<(), ProgramError> { @@ -53,13 +53,13 @@ mod quasar_transfer_fee { /// Withdraw withheld fees from the mint account. #[instruction(discriminator = 3)] - pub fn withdraw(ctx: Ctx) -> Result<(), ProgramError> { + pub fn withdraw(ctx: Ctx) -> Result<(), ProgramError> { handle_withdraw(&mut ctx.accounts) } } #[derive(Accounts)] -pub struct Initialize { +pub struct InitializeAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -69,7 +69,7 @@ pub struct Initialize { } #[inline(always)] -fn handle_initialize(accounts: &mut Initialize, basis_points: u16, max_fee: u64) -> Result<(), ProgramError> { +fn handle_initialize(accounts: &mut InitializeAccountConstraints, basis_points: u16, max_fee: u64) -> Result<(), ProgramError> { // 165 (base) + 1 (AccountType) + 4 (TLV header) + 108 (TransferFeeConfig data) = 278 bytes let mint_size: u64 = 278; let lamports = Rent::get()?.try_minimum_balance(mint_size as usize)?; @@ -127,7 +127,7 @@ fn handle_initialize(accounts: &mut Initialize, basis_points: u16, max_fee: u64) } #[derive(Accounts)] -pub struct Transfer { +pub struct TransferAccountConstraints { #[account(mut)] pub sender: Signer, #[account(mut)] @@ -139,7 +139,7 @@ pub struct Transfer { } #[inline(always)] -fn handle_transfer(accounts: &mut Transfer, amount: u64, fee: u64) -> Result<(), ProgramError> { +fn handle_transfer(accounts: &mut TransferAccountConstraints, amount: u64, fee: u64) -> Result<(), ProgramError> { // TransferCheckedWithFee: opcode 37 // Data: [37, amount (u64 LE), decimals (u8), fee (u64 LE)] let mut data = [0u8; 18]; @@ -168,7 +168,7 @@ fn handle_transfer(accounts: &mut Transfer, amount: u64, fee: u64) -> Result<(), } #[derive(Accounts)] -pub struct UpdateFee { +pub struct UpdateFeeAccountConstraints { pub authority: Signer, #[account(mut)] pub mint_account: UncheckedAccount, @@ -176,7 +176,7 @@ pub struct UpdateFee { } #[inline(always)] -fn handle_update_fee(accounts: &mut UpdateFee, basis_points: u16, max_fee: u64) -> Result<(), ProgramError> { +fn handle_update_fee(accounts: &mut UpdateFeeAccountConstraints, basis_points: u16, max_fee: u64) -> Result<(), ProgramError> { // SetTransferFee: opcode 26, sub-opcode 4 // Actually: extension instruction layout is different. // TransferFeeInstruction::SetTransferFee = 4 within type 26 @@ -202,7 +202,7 @@ fn handle_update_fee(accounts: &mut UpdateFee, basis_points: u16, max_fee: u64) } #[derive(Accounts)] -pub struct Withdraw { +pub struct WithdrawAccountConstraints { pub authority: Signer, #[account(mut)] pub mint_account: UncheckedAccount, @@ -212,7 +212,7 @@ pub struct Withdraw { } #[inline(always)] -fn handle_withdraw(accounts: &mut Withdraw) -> Result<(), ProgramError> { +fn handle_withdraw(accounts: &mut WithdrawAccountConstraints) -> Result<(), ProgramError> { // WithdrawWithheldTokensFromMint: opcode 26, sub-opcode 3 let data: [u8; 2] = [26, 3]; diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs index 508f16ab..34c854ce 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -10,7 +10,7 @@ use spl_transfer_hook_interface::instruction::ExecuteInstruction; use crate::{handle_extra_account_metas, handle_extra_account_metas_count, CounterAccount}; #[derive(Accounts)] -pub struct InitializeExtraAccountMetaList<'info> { +pub struct InitializeExtraAccountMetaListAccountConstraints<'info> { #[account(mut)] payer: Signer<'info>, @@ -34,7 +34,7 @@ pub struct InitializeExtraAccountMetaList<'info> { pub system_program: Program<'info, System>, } -pub fn handler(mut context: Context) -> Result<()> { +pub fn handler(mut context: Context) -> Result<()> { let extra_account_metas = handle_extra_account_metas()?; // initialize ExtraAccountMetaList account with extra accounts diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs index 4feabf57..62aafc31 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs @@ -8,7 +8,7 @@ use crate::{check_is_transferring, CounterAccount, TransferError}; // Remaining accounts are the extra accounts required from the ExtraAccountMetaList account // These accounts are provided via CPI to this program from the token2022 program #[derive(Accounts)] -pub struct TransferHook<'info> { +pub struct TransferHookAccountConstraints<'info> { #[account(token::mint = mint, token::authority = owner)] pub source_token: InterfaceAccount<'info, TokenAccount>, pub mint: InterfaceAccount<'info, Mint>, @@ -23,7 +23,7 @@ pub struct TransferHook<'info> { pub counter_account: Account<'info, CounterAccount>, } -pub fn handler(context: Context, amount: u64) -> Result<()> { +pub fn handler(context: Context, amount: u64) -> Result<()> { // Fail this instruction if it is not called from within a transfer hook check_is_transferring(&context)?; diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/lib.rs index 96ff0eed..c8352560 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/lib.rs @@ -33,18 +33,18 @@ pub mod transfer_hook { #[instruction(discriminator = InitializeExtraAccountMetaListInstruction::SPL_DISCRIMINATOR_SLICE)] pub fn initialize_extra_account_meta_list( - context: Context, + context: Context, ) -> Result<()> { instructions::initialize_extra_account_meta_list::handler(context) } #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] - pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { + pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { instructions::transfer_hook::handler(context, amount) } } -pub fn check_is_transferring(context: &Context) -> Result<()> { +pub fn check_is_transferring(context: &Context) -> Result<()> { let source_token_info = context.accounts.source_token.to_account_info(); let mut account_data_ref: RefMut<&mut [u8]> = source_token_info.try_borrow_mut_data()?; // .map_err() needed because spl-token-2022 uses solana-program-error 2.x diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/tests/test_transfer_hook.rs index 06e21ea9..4b083e01 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/tests/test_transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/tests/test_transfer_hook.rs @@ -95,7 +95,7 @@ fn test_transfer_hook_account_data_as_seed() { let init_extra_ix = Instruction::new_with_bytes( program_id, &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), - transfer_hook::accounts::InitializeExtraAccountMetaList { + transfer_hook::accounts::InitializeExtraAccountMetaListAccountConstraints { payer: payer.pubkey(), extra_account_meta_list, mint, @@ -136,7 +136,7 @@ fn test_transfer_hook_account_data_as_seed() { let direct_hook_ix = Instruction::new_with_bytes( program_id, &transfer_hook::instruction::TransferHook { amount: 1 }.data(), - transfer_hook::accounts::TransferHook { + transfer_hook::accounts::TransferHookAccountConstraints { source_token: source_ata, mint, destination_token: dest_ata, diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/src/lib.rs index eca18dcb..d9f22485 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/quasar/src/lib.rs @@ -28,7 +28,7 @@ mod quasar_transfer_hook_account_data_as_seed { /// Discriminator = sha256("spl-transfer-hook-interface:initialize-extra-account-metas")[:8] #[instruction(discriminator = [43, 34, 13, 49, 167, 88, 235, 235])] pub fn initialize_extra_account_meta_list( - ctx: Ctx, + ctx: Ctx, ) -> Result<(), ProgramError> { handle_initialize_extra_account_meta_list(&mut ctx.accounts) } @@ -36,7 +36,7 @@ mod quasar_transfer_hook_account_data_as_seed { /// Transfer hook handler - increments a per-owner counter on each transfer. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] - pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { + pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { handle_transfer_hook(&mut ctx.accounts) } } @@ -46,7 +46,7 @@ mod quasar_transfer_hook_account_data_as_seed { // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct InitializeExtraAccountMetaList { +pub struct InitializeExtraAccountMetaListAccountConstraints { #[account(mut)] pub payer: Signer, /// ExtraAccountMetaList PDA: ["extra-account-metas", mint] @@ -60,7 +60,7 @@ pub struct InitializeExtraAccountMetaList { } #[inline(always)] -pub fn handle_initialize_extra_account_meta_list(accounts: &mut InitializeExtraAccountMetaList) -> Result<(), ProgramError> { +pub fn handle_initialize_extra_account_meta_list(accounts: &mut InitializeExtraAccountMetaListAccountConstraints) -> Result<(), ProgramError> { // ExtraAccountMetaList with 1 extra account. // ExtraAccountMeta for a PDA with seeds [Literal("counter"), AccountData(0, 32, 32)]: // The AccountData seed resolves the owner pubkey from account_index=0 @@ -168,7 +168,7 @@ pub fn handle_initialize_extra_account_meta_list(accounts: &mut InitializeExtraA // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct TransferHook { +pub struct TransferHookAccountConstraints { pub source_token: UncheckedAccount, pub mint: UncheckedAccount, pub destination_token: UncheckedAccount, @@ -180,7 +180,7 @@ pub struct TransferHook { } #[inline(always)] -pub fn handle_transfer_hook(accounts: &mut TransferHook) -> Result<(), ProgramError> { +pub fn handle_transfer_hook(accounts: &mut TransferHookAccountConstraints) -> Result<(), ProgramError> { let view = unsafe { &mut *(&mut accounts.counter_account as *mut UncheckedAccount as *mut AccountView) diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/attach_to_mint.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/attach_to_mint.rs index 36c3598c..750c21c5 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/attach_to_mint.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/attach_to_mint.rs @@ -10,7 +10,7 @@ use spl_transfer_hook_interface::instruction::ExecuteInstruction; use crate::{get_extra_account_metas, get_meta_list_size, META_LIST_ACCOUNT_SEED}; #[derive(Accounts)] -pub struct AttachToMint<'info> { +pub struct AttachToMintAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -35,7 +35,7 @@ pub struct AttachToMint<'info> { pub token_program: Program<'info, Token2022>, } -impl AttachToMint<'_> { +impl AttachToMintAccountConstraints<'_> { pub fn attach_to_mint(&mut self) -> Result<()> { let tx_hook_accs = TransferHookUpdate { token_program_id: self.token_program.to_account_info(), diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/change_mode.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/change_mode.rs index f0071a45..81fde182 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/change_mode.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/change_mode.rs @@ -16,7 +16,7 @@ use anchor_spl::{ use crate::Mode; #[derive(Accounts)] -pub struct ChangeMode<'info> { +pub struct ChangeModeAccountConstraints<'info> { #[account(mut)] pub authority: Signer<'info>, @@ -37,7 +37,7 @@ pub struct ChangeModeArgs { pub threshold: u64, } -impl ChangeMode<'_> { +impl ChangeModeAccountConstraints<'_> { pub fn change_mode(&mut self, args: ChangeModeArgs) -> Result<()> { let cpi_accounts = TokenMetadataUpdateField { metadata: self.mint.to_account_info(), diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/init_config.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/init_config.rs index 00ce77b9..67142441 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/init_config.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/init_config.rs @@ -2,7 +2,7 @@ use crate::{Config, CONFIG_SEED}; use anchor_lang::prelude::*; #[derive(Accounts)] -pub struct InitConfig<'info> { +pub struct InitConfigAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -18,7 +18,7 @@ pub struct InitConfig<'info> { pub system_program: Program<'info, System>, } -impl InitConfig<'_> { +impl InitConfigAccountConstraints<'_> { pub fn init_config(&mut self, config_bump: u8) -> Result<()> { self.config.set_inner(Config { authority: self.payer.key(), diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/init_mint.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/init_mint.rs index 7c0e0c81..cfbfb90c 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/init_mint.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/init_mint.rs @@ -16,7 +16,7 @@ use crate::{get_extra_account_metas, get_meta_list_size, Mode, META_LIST_ACCOUNT #[derive(Accounts)] #[instruction(args: InitMintArgs)] -pub struct InitMint<'info> { +pub struct InitMintAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -50,7 +50,7 @@ pub struct InitMint<'info> { pub token_program: Program<'info, Token2022>, } -impl InitMint<'_> { +impl InitMintAccountConstraints<'_> { pub fn init_mint(&mut self, args: InitMintArgs) -> Result<()> { let cpi_accounts = TokenMetadataInitialize { program_id: self.token_program.to_account_info(), diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/init_wallet.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/init_wallet.rs index d5809a57..f1eb1b95 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/init_wallet.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/init_wallet.rs @@ -3,7 +3,7 @@ use anchor_lang::prelude::*; use crate::{ABWallet, Config, AB_WALLET_SEED, CONFIG_SEED}; #[derive(Accounts)] -pub struct InitWallet<'info> { +pub struct InitWalletAccountConstraints<'info> { #[account(mut)] pub authority: Signer<'info>, @@ -28,7 +28,7 @@ pub struct InitWallet<'info> { pub system_program: Program<'info, System>, } -impl InitWallet<'_> { +impl InitWalletAccountConstraints<'_> { pub fn init_wallet(&mut self, args: InitWalletArgs, bump: u8) -> Result<()> { let ab_wallet = &mut self.ab_wallet; ab_wallet.wallet = self.wallet.key(); diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/remove_wallet.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/remove_wallet.rs index a7c23a94..a505f085 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/remove_wallet.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/remove_wallet.rs @@ -3,7 +3,7 @@ use anchor_lang::prelude::*; use crate::{ABWallet, Config}; #[derive(Accounts)] -pub struct RemoveWallet<'info> { +pub struct RemoveWalletAccountConstraints<'info> { #[account(mut)] pub authority: Signer<'info>, @@ -23,7 +23,7 @@ pub struct RemoveWallet<'info> { pub system_program: Program<'info, System>, } -impl RemoveWallet<'_> { +impl RemoveWalletAccountConstraints<'_> { pub fn remove_wallet(&mut self) -> Result<()> { Ok(()) } diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/tx_hook.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/tx_hook.rs index 01e807c4..0c3f6291 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/tx_hook.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/instructions/tx_hook.rs @@ -12,7 +12,7 @@ use anchor_spl::{ use crate::{ABListError, ABWallet, Mode}; #[derive(Accounts)] -pub struct TxHook<'info> { +pub struct TxHookAccountConstraints<'info> { /// CHECK: pub source_token_account: UncheckedAccount<'info>, /// CHECK: @@ -27,7 +27,7 @@ pub struct TxHook<'info> { pub ab_wallet: UncheckedAccount<'info>, } -impl TxHook<'_> { +impl TxHookAccountConstraints<'_> { pub fn tx_hook(&self, amount: u64) -> Result<()> { let mint_info = self.mint.to_account_info(); let mint_data = mint_info.data.borrow(); diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/lib.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/lib.rs index 81987e14..517ef28d 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/lib.rs @@ -20,33 +20,33 @@ pub mod abl_token { use super::*; - pub fn init_mint(context: Context, args: InitMintArgs) -> Result<()> { + pub fn init_mint(context: Context, args: InitMintArgs) -> Result<()> { context.accounts.init_mint(args) } - pub fn init_config(context: Context) -> Result<()> { + pub fn init_config(context: Context) -> Result<()> { context.accounts.init_config(context.bumps.config) } - pub fn attach_to_mint(context: Context) -> Result<()> { + pub fn attach_to_mint(context: Context) -> Result<()> { context.accounts.attach_to_mint() } #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] - pub fn tx_hook(context: Context, amount: u64) -> Result<()> { + pub fn tx_hook(context: Context, amount: u64) -> Result<()> { context.accounts.tx_hook(amount) } - pub fn init_wallet(context: Context, args: InitWalletArgs) -> Result<()> { + pub fn init_wallet(context: Context, args: InitWalletArgs) -> Result<()> { let bump = context.bumps.ab_wallet; context.accounts.init_wallet(args, bump) } - pub fn remove_wallet(context: Context) -> Result<()> { + pub fn remove_wallet(context: Context) -> Result<()> { context.accounts.remove_wallet() } - pub fn change_mode(context: Context, args: ChangeModeArgs) -> Result<()> { + pub fn change_mode(context: Context, args: ChangeModeArgs) -> Result<()> { context.accounts.change_mode(args) } } diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/tests/test_abl_token.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/tests/test_abl_token.rs index 286d3060..ccc5712c 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/tests/test_abl_token.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/programs/abl-token/tests/test_abl_token.rs @@ -44,7 +44,7 @@ fn test_init_config_and_init_mint() { let init_config_ix = Instruction::new_with_bytes( program_id, &abl_token::instruction::InitConfig {}.data(), - abl_token::accounts::InitConfig { + abl_token::accounts::InitConfigAccountConstraints { payer: payer.pubkey(), config: config_pda, system_program: system_program::id(), @@ -73,7 +73,7 @@ fn test_init_config_and_init_mint() { args: init_mint_args, } .data(), - abl_token::accounts::InitMint { + abl_token::accounts::InitMintAccountConstraints { payer: payer.pubkey(), mint: mint_keypair.pubkey(), extra_metas_account: extra_account_meta_list, diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/tests-rs/test.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/tests-rs/test.rs index 17194a6f..0f9ecc47 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/tests-rs/test.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/tests-rs/test.rs @@ -5,7 +5,7 @@ // This will resolve when anchor-lang upgrades to solana 3.x (likely anchor 0.33+). use { - abl_token::{accounts::InitConfig, accounts::InitMint, instructions::InitMintArgs, Mode}, + abl_token::{accounts::InitConfigAccountConstraints, accounts::InitMintAccountConstraints, instructions::InitMintArgs, Mode}, anchor_lang::InstructionData, anchor_lang::ToAccountMetas, litesvm::LiteSVM, @@ -54,7 +54,7 @@ fn test() { let init_cfg_ix = abl_token::instruction::InitConfig {}; - let init_cfg_accounts = InitConfig { + let init_cfg_accounts = InitConfigAccountConstraints { payer: admin_pk, config: config, system_program: SYSTEM_PROGRAM_ID, @@ -88,7 +88,7 @@ fn test() { let data = init_mint_ix.data(); - let init_mint_accounts = InitMint { + let init_mint_accounts = InitMintAccountConstraints { payer: admin_pk, mint: mint_pk, extra_metas_account: meta_list, diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/attach_to_mint.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/attach_to_mint.rs index b65b139a..b23cd9a3 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/attach_to_mint.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/attach_to_mint.rs @@ -6,7 +6,7 @@ use crate::constants::*; use crate::instructions::init_mint::Token2022; #[derive(Accounts)] -pub struct AttachToMint { +pub struct AttachToMintAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -18,7 +18,7 @@ pub struct AttachToMint { } #[inline(always)] -pub fn handle_attach_to_mint(accounts: &mut AttachToMint) -> Result<(), ProgramError> { +pub fn handle_attach_to_mint(accounts: &mut AttachToMintAccountConstraints) -> Result<(), ProgramError> { let mint_key = accounts.mint.to_account_view().address(); let payer_key = accounts.payer.to_account_view().address(); let token_prog = accounts.token_program.to_account_view().address(); diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/change_mode.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/change_mode.rs index ea4bc719..09b5dae5 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/change_mode.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/change_mode.rs @@ -7,7 +7,7 @@ use crate::instructions::init_mint::Token2022; use crate::state::mode_to_metadata_value; #[derive(Accounts)] -pub struct ChangeMode { +pub struct ChangeModeAccountConstraints { #[account(mut)] pub authority: Signer, #[account(mut)] @@ -17,7 +17,7 @@ pub struct ChangeMode { } #[inline(always)] -pub fn handle_change_mode(accounts: &mut ChangeMode, mode: u8, threshold: u64) -> Result<(), ProgramError> { +pub fn handle_change_mode(accounts: &mut ChangeModeAccountConstraints, mode: u8, threshold: u64) -> Result<(), ProgramError> { let mode_value = mode_to_metadata_value(mode); let token_prog = accounts.token_program.to_account_view().address(); let mint_key = accounts.mint.to_account_view().address(); @@ -65,7 +65,7 @@ fn emit_update_field( token_prog: &Address, mint_key: &Address, auth_key: &Address, - ctx: &ChangeMode, + ctx: &ChangeModeAccountConstraints, key: &[u8], value: &[u8], ) -> Result<(), ProgramError> { @@ -97,7 +97,7 @@ fn emit_update_field( } /// Check if the mint's metadata already contains a "threshold" key. -fn has_threshold_in_metadata(ctx: &ChangeMode) -> Result { +fn has_threshold_in_metadata(ctx: &ChangeModeAccountConstraints) -> Result { let mint_view = ctx.mint.to_account_view(); let data = mint_view.try_borrow()?; diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_config.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_config.rs index 32b730a9..bf2e981b 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_config.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_config.rs @@ -6,7 +6,7 @@ use crate::constants::CONFIG_SEED; use crate::state::{write_config, CONFIG_SIZE}; #[derive(Accounts)] -pub struct InitConfig { +pub struct InitConfigAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -15,7 +15,7 @@ pub struct InitConfig { } #[inline(always)] -pub fn handle_init_config(accounts: &mut InitConfig) -> Result<(), ProgramError> { +pub fn handle_init_config(accounts: &mut InitConfigAccountConstraints) -> Result<(), ProgramError> { let (config_pda, bump) = Address::find_program_address(&[CONFIG_SEED], &crate::ID); if accounts.config.to_account_view().address() != &config_pda { diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_mint.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_mint.rs index 33ab4f65..d46e79f1 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_mint.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_mint.rs @@ -15,7 +15,7 @@ impl Id for Token2022 { } #[derive(Accounts)] -pub struct InitMint { +pub struct InitMintAccountConstraints { #[account(mut)] pub payer: Signer, /// The mint account (must also be a signer for create_account). @@ -30,7 +30,7 @@ pub struct InitMint { #[inline(always)] pub fn handle_init_mint( - accounts: &mut InitMint, decimals: u8, + accounts: &mut InitMintAccountConstraints, decimals: u8, freeze_authority: &Address, permanent_delegate: &Address, transfer_hook_authority: &Address, @@ -191,7 +191,7 @@ pub fn handle_init_mint( /// Emit a Token Extensions TokenMetadataUpdateField CPI. /// Opcode 44, sub-opcode 1, followed by Field::Key (discriminator 2, then borsh /// string for key, then borsh string for value). -fn emit_update_field_cpi(ctx: &InitMint, key: &[u8], value: &[u8]) -> Result<(), ProgramError> { +fn emit_update_field_cpi(ctx: &InitMintAccountConstraints, key: &[u8], value: &[u8]) -> Result<(), ProgramError> { let token_prog = ctx.token_program.to_account_view().address(); let mint_key = ctx.mint.to_account_view().address(); let payer_key = ctx.payer.to_account_view().address(); @@ -225,7 +225,7 @@ fn emit_update_field_cpi(ctx: &InitMint, key: &[u8], value: &[u8]) -> Result<(), /// Top up the mint account if its balance is below the rent minimum for its /// current data size. -fn top_up_rent(ctx: &InitMint) -> Result<(), ProgramError> { +fn top_up_rent(ctx: &InitMintAccountConstraints) -> Result<(), ProgramError> { let mint_view = ctx.mint.to_account_view(); let data_len = mint_view.data_len(); let min_balance = Rent::get()?.try_minimum_balance(data_len)?; @@ -242,7 +242,7 @@ fn top_up_rent(ctx: &InitMint) -> Result<(), ProgramError> { /// Create the ExtraAccountMetaList PDA and populate it with the ABWallet /// extra account meta (PDA seeded by [AB_WALLET_SEED, AccountData(2, 32, 32)]). -fn init_extra_metas(ctx: &mut InitMint) -> Result<(), ProgramError> { +fn init_extra_metas(ctx: &mut InitMintAccountConstraints) -> Result<(), ProgramError> { let mint_key = ctx.mint.to_account_view().address(); // Meta list with 1 extra account = 51 bytes diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_wallet.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_wallet.rs index 48b56d9e..830f2ea8 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_wallet.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/init_wallet.rs @@ -7,7 +7,7 @@ use crate::errors; use crate::state::{read_config_authority, write_ab_wallet, AB_WALLET_SIZE, CONFIG_SIZE}; #[derive(Accounts)] -pub struct InitWallet { +pub struct InitWalletAccountConstraints { #[account(mut)] pub authority: Signer, pub config: UncheckedAccount, @@ -18,7 +18,7 @@ pub struct InitWallet { } #[inline(always)] -pub fn handle_init_wallet(accounts: &mut InitWallet, allowed: bool) -> Result<(), ProgramError> { +pub fn handle_init_wallet(accounts: &mut InitWalletAccountConstraints, allowed: bool) -> Result<(), ProgramError> { // Verify config PDA let (config_pda, _) = Address::find_program_address(&[CONFIG_SEED], &crate::ID); if accounts.config.to_account_view().address() != &config_pda { diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/remove_wallet.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/remove_wallet.rs index a9d31f87..9a14fa79 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/remove_wallet.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/remove_wallet.rs @@ -5,7 +5,7 @@ use crate::errors; use crate::state::{read_config_authority, CONFIG_SIZE}; #[derive(Accounts)] -pub struct RemoveWallet { +pub struct RemoveWalletAccountConstraints { #[account(mut)] pub authority: Signer, pub config: UncheckedAccount, @@ -14,7 +14,7 @@ pub struct RemoveWallet { } #[inline(always)] -pub fn handle_remove_wallet(accounts: &mut RemoveWallet) -> Result<(), ProgramError> { +pub fn handle_remove_wallet(accounts: &mut RemoveWalletAccountConstraints) -> Result<(), ProgramError> { // Verify config PDA let (config_pda, _) = Address::find_program_address(&[CONFIG_SEED], &crate::ID); if accounts.config.to_account_view().address() != &config_pda { diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/tx_hook.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/tx_hook.rs index b3f89ee8..b2cc6c8a 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/tx_hook.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/instructions/tx_hook.rs @@ -13,7 +13,7 @@ use crate::state::{read_wallet_allowed, MODE_ALLOW, MODE_BLOCK, MODE_MIXED, AB_W /// [4] extra_account_meta_list /// [5] ab_wallet - resolved from extra account metas (PDA for destination owner) #[derive(Accounts)] -pub struct TxHook { +pub struct TxHookAccountConstraints { pub source_token_account: UncheckedAccount, pub mint: UncheckedAccount, pub destination_token_account: UncheckedAccount, @@ -23,7 +23,7 @@ pub struct TxHook { } #[inline(always)] -pub fn handle_tx_hook(accounts: &mut TxHook, amount: u64) -> Result<(), ProgramError> { +pub fn handle_tx_hook(accounts: &mut TxHookAccountConstraints, amount: u64) -> Result<(), ProgramError> { let mint_view = accounts.mint.to_account_view(); let mint_data = mint_view.try_borrow()?; @@ -51,7 +51,7 @@ pub fn handle_tx_hook(accounts: &mut TxHook, amount: u64) -> Result<(), ProgramE } } -fn decode_wallet_mode(accounts: &TxHook) -> Result { +fn decode_wallet_mode(accounts: &TxHookAccountConstraints) -> Result { let wallet_view = accounts.ab_wallet.to_account_view(); if wallet_view.data_len() == 0 { return Ok(DecodedWalletMode::None); diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/lib.rs index 2278d4e5..363da21d 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/quasar/src/lib.rs @@ -38,7 +38,7 @@ mod quasar_abl_token { /// uri: [u8; 128], uri_len: u8 #[instruction(discriminator = [1, 0, 0, 0, 0, 0, 0, 0])] pub fn init_mint( - ctx: Ctx, + ctx: Ctx, decimals: u8, freeze_authority: [u8; 32], permanent_delegate: [u8; 32], @@ -74,14 +74,14 @@ mod quasar_abl_token { /// Create the Config PDA with the payer as authority. #[instruction(discriminator = [0, 0, 0, 0, 0, 0, 0, 1])] - pub fn init_config(ctx: Ctx) -> Result<(), ProgramError> { + pub fn init_config(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_init_config(&mut ctx.accounts) } /// Attach the transfer hook to an existing mint (sets the hook program_id /// and creates the ExtraAccountMetaList PDA). #[instruction(discriminator = [0, 0, 0, 0, 0, 0, 0, 2])] - pub fn attach_to_mint(ctx: Ctx) -> Result<(), ProgramError> { + pub fn attach_to_mint(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_attach_to_mint(&mut ctx.accounts) } @@ -89,25 +89,25 @@ mod quasar_abl_token { /// transfers to enforce allow/block/threshold rules. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] - pub fn tx_hook(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { + pub fn tx_hook(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { instructions::handle_tx_hook(&mut ctx.accounts, amount) } /// Create a per-wallet allow/block entry. #[instruction(discriminator = [0, 0, 0, 0, 0, 0, 0, 4])] - pub fn init_wallet(ctx: Ctx, allowed: bool) -> Result<(), ProgramError> { + pub fn init_wallet(ctx: Ctx, allowed: bool) -> Result<(), ProgramError> { instructions::handle_init_wallet(&mut ctx.accounts, allowed) } /// Remove a wallet entry, closing the PDA account. #[instruction(discriminator = [0, 0, 0, 0, 0, 0, 0, 5])] - pub fn remove_wallet(ctx: Ctx) -> Result<(), ProgramError> { + pub fn remove_wallet(ctx: Ctx) -> Result<(), ProgramError> { instructions::handle_remove_wallet(&mut ctx.accounts) } /// Change the allow/block mode on the mint's metadata. #[instruction(discriminator = [0, 0, 0, 0, 0, 0, 0, 6])] - pub fn change_mode(ctx: Ctx, mode: u8, threshold: u64) -> Result<(), ProgramError> { + pub fn change_mode(ctx: Ctx, mode: u8, threshold: u64) -> Result<(), ProgramError> { instructions::handle_change_mode(&mut ctx.accounts, mode, threshold) } } diff --git a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs index 6d482bb6..7aef4af8 100644 --- a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs +++ b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -10,7 +10,7 @@ use spl_transfer_hook_interface::instruction::ExecuteInstruction; use crate::{handle_extra_account_metas, handle_extra_account_metas_count, CounterAccount}; #[derive(Accounts)] -pub struct InitializeExtraAccountMetaList<'info> { +pub struct InitializeExtraAccountMetaListAccountConstraints<'info> { #[account(mut)] payer: Signer<'info>, @@ -34,7 +34,7 @@ pub struct InitializeExtraAccountMetaList<'info> { pub system_program: Program<'info, System>, } -pub fn handler(mut context: Context) -> Result<()> { +pub fn handler(mut context: Context) -> Result<()> { let extra_account_metas = handle_extra_account_metas()?; // initialize ExtraAccountMetaList account with extra accounts diff --git a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs index 58c5ffa9..31ee75fc 100644 --- a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs @@ -8,7 +8,7 @@ use crate::{check_is_transferring, CounterAccount, TransferError}; // Remaining accounts are the extra accounts required from the ExtraAccountMetaList account // These accounts are provided via CPI to this program from the token2022 program #[derive(Accounts)] -pub struct TransferHook<'info> { +pub struct TransferHookAccountConstraints<'info> { #[account(token::mint = mint, token::authority = owner)] pub source_token: InterfaceAccount<'info, TokenAccount>, pub mint: InterfaceAccount<'info, Mint>, @@ -23,7 +23,7 @@ pub struct TransferHook<'info> { pub counter_account: Account<'info, CounterAccount>, } -pub fn handler(context: Context, amount: u64) -> Result<()> { +pub fn handler(context: Context, amount: u64) -> Result<()> { // Fail this instruction if it is not called from within a transfer hook check_is_transferring(&context)?; diff --git a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/lib.rs index bdef0b88..7fabbb4b 100644 --- a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/src/lib.rs @@ -33,18 +33,18 @@ pub mod transfer_hook { #[instruction(discriminator = InitializeExtraAccountMetaListInstruction::SPL_DISCRIMINATOR_SLICE)] pub fn initialize_extra_account_meta_list( - context: Context, + context: Context, ) -> Result<()> { instructions::initialize_extra_account_meta_list::handler(context) } #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] - pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { + pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { instructions::transfer_hook::handler(context, amount) } } -pub fn check_is_transferring(context: &Context) -> Result<()> { +pub fn check_is_transferring(context: &Context) -> Result<()> { let source_token_info = context.accounts.source_token.to_account_info(); let mut account_data_ref: RefMut<&mut [u8]> = source_token_info.try_borrow_mut_data()?; let mut account = PodStateWithExtensionsMut::::unpack(*account_data_ref)?; diff --git a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/tests/test_transfer_hook_counter.rs b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/tests/test_transfer_hook_counter.rs index 4769edac..ae927cd1 100644 --- a/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/tests/test_transfer_hook_counter.rs +++ b/tokens/token-extensions/transfer-hook/counter/anchor/programs/transfer-hook/tests/test_transfer_hook_counter.rs @@ -95,7 +95,7 @@ fn test_transfer_hook_counter() { let init_extra_ix = Instruction::new_with_bytes( program_id, &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), - transfer_hook::accounts::InitializeExtraAccountMetaList { + transfer_hook::accounts::InitializeExtraAccountMetaListAccountConstraints { payer: payer.pubkey(), extra_account_meta_list, mint, @@ -136,7 +136,7 @@ fn test_transfer_hook_counter() { let direct_hook_ix = Instruction::new_with_bytes( program_id, &transfer_hook::instruction::TransferHook { amount: 1 }.data(), - transfer_hook::accounts::TransferHook { + transfer_hook::accounts::TransferHookAccountConstraints { source_token: source_ata, mint, destination_token: dest_ata, diff --git a/tokens/token-extensions/transfer-hook/counter/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/counter/quasar/src/lib.rs index ef1652ad..1d4a5ddf 100644 --- a/tokens/token-extensions/transfer-hook/counter/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/counter/quasar/src/lib.rs @@ -27,7 +27,7 @@ mod quasar_transfer_hook_counter { /// Discriminator = sha256("spl-transfer-hook-interface:initialize-extra-account-metas")[:8] #[instruction(discriminator = [43, 34, 13, 49, 167, 88, 235, 235])] pub fn initialize_extra_account_meta_list( - ctx: Ctx, + ctx: Ctx, ) -> Result<(), ProgramError> { handle_initialize_extra_account_meta_list(&mut ctx.accounts) } @@ -35,7 +35,7 @@ mod quasar_transfer_hook_counter { /// Transfer hook handler - increments the counter on each transfer. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] - pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { + pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { handle_transfer_hook(&mut ctx.accounts) } } @@ -45,7 +45,7 @@ mod quasar_transfer_hook_counter { // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct InitializeExtraAccountMetaList { +pub struct InitializeExtraAccountMetaListAccountConstraints { #[account(mut)] pub payer: Signer, /// ExtraAccountMetaList PDA: ["extra-account-metas", mint] @@ -60,7 +60,7 @@ pub struct InitializeExtraAccountMetaList { #[inline(always)] fn handle_initialize_extra_account_meta_list( - accounts: &mut InitializeExtraAccountMetaList, + accounts: &mut InitializeExtraAccountMetaListAccountConstraints, ) -> Result<(), ProgramError> { // ExtraAccountMetaList with 1 extra account: // [8 bytes: Execute discriminator] @@ -164,7 +164,7 @@ fn handle_initialize_extra_account_meta_list( // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct TransferHook { +pub struct TransferHookAccountConstraints { /// Source token account pub source_token: UncheckedAccount, /// Mint @@ -181,7 +181,7 @@ pub struct TransferHook { } #[inline(always)] -fn handle_transfer_hook(accounts: &mut TransferHook) -> Result<(), ProgramError> { +fn handle_transfer_hook(accounts: &mut TransferHookAccountConstraints) -> Result<(), ProgramError> { // Read the current counter from the account data let view = unsafe { &mut *(&mut accounts.counter_account as *mut UncheckedAccount diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize.rs index c29921f5..7cc60c7b 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize.rs +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize.rs @@ -13,7 +13,7 @@ use anchor_spl::token_interface::{ #[derive(Accounts)] #[instruction(_decimals: u8)] -pub struct Initialize<'info> { +pub struct InitializeAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -31,13 +31,13 @@ pub struct Initialize<'info> { } // create a mint account that specifies this program as the transfer hook program -pub fn handler(mut context: Context, _decimals: u8) -> Result<()> { +pub fn handler(mut context: Context, _decimals: u8) -> Result<()> { handle_check_mint_data(&mut context.accounts)?; Ok(()) } // helper to check mint data, and demonstrate how to read mint extension data within a program -fn handle_check_mint_data(accounts: &mut Initialize) -> Result<()> { +fn handle_check_mint_data(accounts: &mut InitializeAccountConstraints) -> Result<()> { let mint = &accounts.mint_account.to_account_info(); let mint_data = mint.data.borrow(); // .map_err() needed because spl-token-2022 uses solana-program-error 2.x diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs index ecb51bdf..5a858e59 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -9,7 +9,7 @@ use spl_transfer_hook_interface::instruction::ExecuteInstruction; use crate::{handle_extra_account_metas, handle_extra_account_metas_count}; #[derive(Accounts)] -pub struct InitializeExtraAccountMetaList<'info> { +pub struct InitializeExtraAccountMetaListAccountConstraints<'info> { #[account(mut)] payer: Signer<'info>, @@ -31,7 +31,7 @@ pub struct InitializeExtraAccountMetaList<'info> { pub system_program: Program<'info, System>, } -pub fn handler(mut context: Context) -> Result<()> { +pub fn handler(mut context: Context) -> Result<()> { let extra_account_metas = handle_extra_account_metas()?; // initialize ExtraAccountMetaList account with extra accounts diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs index a3b8a32c..e7b3a5be 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs @@ -8,7 +8,7 @@ use crate::check_is_transferring; // Remaining accounts are the extra accounts required from the ExtraAccountMetaList account // These accounts are provided via CPI to this program from the token2022 program #[derive(Accounts)] -pub struct TransferHook<'info> { +pub struct TransferHookAccountConstraints<'info> { #[account(token::mint = mint, token::authority = owner)] pub source_token: InterfaceAccount<'info, TokenAccount>, pub mint: InterfaceAccount<'info, Mint>, @@ -21,7 +21,7 @@ pub struct TransferHook<'info> { pub extra_account_meta_list: UncheckedAccount<'info>, } -pub fn handler(context: Context, _amount: u64) -> Result<()> { +pub fn handler(context: Context, _amount: u64) -> Result<()> { // Fail this instruction if it is not called from within a transfer hook check_is_transferring(&context)?; diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/lib.rs index 52ef665b..9ef5d2be 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/src/lib.rs @@ -29,24 +29,24 @@ pub enum TransferError { pub mod transfer_hook { use super::*; - pub fn initialize(context: Context, decimals: u8) -> Result<()> { + pub fn initialize(context: Context, decimals: u8) -> Result<()> { instructions::initialize::handler(context, decimals) } #[instruction(discriminator = InitializeExtraAccountMetaListInstruction::SPL_DISCRIMINATOR_SLICE)] pub fn initialize_extra_account_meta_list( - context: Context, + context: Context, ) -> Result<()> { instructions::initialize_extra_account_meta_list::handler(context) } #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] - pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { + pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { instructions::transfer_hook::handler(context, amount) } } -pub fn check_is_transferring(context: &Context) -> Result<()> { +pub fn check_is_transferring(context: &Context) -> Result<()> { let source_token_info = context.accounts.source_token.to_account_info(); let mut account_data_ref: RefMut<&mut [u8]> = source_token_info.try_borrow_mut_data()?; // .map_err() needed because spl-token-2022 uses solana-program-error 2.x diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/tests/test_transfer_hook.rs index f6ff45ed..7471118f 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/tests/test_transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor/programs/transfer-hook/tests/test_transfer_hook.rs @@ -59,7 +59,7 @@ fn test_transfer_hook_hello_world() { decimals, } .data(), - transfer_hook::accounts::Initialize { + transfer_hook::accounts::InitializeAccountConstraints { payer: payer.pubkey(), mint_account: mint_keypair.pubkey(), token_program: TOKEN_EXTENSIONS_PROGRAM_ID, @@ -101,7 +101,7 @@ fn test_transfer_hook_hello_world() { let init_extra_ix = Instruction::new_with_bytes( program_id, &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), - transfer_hook::accounts::InitializeExtraAccountMetaList { + transfer_hook::accounts::InitializeExtraAccountMetaListAccountConstraints { payer: payer.pubkey(), extra_account_meta_list, mint: mint_keypair.pubkey(), @@ -137,7 +137,7 @@ fn test_transfer_hook_hello_world() { let direct_hook_ix = Instruction::new_with_bytes( program_id, &transfer_hook::instruction::TransferHook { amount: 1 }.data(), - transfer_hook::accounts::TransferHook { + transfer_hook::accounts::TransferHookAccountConstraints { source_token: source_ata, mint: mint_keypair.pubkey(), destination_token: dest_ata, diff --git a/tokens/token-extensions/transfer-hook/hello-world/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/hello-world/quasar/src/lib.rs index 5396e272..a1a77663 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/hello-world/quasar/src/lib.rs @@ -36,7 +36,7 @@ mod quasar_transfer_hook_hello_world { /// Create a mint with the TransferHook extension pointing to this program. /// Custom discriminator (not part of the transfer hook interface). #[instruction(discriminator = [0, 0, 0, 0, 0, 0, 0, 1])] - pub fn initialize(ctx: Ctx, decimals: u8) -> Result<(), ProgramError> { + pub fn initialize(ctx: Ctx, decimals: u8) -> Result<(), ProgramError> { handle_initialize(&mut ctx.accounts, decimals) } @@ -44,7 +44,7 @@ mod quasar_transfer_hook_hello_world { /// Discriminator = sha256("spl-transfer-hook-interface:initialize-extra-account-metas")[:8] #[instruction(discriminator = [43, 34, 13, 49, 167, 88, 235, 235])] pub fn initialize_extra_account_meta_list( - ctx: Ctx, + ctx: Ctx, ) -> Result<(), ProgramError> { handle_initialize_extra_account_meta_list(&mut ctx.accounts) } @@ -52,7 +52,7 @@ mod quasar_transfer_hook_hello_world { /// Transfer hook handler - called automatically by Token Extensions during transfers. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] - pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { + pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { handle_transfer_hook(&mut ctx.accounts) } } @@ -62,7 +62,7 @@ mod quasar_transfer_hook_hello_world { // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct Initialize { +pub struct InitializeAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -72,7 +72,7 @@ pub struct Initialize { } #[inline(always)] -fn handle_initialize(accounts: &mut Initialize, decimals: u8) -> Result<(), ProgramError> { +fn handle_initialize(accounts: &mut InitializeAccountConstraints, decimals: u8) -> Result<(), ProgramError> { // Mint with TransferHook extension: // 165 (base account + padding) + 1 (account type) + 4 (TLV header) + 64 (extension) = 234 let mint_size: u64 = 234; @@ -132,7 +132,7 @@ fn handle_initialize(accounts: &mut Initialize, decimals: u8) -> Result<(), Prog // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct InitializeExtraAccountMetaList { +pub struct InitializeExtraAccountMetaListAccountConstraints { #[account(mut)] pub payer: Signer, /// ExtraAccountMetaList PDA seeded by ["extra-account-metas", mint] @@ -144,7 +144,7 @@ pub struct InitializeExtraAccountMetaList { #[inline(always)] fn handle_initialize_extra_account_meta_list( - accounts: &mut InitializeExtraAccountMetaList, + accounts: &mut InitializeExtraAccountMetaListAccountConstraints, ) -> Result<(), ProgramError> { use quasar_lang::cpi::Seed; @@ -212,7 +212,7 @@ fn handle_initialize_extra_account_meta_list( // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct TransferHook { +pub struct TransferHookAccountConstraints { /// Source token account pub source_token: UncheckedAccount, /// Mint @@ -226,7 +226,7 @@ pub struct TransferHook { } #[inline(always)] -fn handle_transfer_hook(_accounts: &mut TransferHook) -> Result<(), ProgramError> { +fn handle_transfer_hook(_accounts: &mut TransferHookAccountConstraints) -> Result<(), ProgramError> { // In production, verify the source token's TransferHookAccount.transferring // flag is set. The Token Extensions program sets this before invoking the hook // and clears it after, preventing standalone invocation. diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs index 6edf615e..d19d662f 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -6,7 +6,7 @@ use spl_transfer_hook_interface::instruction::ExecuteInstruction; use crate::{handle_extra_account_metas, handle_extra_account_metas_count, CounterAccount}; #[derive(Accounts)] -pub struct InitializeExtraAccountMetaList<'info> { +pub struct InitializeExtraAccountMetaListAccountConstraints<'info> { #[account(mut)] payer: Signer<'info>, @@ -28,7 +28,7 @@ pub struct InitializeExtraAccountMetaList<'info> { pub system_program: Program<'info, System>, } -pub fn handler(mut context: Context) -> Result<()> { +pub fn handler(mut context: Context) -> Result<()> { let extra_account_metas = handle_extra_account_metas()?; // initialize ExtraAccountMetaList account with extra accounts diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs index 744634f6..c7f5b9ec 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs @@ -17,7 +17,7 @@ use crate::{check_is_transferring, CounterAccount, TransferError}; // the 4096-byte BPF stack frame limit in try_accounts deserialization. // This struct has 12 accounts - without Box, the generated code uses ~4160 bytes of stack. #[derive(Accounts)] -pub struct TransferHook<'info> { +pub struct TransferHookAccountConstraints<'info> { #[account(token::mint = mint, token::authority = owner)] pub source_token: Box>, pub mint: Box>, @@ -53,7 +53,7 @@ pub struct TransferHook<'info> { pub counter_account: Account<'info, CounterAccount>, } -pub fn handler(context: Context, amount: u64) -> Result<()> { +pub fn handler(context: Context, amount: u64) -> Result<()> { // Fail this instruction if it is not called from within a transfer hook check_is_transferring(&context)?; diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/lib.rs index 1c4730ab..7c17b8ec 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/lib.rs @@ -42,18 +42,18 @@ pub mod transfer_hook { #[instruction(discriminator = InitializeExtraAccountMetaListInstruction::SPL_DISCRIMINATOR_SLICE)] pub fn initialize_extra_account_meta_list( - context: Context, + context: Context, ) -> Result<()> { instructions::initialize_extra_account_meta_list::handler(context) } #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] - pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { + pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { instructions::transfer_hook::handler(context, amount) } } -pub fn check_is_transferring(context: &Context) -> Result<()> { +pub fn check_is_transferring(context: &Context) -> Result<()> { let source_token_info = context.accounts.source_token.to_account_info(); let mut account_data_ref: RefMut<&mut [u8]> = source_token_info.try_borrow_mut_data()?; let mut account = PodStateWithExtensionsMut::::unpack(*account_data_ref) diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/tests/test_transfer_hook.rs index b8993a82..3912dd92 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/tests/test_transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/programs/transfer-hook/tests/test_transfer_hook.rs @@ -57,7 +57,7 @@ fn test_initialize_extra_account_meta_list() { let init_extra_ix = Instruction::new_with_bytes( program_id, &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), - transfer_hook::accounts::InitializeExtraAccountMetaList { + transfer_hook::accounts::InitializeExtraAccountMetaListAccountConstraints { payer: payer.pubkey(), extra_account_meta_list, mint, diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/transfer-cost/quasar/src/lib.rs index e448b342..587714e2 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/transfer-cost/quasar/src/lib.rs @@ -31,7 +31,7 @@ mod quasar_transfer_hook_cost { /// Discriminator = sha256("spl-transfer-hook-interface:initialize-extra-account-metas")[:8] #[instruction(discriminator = [43, 34, 13, 49, 167, 88, 235, 235])] pub fn initialize_extra_account_meta_list( - ctx: Ctx, + ctx: Ctx, ) -> Result<(), ProgramError> { handle_initialize_extra_account_meta_list(&mut ctx.accounts) } @@ -40,7 +40,7 @@ mod quasar_transfer_hook_cost { /// In the full version, this would also charge a WSOL fee via delegate. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] - pub fn transfer_hook(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { + pub fn transfer_hook(ctx: Ctx, amount: u64) -> Result<(), ProgramError> { handle_transfer_hook(&mut ctx.accounts, amount) } } @@ -50,7 +50,7 @@ mod quasar_transfer_hook_cost { // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct InitializeExtraAccountMetaList { +pub struct InitializeExtraAccountMetaListAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -63,7 +63,7 @@ pub struct InitializeExtraAccountMetaList { #[inline(always)] fn handle_initialize_extra_account_meta_list( - accounts: &mut InitializeExtraAccountMetaList, + accounts: &mut InitializeExtraAccountMetaListAccountConstraints, ) -> Result<(), ProgramError> { // Create ExtraAccountMetaList PDA with 1 extra account: counter let meta_list_size: u64 = 51; @@ -138,7 +138,7 @@ fn handle_initialize_extra_account_meta_list( // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct TransferHook { +pub struct TransferHookAccountConstraints { pub source_token: UncheckedAccount, pub mint: UncheckedAccount, pub destination_token: UncheckedAccount, @@ -149,7 +149,7 @@ pub struct TransferHook { } #[inline(always)] -fn handle_transfer_hook(accounts: &mut TransferHook, amount: u64) -> Result<(), ProgramError> { +fn handle_transfer_hook(accounts: &mut TransferHookAccountConstraints, amount: u64) -> Result<(), ProgramError> { // Validate amount if amount > 50 { log("Warning: large transfer amount"); diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/configure_admin.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/configure_admin.rs index 08b6ba2d..b9fc5800 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/configure_admin.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/configure_admin.rs @@ -1,7 +1,7 @@ use {crate::state::AdminConfig, anchor_lang::prelude::*}; #[derive(Accounts)] -pub struct ConfigureAdmin<'info> { +pub struct ConfigureAdminAccountConstraints<'info> { #[account(mut)] pub admin: Signer<'info>, @@ -22,7 +22,7 @@ pub struct ConfigureAdmin<'info> { pub system_program: Program<'info, System>, } -pub fn handle_is_admin(accounts: &mut ConfigureAdmin) -> Result<()> { +pub fn handle_is_admin(accounts: &mut ConfigureAdminAccountConstraints) -> Result<()> { // check if we are not creating the account for the first time, // ensure it's the admin that is making the change // @@ -38,7 +38,7 @@ pub fn handle_is_admin(accounts: &mut ConfigureAdmin) -> Result<()> { Ok(()) } -pub fn handle_configure_admin(accounts: &mut ConfigureAdmin, bump: u8) -> Result<()> { +pub fn handle_configure_admin(accounts: &mut ConfigureAdminAccountConstraints, bump: u8) -> Result<()> { accounts.admin_config.set_inner(AdminConfig { admin: accounts.new_admin.key(), // set the admin pubkey that can switch transfers on/off is_initialised: true, // let us know an admin has been set diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/initialise_extra_account_metas_list.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/initialise_extra_account_metas_list.rs index f880d302..e97028e6 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/initialise_extra_account_metas_list.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/initialise_extra_account_metas_list.rs @@ -11,7 +11,7 @@ use { }; #[derive(Accounts)] -pub struct InitializeExtraAccountMetas<'info> { +pub struct InitializeExtraAccountMetasAccountConstraints<'info> { #[account(mut)] pub payer: Signer<'info>, @@ -29,7 +29,7 @@ pub struct InitializeExtraAccountMetas<'info> { pub system_program: Program<'info, System>, } -pub fn handle_initialize_extra_account_metas_list(accounts: &mut InitializeExtraAccountMetas, bumps: InitializeExtraAccountMetasBumps) -> Result<()> { +pub fn handle_initialize_extra_account_metas_list(accounts: &mut InitializeExtraAccountMetasAccountConstraints, bumps: InitializeExtraAccountMetasAccountConstraintsBumps) -> Result<()> { // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types let account_metas = vec![ diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/switch.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/switch.rs index 77f59256..f33d67d3 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/switch.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/switch.rs @@ -4,7 +4,7 @@ use { }; #[derive(Accounts)] -pub struct Switch<'info> { +pub struct SwitchAccountConstraints<'info> { /// admin that controls the switch #[account(mut)] pub admin: Signer<'info>, @@ -34,7 +34,7 @@ pub struct Switch<'info> { pub system_program: Program<'info, System>, } -pub fn handle_switch(accounts: &mut Switch, on: bool, bump: u8) -> Result<()> { +pub fn handle_switch(accounts: &mut SwitchAccountConstraints, on: bool, bump: u8) -> Result<()> { // toggle switch on/off for the given wallet // accounts.wallet_switch.set_inner(TransferSwitch { diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/transfer_hook.rs index 050056fd..c3567159 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/instructions/transfer_hook.rs @@ -14,7 +14,7 @@ use { }; #[derive(Accounts)] -pub struct TransferHook<'info> { +pub struct TransferHookAccountConstraints<'info> { /// CHECK: Sender token account #[account()] pub source_token_account: UncheckedAccount<'info>, @@ -46,14 +46,14 @@ pub struct TransferHook<'info> { pub wallet_switch: Account<'info, TransferSwitch>, } -pub fn handle_assert_switch_is_on(accounts: &mut TransferHook) -> Result<()> { +pub fn handle_assert_switch_is_on(accounts: &mut TransferHookAccountConstraints) -> Result<()> { if !accounts.wallet_switch.on { return err!(TransferError::SwitchNotOn); } Ok(()) } -pub fn handle_assert_is_transferring(accounts: &mut TransferHook) -> Result<()> { +pub fn handle_assert_is_transferring(accounts: &mut TransferHookAccountConstraints) -> Result<()> { let source_token_info = accounts.source_token_account.to_account_info(); let mut account_data_ref = source_token_info.try_borrow_mut_data()?; // .map_err() needed because spl-token-2022 uses solana-program-error 2.x diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/lib.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/lib.rs index 93a476c7..c392c703 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/lib.rs @@ -15,7 +15,7 @@ declare_id!("FjcHckEgXcBhFmSGai3FRpDLiT6hbpV893n8iTxVd81g"); pub mod transfer_switch { use super::*; - pub fn configure_admin(mut context: Context) -> Result<()> { + pub fn configure_admin(mut context: Context) -> Result<()> { let bump = context.bumps.admin_config; handle_is_admin(&mut context.accounts)?; handle_configure_admin(&mut context.accounts, bump) @@ -23,18 +23,18 @@ pub mod transfer_switch { #[instruction(discriminator = InitializeExtraAccountMetaListInstruction::SPL_DISCRIMINATOR_SLICE)] pub fn initialize_extra_account_metas_list( - mut context: Context, + mut context: Context, ) -> Result<()> { handle_initialize_extra_account_metas_list(&mut context.accounts, context.bumps) } - pub fn switch(mut context: Context, on: bool) -> Result<()> { + pub fn switch(mut context: Context, on: bool) -> Result<()> { let bump = context.bumps.wallet_switch; handle_switch(&mut context.accounts, on, bump) } #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] - pub fn transfer_hook(mut context: Context, _amount: u64) -> Result<()> { + pub fn transfer_hook(mut context: Context, _amount: u64) -> Result<()> { handle_assert_is_transferring(&mut context.accounts)?; handle_assert_switch_is_on(&mut context.accounts) } diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/tests/test_transfer_switch.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/tests/test_transfer_switch.rs index 1dea69a1..5696596e 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/tests/test_transfer_switch.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/programs/transfer-switch/tests/test_transfer_switch.rs @@ -91,7 +91,7 @@ fn test_transfer_switch() { let configure_admin_ix = Instruction::new_with_bytes( program_id, &transfer_switch::instruction::ConfigureAdmin {}.data(), - transfer_switch::accounts::ConfigureAdmin { + transfer_switch::accounts::ConfigureAdminAccountConstraints { admin: payer.pubkey(), new_admin: payer.pubkey(), admin_config, @@ -106,7 +106,7 @@ fn test_transfer_switch() { let init_extra_ix = Instruction::new_with_bytes( program_id, &transfer_switch::instruction::InitializeExtraAccountMetasList {}.data(), - transfer_switch::accounts::InitializeExtraAccountMetas { + transfer_switch::accounts::InitializeExtraAccountMetasAccountConstraints { payer: payer.pubkey(), token_mint: mint, extra_account_metas_list: extra_account_meta_list, @@ -121,7 +121,7 @@ fn test_transfer_switch() { let switch_off_ix = Instruction::new_with_bytes( program_id, &transfer_switch::instruction::Switch { on: false }.data(), - transfer_switch::accounts::Switch { + transfer_switch::accounts::SwitchAccountConstraints { admin: payer.pubkey(), wallet: sender.pubkey(), admin_config, @@ -164,7 +164,7 @@ fn test_transfer_switch() { let switch_on_ix = Instruction::new_with_bytes( program_id, &transfer_switch::instruction::Switch { on: true }.data(), - transfer_switch::accounts::Switch { + transfer_switch::accounts::SwitchAccountConstraints { admin: payer.pubkey(), wallet: sender.pubkey(), admin_config, diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/lib.rs index 323ac417..b32a683d 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/transfer-switch/quasar/src/lib.rs @@ -24,7 +24,7 @@ mod quasar_transfer_hook_switch { /// Set up or change the admin. The first caller becomes admin. #[instruction(discriminator = [0, 0, 0, 0, 0, 0, 0, 1])] - pub fn configure_admin(ctx: Ctx) -> Result<(), ProgramError> { + pub fn configure_admin(ctx: Ctx) -> Result<(), ProgramError> { handle_configure_admin(&mut ctx.accounts) } @@ -32,21 +32,21 @@ mod quasar_transfer_hook_switch { /// Discriminator = sha256("spl-transfer-hook-interface:initialize-extra-account-metas")[:8] #[instruction(discriminator = [43, 34, 13, 49, 167, 88, 235, 235])] pub fn initialize_extra_account_metas_list( - ctx: Ctx, + ctx: Ctx, ) -> Result<(), ProgramError> { handle_initialize_extra_account_metas_list(&mut ctx.accounts) } /// Toggle the transfer switch for a wallet. #[instruction(discriminator = [0, 0, 0, 0, 0, 0, 0, 3])] - pub fn switch(ctx: Ctx, on: u8) -> Result<(), ProgramError> { + pub fn switch(ctx: Ctx, on: u8) -> Result<(), ProgramError> { handle_switch(&mut ctx.accounts, on != 0) } /// Transfer hook handler - checks the sender's switch is on. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] - pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { + pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { handle_transfer_hook(&mut ctx.accounts) } } @@ -61,7 +61,7 @@ mod quasar_transfer_hook_switch { // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct ConfigureAdmin { +pub struct ConfigureAdminAccountConstraints { #[account(mut)] pub admin: Signer, pub new_admin: UncheckedAccount, @@ -71,7 +71,7 @@ pub struct ConfigureAdmin { } #[inline(always)] -fn handle_configure_admin(accounts: &mut ConfigureAdmin) -> Result<(), ProgramError> { +fn handle_configure_admin(accounts: &mut ConfigureAdminAccountConstraints) -> Result<(), ProgramError> { let view = accounts.admin_config.to_account_view(); let data = view.try_borrow()?; @@ -125,7 +125,7 @@ fn handle_configure_admin(accounts: &mut ConfigureAdmin) -> Result<(), ProgramEr // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct InitializeExtraAccountMetas { +pub struct InitializeExtraAccountMetasAccountConstraints { #[account(mut)] pub payer: Signer, pub token_mint: UncheckedAccount, @@ -136,7 +136,7 @@ pub struct InitializeExtraAccountMetas { #[inline(always)] fn handle_initialize_extra_account_metas_list( - accounts: &mut InitializeExtraAccountMetas, + accounts: &mut InitializeExtraAccountMetasAccountConstraints, ) -> Result<(), ProgramError> { // 1 extra account: wallet switch PDA seeded by [AccountKey(index=3)] (sender/owner) let meta_list_size: u64 = 51; // 8 + 4 + 4 + 35 @@ -189,7 +189,7 @@ fn handle_initialize_extra_account_metas_list( // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct Switch { +pub struct SwitchAccountConstraints { #[account(mut)] pub admin: Signer, pub wallet: UncheckedAccount, @@ -200,7 +200,7 @@ pub struct Switch { } #[inline(always)] -fn handle_switch(accounts: &mut Switch, on: bool) -> Result<(), ProgramError> { +fn handle_switch(accounts: &mut SwitchAccountConstraints, on: bool) -> Result<(), ProgramError> { // Verify admin let config_view = accounts.admin_config.to_account_view(); let config_data = config_view.try_borrow()?; @@ -253,7 +253,7 @@ fn handle_switch(accounts: &mut Switch, on: bool) -> Result<(), ProgramError> { // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct TransferHook { +pub struct TransferHookAccountConstraints { pub source_token_account: UncheckedAccount, pub token_mint: UncheckedAccount, pub receiver_token_account: UncheckedAccount, @@ -264,7 +264,7 @@ pub struct TransferHook { } #[inline(always)] -fn handle_transfer_hook(accounts: &mut TransferHook) -> Result<(), ProgramError> { +fn handle_transfer_hook(accounts: &mut TransferHookAccountConstraints) -> Result<(), ProgramError> { let switch_view = accounts.wallet_switch.to_account_view(); let data = switch_view.try_borrow()?; diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/add_to_whitelist.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/add_to_whitelist.rs index e5e20fac..86e100ef 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/add_to_whitelist.rs +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/add_to_whitelist.rs @@ -3,7 +3,7 @@ use anchor_lang::prelude::*; use crate::WhiteList; #[derive(Accounts)] -pub struct AddToWhiteList<'info> { +pub struct AddToWhiteListAccountConstraints<'info> { /// CHECK: New account to add to white list #[account()] pub new_account: UncheckedAccount<'info>, @@ -17,7 +17,7 @@ pub struct AddToWhiteList<'info> { pub signer: Signer<'info>, } -pub fn handler(context: Context) -> Result<()> { +pub fn handler(context: Context) -> Result<()> { if context.accounts.white_list.authority != context.accounts.signer.key() { panic!("Only the authority can add to the white list!"); } diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs index d496ede1..a8c5f6de 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -6,7 +6,7 @@ use spl_transfer_hook_interface::instruction::ExecuteInstruction; use crate::{handle_extra_account_metas, handle_extra_account_metas_count, WhiteList}; #[derive(Accounts)] -pub struct InitializeExtraAccountMetaList<'info> { +pub struct InitializeExtraAccountMetaListAccountConstraints<'info> { #[account(mut)] payer: Signer<'info>, @@ -28,7 +28,7 @@ pub struct InitializeExtraAccountMetaList<'info> { pub white_list: Account<'info, WhiteList>, } -pub fn handler(mut context: Context) -> Result<()> { +pub fn handler(mut context: Context) -> Result<()> { // set authority field on white_list account as payer address context.accounts.white_list.authority = context.accounts.payer.key(); context.accounts.white_list.bump = context.bumps.white_list; diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs index 1f98e583..d0279a60 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/instructions/transfer_hook.rs @@ -8,7 +8,7 @@ use crate::{check_is_transferring, WhiteList}; // Remaining accounts are the extra accounts required from the ExtraAccountMetaList account // These accounts are provided via CPI to this program from the token2022 program #[derive(Accounts)] -pub struct TransferHook<'info> { +pub struct TransferHookAccountConstraints<'info> { #[account(token::mint = mint, token::authority = owner)] pub source_token: InterfaceAccount<'info, TokenAccount>, pub mint: InterfaceAccount<'info, Mint>, @@ -23,7 +23,7 @@ pub struct TransferHook<'info> { pub white_list: Account<'info, WhiteList>, } -pub fn handler(context: Context, _amount: u64) -> Result<()> { +pub fn handler(context: Context, _amount: u64) -> Result<()> { // Fail this instruction if it is not called from within a transfer hook check_is_transferring(&context)?; diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/lib.rs index 5409ea43..08089435 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/src/lib.rs @@ -31,22 +31,22 @@ pub mod transfer_hook { #[instruction(discriminator = InitializeExtraAccountMetaListInstruction::SPL_DISCRIMINATOR_SLICE)] pub fn initialize_extra_account_meta_list( - context: Context, + context: Context, ) -> Result<()> { instructions::initialize_extra_account_meta_list::handler(context) } #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] - pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { + pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { instructions::transfer_hook::handler(context, amount) } - pub fn add_to_whitelist(context: Context) -> Result<()> { + pub fn add_to_whitelist(context: Context) -> Result<()> { instructions::add_to_whitelist::handler(context) } } -pub fn check_is_transferring(context: &Context) -> Result<()> { +pub fn check_is_transferring(context: &Context) -> Result<()> { let source_token_info = context.accounts.source_token.to_account_info(); let mut account_data_ref: RefMut<&mut [u8]> = source_token_info.try_borrow_mut_data()?; // .map_err() needed because spl-token-2022 uses solana-program-error 2.x diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/tests/test_transfer_hook.rs index ace2f529..8911293e 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/tests/test_transfer_hook.rs +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor/programs/transfer-hook/tests/test_transfer_hook.rs @@ -88,7 +88,7 @@ fn test_whitelist_transfer_hook() { let init_extra_ix = Instruction::new_with_bytes( program_id, &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), - transfer_hook::accounts::InitializeExtraAccountMetaList { + transfer_hook::accounts::InitializeExtraAccountMetaListAccountConstraints { payer: payer.pubkey(), extra_account_meta_list, mint, @@ -104,7 +104,7 @@ fn test_whitelist_transfer_hook() { let add_to_whitelist_ix = Instruction::new_with_bytes( program_id, &transfer_hook::instruction::AddToWhitelist {}.data(), - transfer_hook::accounts::AddToWhiteList { + transfer_hook::accounts::AddToWhiteListAccountConstraints { new_account: dest_ata, white_list: white_list_pda, signer: payer.pubkey(), diff --git a/tokens/token-extensions/transfer-hook/whitelist/quasar/src/lib.rs b/tokens/token-extensions/transfer-hook/whitelist/quasar/src/lib.rs index 26a61a43..212313a6 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/quasar/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/whitelist/quasar/src/lib.rs @@ -25,7 +25,7 @@ mod quasar_transfer_hook_whitelist { /// Discriminator = sha256("spl-transfer-hook-interface:initialize-extra-account-metas")[:8] #[instruction(discriminator = [43, 34, 13, 49, 167, 88, 235, 235])] pub fn initialize_extra_account_meta_list( - ctx: Ctx, + ctx: Ctx, ) -> Result<(), ProgramError> { handle_initialize(&mut ctx.accounts) } @@ -33,13 +33,13 @@ mod quasar_transfer_hook_whitelist { /// Transfer hook handler - checks if the destination is in the whitelist. /// Discriminator = sha256("spl-transfer-hook-interface:execute")[:8] #[instruction(discriminator = [105, 37, 101, 197, 75, 251, 102, 26])] - pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { + pub fn transfer_hook(ctx: Ctx, _amount: u64) -> Result<(), ProgramError> { handle_transfer_hook(&mut ctx.accounts) } /// Add an address to the whitelist. Only callable by the authority. #[instruction(discriminator = [0, 0, 0, 0, 0, 0, 0, 2])] - pub fn add_to_whitelist(ctx: Ctx) -> Result<(), ProgramError> { + pub fn add_to_whitelist(ctx: Ctx) -> Result<(), ProgramError> { handle_add_to_whitelist(&mut ctx.accounts) } } @@ -49,7 +49,7 @@ mod quasar_transfer_hook_whitelist { // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct InitializeExtraAccountMetaList { +pub struct InitializeExtraAccountMetaListAccountConstraints { #[account(mut)] pub payer: Signer, #[account(mut)] @@ -62,7 +62,7 @@ pub struct InitializeExtraAccountMetaList { } #[inline(always)] -pub fn handle_initialize(accounts: &mut InitializeExtraAccountMetaList) -> Result<(), ProgramError> { +pub fn handle_initialize(accounts: &mut InitializeExtraAccountMetaListAccountConstraints) -> Result<(), ProgramError> { // Create ExtraAccountMetaList PDA (1 extra account: whitelist) let meta_list_size: u64 = 51; // 8 + 4 + 4 + 35 let lamports = Rent::get()?.try_minimum_balance(meta_list_size as usize)?; @@ -147,7 +147,7 @@ pub fn handle_initialize(accounts: &mut InitializeExtraAccountMetaList) -> Resul // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct TransferHook { +pub struct TransferHookAccountConstraints { pub source_token: UncheckedAccount, pub mint: UncheckedAccount, pub destination_token: UncheckedAccount, @@ -157,7 +157,7 @@ pub struct TransferHook { } #[inline(always)] -pub fn handle_transfer_hook(accounts: &TransferHook) -> Result<(), ProgramError> { +pub fn handle_transfer_hook(accounts: &TransferHookAccountConstraints) -> Result<(), ProgramError> { let wl_view = accounts.white_list.to_account_view(); let data = wl_view.try_borrow()?; @@ -198,7 +198,7 @@ pub fn handle_transfer_hook(accounts: &TransferHook) -> Result<(), ProgramError> // --------------------------------------------------------------------------- #[derive(Accounts)] -pub struct AddToWhitelist { +pub struct AddToWhitelistAccountConstraints { pub signer: Signer, pub new_account: UncheckedAccount, #[account(mut)] @@ -206,7 +206,7 @@ pub struct AddToWhitelist { } #[inline(always)] -pub fn handle_add_to_whitelist(accounts: &mut AddToWhitelist) -> Result<(), ProgramError> { +pub fn handle_add_to_whitelist(accounts: &mut AddToWhitelistAccountConstraints) -> Result<(), ProgramError> { let view = unsafe { &mut *(&mut accounts.white_list as *mut UncheckedAccount as *mut AccountView) From 9496b90540973ee07fdd05e8c0f85a95c494fbdc Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 11 Jun 2026 16:29:40 +0000 Subject: [PATCH 074/138] extension_nft, reference doc: final AccountConstraints straggler and em-dash sweep https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- .reference/ANCHOR-1.0-MIGRATION.md | 6 +++--- .../programs/extension_nft/src/instructions/chop_tree.rs | 6 +++--- .../anchor-example/anchor/programs/extension_nft/src/lib.rs | 2 +- .../programs/extension_nft/tests/test_extension_nft.rs | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.reference/ANCHOR-1.0-MIGRATION.md b/.reference/ANCHOR-1.0-MIGRATION.md index 2db51869..27a86e3e 100644 --- a/.reference/ANCHOR-1.0-MIGRATION.md +++ b/.reference/ANCHOR-1.0-MIGRATION.md @@ -5,8 +5,8 @@ ### Cargo.toml - Change `anchor-lang = "0.32.1"` โ†’ `anchor-lang = "1.0.0"` - Change `anchor-lang = { version = "0.32.1", ... }` โ†’ `anchor-lang = { version = "1.0.0", ... }` -- Same for `anchor-spl` if present โ€” change to `1.0.0` -- Add comment: `# Anchor 1.0.0 โ€” pin to RC until stable release` +- Same for `anchor-spl` if present - change to `1.0.0` +- Add comment: `# Anchor 1.0.0 - pin to RC until stable release` - **REMOVE `interface-instructions` feature** if present (removed in Anchor 1.0). This affects transfer-hook projects. - Keep all other features as-is (`idl-build`, `init-if-needed`, `cpi`, etc.) @@ -37,5 +37,5 @@ ### interface-instructions removal (transfer-hook projects) For projects that had `features = ["interface-instructions"]`: - Remove that feature from Cargo.toml -- The `#[interface]` attribute is removed โ€” check if the program source uses it +- The `#[interface]` attribute is removed - check if the program source uses it - If it does, this needs manual intervention to refactor diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/chop_tree.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/chop_tree.rs index e32ab30a..597f9f0c 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/chop_tree.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/instructions/chop_tree.rs @@ -7,11 +7,11 @@ use anchor_spl::token_2022_extensions::spl_token_metadata_interface; use anchor_spl::token_interface::{spl_token_2022, Token2022}; use session_keys::{Session, SessionToken}; -pub fn chop_tree(context: Context, counter: u16, amount: u64) -> Result<()> { +pub fn chop_tree(context: Context, counter: u16, amount: u64) -> Result<()> { // Save game_data bump on first creation (init_if_needed). See init_player.rs // for the same pattern. let game_data_bump = context.bumps.game_data; - let account: &mut ChopTree<'_> = context.accounts; + let account: &mut ChopTreeAccountConstraints<'_> = context.accounts; account.player.update_energy()?; account.player.print()?; @@ -59,7 +59,7 @@ pub fn chop_tree(context: Context, counter: u16, amount: u64) -> Resul #[derive(Accounts, Session)] #[instruction(level_seed: String)] -pub struct ChopTree<'info> { +pub struct ChopTreeAccountConstraints<'info> { #[session( // The ephemeral key pair signing the transaction signer = signer, diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs index f7ae4953..6d513f1b 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs @@ -39,7 +39,7 @@ pub mod extension_nft { ctx.accounts.player.authority.key() == ctx.accounts.signer.key(), GameErrorCode::WrongAuthority )] - pub fn chop_tree(ctx: Context, _level_seed: String, counter: u16) -> Result<()> { + pub fn chop_tree(ctx: Context, _level_seed: String, counter: u16) -> Result<()> { chop_tree::chop_tree(ctx, counter, 1) } diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs index 1a7ef075..74a58e90 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/tests/test_extension_nft.rs @@ -114,7 +114,7 @@ fn mint_nft_ix(program_id: &Pubkey, signer: &Pubkey, mint: &Pubkey) -> Instructi fn chop_tree_ix(program_id: &Pubkey, signer: &Pubkey, mint: &Pubkey, counter: u16) -> Instruction { Instruction { program_id: *program_id, - accounts: extension_nft::accounts::ChopTree { + accounts: extension_nft::accounts::ChopTreeAccountConstraints { // session_token is optional; pass None -> the macro falls back to // the main-wallet authority check. session_token: None, From 5ad9e48c50360bacb8b2012bd072b4eab45d8234 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 11 Jun 2026 19:16:51 +0000 Subject: [PATCH 075/138] apply cargo fmt and biome formatting CI's Rustfmt job checks the root workspace and the Biome job checks all TypeScript; the audit-fix commits introduced unformatted code in both. No semantic changes. https://claude.ai/code/session_01VPj6WLMxD5KL6NwvUvuz1K --- .../src/instructions/create_user.rs | 5 +- .../native/tests/close-account.test.ts | 13 +-- .../pinocchio/program/tests/tests.rs | 5 +- .../programs/create-system-account/src/lib.rs | 4 +- .../anchor/programs/lever/src/lib.rs | 5 +- .../src/instructions/create_new_account.rs | 4 +- .../src/instructions/init_rent_vault.rs | 5 +- .../anchor-program-example/src/lib.rs | 5 +- .../processing-instructions/src/lib.rs | 6 +- .../src/instructions/create.rs | 4 +- .../src/instructions/increment.rs | 4 +- .../anchor-program-example/src/lib.rs | 4 +- .../instructions/transfer_sol_with_program.rs | 5 +- .../anchor/programs/transfer-sol/src/lib.rs | 5 +- .../transfer-sol/tests/test_transfer_sol.rs | 8 +- .../vault-strategy/tests/vault_strategy.rs | 103 ++++++++++++------ .../program/idl/car_rental_service.json | 52 +++------ .../generated/src/generated/accounts/car.ts | 21 ++-- .../src/generated/accounts/rentalOrder.ts | 21 ++-- .../src/generated/instructions/addCar.ts | 100 +++++------------ .../src/generated/instructions/bookRental.ts | 97 +++++------------ .../src/generated/instructions/pickUpCar.ts | 93 +++++----------- .../src/generated/instructions/returnCar.ts | 93 +++++----------- .../generated/programs/carRentalService.ts | 56 +++++----- .../src/generated/types/rentalOrderStatus.ts | 14 +-- tools/shank-and-codama/native/tests/test.ts | 11 +- 26 files changed, 299 insertions(+), 444 deletions(-) diff --git a/basics/close-account/anchor/programs/close-account/src/instructions/create_user.rs b/basics/close-account/anchor/programs/close-account/src/instructions/create_user.rs index 22efd2ec..a64ebd79 100644 --- a/basics/close-account/anchor/programs/close-account/src/instructions/create_user.rs +++ b/basics/close-account/anchor/programs/close-account/src/instructions/create_user.rs @@ -20,7 +20,10 @@ pub struct CreateUserAccountConstraints<'info> { pub system_program: Program<'info, System>, } -pub fn handle_create_user(context: Context, name: String) -> Result<()> { +pub fn handle_create_user( + context: Context, + name: String, +) -> Result<()> { *context.accounts.user_account = User { bump: context.bumps.user_account, user: context.accounts.user.key(), diff --git a/basics/close-account/native/tests/close-account.test.ts b/basics/close-account/native/tests/close-account.test.ts index 790275a8..d399d239 100644 --- a/basics/close-account/native/tests/close-account.test.ts +++ b/basics/close-account/native/tests/close-account.test.ts @@ -90,9 +90,7 @@ describe("Close Account!", () => { await sendIx( svm, payer, - toKitInstruction( - createCreateUserInstruction(userAccount, payerPublicKey, programPublicKey, "Jacob"), - ), + toKitInstruction(createCreateUserInstruction(userAccount, payerPublicKey, programPublicKey, "Jacob")), ); const userAccountLamports = svm.getBalance(userAccountAddress); @@ -111,9 +109,7 @@ describe("Close Account!", () => { sendIx( svm, attacker, - toKitInstruction( - createCloseUserInstruction(userAccount, attackerPublicKey, programPublicKey), - ), + toKitInstruction(createCloseUserInstruction(userAccount, attackerPublicKey, programPublicKey)), ), "closing someone else's account must fail", ); @@ -152,9 +148,6 @@ describe("Close Account!", () => { ); const closedBalance = svm.getBalance(userAccountAddress); - assert.ok( - closedBalance === null || closedBalance === 0n, - "closed account should hold no lamports", - ); + assert.ok(closedBalance === null || closedBalance === 0n, "closed account should hold no lamports"); }); }); diff --git a/basics/close-account/pinocchio/program/tests/tests.rs b/basics/close-account/pinocchio/program/tests/tests.rs index 868bc7c0..d6b8d11f 100644 --- a/basics/close-account/pinocchio/program/tests/tests.rs +++ b/basics/close-account/pinocchio/program/tests/tests.rs @@ -199,7 +199,10 @@ fn create_rejects_wrong_bump() { ), &payer, ); - assert!(result.is_err(), "create with a non-canonical bump must fail"); + assert!( + result.is_err(), + "create with a non-canonical bump must fail" + ); assert!(svm.get_account(&target).is_none()); } diff --git a/basics/create-account/anchor/programs/create-system-account/src/lib.rs b/basics/create-account/anchor/programs/create-system-account/src/lib.rs index 07b21a30..8898ba27 100644 --- a/basics/create-account/anchor/programs/create-system-account/src/lib.rs +++ b/basics/create-account/anchor/programs/create-system-account/src/lib.rs @@ -7,7 +7,9 @@ declare_id!("ARVNCsYKDQsCLHbwUTJLpFXVrJdjhWZStyzvxmKe2xHi"); pub mod create_system_account { use super::*; - pub fn create_system_account(context: Context) -> Result<()> { + pub fn create_system_account( + context: Context, + ) -> Result<()> { msg!("Program invoked. Creating a system account..."); msg!( " New public key will be: {}", diff --git a/basics/cross-program-invocation/anchor/programs/lever/src/lib.rs b/basics/cross-program-invocation/anchor/programs/lever/src/lib.rs index f57709b9..fa90458d 100644 --- a/basics/cross-program-invocation/anchor/programs/lever/src/lib.rs +++ b/basics/cross-program-invocation/anchor/programs/lever/src/lib.rs @@ -13,7 +13,10 @@ pub mod lever { instructions::initialize::handler(context) } - pub fn switch_power(context: Context, name: String) -> Result<()> { + pub fn switch_power( + context: Context, + name: String, + ) -> Result<()> { instructions::switch_power::handler(context, name) } } diff --git a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/create_new_account.rs b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/create_new_account.rs index 8c6730a7..80a2e84c 100644 --- a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/create_new_account.rs +++ b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/create_new_account.rs @@ -17,7 +17,9 @@ pub struct CreateNewAccountAccountConstraints<'info> { system_program: Program<'info, System>, } -pub fn handle_create_new_account(context: Context) -> Result<()> { +pub fn handle_create_new_account( + context: Context, +) -> Result<()> { // PDA signer seeds let signer_seeds: &[&[&[u8]]] = &[&[b"rent_vault", &[context.bumps.rent_vault]]]; diff --git a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/init_rent_vault.rs b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/init_rent_vault.rs index 2d80e676..a15c49b4 100644 --- a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/init_rent_vault.rs +++ b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/instructions/init_rent_vault.rs @@ -19,7 +19,10 @@ pub struct InitRentVaultAccountConstraints<'info> { // When lamports are transferred to a new address (without and existing account), // An account owned by the system program is created by default -pub fn handle_init_rent_vault(context: Context, fund_lamports: u64) -> Result<()> { +pub fn handle_init_rent_vault( + context: Context, + fund_lamports: u64, +) -> Result<()> { transfer( CpiContext::new( context.accounts.system_program.key(), diff --git a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/lib.rs b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/lib.rs index fa7eef61..c3f3b686 100644 --- a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/lib.rs +++ b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/lib.rs @@ -8,7 +8,10 @@ declare_id!("7Hm9nsYVuBZ9rf8z9AMUHreZRv8Q4vLhqwdVTCawRZtA"); pub mod pda_rent_payer { use super::*; - pub fn init_rent_vault(context: Context, fund_lamports: u64) -> Result<()> { + pub fn init_rent_vault( + context: Context, + fund_lamports: u64, + ) -> Result<()> { init_rent_vault::handle_init_rent_vault(context, fund_lamports) } diff --git a/basics/processing-instructions/anchor/programs/processing-instructions/src/lib.rs b/basics/processing-instructions/anchor/programs/processing-instructions/src/lib.rs index 2fbf5a53..1cc3a11f 100644 --- a/basics/processing-instructions/anchor/programs/processing-instructions/src/lib.rs +++ b/basics/processing-instructions/anchor/programs/processing-instructions/src/lib.rs @@ -8,7 +8,11 @@ pub mod processing_instructions { // With Anchor, we just put instruction data in the function signature! // - pub fn go_to_park(_context: Context, name: String, height: u32) -> Result<()> { + pub fn go_to_park( + _context: Context, + name: String, + height: u32, + ) -> Result<()> { msg!("Welcome to the park, {}!", name); if height > 5 { msg!("You are tall enough to ride this ride. Congratulations."); diff --git a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/create.rs b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/create.rs index 65e55fff..2278e1d1 100644 --- a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/create.rs +++ b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/create.rs @@ -20,7 +20,9 @@ pub struct CreatePageVisitsAccountConstraints<'info> { system_program: Program<'info, System>, } -pub fn handle_create_page_visits(context: Context) -> Result<()> { +pub fn handle_create_page_visits( + context: Context, +) -> Result<()> { *context.accounts.page_visits = PageVisits { page_visits: 0, bump: context.bumps.page_visits, diff --git a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/increment.rs b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/increment.rs index f1b5e203..206ef731 100644 --- a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/increment.rs +++ b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/instructions/increment.rs @@ -15,7 +15,9 @@ pub struct IncrementPageVisitsAccountConstraints<'info> { page_visits: Account<'info, PageVisits>, } -pub fn handle_increment_page_visits(context: Context) -> Result<()> { +pub fn handle_increment_page_visits( + context: Context, +) -> Result<()> { let page_visits = &mut context.accounts.page_visits; page_visits.page_visits = page_visits .page_visits diff --git a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/lib.rs b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/lib.rs index feb49099..40a9f3bf 100644 --- a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/lib.rs +++ b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/lib.rs @@ -15,7 +15,9 @@ pub mod program_derived_addresses_program { create::handle_create_page_visits(context) } - pub fn increment_page_visits(context: Context) -> Result<()> { + pub fn increment_page_visits( + context: Context, + ) -> Result<()> { increment::handle_increment_page_visits(context) } } diff --git a/basics/transfer-sol/anchor/programs/transfer-sol/src/instructions/transfer_sol_with_program.rs b/basics/transfer-sol/anchor/programs/transfer-sol/src/instructions/transfer_sol_with_program.rs index cb754ed0..03d98b73 100644 --- a/basics/transfer-sol/anchor/programs/transfer-sol/src/instructions/transfer_sol_with_program.rs +++ b/basics/transfer-sol/anchor/programs/transfer-sol/src/instructions/transfer_sol_with_program.rs @@ -22,7 +22,10 @@ pub struct TransferSolWithProgramAccountConstraints<'info> { } // Directly modifying lamports is only possible if the program is the owner of the account -pub fn handler(context: Context, amount: u64) -> Result<()> { +pub fn handler( + context: Context, + amount: u64, +) -> Result<()> { let payer = &context.accounts.payer; let recipient = &context.accounts.recipient; diff --git a/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs b/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs index e330ec7b..49f40cb3 100644 --- a/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs +++ b/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs @@ -9,7 +9,10 @@ declare_id!("4fQVnLWKKKYxtxgGn7Haw8v2g2Hzbu8K61JvWKvqAi7W"); pub mod transfer_sol { use super::*; - pub fn transfer_sol_with_cpi(context: Context, amount: u64) -> Result<()> { + pub fn transfer_sol_with_cpi( + context: Context, + amount: u64, + ) -> Result<()> { instructions::transfer_sol_with_cpi::handler(context, amount) } diff --git a/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs b/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs index f370b7d2..3afb8661 100644 --- a/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs +++ b/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs @@ -133,12 +133,8 @@ fn test_transfer_sol_with_program_rejects_insufficient_funds() { .to_account_metas(None), ); - let result = send_transaction_from_instructions( - &mut svm, - vec![instruction], - &[&payer], - &payer.pubkey(), - ); + let result = + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()); assert!(result.is_err(), "overdrawing the payer must fail"); // Balances are untouched. diff --git a/finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs b/finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs index 4df400e9..45d568a6 100644 --- a/finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs +++ b/finance/vault-strategy/anchor/programs/vault-strategy/tests/vault_strategy.rs @@ -9,7 +9,8 @@ use { solana_keypair::Keypair, solana_kite::{ create_associated_token_account, create_token_mint, create_wallet, - get_token_account_balance, mint_tokens_to_token_account, send_transaction_from_instructions, + get_token_account_balance, mint_tokens_to_token_account, + send_transaction_from_instructions, }, solana_signer::Signer, }; @@ -59,7 +60,7 @@ fn build_mock_price_update_account(price: i64, exponent: i32, publish_time: i64) let mut data = Vec::with_capacity(133); data.extend_from_slice(&discriminator); data.extend_from_slice(&[0u8; 32]); // write_authority placeholder - data.push(1u8); // verification_level: Full + data.push(1u8); // verification_level: Full data.extend_from_slice(&[0xEFu8; 32]); // feed_id data.extend_from_slice(&price.to_le_bytes()); data.extend_from_slice(&100_000u64.to_le_bytes()); // conf @@ -155,14 +156,10 @@ fn setup_full() -> TestContext { } // Derive PDAs - let (strategy_pda, _) = Pubkey::find_program_address( - &[b"strategy", manager.pubkey().as_ref()], - &vault_program_id, - ); - let (share_mint_pda, _) = Pubkey::find_program_address( - &[b"share_mint", strategy_pda.as_ref()], - &vault_program_id, - ); + let (strategy_pda, _) = + Pubkey::find_program_address(&[b"strategy", manager.pubkey().as_ref()], &vault_program_id); + let (share_mint_pda, _) = + Pubkey::find_program_address(&[b"share_mint", strategy_pda.as_ref()], &vault_program_id); let (router_config_pda, _) = Pubkey::find_program_address(&[b"router_config"], &router_program_id); let (tsla_rate_pda, _) = @@ -215,10 +212,7 @@ fn setup_full() -> TestContext { // Step 1: Initialize router let init_router_ix = Instruction::new_with_bytes( router_program_id, - &mock_swap_router::instruction::InitializeRouter { - usdc_mint, - } - .data(), + &mock_swap_router::instruction::InitializeRouter { usdc_mint }.data(), mock_swap_router::accounts::InitializeRouterAccountConstraints { authority: payer.pubkey(), usdc_mint, @@ -229,13 +223,8 @@ fn setup_full() -> TestContext { } .to_account_metas(None), ); - send_transaction_from_instructions( - &mut svm, - vec![init_router_ix], - &[&payer], - &payer.pubkey(), - ) - .unwrap(); + send_transaction_from_instructions(&mut svm, vec![init_router_ix], &[&payer], &payer.pubkey()) + .unwrap(); // Step 2: Set TSLAx rate = 250 usdc per token let set_tsla_rate_ix = Instruction::new_with_bytes( @@ -430,8 +419,14 @@ fn test_deposit_first() { .unwrap(); let user_share = derive_ata(&user.pubkey(), &ctx.share_mint_pda); - mint_tokens_to_token_account(&mut ctx.svm, &ctx.usdc_mint, &user_usdc, deposit_amount, &ctx.payer) - .unwrap(); + mint_tokens_to_token_account( + &mut ctx.svm, + &ctx.usdc_mint, + &user_usdc, + deposit_amount, + &ctx.payer, + ) + .unwrap(); let deposit_ix = Instruction::new_with_bytes( ctx.vault_program_id, @@ -474,7 +469,10 @@ fn test_deposit_first() { assert_eq!(share_balance, deposit_amount, "First deposit should be 1:1"); let vault_usdc_balance = get_token_account_balance(&ctx.svm, &ctx.vault_usdc).unwrap(); - assert_eq!(vault_usdc_balance, deposit_amount, "Vault USDC should hold deposit"); + assert_eq!( + vault_usdc_balance, deposit_amount, + "Vault USDC should hold deposit" + ); } fn do_deposit(ctx: &mut TestContext, user: &Keypair, usdc_amount: u64) -> Pubkey { @@ -737,7 +735,10 @@ fn test_collect_fees() { let fee_shares = get_token_account_balance(&ctx.svm, &manager_share).unwrap(); assert!(fee_shares > 0, "Manager should receive fee shares"); // 1% of 1_000_000_000 = 10_000_000 - assert_eq!(fee_shares, 10_000_000, "Annual fee should be 1% of total shares"); + assert_eq!( + fee_shares, 10_000_000, + "Annual fee should be 1% of total shares" + ); } #[test] @@ -877,7 +878,10 @@ fn test_withdraw_rejects_slippage() { &[&ctx.payer, &user], &ctx.payer.pubkey(), ); - assert!(result.is_err(), "Withdraw should fail when slippage too high"); + assert!( + result.is_err(), + "Withdraw should fail when slippage too high" + ); } #[test] @@ -1021,8 +1025,16 @@ fn test_rebalance() { let tsla_after = get_token_account_balance(&ctx.svm, &ctx.vault_tsla).unwrap(); let nvda_after = get_token_account_balance(&ctx.svm, &ctx.vault_nvda).unwrap(); - assert_eq!(tsla_after, tsla_before - sell_amount, "TSLAx balance should decrease by sell_amount"); - assert_eq!(nvda_after, nvda_before + nvda_bought, "NVDAx balance should increase by nvda_bought"); + assert_eq!( + tsla_after, + tsla_before - sell_amount, + "TSLAx balance should decrease by sell_amount" + ); + assert_eq!( + nvda_after, + nvda_before + nvda_bought, + "NVDAx balance should increase by nvda_bought" + ); } fn assert_transaction_fails_with( @@ -1075,8 +1087,14 @@ fn test_deposit_rejects_wrong_usdc_mint() { let user_junk = create_associated_token_account(&mut ctx.svm, &user.pubkey(), &junk_mint, &ctx.payer) .unwrap(); - mint_tokens_to_token_account(&mut ctx.svm, &junk_mint, &user_junk, deposit_amount, &ctx.payer) - .unwrap(); + mint_tokens_to_token_account( + &mut ctx.svm, + &junk_mint, + &user_junk, + deposit_amount, + &ctx.payer, + ) + .unwrap(); let user_share = derive_ata(&user.pubkey(), &ctx.share_mint_pda); let deposit_ix = Instruction::new_with_bytes( @@ -1133,8 +1151,14 @@ fn test_deposit_rejects_wrong_asset_mint() { let user_usdc = create_associated_token_account(&mut ctx.svm, &user.pubkey(), &ctx.usdc_mint, &ctx.payer) .unwrap(); - mint_tokens_to_token_account(&mut ctx.svm, &ctx.usdc_mint, &user_usdc, deposit_amount, &ctx.payer) - .unwrap(); + mint_tokens_to_token_account( + &mut ctx.svm, + &ctx.usdc_mint, + &user_usdc, + deposit_amount, + &ctx.payer, + ) + .unwrap(); let user_share = derive_ata(&user.pubkey(), &ctx.share_mint_pda); let deposit_ix = Instruction::new_with_bytes( @@ -1189,8 +1213,14 @@ fn test_withdraw_rejects_wrong_asset_mint() { let user_usdc = create_associated_token_account(&mut ctx.svm, &user.pubkey(), &ctx.usdc_mint, &ctx.payer) .unwrap(); - mint_tokens_to_token_account(&mut ctx.svm, &ctx.usdc_mint, &user_usdc, deposit_amount, &ctx.payer) - .unwrap(); + mint_tokens_to_token_account( + &mut ctx.svm, + &ctx.usdc_mint, + &user_usdc, + deposit_amount, + &ctx.payer, + ) + .unwrap(); let user_share = do_deposit(&mut ctx, &user, deposit_amount); // An unregistered mint passed as asset_mint_a on withdraw: the empty junk @@ -1244,7 +1274,10 @@ fn test_withdraw_rejects_wrong_asset_mint() { let shares_after = get_token_account_balance(&ctx.svm, &user_share).unwrap(); assert_eq!(shares_after, deposit_amount, "Shares must be untouched"); let vault_usdc_balance = get_token_account_balance(&ctx.svm, &ctx.vault_usdc).unwrap(); - assert_eq!(vault_usdc_balance, deposit_amount, "Vault USDC must be untouched"); + assert_eq!( + vault_usdc_balance, deposit_amount, + "Vault USDC must be untouched" + ); } #[test] diff --git a/tools/shank-and-codama/native/program/idl/car_rental_service.json b/tools/shank-and-codama/native/program/idl/car_rental_service.json index 168a6a59..7329829f 100644 --- a/tools/shank-and-codama/native/program/idl/car_rental_service.json +++ b/tools/shank-and-codama/native/program/idl/car_rental_service.json @@ -9,25 +9,19 @@ "name": "carAccount", "isMut": true, "isSigner": false, - "docs": [ - "The account that will represent the Car being created" - ] + "docs": ["The account that will represent the Car being created"] }, { "name": "payer", "isMut": true, "isSigner": true, - "docs": [ - "Fee payer" - ] + "docs": ["Fee payer"] }, { "name": "systemProgram", "isMut": false, "isSigner": false, - "docs": [ - "The System Program" - ] + "docs": ["The System Program"] } ], "args": [ @@ -50,33 +44,25 @@ "name": "rentalAccount", "isMut": true, "isSigner": false, - "docs": [ - "The account that will represent the actual order for the rental" - ] + "docs": ["The account that will represent the actual order for the rental"] }, { "name": "carAccount", "isMut": false, "isSigner": false, - "docs": [ - "The account representing the Car being rented in this order" - ] + "docs": ["The account representing the Car being rented in this order"] }, { "name": "payer", "isMut": true, "isSigner": true, - "docs": [ - "Fee payer" - ] + "docs": ["Fee payer"] }, { "name": "systemProgram", "isMut": false, "isSigner": false, - "docs": [ - "The System Program" - ] + "docs": ["The System Program"] } ], "args": [ @@ -99,25 +85,19 @@ "name": "rentalAccount", "isMut": true, "isSigner": false, - "docs": [ - "The account representing the active rental" - ] + "docs": ["The account representing the active rental"] }, { "name": "carAccount", "isMut": false, "isSigner": false, - "docs": [ - "The account representing the Car being rented in this order" - ] + "docs": ["The account representing the Car being rented in this order"] }, { "name": "payer", "isMut": true, "isSigner": true, - "docs": [ - "Fee payer" - ] + "docs": ["Fee payer"] } ], "args": [], @@ -133,25 +113,19 @@ "name": "rentalAccount", "isMut": true, "isSigner": false, - "docs": [ - "The account representing the active rental" - ] + "docs": ["The account representing the active rental"] }, { "name": "carAccount", "isMut": false, "isSigner": false, - "docs": [ - "The account representing the Car being rented in this order" - ] + "docs": ["The account representing the Car being rented in this order"] }, { "name": "payer", "isMut": true, "isSigner": true, - "docs": [ - "Fee payer" - ] + "docs": ["Fee payer"] } ], "args": [], diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts index 871f35d6..1da00ac7 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts @@ -7,12 +7,20 @@ */ import { + type Account, + type Address, addDecoderSizePrefix, addEncoderSizePrefix, assertAccountExists, assertAccountsExist, + type Codec, combineCodec, + type Decoder, decodeAccount, + type EncodedAccount, + type Encoder, + type FetchAccountConfig, + type FetchAccountsConfig, fetchEncodedAccount, fetchEncodedAccounts, getStructDecoder, @@ -23,14 +31,6 @@ import { getU32Encoder, getUtf8Decoder, getUtf8Encoder, - type Account, - type Address, - type Codec, - type Decoder, - type EncodedAccount, - type Encoder, - type FetchAccountConfig, - type FetchAccountsConfig, type MaybeAccount, type MaybeEncodedAccount, } from "@solana/kit"; @@ -71,10 +71,7 @@ export function decodeCar( export function decodeCar( encodedAccount: EncodedAccount | MaybeEncodedAccount, ): Account | MaybeAccount { - return decodeAccount( - encodedAccount as MaybeEncodedAccount, - getCarDecoder(), - ); + return decodeAccount(encodedAccount as MaybeEncodedAccount, getCarDecoder()); } export async function fetchCar( diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts index 539854a1..668a53c9 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts @@ -7,12 +7,20 @@ */ import { + type Account, + type Address, addDecoderSizePrefix, addEncoderSizePrefix, assertAccountExists, assertAccountsExist, + type Codec, combineCodec, + type Decoder, decodeAccount, + type EncodedAccount, + type Encoder, + type FetchAccountConfig, + type FetchAccountsConfig, fetchEncodedAccount, fetchEncodedAccounts, getAddressDecoder, @@ -25,14 +33,6 @@ import { getU64Encoder, getUtf8Decoder, getUtf8Encoder, - type Account, - type Address, - type Codec, - type Decoder, - type EncodedAccount, - type Encoder, - type FetchAccountConfig, - type FetchAccountsConfig, type MaybeAccount, type MaybeEncodedAccount, } from "@solana/kit"; @@ -99,10 +99,7 @@ export function decodeRentalOrder( export function decodeRentalOrder( encodedAccount: EncodedAccount | MaybeEncodedAccount, ): Account | MaybeAccount { - return decodeAccount( - encodedAccount as MaybeEncodedAccount, - getRentalOrderDecoder(), - ); + return decodeAccount(encodedAccount as MaybeEncodedAccount, getRentalOrderDecoder()); } export async function fetchRentalOrder( diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts index a74b14bf..cac5ff9a 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts @@ -7,41 +7,38 @@ */ import { + type AccountMeta, + type AccountSignerMeta, + type Address, addDecoderSizePrefix, addEncoderSizePrefix, + type Codec, combineCodec, + type Decoder, + type Encoder, getStructDecoder, getStructEncoder, + getU8Decoder, + getU8Encoder, getU16Decoder, getU16Encoder, getU32Decoder, getU32Encoder, - getU8Decoder, - getU8Encoder, getUtf8Decoder, getUtf8Encoder, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - transformEncoder, - type AccountMeta, - type AccountSignerMeta, - type Address, - type Codec, - type Decoder, - type Encoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, type TransactionSigner, + transformEncoder, type WritableAccount, type WritableSignerAccount, } from "@solana/kit"; -import { - getAccountMetaFactory, - type ResolvedInstructionAccount, -} from "@solana/program-client-core"; +import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; export const ADD_CAR_DISCRIMINATOR = 0; @@ -54,23 +51,17 @@ export type AddCarInstruction< TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, TAccountCarAccount extends string | AccountMeta = string, TAccountPayer extends string | AccountMeta = string, - TAccountSystemProgram extends string | AccountMeta = - "11111111111111111111111111111111", + TAccountSystemProgram extends string | AccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ - TAccountCarAccount extends string - ? WritableAccount - : TAccountCarAccount, + TAccountCarAccount extends string ? WritableAccount : TAccountCarAccount, TAccountPayer extends string - ? WritableSignerAccount & - AccountSignerMeta + ? WritableSignerAccount & AccountSignerMeta : TAccountPayer, - TAccountSystemProgram extends string - ? ReadonlyAccount - : TAccountSystemProgram, + TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, ...TRemainingAccounts, ] >; @@ -109,14 +100,8 @@ export function getAddCarInstructionDataDecoder(): Decoder { - return combineCodec( - getAddCarInstructionDataEncoder(), - getAddCarInstructionDataDecoder(), - ); +export function getAddCarInstructionDataCodec(): Codec { + return combineCodec(getAddCarInstructionDataEncoder(), getAddCarInstructionDataDecoder()); } export type AddCarInput< @@ -143,15 +128,9 @@ export function getAddCarInstruction< >( input: AddCarInput, config?: { programAddress?: TProgramAddress }, -): AddCarInstruction< - TProgramAddress, - TAccountCarAccount, - TAccountPayer, - TAccountSystemProgram -> { +): AddCarInstruction { // Program address. - const programAddress = - config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { @@ -159,18 +138,14 @@ export function getAddCarInstruction< payer: { value: input.payer ?? null, isWritable: true }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, }; - const accounts = originalAccounts as Record< - keyof typeof originalAccounts, - ResolvedInstructionAccount - >; + const accounts = originalAccounts as Record; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = - "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); @@ -180,16 +155,9 @@ export function getAddCarInstruction< getAccountMeta("payer", accounts.payer), getAccountMeta("systemProgram", accounts.systemProgram), ], - data: getAddCarInstructionDataEncoder().encode( - args as AddCarInstructionDataArgs, - ), + data: getAddCarInstructionDataEncoder().encode(args as AddCarInstructionDataArgs), programAddress, - } as AddCarInstruction< - TProgramAddress, - TAccountCarAccount, - TAccountPayer, - TAccountSystemProgram - >); + } as AddCarInstruction); } export type ParsedAddCarInstruction< @@ -208,22 +176,14 @@ export type ParsedAddCarInstruction< data: AddCarInstructionData; }; -export function parseAddCarInstruction< - TProgram extends string, - TAccountMetas extends readonly AccountMeta[], ->( - instruction: Instruction & - InstructionWithAccounts & - InstructionWithData, +export function parseAddCarInstruction( + instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedAddCarInstruction { if (instruction.accounts.length < 3) { - throw new SolanaError( - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 3, - }, - ); + throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 3, + }); } let accountIndex = 0; const getNextAccount = () => { diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts index 7925f36c..520382c8 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts @@ -7,41 +7,38 @@ */ import { + type AccountMeta, + type AccountSignerMeta, + type Address, addDecoderSizePrefix, addEncoderSizePrefix, + type Codec, combineCodec, + type Decoder, + type Encoder, getStructDecoder, getStructEncoder, + getU8Decoder, + getU8Encoder, getU32Decoder, getU32Encoder, getU64Decoder, getU64Encoder, - getU8Decoder, - getU8Encoder, getUtf8Decoder, getUtf8Encoder, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - transformEncoder, - type AccountMeta, - type AccountSignerMeta, - type Address, - type Codec, - type Decoder, - type Encoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, type TransactionSigner, + transformEncoder, type WritableAccount, type WritableSignerAccount, } from "@solana/kit"; -import { - getAccountMetaFactory, - type ResolvedInstructionAccount, -} from "@solana/program-client-core"; +import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; export const BOOK_RENTAL_DISCRIMINATOR = 1; @@ -55,26 +52,18 @@ export type BookRentalInstruction< TAccountRentalAccount extends string | AccountMeta = string, TAccountCarAccount extends string | AccountMeta = string, TAccountPayer extends string | AccountMeta = string, - TAccountSystemProgram extends string | AccountMeta = - "11111111111111111111111111111111", + TAccountSystemProgram extends string | AccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ - TAccountRentalAccount extends string - ? WritableAccount - : TAccountRentalAccount, - TAccountCarAccount extends string - ? ReadonlyAccount - : TAccountCarAccount, + TAccountRentalAccount extends string ? WritableAccount : TAccountRentalAccount, + TAccountCarAccount extends string ? ReadonlyAccount : TAccountCarAccount, TAccountPayer extends string - ? WritableSignerAccount & - AccountSignerMeta + ? WritableSignerAccount & AccountSignerMeta : TAccountPayer, - TAccountSystemProgram extends string - ? ReadonlyAccount - : TAccountSystemProgram, + TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, ...TRemainingAccounts, ] >; @@ -117,14 +106,8 @@ export function getBookRentalInstructionDataDecoder(): Decoder { - return combineCodec( - getBookRentalInstructionDataEncoder(), - getBookRentalInstructionDataDecoder(), - ); +export function getBookRentalInstructionDataCodec(): Codec { + return combineCodec(getBookRentalInstructionDataEncoder(), getBookRentalInstructionDataDecoder()); } export type BookRentalInput< @@ -154,12 +137,7 @@ export function getBookRentalInstruction< TAccountSystemProgram extends string, TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, >( - input: BookRentalInput< - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer, - TAccountSystemProgram - >, + input: BookRentalInput, config?: { programAddress?: TProgramAddress }, ): BookRentalInstruction< TProgramAddress, @@ -169,8 +147,7 @@ export function getBookRentalInstruction< TAccountSystemProgram > { // Program address. - const programAddress = - config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { @@ -179,18 +156,14 @@ export function getBookRentalInstruction< payer: { value: input.payer ?? null, isWritable: true }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, }; - const accounts = originalAccounts as Record< - keyof typeof originalAccounts, - ResolvedInstructionAccount - >; + const accounts = originalAccounts as Record; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = - "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); @@ -201,9 +174,7 @@ export function getBookRentalInstruction< getAccountMeta("payer", accounts.payer), getAccountMeta("systemProgram", accounts.systemProgram), ], - data: getBookRentalInstructionDataEncoder().encode( - args as BookRentalInstructionDataArgs, - ), + data: getBookRentalInstructionDataEncoder().encode(args as BookRentalInstructionDataArgs), programAddress, } as BookRentalInstruction< TProgramAddress, @@ -232,22 +203,14 @@ export type ParsedBookRentalInstruction< data: BookRentalInstructionData; }; -export function parseBookRentalInstruction< - TProgram extends string, - TAccountMetas extends readonly AccountMeta[], ->( - instruction: Instruction & - InstructionWithAccounts & - InstructionWithData, +export function parseBookRentalInstruction( + instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedBookRentalInstruction { if (instruction.accounts.length < 4) { - throw new SolanaError( - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 4, - }, - ); + throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 4, + }); } let accountIndex = 0; const getNextAccount = () => { diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts index 2297f93e..0915df46 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts @@ -7,33 +7,30 @@ */ import { - combineCodec, - getStructDecoder, - getStructEncoder, - getU8Decoder, - getU8Encoder, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - transformEncoder, type AccountMeta, type AccountSignerMeta, type Address, + combineCodec, type FixedSizeCodec, type FixedSizeDecoder, type FixedSizeEncoder, + getStructDecoder, + getStructEncoder, + getU8Decoder, + getU8Encoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, type TransactionSigner, + transformEncoder, type WritableAccount, type WritableSignerAccount, } from "@solana/kit"; -import { - getAccountMetaFactory, - type ResolvedInstructionAccount, -} from "@solana/program-client-core"; +import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; export const PICK_UP_CAR_DISCRIMINATOR = 2; @@ -52,15 +49,10 @@ export type PickUpCarInstruction< InstructionWithData & InstructionWithAccounts< [ - TAccountRentalAccount extends string - ? WritableAccount - : TAccountRentalAccount, - TAccountCarAccount extends string - ? ReadonlyAccount - : TAccountCarAccount, + TAccountRentalAccount extends string ? WritableAccount : TAccountRentalAccount, + TAccountCarAccount extends string ? ReadonlyAccount : TAccountCarAccount, TAccountPayer extends string - ? WritableSignerAccount & - AccountSignerMeta + ? WritableSignerAccount & AccountSignerMeta : TAccountPayer, ...TRemainingAccounts, ] @@ -71,10 +63,10 @@ export type PickUpCarInstructionData = { discriminator: number }; export type PickUpCarInstructionDataArgs = {}; export function getPickUpCarInstructionDataEncoder(): FixedSizeEncoder { - return transformEncoder( - getStructEncoder([["discriminator", getU8Encoder()]]), - (value) => ({ ...value, discriminator: PICK_UP_CAR_DISCRIMINATOR }), - ); + return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ + ...value, + discriminator: PICK_UP_CAR_DISCRIMINATOR, + })); } export function getPickUpCarInstructionDataDecoder(): FixedSizeDecoder { @@ -85,10 +77,7 @@ export function getPickUpCarInstructionDataCodec(): FixedSizeCodec< PickUpCarInstructionDataArgs, PickUpCarInstructionData > { - return combineCodec( - getPickUpCarInstructionDataEncoder(), - getPickUpCarInstructionDataDecoder(), - ); + return combineCodec(getPickUpCarInstructionDataEncoder(), getPickUpCarInstructionDataDecoder()); } export type PickUpCarInput< @@ -110,21 +99,11 @@ export function getPickUpCarInstruction< TAccountPayer extends string, TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, >( - input: PickUpCarInput< - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer - >, + input: PickUpCarInput, config?: { programAddress?: TProgramAddress }, -): PickUpCarInstruction< - TProgramAddress, - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer -> { +): PickUpCarInstruction { // Program address. - const programAddress = - config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { @@ -132,10 +111,7 @@ export function getPickUpCarInstruction< carAccount: { value: input.carAccount ?? null, isWritable: false }, payer: { value: input.payer ?? null, isWritable: true }, }; - const accounts = originalAccounts as Record< - keyof typeof originalAccounts, - ResolvedInstructionAccount - >; + const accounts = originalAccounts as Record; const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ @@ -146,12 +122,7 @@ export function getPickUpCarInstruction< ], data: getPickUpCarInstructionDataEncoder().encode({}), programAddress, - } as PickUpCarInstruction< - TProgramAddress, - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer - >); + } as PickUpCarInstruction); } export type ParsedPickUpCarInstruction< @@ -170,22 +141,14 @@ export type ParsedPickUpCarInstruction< data: PickUpCarInstructionData; }; -export function parsePickUpCarInstruction< - TProgram extends string, - TAccountMetas extends readonly AccountMeta[], ->( - instruction: Instruction & - InstructionWithAccounts & - InstructionWithData, +export function parsePickUpCarInstruction( + instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedPickUpCarInstruction { if (instruction.accounts.length < 3) { - throw new SolanaError( - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 3, - }, - ); + throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 3, + }); } let accountIndex = 0; const getNextAccount = () => { diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts index a331fed1..a6a1c90e 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts @@ -7,33 +7,30 @@ */ import { - combineCodec, - getStructDecoder, - getStructEncoder, - getU8Decoder, - getU8Encoder, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - transformEncoder, type AccountMeta, type AccountSignerMeta, type Address, + combineCodec, type FixedSizeCodec, type FixedSizeDecoder, type FixedSizeEncoder, + getStructDecoder, + getStructEncoder, + getU8Decoder, + getU8Encoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, + SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, + SolanaError, type TransactionSigner, + transformEncoder, type WritableAccount, type WritableSignerAccount, } from "@solana/kit"; -import { - getAccountMetaFactory, - type ResolvedInstructionAccount, -} from "@solana/program-client-core"; +import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; export const RETURN_CAR_DISCRIMINATOR = 3; @@ -52,15 +49,10 @@ export type ReturnCarInstruction< InstructionWithData & InstructionWithAccounts< [ - TAccountRentalAccount extends string - ? WritableAccount - : TAccountRentalAccount, - TAccountCarAccount extends string - ? ReadonlyAccount - : TAccountCarAccount, + TAccountRentalAccount extends string ? WritableAccount : TAccountRentalAccount, + TAccountCarAccount extends string ? ReadonlyAccount : TAccountCarAccount, TAccountPayer extends string - ? WritableSignerAccount & - AccountSignerMeta + ? WritableSignerAccount & AccountSignerMeta : TAccountPayer, ...TRemainingAccounts, ] @@ -71,10 +63,10 @@ export type ReturnCarInstructionData = { discriminator: number }; export type ReturnCarInstructionDataArgs = {}; export function getReturnCarInstructionDataEncoder(): FixedSizeEncoder { - return transformEncoder( - getStructEncoder([["discriminator", getU8Encoder()]]), - (value) => ({ ...value, discriminator: RETURN_CAR_DISCRIMINATOR }), - ); + return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ + ...value, + discriminator: RETURN_CAR_DISCRIMINATOR, + })); } export function getReturnCarInstructionDataDecoder(): FixedSizeDecoder { @@ -85,10 +77,7 @@ export function getReturnCarInstructionDataCodec(): FixedSizeCodec< ReturnCarInstructionDataArgs, ReturnCarInstructionData > { - return combineCodec( - getReturnCarInstructionDataEncoder(), - getReturnCarInstructionDataDecoder(), - ); + return combineCodec(getReturnCarInstructionDataEncoder(), getReturnCarInstructionDataDecoder()); } export type ReturnCarInput< @@ -110,21 +99,11 @@ export function getReturnCarInstruction< TAccountPayer extends string, TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, >( - input: ReturnCarInput< - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer - >, + input: ReturnCarInput, config?: { programAddress?: TProgramAddress }, -): ReturnCarInstruction< - TProgramAddress, - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer -> { +): ReturnCarInstruction { // Program address. - const programAddress = - config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; + const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { @@ -132,10 +111,7 @@ export function getReturnCarInstruction< carAccount: { value: input.carAccount ?? null, isWritable: false }, payer: { value: input.payer ?? null, isWritable: true }, }; - const accounts = originalAccounts as Record< - keyof typeof originalAccounts, - ResolvedInstructionAccount - >; + const accounts = originalAccounts as Record; const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ @@ -146,12 +122,7 @@ export function getReturnCarInstruction< ], data: getReturnCarInstructionDataEncoder().encode({}), programAddress, - } as ReturnCarInstruction< - TProgramAddress, - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer - >); + } as ReturnCarInstruction); } export type ParsedReturnCarInstruction< @@ -170,22 +141,14 @@ export type ParsedReturnCarInstruction< data: ReturnCarInstructionData; }; -export function parseReturnCarInstruction< - TProgram extends string, - TAccountMetas extends readonly AccountMeta[], ->( - instruction: Instruction & - InstructionWithAccounts & - InstructionWithData, +export function parseReturnCarInstruction( + instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedReturnCarInstruction { if (instruction.accounts.length < 3) { - throw new SolanaError( - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 3, - }, - ); + throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { + actualAccountMetas: instruction.accounts.length, + expectedAccountMetas: 3, + }); } let accountIndex = 0; const getNextAccount = () => { diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts b/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts index 2d2fcdab..1dbc4e71 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts @@ -7,23 +7,23 @@ */ import { - assertIsInstructionWithAccounts, - containsBytes, - extendClient, - getU8Encoder, - SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, - SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, - SolanaError, type Address, + assertIsInstructionWithAccounts, type ClientWithPayer, type ClientWithRpc, type ClientWithTransactionPlanning, type ClientWithTransactionSending, + containsBytes, + extendClient, type GetAccountInfoApi, type GetMultipleAccountsApi, + getU8Encoder, type Instruction, type InstructionWithData, type ReadonlyUint8Array, + SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, + SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, + SolanaError, } from "@solana/kit"; import { addSelfFetchFunctions, @@ -32,29 +32,29 @@ import { type SelfPlanAndSendFunctions, } from "@solana/program-client-core"; import { - getCarCodec, - getRentalOrderCodec, type Car, type CarArgs, + getCarCodec, + getRentalOrderCodec, type RentalOrder, type RentalOrderArgs, } from "../accounts"; import { + type AddCarInput, + type BookRentalInput, getAddCarInstruction, getBookRentalInstruction, getPickUpCarInstruction, getReturnCarInstruction, - parseAddCarInstruction, - parseBookRentalInstruction, - parsePickUpCarInstruction, - parseReturnCarInstruction, - type AddCarInput, - type BookRentalInput, type ParsedAddCarInstruction, type ParsedBookRentalInstruction, type ParsedPickUpCarInstruction, type ParsedReturnCarInstruction, type PickUpCarInput, + parseAddCarInstruction, + parseBookRentalInstruction, + parsePickUpCarInstruction, + parseReturnCarInstruction, type ReturnCarInput, } from "../instructions"; @@ -89,10 +89,10 @@ export function identifyCarRentalServiceInstruction( if (containsBytes(data, getU8Encoder().encode(3), 0)) { return CarRentalServiceInstruction.ReturnCar; } - throw new SolanaError( - SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, - { instructionData: data, programName: "carRentalService" }, - ); + throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, { + instructionData: data, + programName: "carRentalService", + }); } export type ParsedCarRentalServiceInstruction< @@ -145,13 +145,10 @@ export function parseCarRentalServiceInstruction( }; } default: - throw new SolanaError( - SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, - { - instructionType: instructionType as string, - programName: "carRentalService", - }, - ); + throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, { + instructionType: instructionType as string, + programName: "carRentalService", + }); } } @@ -162,8 +159,7 @@ export type CarRentalServicePlugin = { export type CarRentalServicePluginAccounts = { car: ReturnType & SelfFetchFunctions; - rentalOrder: ReturnType & - SelfFetchFunctions; + rentalOrder: ReturnType & SelfFetchFunctions; }; export type CarRentalServicePluginInstructions = { @@ -181,9 +177,7 @@ export type CarRentalServicePluginInstructions = { ) => ReturnType & SelfPlanAndSendFunctions; }; -export type CarRentalServicePluginRequirements = ClientWithRpc< - GetAccountInfoApi & GetMultipleAccountsApi -> & +export type CarRentalServicePluginRequirements = ClientWithRpc & ClientWithPayer & ClientWithTransactionPlanning & ClientWithTransactionSending; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts b/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts index f4d5054d..6034aec0 100644 --- a/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts +++ b/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts @@ -8,11 +8,11 @@ import { combineCodec, - getEnumDecoder, - getEnumEncoder, type FixedSizeCodec, type FixedSizeDecoder, type FixedSizeEncoder, + getEnumDecoder, + getEnumEncoder, } from "@solana/kit"; export enum RentalOrderStatus { @@ -31,12 +31,6 @@ export function getRentalOrderStatusDecoder(): FixedSizeDecoder { - return combineCodec( - getRentalOrderStatusEncoder(), - getRentalOrderStatusDecoder(), - ); +export function getRentalOrderStatusCodec(): FixedSizeCodec { + return combineCodec(getRentalOrderStatusEncoder(), getRentalOrderStatusDecoder()); } diff --git a/tools/shank-and-codama/native/tests/test.ts b/tools/shank-and-codama/native/tests/test.ts index 240c623c..1cbe6e75 100644 --- a/tools/shank-and-codama/native/tests/test.ts +++ b/tools/shank-and-codama/native/tests/test.ts @@ -213,18 +213,11 @@ test("pick_up_car rejects a payer that did not sign", async () => { const instructionWithoutVictimSignature: Instruction = { ...instruction, accounts: instruction.accounts.map((account) => - account.address === victim.address - ? { address: account.address, role: AccountRole.WRITABLE } - : account, + account.address === victim.address ? { address: account.address, role: AccountRole.WRITABLE } : account, ), }; - await expectCustomError( - svm, - attacker, - instructionWithoutVictimSignature, - ERROR_PAYER_SIGNATURE_MISSING, - ); + await expectCustomError(svm, attacker, instructionWithoutVictimSignature, ERROR_PAYER_SIGNATURE_MISSING); // The rental is untouched. const rental = decodeRentalOrder(svm.getAccount(rentalAccount)!); From 15ce53fa3e9f7370eb55db5ed5f04580bad79a42 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Fri, 12 Jun 2026 10:00:33 -0400 Subject: [PATCH 076/138] docs: rewrite README intro for SEO and LLM extraction --- README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 67305c41..12a73821 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ -# Quicknode Solana Program Examples +# Solana Program Examples -> A fork of the [Solana Foundation program examples](https://github.com/solana-developers/program-examples) with current versions, more [programs](https://solana.com/docs/terminology#program), and additional frameworks. +Working, tested, up-to-date examples of common Solana programs โ€” maintained by [Quicknode](https://quicknode.com). Each example compiles and passes CI on the current Solana and Anchor toolchain. [![Anchor](../../actions/workflows/anchor.yml/badge.svg)](../../actions/workflows/anchor.yml) [![Quasar](../../actions/workflows/quasar.yml/badge.svg)](../../actions/workflows/quasar.yml) [![Pinocchio](../../actions/workflows/pinocchio.yml/badge.svg)](../../actions/workflows/pinocchio.yml) [![Native](../../actions/workflows/native.yml/badge.svg)](../../actions/workflows/native.yml) [![ASM](../../actions/workflows/solana-asm.yml/badge.svg)](../../actions/workflows/solana-asm.yml) +**What you can build here:** escrow, AMM-based token swaps, order-book exchanges, token fundraisers, vault strategies, betting markets, NFTs, token extensions, compressed NFTs, and all the foundational Solana patterns (PDAs, CPIs, account management, rent). + Each example is available in one or more of the following frameworks: - [โš“ Anchor](https://www.anchor-lang.com/) - the most popular framework for Solana development. Build with `anchor build`, test with `pnpm test` as defined in `Anchor.toml`. @@ -15,8 +17,16 @@ Each example is available in one or more of the following frameworks: > [!NOTE] > You don't need to write your own program for basic tasks like creating [accounts](https://solana.com/docs/terminology#account), transferring SOL, or minting tokens. These are handled by existing programs like the System Program and Token Program. +## Getting started + +You need [Rust](https://www.rust-lang.org/tools/install), [Solana CLI](https://docs.anza.xyz/cli/install), [Anchor](https://www.anchor-lang.com/docs/installation), and [pnpm](https://pnpm.io/installation) installed. Clone the repo, `cd` into any example directory, and run `pnpm test`. + +To deploy to mainnet or devnet you'll need an RPC endpoint. [Quicknode](https://quicknode.com) provides free and paid Solana endpoints โ€” create one and set it as your cluster in `Anchor.toml` or with `solana config set --url `. + ## Financial Software +The programs below implement the core primitives of Solana DeFi: peer-to-peer trading (escrow), decentralized exchanges (AMM and order book), fundraising, yield-bearing vaults, and prediction markets. These are the building blocks used by protocols like Raydium, Orca, Openbook, and Kamino. + ### Escrow **Start here - the best first finance program to learn on Solana.** A neutral account that holds funds until both sides deliver, like a real-estate escrow or a lawyer's trust account. The maker deposits token A and names how much token B they want; when a taker supplies token B, the program swaps both in a single all-or-nothing transaction. This swap is the core idea behind every onchain exchange. From 663f4ead93f9e3bffc26e8d293817c5dda912982 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Fri, 12 Jun 2026 10:20:24 -0400 Subject: [PATCH 077/138] ci: exclude generated code from biome lint The Codama-generated client under tools/shank-and-codama emits `{}` arg types that trip biome's noBannedTypes rule. Generated code is not hand-maintained and is overwritten on regeneration, so exclude any generated/ directory from linting. --- biome.jsonc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/biome.jsonc b/biome.jsonc index a42a6112..7fcec1f2 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -1,7 +1,9 @@ { "$schema": "https://biomejs.dev/schemas/2.4.12/schema.json", "files": { - "includes": ["**", "!**/Assets"] + // Generated code (e.g. Codama clients) is excluded - it's not + // hand-maintained and gets overwritten on every regeneration. + "includes": ["**", "!**/Assets", "!**/generated/**"] }, "formatter": { // Matches more existing code, From 089e7f7114ebc2c2b63e557c42807896ad1942ac Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 12 Jun 2026 14:29:29 +0000 Subject: [PATCH 078/138] tests: replace web3.js v1 TypeScript tests with Rust + LiteSVM everywhere The native, pinocchio, and asm examples carried web3.js v1 + solana-bankrun + ts-mocha TypeScript test suites that duplicated the Rust + LiteSVM tests already living in each program crate. Anchor and Quasar examples already tested with cargo test, so this makes Rust + LiteSVM the single test pattern for the whole repository. - Delete the TypeScript tests, ts/ client dirs, package.json, pnpm-lock.yaml, and tsconfig files from ~30 native/pinocchio/asm projects - Point the Rust tests' include_bytes! at the workspace target/deploy (built by cargo build-sbf) instead of per-project tests/fixtures; keep committed foreign fixtures like mpl_token_metadata.so - Standardize asm examples on sbpf build's default deploy/ output - Add a Rust + LiteSVM test for hello-solana/pinocchio (previously TS-only) - Port the block-list transfer-hook test to Rust, driving the program through its Codama-generated Rust SDK (full lifecycle incl. AccountBlocked failure) - Switch shank-and-codama to generate a Rust client (renderers-rust) wrapped in a car-rental-service-client crate; port its four tests to Rust - Rework native.yml, pinocchio.yml, and solana-asm.yml CI to drop Node/pnpm and run cargo build-sbf (or sbpf build) + cargo test - Update root README, CONTRIBUTING, per-project READMEs, and CHANGELOG - Fix a broken solana-sdk 4.0.1 dev-dependency in checking-accounts (native and pinocchio) that no longer compiled https://claude.ai/code/session_01GfHnheiE7VPmapt3v4c42p --- .github/workflows/native.yml | 59 +- .github/workflows/pinocchio.yml | 59 +- .github/workflows/solana-asm.yml | 43 +- CHANGELOG.md | 15 + CONTRIBUTING.md | 6 +- Cargo.lock | 300 +- README.md | 14 +- basics/account-data/native/package.json | 24 - basics/account-data/native/pnpm-lock.yaml | 1360 --------- .../native/program/tests/tests.rs | 6 +- basics/account-data/native/tests/test.ts | 76 - basics/account-data/native/tsconfig.json | 10 - basics/account-data/pinocchio/package.json | 22 - basics/account-data/pinocchio/pnpm-lock.yaml | 1371 --------- .../pinocchio/program/tests/tests.rs | 6 +- .../pinocchio/tests/index.test.ts | 142 - basics/account-data/pinocchio/tsconfig.json | 10 - basics/checking-accounts/asm/README.md | 7 + basics/checking-accounts/asm/package.json | 22 - basics/checking-accounts/asm/pnpm-lock.yaml | 1349 --------- basics/checking-accounts/asm/src/lib.rs | 4 +- basics/checking-accounts/asm/tests/test.ts | 247 -- basics/checking-accounts/asm/tsconfig.json | 10 - basics/checking-accounts/native/package.json | 22 - .../checking-accounts/native/pnpm-lock.yaml | 1344 --------- .../native/program/Cargo.toml | 2 +- .../native/program/tests/test.rs | 9 +- basics/checking-accounts/native/tests/test.ts | 54 - basics/checking-accounts/native/tsconfig.json | 10 - .../checking-accounts/pinocchio/package.json | 22 - .../pinocchio/pnpm-lock.yaml | 1351 --------- .../pinocchio/program/Cargo.toml | 12 +- .../pinocchio/program/tests/test.rs | 9 +- .../checking-accounts/pinocchio/tests/test.ts | 54 - .../checking-accounts/pinocchio/tsconfig.json | 10 - basics/close-account/native/package.json | 20 - basics/close-account/native/pnpm-lock.yaml | 1753 ----------- .../native/program/tests/test.rs | 6 +- .../native/tests/close-account.test.ts | 153 - .../fixtures/close_account_native_program.so | Bin 88528 -> 0 bytes basics/close-account/native/ts/index.ts | 2 - .../native/ts/instructions/close.ts | 54 - .../native/ts/instructions/create.ts | 59 - .../native/ts/instructions/index.ts | 7 - basics/close-account/native/ts/state/index.ts | 34 - basics/close-account/pinocchio/package.json | 22 - basics/close-account/pinocchio/pnpm-lock.yaml | 1342 --------- .../pinocchio/program/tests/tests.rs | 6 +- .../pinocchio/tests/close-account.test.ts | 5 - .../close_account_pinocchio_program.so | Bin 19200 -> 0 bytes .../pinocchio/tests/tsconfig.test.json | 10 - basics/close-account/pinocchio/tsconfig.json | 10 - basics/counter/native/README.md | 9 +- basics/counter/native/package.json | 30 - basics/counter/native/pnpm-lock.yaml | 1357 --------- basics/counter/native/program/tests/test.rs | 11 +- basics/counter/native/tests/counter.test.ts | 99 - .../counter/native/tests/tsconfig.test.json | 10 - basics/counter/native/ts/accounts/counter.ts | 17 - basics/counter/native/ts/accounts/index.ts | 1 - basics/counter/native/ts/index.ts | 6 - .../createIncrementInstruction.ts | 20 - .../counter/native/ts/instructions/index.ts | 1 - basics/counter/pinocchio/README.md | 9 +- basics/counter/pinocchio/package.json | 29 - basics/counter/pinocchio/pnpm-lock.yaml | 1354 --------- .../counter/pinocchio/program/tests/test.rs | 10 +- .../counter/pinocchio/tests/counter.test.ts | 5 - .../pinocchio/tests/tsconfig.test.json | 10 - basics/create-account/asm/README.md | 7 + basics/create-account/asm/package.json | 22 - basics/create-account/asm/pnpm-lock.yaml | 1342 --------- basics/create-account/asm/tests/test.ts | 68 - basics/create-account/asm/tsconfig.json | 10 - basics/create-account/native/package.json | 22 - basics/create-account/native/pnpm-lock.yaml | 1344 --------- .../native/program/tests/test.rs | 6 +- basics/create-account/native/tests/test.ts | 66 - basics/create-account/native/tsconfig.json | 10 - basics/create-account/pinocchio/package.json | 22 - .../create-account/pinocchio/pnpm-lock.yaml | 1344 --------- .../pinocchio/program/tests/test.rs | 6 +- basics/create-account/pinocchio/tests/test.ts | 58 - basics/create-account/pinocchio/tsconfig.json | 10 - .../native/package.json | 7 - .../native/pnpm-lock.yaml | 9 - .../native/programs/hand/tests/test.rs | 9 +- basics/favorites/native/package.json | 24 - basics/favorites/native/pnpm-lock.yaml | 1355 --------- basics/favorites/native/program/tests/test.rs | 6 +- basics/favorites/native/tests/test.ts | 194 -- basics/favorites/native/tsconfig.json | 10 - basics/favorites/pinocchio/package.json | 24 - basics/favorites/pinocchio/pnpm-lock.yaml | 1355 --------- .../favorites/pinocchio/program/tests/test.rs | 6 +- basics/favorites/pinocchio/tests/test.ts | 5 - basics/favorites/pinocchio/tsconfig.json | 10 - basics/hello-solana/asm/README.md | 7 + basics/hello-solana/asm/package.json | 23 - basics/hello-solana/asm/pnpm-lock.yaml | 1347 --------- basics/hello-solana/asm/src/lib.rs | 2 +- basics/hello-solana/asm/tests/index.test.ts | 35 - basics/hello-solana/asm/tsconfig.json | 10 - basics/hello-solana/native/package.json | 22 - basics/hello-solana/native/pnpm-lock.yaml | 1344 --------- .../hello-solana/native/program/tests/test.rs | 6 +- .../hello-solana/native/tests/index.test.ts | 36 - basics/hello-solana/native/tsconfig.json | 10 - basics/hello-solana/pinocchio/package.json | 23 - basics/hello-solana/pinocchio/pnpm-lock.yaml | 1345 --------- .../hello-solana/pinocchio/program/Cargo.toml | 8 + .../pinocchio/program/tests/test.rs | 43 + .../pinocchio/tests/index.test.ts | 39 - basics/hello-solana/pinocchio/tsconfig.json | 10 - basics/pda-rent-payer/native/package.json | 23 - basics/pda-rent-payer/native/pnpm-lock.yaml | 1352 --------- .../native/program/tests/test.rs | 6 +- basics/pda-rent-payer/native/tests/test.ts | 87 - basics/pda-rent-payer/native/tsconfig.json | 10 - basics/pda-rent-payer/pinocchio/package.json | 22 - .../pda-rent-payer/pinocchio/pnpm-lock.yaml | 1344 --------- .../pinocchio/program/tests/test.rs | 6 +- basics/pda-rent-payer/pinocchio/tests/test.ts | 5 - basics/pda-rent-payer/pinocchio/tsconfig.json | 10 - .../native/package.json | 23 - .../native/pnpm-lock.yaml | 1352 --------- .../native/program/tests/test.rs | 6 +- .../native/tests/test.ts | 53 - .../native/tsconfig.json | 10 - .../pinocchio/package.json | 22 - .../pinocchio/pnpm-lock.yaml | 1344 --------- .../pinocchio/program/tests/test.rs | 6 +- .../pinocchio/tests/test.ts | 5 - .../pinocchio/tsconfig.json | 10 - .../native/package.json | 23 - .../native/pnpm-lock.yaml | 1300 -------- .../native/program/tests/test.rs | 6 +- .../native/tests/test.ts | 129 - .../native/tsconfig.json | 10 - .../pinocchio/package.json | 22 - .../pinocchio/pnpm-lock.yaml | 1292 -------- .../pinocchio/program/tests/test.rs | 6 +- .../pinocchio/tests/test.ts | 5 - .../pinocchio/tsconfig.json | 10 - basics/realloc/pinocchio/package.json | 23 - basics/realloc/pinocchio/pnpm-lock.yaml | 1352 --------- .../realloc/pinocchio/program/tests/test.rs | 6 +- .../realloc/pinocchio/tests/realloc.test.ts | 5 - .../pinocchio/tests/tsconfig.test.json | 10 - basics/rent/native/package.json | 25 - basics/rent/native/pnpm-lock.yaml | 1363 --------- basics/rent/native/program/tests/test.rs | 6 +- basics/rent/native/tests/test.ts | 54 - basics/rent/native/tsconfig.json | 10 - basics/rent/pinocchio/package.json | 25 - basics/rent/pinocchio/pnpm-lock.yaml | 1363 --------- basics/rent/pinocchio/program/tests/test.rs | 6 +- basics/rent/pinocchio/tests/test.ts | 5 - basics/rent/pinocchio/tsconfig.json | 10 - basics/repository-layout/native/package.json | 24 - .../repository-layout/native/pnpm-lock.yaml | 1360 --------- .../native/program/tests/test.rs | 6 +- basics/repository-layout/native/tests/test.ts | 148 - basics/repository-layout/native/tsconfig.json | 10 - basics/transfer-sol/asm/README.md | 7 + basics/transfer-sol/asm/package.json | 24 - basics/transfer-sol/asm/pnpm-lock.yaml | 1359 --------- basics/transfer-sol/asm/tests/instruction.ts | 22 - basics/transfer-sol/asm/tests/test.ts | 55 - basics/transfer-sol/asm/tsconfig.json | 10 - basics/transfer-sol/native/package.json | 25 - basics/transfer-sol/native/pnpm-lock.yaml | 1369 --------- .../transfer-sol/native/program/tests/test.rs | 8 +- .../tests/fixtures/transfer_sol_program.so | Bin 70680 -> 0 bytes .../transfer-sol/native/tests/instruction.ts | 40 - basics/transfer-sol/native/tests/test.ts | 88 - basics/transfer-sol/native/tsconfig.json | 10 - basics/transfer-sol/pinocchio/package.json | 24 - basics/transfer-sol/pinocchio/pnpm-lock.yaml | 1361 --------- .../pinocchio/program/tests/test.rs | 6 +- basics/transfer-sol/pinocchio/tests/test.ts | 5 - basics/transfer-sol/pinocchio/tsconfig.json | 10 - finance/escrow/native/README.md | 8 +- finance/escrow/native/package.json | 7 - finance/escrow/native/pnpm-lock.yaml | 9 - finance/escrow/native/program/tests/test.rs | 6 +- tokens/create-token/native/package.json | 7 - tokens/create-token/native/pnpm-lock.yaml | 9 - .../create-token/native/program/tests/test.rs | 6 +- tokens/nft-minter/native/package.json | 7 - tokens/nft-minter/native/pnpm-lock.yaml | 9 - .../nft-minter/native/program/tests/test.rs | 6 +- tokens/pda-mint-authority/native/package.json | 7 - .../pda-mint-authority/native/pnpm-lock.yaml | 9 - .../native/program/tests/test.rs | 6 +- .../default-account-state/native/README.md | 7 + .../default-account-state/native/package.json | 7 - .../native/pnpm-lock.yaml | 9 - .../native/program/tests/test.rs | 6 +- .../mint-close-authority/native/package.json | 7 - .../native/pnpm-lock.yaml | 9 - .../native/program/tests/test.rs | 6 +- .../multiple-extensions/native/package.json | 7 - .../multiple-extensions/native/pnpm-lock.yaml | 9 - .../native/program/tests/test.rs | 6 +- .../non-transferable/native/package.json | 7 - .../non-transferable/native/pnpm-lock.yaml | 9 - .../native/program/tests/test.rs | 6 +- .../transfer-fee/native/package.json | 7 - .../transfer-fee/native/pnpm-lock.yaml | 9 - .../transfer-fee/native/program/tests/test.rs | 6 +- .../block-list/pinocchio/package.json | 14 +- .../block-list/pinocchio/pnpm-lock.yaml | 1494 +-------- .../block-list/pinocchio/program/Cargo.toml | 11 + .../pinocchio/program/tests/test.rs | 414 +++ .../pinocchio/tests/run-mocha-with-retry.mjs | 92 - .../block-list/pinocchio/tests/test.spec.ts | 419 --- .../pinocchio/tests/tsconfig.test.json | 12 - .../block-list/pinocchio/tsconfig.json | 13 - .../transfer-hook/block-list/readme.md | 9 + tokens/token-minter/native/package.json | 7 - tokens/token-minter/native/pnpm-lock.yaml | 9 - .../token-minter/native/program/tests/test.rs | 6 +- tokens/transfer-tokens/native/package.json | 7 - tokens/transfer-tokens/native/pnpm-lock.yaml | 9 - .../native/program/tests/test.rs | 6 +- tools/shank-and-codama/native/README.md | 59 +- .../native/clients/rust/Cargo.toml | 32 + .../rust/src/generated/accounts/car.rs | 124 + .../rust/src/generated/accounts/mod.rs | 13 + .../src/generated/accounts/rental_order.rs | 130 + .../clients/rust/src/generated/errors/mod.rs | 9 + .../src/generated/instructions/add_car.rs | 422 +++ .../src/generated/instructions/book_rental.rs | 483 +++ .../rust/src/generated/instructions/mod.rs | 17 + .../src/generated/instructions/pick_up_car.rs | 350 +++ .../src/generated/instructions/return_car.rs | 350 +++ .../native/clients/rust/src/generated/mod.rs | 15 + .../clients/rust/src/generated/programs.rs | 13 + .../clients/rust/src/generated/shared.rs | 26 + .../clients/rust/src/generated/types/mod.rs | 11 + .../generated/types/rental_order_status.rs | 20 + .../native/clients/rust/src/lib.rs | 2 + tools/shank-and-codama/native/codama.ts | 27 +- tools/shank-and-codama/native/package.json | 14 +- tools/shank-and-codama/native/pnpm-lock.yaml | 1049 +------ .../native/program/Cargo.lock | 2683 ++++++++++++++++- .../native/program/Cargo.toml | 9 + .../native/program/tests/test.rs | 329 ++ .../generated/src/generated/accounts/car.ts | 113 - .../generated/src/generated/accounts/index.ts | 10 - .../src/generated/accounts/rentalOrder.ts | 141 - .../tests/generated/src/generated/index.ts | 12 - .../src/generated/instructions/addCar.ts | 203 -- .../src/generated/instructions/bookRental.ts | 231 -- .../src/generated/instructions/index.ts | 12 - .../src/generated/instructions/pickUpCar.ts | 168 -- .../src/generated/instructions/returnCar.ts | 168 -- .../generated/programs/carRentalService.ts | 236 -- .../generated/src/generated/programs/index.ts | 9 - .../generated/src/generated/types/index.ts | 9 - .../src/generated/types/rentalOrderStatus.ts | 36 - tools/shank-and-codama/native/tests/test.ts | 291 -- .../native/tests/tsconfig.test.json | 14 - 264 files changed, 5862 insertions(+), 49629 deletions(-) delete mode 100644 basics/account-data/native/package.json delete mode 100644 basics/account-data/native/pnpm-lock.yaml delete mode 100644 basics/account-data/native/tests/test.ts delete mode 100644 basics/account-data/native/tsconfig.json delete mode 100644 basics/account-data/pinocchio/package.json delete mode 100644 basics/account-data/pinocchio/pnpm-lock.yaml delete mode 100644 basics/account-data/pinocchio/tests/index.test.ts delete mode 100644 basics/account-data/pinocchio/tsconfig.json delete mode 100644 basics/checking-accounts/asm/package.json delete mode 100644 basics/checking-accounts/asm/pnpm-lock.yaml delete mode 100644 basics/checking-accounts/asm/tests/test.ts delete mode 100644 basics/checking-accounts/asm/tsconfig.json delete mode 100644 basics/checking-accounts/native/package.json delete mode 100644 basics/checking-accounts/native/pnpm-lock.yaml delete mode 100644 basics/checking-accounts/native/tests/test.ts delete mode 100644 basics/checking-accounts/native/tsconfig.json delete mode 100644 basics/checking-accounts/pinocchio/package.json delete mode 100644 basics/checking-accounts/pinocchio/pnpm-lock.yaml delete mode 100644 basics/checking-accounts/pinocchio/tests/test.ts delete mode 100644 basics/checking-accounts/pinocchio/tsconfig.json delete mode 100644 basics/close-account/native/package.json delete mode 100644 basics/close-account/native/pnpm-lock.yaml delete mode 100644 basics/close-account/native/tests/close-account.test.ts delete mode 100755 basics/close-account/native/tests/fixtures/close_account_native_program.so delete mode 100644 basics/close-account/native/ts/index.ts delete mode 100644 basics/close-account/native/ts/instructions/close.ts delete mode 100644 basics/close-account/native/ts/instructions/create.ts delete mode 100644 basics/close-account/native/ts/instructions/index.ts delete mode 100644 basics/close-account/native/ts/state/index.ts delete mode 100644 basics/close-account/pinocchio/package.json delete mode 100644 basics/close-account/pinocchio/pnpm-lock.yaml delete mode 100644 basics/close-account/pinocchio/tests/close-account.test.ts delete mode 100755 basics/close-account/pinocchio/tests/fixtures/close_account_pinocchio_program.so delete mode 100644 basics/close-account/pinocchio/tests/tsconfig.test.json delete mode 100644 basics/close-account/pinocchio/tsconfig.json delete mode 100644 basics/counter/native/package.json delete mode 100644 basics/counter/native/pnpm-lock.yaml delete mode 100644 basics/counter/native/tests/counter.test.ts delete mode 100644 basics/counter/native/tests/tsconfig.test.json delete mode 100644 basics/counter/native/ts/accounts/counter.ts delete mode 100644 basics/counter/native/ts/accounts/index.ts delete mode 100644 basics/counter/native/ts/index.ts delete mode 100644 basics/counter/native/ts/instructions/createIncrementInstruction.ts delete mode 100644 basics/counter/native/ts/instructions/index.ts delete mode 100644 basics/counter/pinocchio/package.json delete mode 100644 basics/counter/pinocchio/pnpm-lock.yaml delete mode 100644 basics/counter/pinocchio/tests/counter.test.ts delete mode 100644 basics/counter/pinocchio/tests/tsconfig.test.json delete mode 100644 basics/create-account/asm/package.json delete mode 100644 basics/create-account/asm/pnpm-lock.yaml delete mode 100644 basics/create-account/asm/tests/test.ts delete mode 100644 basics/create-account/asm/tsconfig.json delete mode 100644 basics/create-account/native/package.json delete mode 100644 basics/create-account/native/pnpm-lock.yaml delete mode 100644 basics/create-account/native/tests/test.ts delete mode 100644 basics/create-account/native/tsconfig.json delete mode 100644 basics/create-account/pinocchio/package.json delete mode 100644 basics/create-account/pinocchio/pnpm-lock.yaml delete mode 100644 basics/create-account/pinocchio/tests/test.ts delete mode 100644 basics/create-account/pinocchio/tsconfig.json delete mode 100644 basics/cross-program-invocation/native/package.json delete mode 100644 basics/cross-program-invocation/native/pnpm-lock.yaml delete mode 100644 basics/favorites/native/package.json delete mode 100644 basics/favorites/native/pnpm-lock.yaml delete mode 100644 basics/favorites/native/tests/test.ts delete mode 100644 basics/favorites/native/tsconfig.json delete mode 100644 basics/favorites/pinocchio/package.json delete mode 100644 basics/favorites/pinocchio/pnpm-lock.yaml delete mode 100644 basics/favorites/pinocchio/tests/test.ts delete mode 100644 basics/favorites/pinocchio/tsconfig.json delete mode 100644 basics/hello-solana/asm/package.json delete mode 100644 basics/hello-solana/asm/pnpm-lock.yaml delete mode 100644 basics/hello-solana/asm/tests/index.test.ts delete mode 100644 basics/hello-solana/asm/tsconfig.json delete mode 100644 basics/hello-solana/native/package.json delete mode 100644 basics/hello-solana/native/pnpm-lock.yaml delete mode 100644 basics/hello-solana/native/tests/index.test.ts delete mode 100644 basics/hello-solana/native/tsconfig.json delete mode 100644 basics/hello-solana/pinocchio/package.json delete mode 100644 basics/hello-solana/pinocchio/pnpm-lock.yaml create mode 100644 basics/hello-solana/pinocchio/program/tests/test.rs delete mode 100644 basics/hello-solana/pinocchio/tests/index.test.ts delete mode 100644 basics/hello-solana/pinocchio/tsconfig.json delete mode 100644 basics/pda-rent-payer/native/package.json delete mode 100644 basics/pda-rent-payer/native/pnpm-lock.yaml delete mode 100644 basics/pda-rent-payer/native/tests/test.ts delete mode 100644 basics/pda-rent-payer/native/tsconfig.json delete mode 100644 basics/pda-rent-payer/pinocchio/package.json delete mode 100644 basics/pda-rent-payer/pinocchio/pnpm-lock.yaml delete mode 100644 basics/pda-rent-payer/pinocchio/tests/test.ts delete mode 100644 basics/pda-rent-payer/pinocchio/tsconfig.json delete mode 100644 basics/processing-instructions/native/package.json delete mode 100644 basics/processing-instructions/native/pnpm-lock.yaml delete mode 100644 basics/processing-instructions/native/tests/test.ts delete mode 100644 basics/processing-instructions/native/tsconfig.json delete mode 100644 basics/processing-instructions/pinocchio/package.json delete mode 100644 basics/processing-instructions/pinocchio/pnpm-lock.yaml delete mode 100644 basics/processing-instructions/pinocchio/tests/test.ts delete mode 100644 basics/processing-instructions/pinocchio/tsconfig.json delete mode 100644 basics/program-derived-addresses/native/package.json delete mode 100644 basics/program-derived-addresses/native/pnpm-lock.yaml delete mode 100644 basics/program-derived-addresses/native/tests/test.ts delete mode 100644 basics/program-derived-addresses/native/tsconfig.json delete mode 100644 basics/program-derived-addresses/pinocchio/package.json delete mode 100644 basics/program-derived-addresses/pinocchio/pnpm-lock.yaml delete mode 100644 basics/program-derived-addresses/pinocchio/tests/test.ts delete mode 100644 basics/program-derived-addresses/pinocchio/tsconfig.json delete mode 100644 basics/realloc/pinocchio/package.json delete mode 100644 basics/realloc/pinocchio/pnpm-lock.yaml delete mode 100644 basics/realloc/pinocchio/tests/realloc.test.ts delete mode 100644 basics/realloc/pinocchio/tests/tsconfig.test.json delete mode 100644 basics/rent/native/package.json delete mode 100644 basics/rent/native/pnpm-lock.yaml delete mode 100644 basics/rent/native/tests/test.ts delete mode 100644 basics/rent/native/tsconfig.json delete mode 100644 basics/rent/pinocchio/package.json delete mode 100644 basics/rent/pinocchio/pnpm-lock.yaml delete mode 100644 basics/rent/pinocchio/tests/test.ts delete mode 100644 basics/rent/pinocchio/tsconfig.json delete mode 100644 basics/repository-layout/native/package.json delete mode 100644 basics/repository-layout/native/pnpm-lock.yaml delete mode 100644 basics/repository-layout/native/tests/test.ts delete mode 100644 basics/repository-layout/native/tsconfig.json delete mode 100644 basics/transfer-sol/asm/package.json delete mode 100644 basics/transfer-sol/asm/pnpm-lock.yaml delete mode 100644 basics/transfer-sol/asm/tests/instruction.ts delete mode 100644 basics/transfer-sol/asm/tests/test.ts delete mode 100644 basics/transfer-sol/asm/tsconfig.json delete mode 100644 basics/transfer-sol/native/package.json delete mode 100644 basics/transfer-sol/native/pnpm-lock.yaml delete mode 100755 basics/transfer-sol/native/tests/fixtures/transfer_sol_program.so delete mode 100644 basics/transfer-sol/native/tests/instruction.ts delete mode 100644 basics/transfer-sol/native/tests/test.ts delete mode 100644 basics/transfer-sol/native/tsconfig.json delete mode 100644 basics/transfer-sol/pinocchio/package.json delete mode 100644 basics/transfer-sol/pinocchio/pnpm-lock.yaml delete mode 100644 basics/transfer-sol/pinocchio/tests/test.ts delete mode 100644 basics/transfer-sol/pinocchio/tsconfig.json delete mode 100644 finance/escrow/native/package.json delete mode 100644 finance/escrow/native/pnpm-lock.yaml delete mode 100644 tokens/create-token/native/package.json delete mode 100644 tokens/create-token/native/pnpm-lock.yaml delete mode 100644 tokens/nft-minter/native/package.json delete mode 100644 tokens/nft-minter/native/pnpm-lock.yaml delete mode 100644 tokens/pda-mint-authority/native/package.json delete mode 100644 tokens/pda-mint-authority/native/pnpm-lock.yaml delete mode 100644 tokens/token-extensions/default-account-state/native/package.json delete mode 100644 tokens/token-extensions/default-account-state/native/pnpm-lock.yaml delete mode 100644 tokens/token-extensions/mint-close-authority/native/package.json delete mode 100644 tokens/token-extensions/mint-close-authority/native/pnpm-lock.yaml delete mode 100644 tokens/token-extensions/multiple-extensions/native/package.json delete mode 100644 tokens/token-extensions/multiple-extensions/native/pnpm-lock.yaml delete mode 100644 tokens/token-extensions/non-transferable/native/package.json delete mode 100644 tokens/token-extensions/non-transferable/native/pnpm-lock.yaml delete mode 100644 tokens/token-extensions/transfer-fee/native/package.json delete mode 100644 tokens/token-extensions/transfer-fee/native/pnpm-lock.yaml create mode 100644 tokens/token-extensions/transfer-hook/block-list/pinocchio/program/tests/test.rs delete mode 100644 tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/run-mocha-with-retry.mjs delete mode 100644 tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/test.spec.ts delete mode 100644 tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/tsconfig.test.json delete mode 100644 tokens/token-extensions/transfer-hook/block-list/pinocchio/tsconfig.json delete mode 100644 tokens/token-minter/native/package.json delete mode 100644 tokens/token-minter/native/pnpm-lock.yaml delete mode 100644 tokens/transfer-tokens/native/package.json delete mode 100644 tokens/transfer-tokens/native/pnpm-lock.yaml create mode 100644 tools/shank-and-codama/native/clients/rust/Cargo.toml create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/accounts/car.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/accounts/mod.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/accounts/rental_order.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/errors/mod.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/instructions/add_car.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/instructions/book_rental.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/instructions/mod.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/instructions/pick_up_car.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/instructions/return_car.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/mod.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/programs.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/shared.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/types/mod.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/generated/types/rental_order_status.rs create mode 100644 tools/shank-and-codama/native/clients/rust/src/lib.rs create mode 100644 tools/shank-and-codama/native/program/tests/test.rs delete mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts delete mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/accounts/index.ts delete mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts delete mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/index.ts delete mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts delete mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts delete mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/instructions/index.ts delete mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts delete mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts delete mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts delete mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/programs/index.ts delete mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/types/index.ts delete mode 100644 tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts delete mode 100644 tools/shank-and-codama/native/tests/test.ts delete mode 100644 tools/shank-and-codama/native/tests/tsconfig.test.json diff --git a/.github/workflows/native.yml b/.github/workflows/native.yml index ab4334cb..d96bff72 100644 --- a/.github/workflows/native.yml +++ b/.github/workflows/native.yml @@ -158,12 +158,6 @@ jobs: key: cargo-${{ runner.os }}-${{ hashFiles('**/Cargo.toml', '**/Cargo.lock') }} restore-keys: | cargo-${{ runner.os }}- - - uses: pnpm/action-setup@v4 - - name: Use Node.js - uses: actions/setup-node@v5 - with: - node-version: 'lts/*' - check-latest: true - name: Setup build environment id: setup run: | @@ -175,40 +169,45 @@ jobs: echo "Building and Testing $project with Solana $solana_version" cd "$project" || return 1 - # Install dependencies - if ! pnpm install --frozen-lockfile; then - echo "::error::pnpm install failed for $project" - echo "$project: pnpm install failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt - cd - > /dev/null - return 1 + # Collect program manifests: single-program projects use program/, + # multi-program projects (e.g. cross-program-invocation) use programs/*/. + local manifests=() + if [ -d "program" ]; then + manifests=("./program/Cargo.toml") + elif [ -d "programs" ]; then + for manifest in programs/*/Cargo.toml; do + manifests+=("./$manifest") + done fi - # Build - if ! pnpm build; then - echo "::error::build failed for $project" - echo "$project: build failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt + if [ ${#manifests[@]} -eq 0 ]; then + echo "::error::no program manifest found for $project" + echo "$project: no program manifest found with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt cd - > /dev/null return 1 fi - # Test - if ! pnpm build-and-test; then - echo "::error::tests failed for $project" - echo "$project: tests failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt - cd - > /dev/null - return 1 - fi + # Build the .so files first: the Rust + LiteSVM tests embed them + # at compile time via include_bytes!, so the tests cannot even + # compile without a build, and a stale .so would test old code. + for manifest in "${manifests[@]}"; do + if ! cargo build-sbf --manifest-path="$manifest"; then + echo "::error::build failed for $project ($manifest)" + echo "$project: build failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt + cd - > /dev/null + return 1 + fi + done - # Run Rust unit tests - if [ -d "program" ]; then - echo "Running Rust unit tests for $project" - if ! cargo test --manifest-path=./program/Cargo.toml; then - echo "::error::Rust unit tests failed for $project" - echo "$project: Rust unit tests failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt + # Run the Rust + LiteSVM tests + for manifest in "${manifests[@]}"; do + if ! cargo test --manifest-path="$manifest"; then + echo "::error::tests failed for $project ($manifest)" + echo "$project: tests failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt cd - > /dev/null return 1 fi - fi + done echo "Build and tests succeeded for $project with $solana_version version." cd - > /dev/null diff --git a/.github/workflows/pinocchio.yml b/.github/workflows/pinocchio.yml index ccb79384..6d521c25 100644 --- a/.github/workflows/pinocchio.yml +++ b/.github/workflows/pinocchio.yml @@ -159,12 +159,6 @@ jobs: key: cargo-${{ runner.os }}-${{ hashFiles('**/Cargo.toml', '**/Cargo.lock') }} restore-keys: | cargo-${{ runner.os }}- - - uses: pnpm/action-setup@v4 - - name: Use Node.js - uses: actions/setup-node@v5 - with: - node-version: "lts/*" - check-latest: true - name: Setup build environment id: setup run: | @@ -176,40 +170,45 @@ jobs: echo "Building and Testing $project with Solana $solana_version" cd "$project" || return 1 - # Install dependencies - if ! pnpm install --frozen-lockfile; then - echo "::error::pnpm install failed for $project" - echo "$project: pnpm install failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt - cd - > /dev/null - return 1 + # Collect program manifests: single-program projects use program/, + # multi-program projects (e.g. cross-program-invocation) use programs/*/. + local manifests=() + if [ -d "program" ]; then + manifests=("./program/Cargo.toml") + elif [ -d "programs" ]; then + for manifest in programs/*/Cargo.toml; do + manifests+=("./$manifest") + done fi - # Build - if ! pnpm build; then - echo "::error::build failed for $project" - echo "$project: build failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt + if [ ${#manifests[@]} -eq 0 ]; then + echo "::error::no program manifest found for $project" + echo "$project: no program manifest found with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt cd - > /dev/null return 1 fi - # Test - if ! pnpm build-and-test; then - echo "::error::tests failed for $project" - echo "$project: tests failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt - cd - > /dev/null - return 1 - fi + # Build the .so files first: the Rust + LiteSVM tests embed them + # at compile time via include_bytes!, so the tests cannot even + # compile without a build, and a stale .so would test old code. + for manifest in "${manifests[@]}"; do + if ! cargo build-sbf --manifest-path="$manifest"; then + echo "::error::build failed for $project ($manifest)" + echo "$project: build failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt + cd - > /dev/null + return 1 + fi + done - # Run Rust unit tests - if [ -d "program" ]; then - echo "Running Rust unit tests for $project" - if ! cargo test --manifest-path=./program/Cargo.toml; then - echo "::error::Rust unit tests failed for $project" - echo "$project: Rust unit tests failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt + # Run the Rust + LiteSVM tests + for manifest in "${manifests[@]}"; do + if ! cargo test --manifest-path="$manifest"; then + echo "::error::tests failed for $project ($manifest)" + echo "$project: tests failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt cd - > /dev/null return 1 fi - fi + done echo "Build and tests succeeded for $project with $solana_version version." cd - > /dev/null diff --git a/.github/workflows/solana-asm.yml b/.github/workflows/solana-asm.yml index d314032c..2cf2b104 100644 --- a/.github/workflows/solana-asm.yml +++ b/.github/workflows/solana-asm.yml @@ -129,17 +129,6 @@ jobs: failed_projects: ${{ steps.set-failed.outputs.failed_projects }} steps: - uses: actions/checkout@v4 - # The previous `npm install --global pnpm` step picked up a pnpm release that - # treats ignored build scripts (bufferutil, utf-8-validate) as a hard error and - # fails `pnpm install --frozen-lockfile`. The other workflows (anchor, native, - # pinocchio, typescript) use pnpm/action-setup@v4, which pins a known-good pnpm - # release (10.33.0 at time of writing) that only warns. Match that here. - - uses: pnpm/action-setup@v4 - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: "lts/*" - check-latest: true - name: Setup build environment id: setup run: | @@ -151,33 +140,24 @@ jobs: echo "Building and Testing $project with Solana $solana_version" cd "$project" || return 1 - # Install dependencies - if ! pnpm install --frozen-lockfile; then - echo "::error::pnpm install failed for $project" - echo "$project: pnpm install failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt + # Build the .so into deploy/: the Rust + LiteSVM tests embed it at + # compile time via include_bytes!, so the tests cannot even compile + # without a build, and a stale .so would test old code. + if ! sbpf build; then + echo "::error::sbpf build failed for $project" + echo "$project: sbpf build failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt cd - > /dev/null return 1 fi - # Build and Test - if ! pnpm build-and-test; then - echo "::error::build-and-test failed for $project" - echo "$project: build-and-test failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt + # Run the Rust + LiteSVM tests (inline in src/lib.rs) + if ! cargo test --manifest-path=./Cargo.toml; then + echo "::error::tests failed for $project" + echo "$project: tests failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt cd - > /dev/null return 1 fi - # Run Rust unit tests - if [ -d "program" ]; then - echo "Running Rust unit tests for $project" - if ! cargo test --manifest-path=./program/Cargo.toml; then - echo "::error::Rust unit tests failed for $project" - echo "$project: Rust unit tests failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt - cd - > /dev/null - return 1 - fi - fi - echo "Build and tests succeeded for $project with $solana_version version." cd - > /dev/null return 0 @@ -212,9 +192,6 @@ jobs: # Make the script executable chmod +x build_and_test.sh - # pnpm is installed by pnpm/action-setup@v4 above. Avoid `npm install --global pnpm` - # here because that resolves to pnpm 10+, which errors on ignored build scripts. - # Install sbpf assembler cargo install --git https://github.com/blueshift-gg/sbpf.git - name: Setup Solana Stable diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a97d4d3..028271cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,21 @@ All notable changes to this repository are documented here. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +## [2026-06-12] - Rust + LiteSVM tests everywhere + +### Changed + +- All native, Pinocchio, and ASM examples are now tested exclusively with Rust + LiteSVM. The web3.js v1 / solana-bankrun / ts-mocha TypeScript test suites (which duplicated existing Rust tests) were removed, along with their `package.json`, `pnpm-lock.yaml`, and `tsconfig.json` files and the `ts/` client directories. +- Rust tests now load the program binary from the workspace `target/deploy/` (built with `cargo build-sbf --manifest-path=./program/Cargo.toml`) instead of per-project `tests/fixtures` directories. Committed foreign-program fixtures (e.g. `mpl_token_metadata.so`) stay where they were. +- ASM examples standardized on `sbpf build`'s default `deploy/` output directory; their inline LiteSVM tests load from there. +- `tools/shank-and-codama` now generates a Rust client (`@codama/renderers-rust`) instead of a TypeScript one, wrapped in the `car-rental-service-client` crate, and its tests are Rust + LiteSVM under `program/tests/`. +- `transfer-hook/block-list` gained a Rust + LiteSVM lifecycle test (`program/tests/`) driving the program through its Codama-generated Rust SDK; the mocha/web3.js test was removed. Its `package.json` now only covers SDK generation. +- CI (`native.yml`, `pinocchio.yml`, `solana-asm.yml`) no longer installs Node/pnpm; it builds with `cargo build-sbf` (or `sbpf build`) and tests with `cargo test`. + +### Added + +- `basics/hello-solana/pinocchio` Rust + LiteSVM test (it previously had only a TypeScript test). + ## [2026-04-08] - Quicknode fork modernization (Mike MacCana) Mike MacCana led the Quicknode fork of the [Solana Foundation program examples](https://github.com/solana-developers/program-examples) from late 2025. The first commits on this repository lineage are dated **8 April 2026**; the summary below covers that work through the initial merge. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eb6f7fe8..4d073489 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,9 +33,11 @@ Optional helpers come from the [`solana-kite`](https://crates.io/crates/solana-k **Quasar examples** are tested in Rust with QuasarSVM. Run `quasar build` (which also generates the Rust client crate under `target/client/rust/` that the tests import), then `quasar test` or `cargo test`. -**Native and Pinocchio examples** use `litesvm` directly from Rust, except for a few that keep TypeScript tests (`tsx --test` with [`solana-kite`](https://solanakite.org) and [`@solana/kit`](https://solanakit.com)) where the example is specifically about client-side tooling. +**Native and Pinocchio examples** use `litesvm` directly from Rust. Tests live in `program/tests/`, load the compiled program with `include_bytes!` from the workspace `target/deploy/`, and run with `cargo test --manifest-path=./program/Cargo.toml` (build the `.so` first with `cargo build-sbf --manifest-path=./program/Cargo.toml`). -Do not write TypeScript tests for Anchor or Quasar programs, and do not use `anchor.workspace` or `program.methods.X().rpc()`. +**ASM examples** keep their LiteSVM tests inline in `src/lib.rs`; build with `sbpf build`, test with `cargo test`. + +Do not write TypeScript tests for any program, and do not use `anchor.workspace` or `program.methods.X().rpc()`. All tests are Rust + LiteSVM (QuasarSVM for Quasar). Tests must exercise the program for real: initialize accounts, send transactions through the program's instruction handlers, and assert resulting state and balances. Placeholder tests (`assert!(true)`, build-only checks) don't count. diff --git a/Cargo.lock b/Cargo.lock index 2a68a992..20234a90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,7 +28,7 @@ dependencies = [ "solana-pubkey 3.0.0", "solana-signer", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -45,7 +45,7 @@ dependencies = [ "solana-pubkey 3.0.0", "solana-signer", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -687,7 +687,7 @@ dependencies = [ "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -999,7 +999,7 @@ dependencies = [ "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", "solana-transaction-error 3.1.0", ] @@ -1020,13 +1020,13 @@ name = "checking-accounts-native-program" version = "0.1.0" dependencies = [ "litesvm", + "solana-instruction 3.3.0", "solana-keypair", "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", - "solana-sdk", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -1037,12 +1037,12 @@ dependencies = [ "pinocchio 0.10.2", "pinocchio-log", "pinocchio-system", + "solana-instruction 3.3.0", "solana-keypair", "solana-native-token 3.0.0", "solana-pubkey 3.0.0", - "solana-sdk", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -1068,7 +1068,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -1087,7 +1087,7 @@ dependencies = [ "solana-pubkey 3.0.0", "solana-signer", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -1170,7 +1170,7 @@ dependencies = [ "solana-pubkey 3.0.0", "solana-rent 4.1.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -1187,7 +1187,7 @@ dependencies = [ "solana-pubkey 3.0.0", "solana-rent 4.1.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -1221,7 +1221,7 @@ dependencies = [ "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -1238,7 +1238,7 @@ dependencies = [ "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -1252,7 +1252,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -1281,7 +1281,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", "spl-token-interface", ] @@ -1514,18 +1514,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ed25519-dalek-bip32" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b49a684b133c4980d7ee783936af771516011c8cd15f429dbda77245e282f03" -dependencies = [ - "derivation-path", - "ed25519-dalek", - "hmac", - "sha2 0.10.9", -] - [[package]] name = "educe" version = "0.6.0" @@ -1622,7 +1610,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -1639,7 +1627,7 @@ dependencies = [ "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -1855,7 +1843,7 @@ dependencies = [ "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -1868,15 +1856,21 @@ dependencies = [ "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] name = "hello-solana-program-pinocchio" version = "0.1.0" dependencies = [ + "litesvm", "pinocchio 0.10.2", "pinocchio-log", + "solana-instruction 3.3.0", + "solana-keypair", + "solana-native-token 3.0.0", + "solana-pubkey 3.0.0", + "solana-transaction", ] [[package]] @@ -2145,7 +2139,7 @@ dependencies = [ "solana-system-program", "solana-sysvar 3.1.1", "solana-sysvar-id 3.1.0", - "solana-transaction 3.1.0", + "solana-transaction", "solana-transaction-context", "solana-transaction-error 3.1.0", "thiserror 2.0.18", @@ -2234,7 +2228,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", "spl-associated-token-account-interface", "spl-token-interface", ] @@ -2440,7 +2434,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", "spl-associated-token-account-interface", "spl-token-interface", ] @@ -2470,7 +2464,7 @@ dependencies = [ "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -2486,7 +2480,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -2644,7 +2638,7 @@ dependencies = [ "solana-keypair", "solana-native-token 3.0.0", "solana-pubkey 3.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -2659,7 +2653,7 @@ dependencies = [ "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -2676,7 +2670,7 @@ dependencies = [ "solana-pubkey 3.0.0", "solana-rent 4.1.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -2693,7 +2687,7 @@ dependencies = [ "solana-pubkey 3.0.0", "solana-rent 4.1.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -2709,7 +2703,7 @@ dependencies = [ "solana-pubkey 3.0.0", "solana-rent 4.1.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -2872,7 +2866,7 @@ dependencies = [ "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -2888,7 +2882,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -2955,7 +2949,7 @@ dependencies = [ "solana-pubkey 3.0.0", "solana-rent 4.1.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -2970,7 +2964,7 @@ dependencies = [ "solana-native-token 3.0.0", "solana-program 4.0.0", "solana-pubkey 3.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -3179,12 +3173,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - [[package]] name = "smallvec" version = "1.15.1" @@ -3222,24 +3210,6 @@ dependencies = [ "solana-sysvar 3.1.1", ] -[[package]] -name = "solana-account" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbea62563f5143b29fff5aa6af57426bc1beb77c6416b5c1c8e7d1266272c21" -dependencies = [ - "bincode", - "serde", - "serde_bytes", - "serde_derive", - "solana-account-info 3.1.1", - "solana-clock 3.0.1", - "solana-instruction-error", - "solana-pubkey 4.1.0", - "solana-sdk-ids 3.1.0", - "solana-sysvar 4.0.0", -] - [[package]] name = "solana-account-info" version = "2.3.0" @@ -3297,7 +3267,6 @@ dependencies = [ "curve25519-dalek", "five8 1.0.0", "five8_const 1.0.0", - "rand 0.9.2", "serde", "serde_derive", "sha2-const-stable", @@ -3694,16 +3663,6 @@ dependencies = [ "uriparse", ] -[[package]] -name = "solana-epoch-info" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e093c84f6ece620a6b10cd036574b0cd51944231ab32d81f80f76d54aba833e6" -dependencies = [ - "serde", - "serde_derive", -] - [[package]] name = "solana-epoch-rewards" version = "2.2.1" @@ -3732,17 +3691,6 @@ dependencies = [ "solana-sysvar-id 3.1.0", ] -[[package]] -name = "solana-epoch-rewards-hasher" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee8beac9bff4db9225e57d532d169b0be5e447f1e6601a2f50f27a01bf5518f" -dependencies = [ - "siphasher", - "solana-address 2.6.0", - "solana-hash 4.2.0", -] - [[package]] name = "solana-epoch-schedule" version = "2.2.1" @@ -3914,16 +3862,6 @@ name = "solana-fee-structure" version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e2abdb1223eea8ec64136f39cb1ffcf257e00f915c957c35c0dd9e3f4e700b0" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "solana-hard-forks" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c19418921b9369092a9583120dbbccbcc2d92bd0c6bf5adb5f80ffd4ea4c69" [[package]] name = "solana-hash" @@ -3969,16 +3907,6 @@ dependencies = [ "wincode 0.4.8", ] -[[package]] -name = "solana-inflation" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e92f37a14e7c660628752833250dd3dcd8e95309876aee751d7f8769a27947c6" -dependencies = [ - "serde", - "serde_derive", -] - [[package]] name = "solana-instruction" version = "2.3.3" @@ -4115,13 +4043,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "263d614c12aa267a3278703175fd6440552ca61bc960b5a02a4482720c53438b" dependencies = [ "ed25519-dalek", - "ed25519-dalek-bip32", "five8 1.0.0", "five8_core 1.0.0", "rand 0.9.2", "solana-address 2.6.0", - "solana-derivation-path", - "solana-seed-derivable", "solana-seed-phrase", "solana-signature", "solana-signer", @@ -4141,7 +4066,7 @@ dependencies = [ "solana-program 3.0.0", "solana-pubkey 3.0.0", "solana-signer", - "solana-transaction 3.1.0", + "solana-transaction", "spl-associated-token-account", "spl-token", ] @@ -4319,18 +4244,13 @@ version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6435a6070b6c5898201aae845db328cf3bd3cebc17b55af9b43138da5ced4a85" dependencies = [ - "blake3", "lazy_static", - "serde", - "serde_derive", "solana-address 2.6.0", "solana-hash 4.2.0", "solana-instruction 3.3.0", "solana-sanitize 3.0.1", "solana-sdk-ids 3.1.0", - "solana-short-vec 3.2.0", "solana-transaction-error 3.1.0", - "wincode 0.4.8", ] [[package]] @@ -4412,22 +4332,6 @@ dependencies = [ "bytemuck", ] -[[package]] -name = "solana-offchain-message" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e2a1141a673f72a05cf406b99e4b2b8a457792b7c01afa07b3f00d4e2de393" -dependencies = [ - "num_enum", - "solana-hash 3.1.0", - "solana-packet", - "solana-pubkey 3.0.0", - "solana-sanitize 3.0.1", - "solana-sha256-hasher 3.1.0", - "solana-signature", - "solana-signer", -] - [[package]] name = "solana-packet" version = "3.0.0" @@ -4460,17 +4364,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "solana-presigner" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f704eaf825be3180832445b9e4983b875340696e8e7239bf2d535b0f86c14a2" -dependencies = [ - "solana-pubkey 3.0.0", - "solana-signature", - "solana-signer", -] - [[package]] name = "solana-program" version = "2.3.0" @@ -4830,7 +4723,6 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b06bd918d60111ee1f97de817113e2040ca0cedb740099ee8d646233f6b906c" dependencies = [ - "rand 0.9.2", "solana-address 2.6.0", ] @@ -4902,44 +4794,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "solana-sdk" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "657e20ea41ba32cad0c493bec60b6d55cc6c30d2c1073b94cfee96dda0d764dd" -dependencies = [ - "bincode", - "bs58", - "serde", - "solana-account 4.2.0", - "solana-epoch-info", - "solana-epoch-rewards-hasher", - "solana-fee-structure", - "solana-inflation", - "solana-keypair", - "solana-message 4.0.0", - "solana-offchain-message", - "solana-presigner", - "solana-program 4.0.0", - "solana-program-memory 3.1.0", - "solana-pubkey 4.1.0", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.1.0", - "solana-sdk-macro 3.0.1", - "solana-seed-derivable", - "solana-seed-phrase", - "solana-serde", - "solana-serde-varint 3.0.1", - "solana-short-vec 3.2.0", - "solana-shred-version", - "solana-signature", - "solana-signer", - "solana-time-utils", - "solana-transaction 4.0.0", - "solana-transaction-error 3.1.0", - "thiserror 2.0.18", -] - [[package]] name = "solana-sdk-ids" version = "2.2.1" @@ -5024,15 +4878,6 @@ dependencies = [ "sha2 0.10.9", ] -[[package]] -name = "solana-serde" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709a93cab694c70f40b279d497639788fc2ccbcf9b4aa32273d4b361322c02dd" -dependencies = [ - "serde", -] - [[package]] name = "solana-serde-varint" version = "2.2.2" @@ -5113,17 +4958,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "solana-shred-version" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c79722e299d957958bf33695f7cd1ef6724ff55563c60fd9e3e24487cccde2" -dependencies = [ - "solana-hard-forks", - "solana-hash 4.2.0", - "solana-sha256-hasher 3.1.0", -] - [[package]] name = "solana-signature" version = "3.3.0" @@ -5132,7 +4966,6 @@ checksum = "132a93134f1262aa832f1849b83bec6c9945669b866da18661a427943b9e801e" dependencies = [ "ed25519-dalek", "five8 1.0.0", - "rand 0.9.2", "serde", "serde-big-array", "serde_derive", @@ -5318,7 +5151,7 @@ dependencies = [ "solana-pubkey 3.0.0", "solana-sdk-ids 3.1.0", "solana-signature", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -5527,12 +5360,6 @@ dependencies = [ "solana-sdk-ids 3.1.0", ] -[[package]] -name = "solana-time-utils" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ced92c60aa76ec4780a9d93f3bd64dfa916e1b998eacc6f1c110f3f444f02c9" - [[package]] name = "solana-transaction" version = "3.1.0" @@ -5555,28 +5382,6 @@ dependencies = [ "solana-transaction-error 3.1.0", ] -[[package]] -name = "solana-transaction" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dc0d18f4f109cc1777459271800755705ca6d1aba319934611e1d4f6bb162b5" -dependencies = [ - "serde", - "serde_derive", - "solana-address 2.6.0", - "solana-hash 4.2.0", - "solana-instruction 3.3.0", - "solana-instruction-error", - "solana-message 4.0.0", - "solana-sanitize 3.0.1", - "solana-sdk-ids 3.1.0", - "solana-short-vec 3.2.0", - "solana-signature", - "solana-signer", - "solana-transaction-error 3.1.0", - "wincode 0.4.8", -] - [[package]] name = "solana-transaction-context" version = "3.1.11" @@ -5692,7 +5497,7 @@ dependencies = [ "solana-sdk-ids 3.1.0", "solana-signer", "solana-slot-hashes 3.0.1", - "solana-transaction 3.1.0", + "solana-transaction", "solana-transaction-context", "solana-vote-interface 4.0.4", "thiserror 2.0.18", @@ -6179,7 +5984,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", "spl-associated-token-account-interface", "spl-token-2022-interface", "spl-token-interface", @@ -6198,7 +6003,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", "spl-token-2022-interface", ] @@ -6215,7 +6020,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", "spl-token-2022-interface", ] @@ -6232,7 +6037,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", "spl-token-2022-interface", ] @@ -6249,7 +6054,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", "spl-token-2022-interface", ] @@ -6268,7 +6073,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", "spl-associated-token-account-interface", "spl-token-interface", ] @@ -6376,7 +6181,7 @@ dependencies = [ "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -6392,7 +6197,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -6410,7 +6215,7 @@ dependencies = [ "solana-program 4.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", "spl-associated-token-account-interface", "spl-token-interface", ] @@ -6596,7 +6401,6 @@ dependencies = [ "pastey", "proc-macro2", "quote", - "solana-short-vec 3.2.0", "thiserror 2.0.18", "wincode-derive", ] diff --git a/README.md b/README.md index 67305c41..37c50c10 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,13 @@ Each example is available in one or more of the following frameworks: -- [โš“ Anchor](https://www.anchor-lang.com/) - the most popular framework for Solana development. Build with `anchor build`, test with `pnpm test` as defined in `Anchor.toml`. -- [๐Ÿ’ซ Quasar](https://quasar-lang.com/docs) - a newer, more performant framework with Anchor-compatible ergonomics. Run `pnpm test` to execute tests. -- [๐Ÿคฅ Pinocchio](https://github.com/anza-xyz/pinocchio) - a zero-copy, zero-allocation library for Solana programs. Run `pnpm test` to execute tests. -- [๐Ÿฆ€ Native Rust](https://docs.anza.xyz/) - vanilla Rust using Solana's native crates. Run `pnpm test` to execute tests. -- [๐Ÿงฌ ASM](https://github.com/blueshift-gg/sbpf) - hand-written sBPF assembly built with the `sbpf` toolchain. Run `pnpm build-and-test` to build and test. +- [โš“ Anchor](https://www.anchor-lang.com/) - the most popular framework for Solana development. Build with `anchor build`, test with `cargo test` as defined in `Anchor.toml`. +- [๐Ÿ’ซ Quasar](https://quasar-lang.com/docs) - a newer, more performant framework with Anchor-compatible ergonomics. Build with `quasar build`, test with `quasar test`. +- [๐Ÿคฅ Pinocchio](https://github.com/anza-xyz/pinocchio) - a zero-copy, zero-allocation library for Solana programs. Build with `cargo build-sbf --manifest-path=./program/Cargo.toml`, test with `cargo test --manifest-path=./program/Cargo.toml`. +- [๐Ÿฆ€ Native Rust](https://docs.anza.xyz/) - vanilla Rust using Solana's native crates. Build with `cargo build-sbf --manifest-path=./program/Cargo.toml`, test with `cargo test --manifest-path=./program/Cargo.toml`. +- [๐Ÿงฌ ASM](https://github.com/blueshift-gg/sbpf) - hand-written sBPF assembly built with the `sbpf` toolchain. Build with `sbpf build`, test with `cargo test`. + +All examples are tested with Rust + [LiteSVM](https://github.com/litesvm/litesvm) in-process tests: build the program first, since the tests embed the `.so` at compile time. > [!NOTE] > You don't need to write your own program for basic tasks like creating [accounts](https://solana.com/docs/terminology#account), transferring SOL, or minting tokens. These are handled by existing programs like the System Program and Token Program. @@ -348,7 +350,7 @@ Work with Metaplex compressed NFTs. ### Shank and Codama -Generate an IDL from a native Rust program with [Shank](https://github.com/metaplex-foundation/shank), then generate a TypeScript client from that IDL with [Codama](https://github.com/codama-idl/codama). +Generate an IDL from a native Rust program with [Shank](https://github.com/metaplex-foundation/shank), then generate a Rust client from that IDL with [Codama](https://github.com/codama-idl/codama). [๐Ÿฆ€ Native](./tools/shank-and-codama/native) diff --git a/basics/account-data/native/package.json b/basics/account-data/native/package.json deleted file mode 100644 index 8a9cc795..00000000 --- a/basics/account-data/native/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "fs": "^0.0.1-security", - "borsh": "^2.0.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/account-data/native/pnpm-lock.yaml b/basics/account-data/native/pnpm-lock.yaml deleted file mode 100644 index 684a5c5f..00000000 --- a/basics/account-data/native/pnpm-lock.yaml +++ /dev/null @@ -1,1360 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.18': - resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.18 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.18 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.18': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.18 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.18 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/account-data/native/program/tests/tests.rs b/basics/account-data/native/program/tests/tests.rs index 515fd5f3..c213fe66 100644 --- a/basics/account-data/native/program/tests/tests.rs +++ b/basics/account-data/native/program/tests/tests.rs @@ -19,7 +19,11 @@ fn test_account_data() { svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); - let program_bytes = include_bytes!("../../tests/fixtures/account_data_native_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/account_data_native_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/account-data/native/tests/test.ts b/basics/account-data/native/tests/test.ts deleted file mode 100644 index 5af29822..00000000 --- a/basics/account-data/native/tests/test.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; -import * as borsh from "borsh"; -import { start } from "solana-bankrun"; - -const AddressInfoSchema = { - struct: { - name: "string", - house_number: "u8", - street: "string", - city: "string", - }, -}; - -type AddressInfo = { - name: string; - house_number: number; - street: string; - city: string; -}; - -function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); -} - -describe("Account Data!", async () => { - const addressInfoAccount = Keypair.generate(); - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "account_data_native_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - - test("Create the address info account", async () => { - const payer = context.payer; - - console.log(`Program Address : ${PROGRAM_ID}`); - console.log(`Payer Address : ${payer.publicKey}`); - console.log(`Address Info Acct : ${addressInfoAccount.publicKey}`); - - const ix = new TransactionInstruction({ - keys: [ - { - pubkey: addressInfoAccount.publicKey, - isSigner: true, - isWritable: true, - }, - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: borshSerialize(AddressInfoSchema, { - name: "Joe C", - house_number: 136, - street: "Mile High Dr.", - city: "Solana Beach", - }), - }); - - const blockhash = context.lastBlockhash; - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, addressInfoAccount); - await client.processTransaction(tx); - }); - - test("Read the new account's data", async () => { - const accountInfo = await client.getAccount(addressInfoAccount.publicKey); - - const readAddressInfo = borsh.deserialize(AddressInfoSchema, Buffer.from(accountInfo.data)) as AddressInfo; - console.log(`Name : ${readAddressInfo.name}`); - console.log(`House Num: ${readAddressInfo.house_number}`); - console.log(`Street : ${readAddressInfo.street}`); - console.log(`City : ${readAddressInfo.city}`); - }); -}); diff --git a/basics/account-data/native/tsconfig.json b/basics/account-data/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/account-data/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/account-data/pinocchio/package.json b/basics/account-data/pinocchio/package.json deleted file mode 100644 index 6f43071a..00000000 --- a/basics/account-data/pinocchio/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/index.test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/account_data_pinocchio_program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "litesvm": "^0.3.3", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/account-data/pinocchio/pnpm-lock.yaml b/basics/account-data/pinocchio/pnpm-lock.yaml deleted file mode 100644 index 1599428b..00000000 --- a/basics/account-data/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,1371 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - litesvm: - specifier: ^0.3.3 - version: 0.3.3(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - mocha: - specifier: ^9.0.3 - version: 9.2.2 - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.0': - resolution: {integrity: sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.0': - resolution: {integrity: sha512-SR7pKtmJBg2mhmkel2NeHA1pz06QeQXdMv8WJoIR9m8F/hw80K/612uaYbwTt2nkK0jg/Qn/rNSd7EcJ4SBGjw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.1.0': - resolution: {integrity: sha512-XMu4yw5iCgQnMKsxSWPPOrGgtaohmupN3eyAtYv3K3C/MJEc5V90h74k5B1GUCiHvcrdUDO9RclNjD9lgbjFag==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.1.0': - resolution: {integrity: sha512-l+GxAv0Ar4d3c3PlZdA9G++wFYZREEbbRyAFP8+n8HSg0vudCuzogh/13io6hYuUhG/9Ve8ARZNamhV7UScKNw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.2': - resolution: {integrity: sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base-x@5.0.1: - resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@6.0.0: - resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - litesvm-darwin-arm64@0.3.3: - resolution: {integrity: sha512-81YimsV3ezWjWLgoKixsXfVznaaecbURE3RtECgNb6Din6Za03pKGKGEN4gkyecHkv8uoPaEZv5cl6ARsgeN1Q==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - litesvm-darwin-x64@0.3.3: - resolution: {integrity: sha512-pYietuU165Bl+2eDnVp2Eidiedfjt+pljyyBAfJPbYriaFyG577mU364NiNcsfQ8ZZWbe+ygIEAVq4Ol247+1g==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - litesvm-linux-arm64-musl@0.3.3: - resolution: {integrity: sha512-mkI15rWtNbaJxVFUfh+qnolqnDCZEqhwSZo/XZ48TZNsQ69vAqY00KhyFhTVJ+jeaYCAZTSNamuFIiRBxqVmNg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [musl] - - litesvm-linux-x64-gnu@0.3.3: - resolution: {integrity: sha512-Qai2/E8Eq03w8VKnJDREyiWxwavjykW/H6onE179ayMnBjVVmkj5fN7XF50VV4z73kasx5bpDzBNK8fcaxMdzA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [glibc] - - litesvm-linux-x64-musl@0.3.3: - resolution: {integrity: sha512-bpWZ2f506hbfu1y6bkmuZf+qqtnLDxggpOMTQbibjd+q6faEO3sETWwKGlIgHB99P8wyU+aXKwLSGQX2sJEw6Q==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [musl] - - litesvm@0.3.3: - resolution: {integrity: sha512-QHXjAIXzvG0uAMOza6aJcYl19yTKz3guwq/z0Zml4KnQxyQvPhjaBpUFc5sf2ey/NxMVdqFhoXmL02CXOOomjw==} - engines: {node: '>= 20'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@noble/curves@1.9.0': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.0(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.0(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.0(typescript@4.9.5) - '@solana/errors': 2.1.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.0(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.0 - '@noble/curves': 1.9.0 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.0(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.2 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.2 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.2': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.2 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.2 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base-x@5.0.1: {} - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.1: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - bs58@6.0.0: - dependencies: - base-x: 5.0.1 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - litesvm-darwin-arm64@0.3.3: - optional: true - - litesvm-darwin-x64@0.3.3: - optional: true - - litesvm-linux-arm64-musl@0.3.3: - optional: true - - litesvm-linux-x64-gnu@0.3.3: - optional: true - - litesvm-linux-x64-musl@0.3.3: - optional: true - - litesvm@0.3.3(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 6.0.0 - fastestsmallesttextencoderdecoder: 1.0.22 - optionalDependencies: - litesvm-darwin-arm64: 0.3.3 - litesvm-darwin-x64: 0.3.3 - litesvm-linux-arm64-musl: 0.3.3 - litesvm-linux-x64-gnu: 0.3.3 - litesvm-linux-x64-musl: 0.3.3 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - regenerator-runtime@0.14.1: {} - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/account-data/pinocchio/program/tests/tests.rs b/basics/account-data/pinocchio/program/tests/tests.rs index e6a93e3a..847de80d 100644 --- a/basics/account-data/pinocchio/program/tests/tests.rs +++ b/basics/account-data/pinocchio/program/tests/tests.rs @@ -18,7 +18,11 @@ fn test_account_data() { svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); - let program_bytes = include_bytes!("../../tests/fixtures/account_data_pinocchio_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/account_data_pinocchio_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/account-data/pinocchio/tests/index.test.ts b/basics/account-data/pinocchio/tests/index.test.ts deleted file mode 100644 index 825ab4e6..00000000 --- a/basics/account-data/pinocchio/tests/index.test.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { readFileSync } from "node:fs"; -import { describe, test } from "node:test"; -import { Keypair, LAMPORTS_PER_SOL, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; -import { LiteSVM } from "litesvm"; - -interface AddressInfo { - name: string; - house_number: number; - street: string; - city: string; -} - -function toBytes(addressInfo: AddressInfo): Buffer { - const data: number[] = []; - - // Add instruction discriminator - data.push(0); - - // Pad name to 16 bytes (data[1..17]) - const nameBytes = Buffer.from(addressInfo.name, "utf-8"); - const namePadded = Buffer.alloc(16); - nameBytes.copy(namePadded, 0, 0, Math.min(nameBytes.length, 16)); - data.push(...namePadded); - - // Add 1 byte padding at index 17 - data.push(0); - - // Add house_number at index 18 - data.push(addressInfo.house_number); - - // Pad street to 16 bytes (data[19..35]) - const streetBytes = Buffer.from(addressInfo.street, "utf-8"); - const streetPadded = Buffer.alloc(16); - streetBytes.copy(streetPadded, 0, 0, Math.min(streetBytes.length, 16)); - data.push(...streetPadded); - - // Add 1 byte padding at index 35 - data.push(0); - - // Pad city to 16 bytes (data[36..52]) - const cityBytes = Buffer.from(addressInfo.city, "utf-8"); - const cityPadded = Buffer.alloc(16); - cityBytes.copy(cityPadded, 0, 0, Math.min(cityBytes.length, 16)); - data.push(...cityPadded); - - return Buffer.from(data); -} - -function fromBytes(buffer: Buffer): AddressInfo { - // name: bytes 0..16 - const nameBytes = buffer.subarray(0, 16); - const name = nameBytes.toString("utf-8").replace(/\0/g, ""); - - // house_number: byte 17 - const house_number = buffer[17]; - - // street: bytes 18..34 - const streetBytes = buffer.subarray(18, 34); - const street = streetBytes.toString("utf-8").replace(/\0/g, ""); - - // city: bytes 35..51 - const cityBytes = buffer.subarray(35, 51); - const city = cityBytes.toString("utf-8").replace(/\0/g, ""); - - return { name, house_number, street, city }; -} - -describe("Account Data!", () => { - // Load the program keypair - const programKeypairPath = new URL( - "./fixtures/account_data_pinocchio_program-keypair.json", - // @ts-expect-error - import.meta.url, - ).pathname; - const programKeypairData = JSON.parse(readFileSync(programKeypairPath, "utf-8")); - const programKeypair = Keypair.fromSecretKey(new Uint8Array(programKeypairData)); - const PROGRAM_ID = programKeypair.publicKey; - - // Load the program - const programPath = new URL( - "./fixtures/account_data_pinocchio_program.so", - // @ts-expect-error - import.meta.url, - ).pathname; - - const litesvm = new LiteSVM(); - litesvm.addProgramFromFile(PROGRAM_ID, programPath); - - const payer = Keypair.generate(); - litesvm.airdrop(payer.publicKey, BigInt(100 * LAMPORTS_PER_SOL)); - - const addressInfoAccount = Keypair.generate(); - - test("Create the address info account", () => { - console.log(`Program Address : ${PROGRAM_ID}`); - console.log(`Payer Address : ${payer.publicKey}`); - console.log(`Address Info Acct : ${addressInfoAccount.publicKey}`); - - const addressInfo: AddressInfo = { - name: "Joe C", - house_number: 136, - street: "Mile High Dr.", - city: "Solana Beach", - }; - - const ix = new TransactionInstruction({ - keys: [ - { - pubkey: addressInfoAccount.publicKey, - isSigner: true, - isWritable: true, - }, - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: toBytes(addressInfo), - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = litesvm.latestBlockhash(); - tx.sign(payer, addressInfoAccount); - - litesvm.sendTransaction(tx); - }); - - test("Read the new account's data", () => { - const accountInfo = litesvm.getAccount(addressInfoAccount.publicKey); - - if (!accountInfo) { - throw new Error("Account not found"); - } - - const readAddressInfo = fromBytes(Buffer.from(accountInfo.data)); - - console.log(`Name : ${readAddressInfo.name}`); - console.log(`House Num: ${readAddressInfo.house_number}`); - console.log(`Street : ${readAddressInfo.street}`); - console.log(`City : ${readAddressInfo.city}`); - }); -}); diff --git a/basics/account-data/pinocchio/tsconfig.json b/basics/account-data/pinocchio/tsconfig.json deleted file mode 100644 index 8c20b223..00000000 --- a/basics/account-data/pinocchio/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai", "node"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/checking-accounts/asm/README.md b/basics/checking-accounts/asm/README.md index 30fdcdf8..6baa49fd 100644 --- a/basics/checking-accounts/asm/README.md +++ b/basics/checking-accounts/asm/README.md @@ -1,3 +1,10 @@ # checking-account-asm-program A Solana SBPF assembly implementation, scaffolded with [sbpf](https://github.com/blueshift-gg/sbpf). + +## Setup + +1. Build the program: `sbpf build` +2. Run the Rust + LiteSVM tests: `cargo test` + +The tests embed the `.so` from `deploy/` at compile time, so rebuild after every change or a stale binary silently tests old code. diff --git a/basics/checking-accounts/asm/package.json b/basics/checking-accounts/asm/package.json deleted file mode 100644 index 1de6c61d..00000000 --- a/basics/checking-accounts/asm/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "sbpf build --deploy-dir ./tests/fixtures && pnpm test", - "build": "sbpf build --deploy-dir ./tests/fixtures", - "deploy": "solana program deploy ./tests/fixtures/checking-account-asm-program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.47.3" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5", - "solana-bankrun": "^0.3.0" - } -} diff --git a/basics/checking-accounts/asm/pnpm-lock.yaml b/basics/checking-accounts/asm/pnpm-lock.yaml deleted file mode 100644 index b70de678..00000000 --- a/basics/checking-accounts/asm/pnpm-lock.yaml +++ /dev/null @@ -1,1349 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.47.3 - version: 1.98.2(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.0': - resolution: {integrity: sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.0': - resolution: {integrity: sha512-SR7pKtmJBg2mhmkel2NeHA1pz06QeQXdMv8WJoIR9m8F/hw80K/612uaYbwTt2nkK0jg/Qn/rNSd7EcJ4SBGjw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.1.0': - resolution: {integrity: sha512-XMu4yw5iCgQnMKsxSWPPOrGgtaohmupN3eyAtYv3K3C/MJEc5V90h74k5B1GUCiHvcrdUDO9RclNjD9lgbjFag==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.1.0': - resolution: {integrity: sha512-l+GxAv0Ar4d3c3PlZdA9G++wFYZREEbbRyAFP8+n8HSg0vudCuzogh/13io6hYuUhG/9Ve8ARZNamhV7UScKNw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5' - - '@solana/web3.js@1.98.2': - resolution: {integrity: sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.2': - resolution: {integrity: sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@noble/curves@1.9.0': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.0(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.0(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.0(typescript@4.9.5) - '@solana/errors': 2.1.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.0(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.0 - '@noble/curves': 1.9.0 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.0(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.2 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.2 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.2': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.2 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.2 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.1: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - regenerator-runtime@0.14.1: {} - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/checking-accounts/asm/src/lib.rs b/basics/checking-accounts/asm/src/lib.rs index b81c4250..ec4cb420 100644 --- a/basics/checking-accounts/asm/src/lib.rs +++ b/basics/checking-accounts/asm/src/lib.rs @@ -21,7 +21,7 @@ mod tests { svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../tests/fixtures/checking-account-asm-program.so"); + let program_bytes = include_bytes!("../deploy/checking-account-asm-program.so"); svm.add_program(program_id, program_bytes).unwrap(); @@ -69,7 +69,7 @@ mod tests { fn setup() -> (LiteSVM, Pubkey) { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../tests/fixtures/checking-account-asm-program.so"); + let program_bytes = include_bytes!("../deploy/checking-account-asm-program.so"); svm.add_program(program_id, program_bytes).unwrap(); (svm, program_id) } diff --git a/basics/checking-accounts/asm/tests/test.ts b/basics/checking-accounts/asm/tests/test.ts deleted file mode 100644 index 5da3e20e..00000000 --- a/basics/checking-accounts/asm/tests/test.ts +++ /dev/null @@ -1,247 +0,0 @@ -import assert from "node:assert"; -import { describe, test } from "node:test"; -import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; -import { start } from "solana-bankrun"; - -describe("Checking accounts", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "checking-account-asm-program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - const rent = await client.getRent(); - - // We'll create this ahead of time. - // Our program will try to modify it. - const accountToChange = Keypair.generate(); - // Our program will create this. - const accountToCreate = Keypair.generate(); - - test("Create an account owned by our program", async () => { - const blockhash = context.lastBlockhash; - const ix = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: accountToChange.publicKey, - lamports: Number(rent.minimumBalance(BigInt(0))), - space: 0, - programId: PROGRAM_ID, // Our program - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, accountToChange); - - await client.processTransaction(tx); - }); - - test("Check accounts", async () => { - const blockhash = context.lastBlockhash; - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: accountToCreate.publicKey, isSigner: true, isWritable: true }, - { pubkey: accountToChange.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: Buffer.alloc(0), - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, accountToChange, accountToCreate); - - await client.processTransaction(tx); - }); - - test("Invalid number of accounts (error 1)", async () => { - const blockhash = context.lastBlockhash; - const ix = new TransactionInstruction({ - keys: [{ pubkey: payer.publicKey, isSigner: true, isWritable: true }], - programId: PROGRAM_ID, - data: Buffer.alloc(0), - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer); - - const res = await client.tryProcessTransaction(tx); - assert.equal(res.result, "Error processing Instruction 0: custom program error: 0x1"); - }); - - test("Payer not signer (error 2)", async () => { - const blockhash = context.lastBlockhash; - const feePayer = Keypair.generate(); - const fakePayer = Keypair.generate(); - const acCreate = Keypair.generate(); - const acChange = Keypair.generate(); - - const fund = SystemProgram.transfer({ - fromPubkey: payer.publicKey, - toPubkey: feePayer.publicKey, - lamports: 10_000_000, - }); - const fundTx = new Transaction(); - fundTx.recentBlockhash = blockhash; - fundTx.add(fund).sign(payer); - await client.processTransaction(fundTx); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: fakePayer.publicKey, isSigner: false, isWritable: true }, // not a signer - { pubkey: acCreate.publicKey, isSigner: true, isWritable: true }, - { pubkey: acChange.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: Buffer.alloc(0), - }); - - const tx = new Transaction(); - tx.recentBlockhash = context.lastBlockhash; - tx.add(ix).sign(feePayer, acCreate, acChange); - - const res = await client.tryProcessTransaction(tx); - assert.equal(res.result, "Error processing Instruction 0: custom program error: 0x2"); - }); - - test("Account to create already initialized (error 3)", async () => { - const blockhash = context.lastBlockhash; - const acCreate = Keypair.generate(); - const acChange = Keypair.generate(); - - // Fund acCreate so it appears initialized - const fund = SystemProgram.transfer({ - fromPubkey: payer.publicKey, - toPubkey: acCreate.publicKey, - lamports: 1_000_000, - }); - // Fund acChange so it is initialized and owned by our program - const fundChange = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: acChange.publicKey, - lamports: Number(rent.minimumBalance(BigInt(0))), - space: 0, - programId: PROGRAM_ID, - }); - - const setupTx = new Transaction(); - setupTx.recentBlockhash = blockhash; - setupTx.add(fund, fundChange).sign(payer, acChange); - await client.processTransaction(setupTx); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: acCreate.publicKey, isSigner: true, isWritable: true }, - { pubkey: acChange.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: Buffer.alloc(0), - }); - - const tx = new Transaction(); - tx.recentBlockhash = context.lastBlockhash; - tx.add(ix).sign(payer, acCreate, acChange); - - const res = await client.tryProcessTransaction(tx); - assert.equal(res.result, "Error processing Instruction 0: custom program error: 0x3"); - }); - - test("Account to change not initialized (error 4)", async () => { - const blockhash = context.lastBlockhash; - const acCreate = Keypair.generate(); - const acChange = Keypair.generate(); // no lamports - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: acCreate.publicKey, isSigner: true, isWritable: true }, - { pubkey: acChange.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: Buffer.alloc(0), - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, acCreate, acChange); - - const res = await client.tryProcessTransaction(tx); - assert.equal(res.result, "Error processing Instruction 0: custom program error: 0x4"); - }); - - test("Invalid system program (error 5)", async () => { - const blockhash = context.lastBlockhash; - const acCreate = Keypair.generate(); - const acChange = Keypair.generate(); - const fakeSystemProgram = PublicKey.unique(); - - const fund = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: acChange.publicKey, - lamports: Number(rent.minimumBalance(BigInt(0))), - space: 0, - programId: PROGRAM_ID, - }); - const setupTx = new Transaction(); - setupTx.recentBlockhash = blockhash; - setupTx.add(fund).sign(payer, acChange); - await client.processTransaction(setupTx); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: acCreate.publicKey, isSigner: true, isWritable: true }, - { pubkey: acChange.publicKey, isSigner: true, isWritable: true }, - { pubkey: fakeSystemProgram, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: Buffer.alloc(0), - }); - - const tx = new Transaction(); - tx.recentBlockhash = context.lastBlockhash; - tx.add(ix).sign(payer, acCreate, acChange); - - const res = await client.tryProcessTransaction(tx); - assert.equal(res.result, "Error processing Instruction 0: custom program error: 0x5"); - }); - - test("Account to change wrong owner (error 6)", async () => { - const blockhash = context.lastBlockhash; - const acCreate = Keypair.generate(); - const acChange = Keypair.generate(); - - // Fund acChange but keep it owned by the system program (no createAccount with PROGRAM_ID) - const fund = SystemProgram.transfer({ - fromPubkey: payer.publicKey, - toPubkey: acChange.publicKey, - lamports: 1_000_000, - }); - const setupTx = new Transaction(); - setupTx.recentBlockhash = blockhash; - setupTx.add(fund).sign(payer); - await client.processTransaction(setupTx); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: acCreate.publicKey, isSigner: true, isWritable: true }, - { pubkey: acChange.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: Buffer.alloc(0), - }); - - const tx = new Transaction(); - tx.recentBlockhash = context.lastBlockhash; - tx.add(ix).sign(payer, acCreate, acChange); - - const res = await client.tryProcessTransaction(tx); - assert.equal(res.result, "Error processing Instruction 0: custom program error: 0x6"); - }); -}); diff --git a/basics/checking-accounts/asm/tsconfig.json b/basics/checking-accounts/asm/tsconfig.json deleted file mode 100644 index 8c20b223..00000000 --- a/basics/checking-accounts/asm/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai", "node"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/checking-accounts/native/package.json b/basics/checking-accounts/native/package.json deleted file mode 100644 index f7dd7c5d..00000000 --- a/basics/checking-accounts/native/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5", - "solana-bankrun": "^0.3.0" - } -} diff --git a/basics/checking-accounts/native/pnpm-lock.yaml b/basics/checking-accounts/native/pnpm-lock.yaml deleted file mode 100644 index 6f8339c0..00000000 --- a/basics/checking-accounts/native/pnpm-lock.yaml +++ /dev/null @@ -1,1344 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/checking-accounts/native/program/Cargo.toml b/basics/checking-accounts/native/program/Cargo.toml index 665516c5..7f3eace1 100644 --- a/basics/checking-accounts/native/program/Cargo.toml +++ b/basics/checking-accounts/native/program/Cargo.toml @@ -20,8 +20,8 @@ unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana" [dev-dependencies] litesvm = "0.11.0" +solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" solana-pubkey = "3.0.0" -solana-sdk = "4.0.1" solana-transaction = "3.0.1" diff --git a/basics/checking-accounts/native/program/tests/test.rs b/basics/checking-accounts/native/program/tests/test.rs index 8fe3ddcf..4083bb20 100644 --- a/basics/checking-accounts/native/program/tests/test.rs +++ b/basics/checking-accounts/native/program/tests/test.rs @@ -3,7 +3,8 @@ use solana_keypair::{Keypair, Signer}; use solana_native_token::LAMPORTS_PER_SOL; use solana_pubkey::Pubkey; use solana_system_interface::instruction::create_account; -use solana_transaction::{AccountMeta, Instruction, Transaction}; +use solana_instruction::{AccountMeta, Instruction}; +use solana_transaction::Transaction; #[test] fn test_checking_accounts() { @@ -16,7 +17,11 @@ fn test_checking_accounts() { svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/checking_accounts_native_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/checking_accounts_native_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/checking-accounts/native/tests/test.ts b/basics/checking-accounts/native/tests/test.ts deleted file mode 100644 index a64bd5e0..00000000 --- a/basics/checking-accounts/native/tests/test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { describe, test } from "node:test"; -import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; -import { start } from "solana-bankrun"; - -describe("Checking accounts", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "checking_accounts_native_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - const rent = await client.getRent(); - - // We'll create this ahead of time. - // Our program will try to modify it. - const accountToChange = Keypair.generate(); - // Our program will create this. - const accountToCreate = Keypair.generate(); - - test("Create an account owned by our program", async () => { - const blockhash = context.lastBlockhash; - const ix = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: accountToChange.publicKey, - lamports: Number(rent.minimumBalance(BigInt(0))), - space: 0, - programId: PROGRAM_ID, // Our program - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, accountToChange); - - await client.processTransaction(tx); - }); - - test("Check accounts", async () => { - const blockhash = context.lastBlockhash; - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: accountToCreate.publicKey, isSigner: true, isWritable: true }, - { pubkey: accountToChange.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: Buffer.alloc(0), - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, accountToChange, accountToCreate); - - await client.processTransaction(tx); - }); -}); diff --git a/basics/checking-accounts/native/tsconfig.json b/basics/checking-accounts/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/checking-accounts/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/checking-accounts/pinocchio/package.json b/basics/checking-accounts/pinocchio/package.json deleted file mode 100644 index f7dd7c5d..00000000 --- a/basics/checking-accounts/pinocchio/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5", - "solana-bankrun": "^0.3.0" - } -} diff --git a/basics/checking-accounts/pinocchio/pnpm-lock.yaml b/basics/checking-accounts/pinocchio/pnpm-lock.yaml deleted file mode 100644 index 40c42043..00000000 --- a/basics/checking-accounts/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,1351 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.0': - resolution: {integrity: sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.0': - resolution: {integrity: sha512-SR7pKtmJBg2mhmkel2NeHA1pz06QeQXdMv8WJoIR9m8F/hw80K/612uaYbwTt2nkK0jg/Qn/rNSd7EcJ4SBGjw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.1.0': - resolution: {integrity: sha512-XMu4yw5iCgQnMKsxSWPPOrGgtaohmupN3eyAtYv3K3C/MJEc5V90h74k5B1GUCiHvcrdUDO9RclNjD9lgbjFag==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.1.0': - resolution: {integrity: sha512-l+GxAv0Ar4d3c3PlZdA9G++wFYZREEbbRyAFP8+n8HSg0vudCuzogh/13io6hYuUhG/9Ve8ARZNamhV7UScKNw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.2': - resolution: {integrity: sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@noble/curves@1.9.0': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.0(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.0(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.0(typescript@4.9.5) - '@solana/errors': 2.1.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.0(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.0 - '@noble/curves': 1.9.0 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.0(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.2 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.2 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.2': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.2 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.2 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.1: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - regenerator-runtime@0.14.1: {} - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/checking-accounts/pinocchio/program/Cargo.toml b/basics/checking-accounts/pinocchio/program/Cargo.toml index ea245111..c38f2d46 100644 --- a/basics/checking-accounts/pinocchio/program/Cargo.toml +++ b/basics/checking-accounts/pinocchio/program/Cargo.toml @@ -9,12 +9,12 @@ pinocchio-system.workspace = true pinocchio-log.workspace = true [dev-dependencies] -litesvm = "0.11.0" -solana-keypair = "3.0.1" -solana-native-token = "3.0.0" -solana-pubkey = "3.0.0" -solana-sdk = "4.0.1" -solana-transaction = "3.0.1" +litesvm.workspace = true +solana-instruction.workspace = true +solana-keypair.workspace = true +solana-native-token.workspace = true +solana-pubkey.workspace = true +solana-transaction.workspace = true solana-system-interface.workspace = true [lib] diff --git a/basics/checking-accounts/pinocchio/program/tests/test.rs b/basics/checking-accounts/pinocchio/program/tests/test.rs index df91f75d..cef61437 100644 --- a/basics/checking-accounts/pinocchio/program/tests/test.rs +++ b/basics/checking-accounts/pinocchio/program/tests/test.rs @@ -3,7 +3,8 @@ use solana_keypair::{Keypair, Signer}; use solana_native_token::LAMPORTS_PER_SOL; use solana_pubkey::Pubkey; use solana_system_interface::instruction::create_account; -use solana_transaction::{AccountMeta, Instruction, Transaction}; +use solana_instruction::{AccountMeta, Instruction}; +use solana_transaction::Transaction; #[test] fn test_checking_accounts() { @@ -16,8 +17,12 @@ fn test_checking_accounts() { svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); let program_id = Pubkey::new_unique(); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. let program_bytes = - include_bytes!("../../tests/fixtures/checking_accounts_pinocchio_program.so"); + include_bytes!("../../../../../target/deploy/checking_accounts_pinocchio_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/checking-accounts/pinocchio/tests/test.ts b/basics/checking-accounts/pinocchio/tests/test.ts deleted file mode 100644 index ea6a1a54..00000000 --- a/basics/checking-accounts/pinocchio/tests/test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { describe, test } from "node:test"; -import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; -import { start } from "solana-bankrun"; - -describe("Checking accounts", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "checking_accounts_pinocchio_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - const rent = await client.getRent(); - - // We'll create this ahead of time. - // Our program will try to modify it. - const accountToChange = Keypair.generate(); - // Our program will create this. - const accountToCreate = Keypair.generate(); - - test("Create an account owned by our program", async () => { - const blockhash = context.lastBlockhash; - const ix = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: accountToChange.publicKey, - lamports: Number(rent.minimumBalance(BigInt(0))), - space: 0, - programId: PROGRAM_ID, // Our program - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, accountToChange); - - await client.processTransaction(tx); - }); - - test("Check accounts", async () => { - const blockhash = context.lastBlockhash; - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: accountToCreate.publicKey, isSigner: true, isWritable: true }, - { pubkey: accountToChange.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: Buffer.alloc(0), - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, accountToChange, accountToCreate); - - await client.processTransaction(tx); - }); -}); diff --git a/basics/checking-accounts/pinocchio/tsconfig.json b/basics/checking-accounts/pinocchio/tsconfig.json deleted file mode 100644 index 8c20b223..00000000 --- a/basics/checking-accounts/pinocchio/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai", "node"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/close-account/native/package.json b/basics/close-account/native/package.json deleted file mode 100644 index 740e87a4..00000000 --- a/basics/close-account/native/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "node --import tsx --test ./tests/close-account.test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/kit": "^6.9.0", - "@solana/web3.js": "^1.98.4", - "borsh": "^0.7.0", - "litesvm": "^1.1.0" - }, - "devDependencies": { - "@types/node": "^25.9.1", - "tsx": "^4.22.4", - "typescript": "^5.9.0" - } -} diff --git a/basics/close-account/native/pnpm-lock.yaml b/basics/close-account/native/pnpm-lock.yaml deleted file mode 100644 index 67600698..00000000 --- a/basics/close-account/native/pnpm-lock.yaml +++ /dev/null @@ -1,1753 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/kit': - specifier: ^6.9.0 - version: 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - borsh: - specifier: ^0.7.0 - version: 0.7.0 - litesvm: - specifier: ^1.1.0 - version: 1.1.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - devDependencies: - '@types/node': - specifier: ^25.9.1 - version: 25.9.2 - tsx: - specifier: ^4.22.4 - version: 4.22.4 - typescript: - specifier: ^5.9.0 - version: 5.9.3 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@esbuild/aix-ppc64@0.28.0': - resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.28.0': - resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.28.0': - resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.28.0': - resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.28.0': - resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.28.0': - resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.28.0': - resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.28.0': - resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.28.0': - resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.28.0': - resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.28.0': - resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.28.0': - resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.28.0': - resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.28.0': - resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.28.0': - resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.28.0': - resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.28.0': - resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.28.0': - resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.28.0': - resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.28.0': - resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.28.0': - resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.28.0': - resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.28.0': - resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.28.0': - resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.28.0': - resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.28.0': - resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana-program/system@0.12.2': - resolution: {integrity: sha512-MaBeOxlvTruQhA7UYkOb3hVTEHPPagOtd+PvTm6a8rGgvEAP0kD4BbC37NceOaR4ABNqdaCmD5OMVRKgrE6KAg==} - peerDependencies: - '@solana/kit': ^6.4.0 - - '@solana-program/token@0.13.0': - resolution: {integrity: sha512-/Apjrd5lwOJGrPB0J5Rv7EBeclvyEBQPAGA85Scm7wBH+GpkbdLDM9uK3TNg8jjFKyWQYai/JtPHbrx7VgFLSg==} - peerDependencies: - '@solana/kit': ^6.5.0 - - '@solana/accounts@6.9.0': - resolution: {integrity: sha512-g36AJreJrgf9AAjOfbdFHEFUTymBgzbWHoEDElZ+fDKvqBINDiUVKzDApwc7C7kGPMFqQBaoEHnQRxf2IqfKZQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/addresses@6.9.0': - resolution: {integrity: sha512-tWnG2L6lo/ZhcMT019F3myDsH87MM8EZbTO0cgwgvVPlEdIGblROFF3tGVrb7FVCOlbPI0ONCFyPbnrmR58LsA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/assertions@6.9.0': - resolution: {integrity: sha512-FjWWD6e0in+HFsHMvU2zKCbyPfKtDW6iGXZZ9+Qg1QUYpO1AEObsya3F7hb9RkZKUueK4WwWAQnIuvEUp3A1uA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-core@6.9.0': - resolution: {integrity: sha512-F2BmLecG/1nTtnjyD509NsEc254pxJKa2bpvotymv1lL1WfEn3zchcZ9SMIiLyL4G6J8b9F3OKIq2YSZho2AOQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/codecs-data-structures@6.9.0': - resolution: {integrity: sha512-f7GYtiHafvJDhqiwzUUSr/6AYSK4DCw6quPmA80NZGtkNiFa+g6LoJy2wbC0wp2dxvCwNpxf6x3ILCYRutAvvg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@6.9.0': - resolution: {integrity: sha512-XMI0FOHV2h7yPAllxWCX8z+J1msidNjXzN1mRjH5KR6C+vfzyKa2xWHve0bNSV/bjVAhqqhc7dQCpBKuF4+ScQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/codecs-strings@6.9.0': - resolution: {integrity: sha512-PTqYQxMsmdfEEq29bV1AnALD4FjFEsSxOj1fYNqooOSTEQEpUoYEQtsd55/kBsnIKltXbvYwXYXBusm19n1sQA==} - engines: {node: '>=20.18.0'} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - typescript: '>=5.4.0' - peerDependenciesMeta: - fastestsmallesttextencoderdecoder: - optional: true - typescript: - optional: true - - '@solana/codecs@6.9.0': - resolution: {integrity: sha512-oWOybKa1PTGI1D/FyrvGKralADM1jmVZC2AtgEo+4JTKG0+i1p9ZbwNY2UcJqdYsDMDaGHAx0LMAid9LDCxXTQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@6.9.0': - resolution: {integrity: sha512-7i+b07KMnkbHvFlz7uWade3jvyc22UmVm8o9taxPK8YV3JNM/NkS8oQFvMac2MIaLPAlEs7I8MHyVLUal1yY4g==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/fast-stable-stringify@6.9.0': - resolution: {integrity: sha512-l14zGVsURbT5Aox/kLFQywqV4VaE9/j3h2EvCu9oULVPMwzQB6yezJb1/KyiDwhm/RscooPd0gFQFIKEGQbayw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/fixed-points@6.9.0': - resolution: {integrity: sha512-0K7mbYC4jdAZFlXqXjpNanmEyZxk7K9NtXDLc1zuhGuxwH8J9guvohwdw2V7TQ9bfjCYsprY3Tp2kUVQpECGmA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/functional@6.9.0': - resolution: {integrity: sha512-sgNHOaIjETZZuziZdlwPsU5EjBVj5M0dUbwrSQTTNZe0SxX3pQ1QFVcs5KyvdS7AQcpBVdLjx4CfQjdKXk52GA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/instruction-plans@6.9.0': - resolution: {integrity: sha512-SxTSOetEKD+WPzvDuYRsP1+KkwUp8KqL1n7oFx9ThxjyfEY0ly0i9KdbvX5yYVDOA2TSwrltgdu14y/Pf6y3Cg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/instructions@6.9.0': - resolution: {integrity: sha512-LZfJx3bGdUSbGaswoOEPHygticqkCg3TusRczPJXyCmKhoQzPCcGQQ99qMzP7Wg8pEV5tWA5t7tycf8E237ydg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/keys@6.9.0': - resolution: {integrity: sha512-1g2QARiqSjNqT0EIqLDLQ5vRm7hCsbqgFwFAp5GsMV/8BTYT8s1Ct2wLHDZiJ4eAX6beTHVf8LbOBfVejtn3oQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/kit@6.9.0': - resolution: {integrity: sha512-k7BRz7Akfv8wiRtlCR/xUyDLfuMfYMelMR1+AC5KgwaRRJReDF0BucMLNN1In7WoI+KuWwr1OKv4na/oKpyeAQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/nominal-types@6.9.0': - resolution: {integrity: sha512-ouhrnY7a6nsLXRGcariwcmHDdXroCNqOuzwtdjKt2c8e8Drwao9yxPH2VoViNgpq8IGNJeQMEI1TVnoJZRn0gw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/offchain-messages@6.9.0': - resolution: {integrity: sha512-qK3tqRPb+E0kmTz5qFXZbEdF4pyzfOWRZjyVESHVGemDDeGzZ1SV3zAxcA6HBCnv4wCBnlyaDPw8t+5sryNMAw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/options@6.9.0': - resolution: {integrity: sha512-H5ZRWNzzLMwHU/fRU9aVx+3TaMN4gDNCUYxsZxq0h7mqiwxFy6mpy95xPsfdldthCHDYtYnUTxe2sBatGbNHig==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/plugin-core@6.9.0': - resolution: {integrity: sha512-KslLSnzY8zbGZibEBVMVUm2ZS8T2xf+cut7F65VjWPoWNAxU+p7933wsMz/az6CF7b65RI7iU3HhCr5/5QF50w==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/plugin-interfaces@6.9.0': - resolution: {integrity: sha512-Qj4sk9thkM1UgnFXvWIoezd/CbqpX/2jigLBDsMB5Ed/gmFlkBSTL127LFDSY3OtzBpXl4hROs+Zqv+5xqtguA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/program-client-core@6.9.0': - resolution: {integrity: sha512-+iUnsddhs72QoBJoUO+/yHUXoBvYWa1sGCBRJk35zeg8j7ZXEwRkk6eX0VOrUPxhEpQbYJsIOCrIYApNIt8RFw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/programs@6.9.0': - resolution: {integrity: sha512-L9LAnQtfFFcCDLcbbnxhUtgAmu/kS4aRmrVncdnX5CFyQshlpo0/Qhrq3UA7vnhute4gjYV4pFT+64onH5qGEQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/promises@6.9.0': - resolution: {integrity: sha512-227PlXRi6KZX4ODYTkJitr9InSa79NTquI72slay4gzxO9VmMepgvYdMAX6kawdN5pt+VzaklKhNhWXk50Pi9g==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-api@6.9.0': - resolution: {integrity: sha512-3KhXS6A1ie6GqTywW/KEMSXJ1VJEU66fxjhuiiqPILuJstP7kex3ycr3H6DirKydUsy6gaKaPN43rE+LfyS7OA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-parsed-types@6.9.0': - resolution: {integrity: sha512-6ThH8izY+DWDyrVOOlS40vTcFjwjCinjfqnId7zhRk8OxhkfHQ/iEj+OnGwD4Yhe8pGdVa7GNVYlrQgQgzQ3eQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-spec-types@6.9.0': - resolution: {integrity: sha512-A4fY1JRrcKqX3EfttO4Q8L97nGPqdjfekAV0eDyxN5nu9ngf5p7GKenkl7AYDoHLNr6ZX/C96cRADxXjsRJ0iA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-spec@6.9.0': - resolution: {integrity: sha512-3yHRoChc0IpsJbUq0/94l+ar3t9U3Ax58W0HON7eyYe7zFP10UAxpkHn7DPch9DeALyuGph8kVnvl+kXRgJlGg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-subscriptions-api@6.9.0': - resolution: {integrity: sha512-UA/rPQeNx6zQMUFcS8PPPuB4vzUOtSzIY/igMH0DRoP020NyES2GguIb7Zo7sqDNi4n0gkQRhoW4dPVotcNKdA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-subscriptions-channel-websocket@6.9.0': - resolution: {integrity: sha512-kT8Yne9HjJD2gooaOFNSyKrvaIfOy2GR0Ymv8OfecBCwFStdz+SPo5eYXq8ZWoZbr5E/MMpHgqsHBanqa2Ffyg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-subscriptions-spec@6.9.0': - resolution: {integrity: sha512-DbaG67s99vRZQxFMK80UQ7DEKkRJK6JEZeYg/U5UttD6n7ax/vct7qopxGnrt4RCkaaac2fU8Sr+fcnvWQweUg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-subscriptions@6.9.0': - resolution: {integrity: sha512-IMctZQaMxzvRACQ6ooW98lP+7tVoUJnRgOZtkAdzgBizldQAYPIKd3MulP0jbQPCMfdPsa2Hs0NBcUwfgonq3w==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-transformers@6.9.0': - resolution: {integrity: sha512-dg4LK2wEBpaY+KRk/SJIkYvrvjdsc1AwD4bkmGY4Fp7EwVlvwBQShAQn78Qi4IP0WQ/0n9ncFyUxgcB1Y01ZuQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-transport-http@6.9.0': - resolution: {integrity: sha512-4gy30fWJcS6jrcXCoP/optFpGJ/gD9xdkE8wDbe1Ys/Y+e4XjyBt45xtTnbdmMdukvdRX+oXS3zgUIYoagpNzQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-types@6.9.0': - resolution: {integrity: sha512-iFhPzZK3qiQ1lhfNTNBTI7BIs5PfWZSgRLD3enKm8ZAQggzvUklfO3KPh47jVsc/Jsr1UGPH8M3o3m17qjO1Cg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc@6.9.0': - resolution: {integrity: sha512-ny1Kt20+oq3xZErNA56+Magmb2JKYfQgHwZTsBmHKVl/9mBpv1y1+ygV+KNiiX/wWXWstLbdIo1jgPwZPbU2Vg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/signers@6.9.0': - resolution: {integrity: sha512-x7WyoRm9IORMqeSqNivZgyY+RERPkmqWxpINPD13kUH+oaZzonORIgxk2Lz+u5iPRXiJPkdRPrQ4FoFWv8i6kQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/subscribable@6.9.0': - resolution: {integrity: sha512-YV0/BrJNfepf10CTfLwD7kRY1kkELDHd+BbHJZhBeiuiXTY3xQTvvx1RFs3NtfFCcTHG25Uh8NpRacQJnxSSIQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/sysvars@6.9.0': - resolution: {integrity: sha512-e0e+QKr/th9t/O2N1oUoJmcodLghzAtWKUlGb1zyYub0/WJrPImnKqJqp/gDP4tK98mJxopPMcprCeHk4B+TQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/transaction-confirmation@6.9.0': - resolution: {integrity: sha512-fzYCOih7hhtBzzNSkAnxMjeFeQ8U7e27k9i0RsgQc3/e3OCynF5HoIVNhhqZbwfIBKiaD4ginJR6slRnfqO32Q==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/transaction-messages@6.9.0': - resolution: {integrity: sha512-OWpryt0w6SHlwHx12Vd1wvx2QwSGBXAIUEHTCtkctcM3AaZRy5cIl7CAq9iD5PgahUsaOyRLBV0zlCJcC2JrJA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/transactions@6.9.0': - resolution: {integrity: sha512-uKPzLwHbjwChfVl82he17ntkh02PfgnMMhN7uOAC+VbkIt1O+EEw8sX87gi6kdG/EV+QBDQXm9PLAo5W0tYylw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@25.9.2': - resolution: {integrity: sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - esbuild@0.28.0: - resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} - engines: {node: '>=18'} - hasBin: true - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - litesvm-darwin-arm64@1.1.0: - resolution: {integrity: sha512-SjcivEOOjBk65U6TgIeMJ7CCnHNKQXHx0qf6K6GIFZC1aHTg7ePrEi+WhAQD6VUBMdDHIMCVKC/uXnXPi6EKIw==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - litesvm-darwin-x64@1.1.0: - resolution: {integrity: sha512-hTs+eZ9sHVZXhjggpnn/8A/E+Nt/E6Gf8E2ejdWWL9bBQKmq1Y0VcrDpORbIvqqRpTLHXqbxCuH1wQB2C8frJg==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - litesvm-linux-arm64-gnu@1.1.0: - resolution: {integrity: sha512-6EjJ6+E+1SUXdJmCyeyhvlKhNncccqQNH241+P8d4E72rE3zuFxeCtLHhusCQk2p/Xau3dBI0qTLogZ1F1IGSA==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - litesvm-linux-arm64-musl@1.1.0: - resolution: {integrity: sha512-mNuBOfX6GnDFT2i/kYPWud7eZGe57dDP0u4lwiSTQPRE0BxQbGZT2aEwX8LTwbonhbc6HSt50LamaZZzK4h4ig==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [musl] - - litesvm-linux-x64-gnu@1.1.0: - resolution: {integrity: sha512-Ot8RgUVlMKzKJi2nVDxaHVo0hjB5vtYTomYNIf26mIA32DOy0+dQfwOqUhynhvvSMxN3VFec3r/OtCnk6lRBrw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [glibc] - - litesvm-linux-x64-musl@1.1.0: - resolution: {integrity: sha512-6kmneOIsTBSActELRTwxIYVJOVaLm3P6uwlmkqc9BUtDAQ7bRdRmwREWSbM8XxKBGw2LjiUfgRJ5WJGYo8fUFg==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [musl] - - litesvm@1.1.0: - resolution: {integrity: sha512-UOlMIEst50gSUyPnC2pGjGLygH8iC/GOqnNXQIHc8iGwD76m44ReeA/0h0vu/AIieZ2zG5/ERLxFV0kdNxkNsA==} - engines: {node: '>= 20'} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tsx@4.22.4: - resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} - engines: {node: '>=18.0.0'} - hasBin: true - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@7.24.6: - resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} - - undici-types@8.4.1: - resolution: {integrity: sha512-iIXDNrTeaM0lDZvNUY1Urfs9dVgOWdQCkv6VMiePh644EKce0qoz6FNxxg7/DS4CxbFI36Atlz0VgHKS2qL1Dw==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@esbuild/aix-ppc64@0.28.0': - optional: true - - '@esbuild/android-arm64@0.28.0': - optional: true - - '@esbuild/android-arm@0.28.0': - optional: true - - '@esbuild/android-x64@0.28.0': - optional: true - - '@esbuild/darwin-arm64@0.28.0': - optional: true - - '@esbuild/darwin-x64@0.28.0': - optional: true - - '@esbuild/freebsd-arm64@0.28.0': - optional: true - - '@esbuild/freebsd-x64@0.28.0': - optional: true - - '@esbuild/linux-arm64@0.28.0': - optional: true - - '@esbuild/linux-arm@0.28.0': - optional: true - - '@esbuild/linux-ia32@0.28.0': - optional: true - - '@esbuild/linux-loong64@0.28.0': - optional: true - - '@esbuild/linux-mips64el@0.28.0': - optional: true - - '@esbuild/linux-ppc64@0.28.0': - optional: true - - '@esbuild/linux-riscv64@0.28.0': - optional: true - - '@esbuild/linux-s390x@0.28.0': - optional: true - - '@esbuild/linux-x64@0.28.0': - optional: true - - '@esbuild/netbsd-arm64@0.28.0': - optional: true - - '@esbuild/netbsd-x64@0.28.0': - optional: true - - '@esbuild/openbsd-arm64@0.28.0': - optional: true - - '@esbuild/openbsd-x64@0.28.0': - optional: true - - '@esbuild/openharmony-arm64@0.28.0': - optional: true - - '@esbuild/sunos-x64@0.28.0': - optional: true - - '@esbuild/win32-arm64@0.28.0': - optional: true - - '@esbuild/win32-ia32@0.28.0': - optional: true - - '@esbuild/win32-x64@0.28.0': - optional: true - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana-program/system@0.12.2(@solana/kit@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': - dependencies: - '@solana/kit': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - - '@solana-program/token@0.13.0(@solana/kit@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': - dependencies: - '@solana-program/system': 0.12.2(@solana/kit@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana/kit': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - - '@solana/accounts@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/addresses@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/assertions': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/assertions@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.1.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-core@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/codecs-data-structures@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/codecs-numbers@2.1.1(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@5.9.3) - '@solana/errors': 2.1.1(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/codecs-strings@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/codecs@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/fixed-points': 6.9.0(typescript@5.9.3) - '@solana/options': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@2.1.1(typescript@5.9.3)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 5.9.3 - - '@solana/errors@6.9.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - optionalDependencies: - typescript: 5.9.3 - - '@solana/fast-stable-stringify@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/fixed-points@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/functional@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/instruction-plans@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/instructions': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/promises': 6.9.0(typescript@5.9.3) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - '@solana/transactions': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/instructions@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/keys@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/assertions': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - '@solana/promises': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/kit@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/accounts': 6.9.0(typescript@5.9.3) - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/instruction-plans': 6.9.0(typescript@5.9.3) - '@solana/instructions': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/offchain-messages': 6.9.0(typescript@5.9.3) - '@solana/plugin-core': 6.9.0(typescript@5.9.3) - '@solana/plugin-interfaces': 6.9.0(typescript@5.9.3) - '@solana/program-client-core': 6.9.0(typescript@5.9.3) - '@solana/programs': 6.9.0(typescript@5.9.3) - '@solana/rpc': 6.9.0(typescript@5.9.3) - '@solana/rpc-api': 6.9.0(typescript@5.9.3) - '@solana/rpc-parsed-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/signers': 6.9.0(typescript@5.9.3) - '@solana/subscribable': 6.9.0(typescript@5.9.3) - '@solana/sysvars': 6.9.0(typescript@5.9.3) - '@solana/transaction-confirmation': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - '@solana/transactions': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - bufferutil - - fastestsmallesttextencoderdecoder - - utf-8-validate - - '@solana/nominal-types@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/offchain-messages@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/options@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/plugin-core@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/plugin-interfaces@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/instruction-plans': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/signers': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/program-client-core@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/accounts': 6.9.0(typescript@5.9.3) - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/instruction-plans': 6.9.0(typescript@5.9.3) - '@solana/instructions': 6.9.0(typescript@5.9.3) - '@solana/plugin-interfaces': 6.9.0(typescript@5.9.3) - '@solana/rpc-api': 6.9.0(typescript@5.9.3) - '@solana/signers': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/programs@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/promises@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/rpc-api@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/rpc-parsed-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - '@solana/transactions': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/rpc-parsed-types@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/rpc-spec-types@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/rpc-spec@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/rpc-subscriptions-api@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - '@solana/transactions': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/rpc-subscriptions-channel-websocket@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) - '@solana/subscribable': 6.9.0(typescript@5.9.3) - ws: 8.21.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@solana/rpc-subscriptions-spec@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/promises': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - '@solana/subscribable': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/rpc-subscriptions@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/promises': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions-api': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions-channel-websocket': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/subscribable': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - bufferutil - - fastestsmallesttextencoderdecoder - - utf-8-validate - - '@solana/rpc-transformers@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/rpc-transport-http@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - undici-types: 8.4.1 - optionalDependencies: - typescript: 5.9.3 - - '@solana/rpc-types@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/fixed-points': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/rpc@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/rpc-api': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) - '@solana/rpc-transport-http': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/signers@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/instructions': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - '@solana/offchain-messages': 6.9.0(typescript@5.9.3) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - '@solana/transactions': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/subscribable@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/sysvars@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/accounts': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/transaction-confirmation@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/promises': 6.9.0(typescript@5.9.3) - '@solana/rpc': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - '@solana/transactions': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - bufferutil - - fastestsmallesttextencoderdecoder - - utf-8-validate - - '@solana/transaction-messages@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/instructions': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/transactions@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/instructions': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@5.9.3) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/connect@3.4.38': - dependencies: - '@types/node': 25.9.2 - - '@types/node@12.20.55': {} - - '@types/node@25.9.2': - dependencies: - undici-types: 7.24.6 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 25.9.2 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 25.9.2 - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - chalk@5.4.1: {} - - chalk@5.6.2: {} - - commander@13.1.0: {} - - commander@14.0.3: {} - - commander@2.20.3: {} - - delay@5.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - esbuild@0.28.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.28.0 - '@esbuild/android-arm': 0.28.0 - '@esbuild/android-arm64': 0.28.0 - '@esbuild/android-x64': 0.28.0 - '@esbuild/darwin-arm64': 0.28.0 - '@esbuild/darwin-x64': 0.28.0 - '@esbuild/freebsd-arm64': 0.28.0 - '@esbuild/freebsd-x64': 0.28.0 - '@esbuild/linux-arm': 0.28.0 - '@esbuild/linux-arm64': 0.28.0 - '@esbuild/linux-ia32': 0.28.0 - '@esbuild/linux-loong64': 0.28.0 - '@esbuild/linux-mips64el': 0.28.0 - '@esbuild/linux-ppc64': 0.28.0 - '@esbuild/linux-riscv64': 0.28.0 - '@esbuild/linux-s390x': 0.28.0 - '@esbuild/linux-x64': 0.28.0 - '@esbuild/netbsd-arm64': 0.28.0 - '@esbuild/netbsd-x64': 0.28.0 - '@esbuild/openbsd-arm64': 0.28.0 - '@esbuild/openbsd-x64': 0.28.0 - '@esbuild/openharmony-arm64': 0.28.0 - '@esbuild/sunos-x64': 0.28.0 - '@esbuild/win32-arm64': 0.28.0 - '@esbuild/win32-ia32': 0.28.0 - '@esbuild/win32-x64': 0.28.0 - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fsevents@2.3.3: - optional: true - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - json-stringify-safe@5.0.1: {} - - litesvm-darwin-arm64@1.1.0: - optional: true - - litesvm-darwin-x64@1.1.0: - optional: true - - litesvm-linux-arm64-gnu@1.1.0: - optional: true - - litesvm-linux-arm64-musl@1.1.0: - optional: true - - litesvm-linux-x64-gnu@1.1.0: - optional: true - - litesvm-linux-x64-musl@1.1.0: - optional: true - - litesvm@1.1.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10): - dependencies: - '@solana-program/system': 0.12.2(@solana/kit@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana-program/token': 0.13.0(@solana/kit@6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana/kit': 6.9.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) - optionalDependencies: - litesvm-darwin-arm64: 1.1.0 - litesvm-darwin-x64: 1.1.0 - litesvm-linux-arm64-gnu: 1.1.0 - litesvm-linux-arm64-musl: 1.1.0 - litesvm-linux-x64-gnu: 1.1.0 - litesvm-linux-x64-musl: 1.1.0 - transitivePeerDependencies: - - bufferutil - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - ms@2.1.3: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - superstruct@2.0.2: {} - - text-encoding-utf-8@1.0.2: {} - - tr46@0.0.3: {} - - tslib@2.8.1: {} - - tsx@4.22.4: - dependencies: - esbuild: 0.28.0 - optionalDependencies: - fsevents: 2.3.3 - - typescript@5.9.3: {} - - undici-types@7.24.6: {} - - undici-types@8.4.1: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.21.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 diff --git a/basics/close-account/native/program/tests/test.rs b/basics/close-account/native/program/tests/test.rs index a9ab4ccb..7081894e 100644 --- a/basics/close-account/native/program/tests/test.rs +++ b/basics/close-account/native/program/tests/test.rs @@ -15,7 +15,11 @@ const TRANSACTION_FEE_LAMPORTS: u64 = 5000; fn setup() -> (LiteSVM, Pubkey) { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/close_account_native_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/close_account_native_program.so"); svm.add_program(program_id, program_bytes).unwrap(); (svm, program_id) } diff --git a/basics/close-account/native/tests/close-account.test.ts b/basics/close-account/native/tests/close-account.test.ts deleted file mode 100644 index d399d239..00000000 --- a/basics/close-account/native/tests/close-account.test.ts +++ /dev/null @@ -1,153 +0,0 @@ -// In-process integration test: the program `.so` is loaded into a LiteSVM -// instance (no validator) and driven through the web3.js instruction -// builders in ../ts. - -import assert from "node:assert/strict"; -import { readFileSync } from "node:fs"; -import { dirname, join } from "node:path"; -import { describe, test } from "node:test"; -import { fileURLToPath } from "node:url"; - -import { - AccountRole, - type Address, - appendTransactionMessageInstruction, - createTransactionMessage, - generateKeyPairSigner, - type Instruction, - lamports, - pipe, - setTransactionMessageFeePayerSigner, - signTransactionMessageWithSigners, -} from "@solana/kit"; -import { PublicKey, type TransactionInstruction } from "@solana/web3.js"; -import { FailedTransactionMetadata, LiteSVM } from "litesvm"; - -import { createCloseUserInstruction, createCreateUserInstruction } from "../ts"; - -const here = dirname(fileURLToPath(import.meta.url)); -const programSoPath = join(here, "fixtures", "close_account_native_program.so"); - -// LiteSVM's default fee: 5000 lamports per signature, one signer per -// transaction in these tests. -const TRANSACTION_FEE_LAMPORTS = 5000n; - -/** Convert a web3.js TransactionInstruction (from ../ts) into a kit Instruction. */ -function toKitInstruction(instruction: TransactionInstruction): Instruction { - return { - programAddress: instruction.programId.toBase58() as Address, - accounts: instruction.keys.map((meta) => ({ - address: meta.pubkey.toBase58() as Address, - role: meta.isSigner - ? meta.isWritable - ? AccountRole.WRITABLE_SIGNER - : AccountRole.READONLY_SIGNER - : meta.isWritable - ? AccountRole.WRITABLE - : AccountRole.READONLY, - })), - data: new Uint8Array(instruction.data), - }; -} - -async function sendIx( - svm: LiteSVM, - feePayer: Awaited>, - instruction: Instruction, -) { - const tx = await pipe( - createTransactionMessage({ version: 0 }), - (m) => setTransactionMessageFeePayerSigner(feePayer, m), - (m) => svm.setTransactionMessageLifetimeUsingLatestBlockhash(m), - (m) => appendTransactionMessageInstruction(instruction, m), - (m) => signTransactionMessageWithSigners(m), - ); - const result = svm.sendTransaction(tx); - if (result instanceof FailedTransactionMetadata) { - throw new Error(`Transaction failed: ${result.err()}\n${result.meta().logs().join("\n")}`); - } - return result; -} - -describe("Close Account!", () => { - test("create, reject a non-owner close, then close and recover every lamport", async () => { - const svm = new LiteSVM(); - const programId = (await generateKeyPairSigner()).address; - svm.addProgram(programId, readFileSync(programSoPath)); - - const payer = await generateKeyPairSigner(); - svm.airdrop(payer.address, lamports(10_000_000_000n)); - const payerPublicKey = new PublicKey(payer.address); - const programPublicKey = new PublicKey(programId); - - const userAccount = PublicKey.findProgramAddressSync( - [Buffer.from("USER"), payerPublicKey.toBuffer()], - programPublicKey, - )[0]; - const userAccountAddress = userAccount.toBase58() as Address; - - // 1. Create the user account. - await sendIx( - svm, - payer, - toKitInstruction(createCreateUserInstruction(userAccount, payerPublicKey, programPublicKey, "Jacob")), - ); - - const userAccountLamports = svm.getBalance(userAccountAddress); - assert.ok( - userAccountLamports !== null && userAccountLamports > 0n, - "user account should hold rent lamports after create", - ); - - // 2. A non-owner cannot close it: the attacker signs as payer, but the - // target is the victim's PDA, so the program's seeds check rejects it. - const attacker = await generateKeyPairSigner(); - svm.airdrop(attacker.address, lamports(1_000_000_000n)); - const attackerPublicKey = new PublicKey(attacker.address); - - await assert.rejects( - sendIx( - svm, - attacker, - toKitInstruction(createCloseUserInstruction(userAccount, attackerPublicKey, programPublicKey)), - ), - "closing someone else's account must fail", - ); - - // 3. Naming the victim as payer without their signature is rejected too. - const closeWithoutSignature = toKitInstruction( - createCloseUserInstruction(userAccount, payerPublicKey, programPublicKey), - ); - const demotedAccounts = closeWithoutSignature.accounts!.map((meta) => - meta.address === payer.address ? { address: meta.address, role: AccountRole.WRITABLE } : meta, - ); - await assert.rejects( - sendIx(svm, attacker, { ...closeWithoutSignature, accounts: demotedAccounts }), - "closing without the owner's signature must fail", - ); - assert.equal( - svm.getBalance(userAccountAddress), - userAccountLamports, - "victim account must survive the attacks untouched", - ); - - // 4. The owner closes it and recovers every lamport (minus the - // transaction fee). Nothing is stranded at the PDA. - const payerBalanceBefore = svm.getBalance(payer.address)!; - await sendIx( - svm, - payer, - toKitInstruction(createCloseUserInstruction(userAccount, payerPublicKey, programPublicKey)), - ); - - const payerBalanceAfter = svm.getBalance(payer.address)!; - assert.equal( - payerBalanceAfter, - payerBalanceBefore + userAccountLamports - TRANSACTION_FEE_LAMPORTS, - "payer should recover every lamport the PDA held", - ); - - const closedBalance = svm.getBalance(userAccountAddress); - assert.ok(closedBalance === null || closedBalance === 0n, "closed account should hold no lamports"); - }); -}); diff --git a/basics/close-account/native/tests/fixtures/close_account_native_program.so b/basics/close-account/native/tests/fixtures/close_account_native_program.so deleted file mode 100755 index bb1c5e0d89d8b1ac4df36c08466e2fd7e9a9a0e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88528 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 Ok3&GIMBB15Ec7{X-$ diff --git a/basics/close-account/native/ts/index.ts b/basics/close-account/native/ts/index.ts deleted file mode 100644 index 110032b7..00000000 --- a/basics/close-account/native/ts/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./instructions"; -export * from "./state"; diff --git a/basics/close-account/native/ts/instructions/close.ts b/basics/close-account/native/ts/instructions/close.ts deleted file mode 100644 index 3bc4afd3..00000000 --- a/basics/close-account/native/ts/instructions/close.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Buffer } from "node:buffer"; -import { type PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; -import * as borsh from "borsh"; -import { MyInstruction } from "."; - -export class Close { - instruction: MyInstruction; - - constructor(props: { - instruction: MyInstruction; - }) { - this.instruction = props.instruction; - } - - toBuffer() { - return Buffer.from(borsh.serialize(CloseSchema, this)); - } - - static fromBuffer(buffer: Buffer) { - return borsh.deserialize(CloseSchema, Close, buffer); - } -} - -export const CloseSchema = new Map([ - [ - Close, - { - kind: "struct", - fields: [["instruction", "u8"]], - }, - ], -]); - -export function createCloseUserInstruction( - target: PublicKey, - payer: PublicKey, - programId: PublicKey, -): TransactionInstruction { - const instructionObject = new Close({ - instruction: MyInstruction.CloseUser, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: target, isSigner: false, isWritable: true }, - { pubkey: payer, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: programId, - data: instructionObject.toBuffer(), - }); - - return ix; -} diff --git a/basics/close-account/native/ts/instructions/create.ts b/basics/close-account/native/ts/instructions/create.ts deleted file mode 100644 index 7a18c43a..00000000 --- a/basics/close-account/native/ts/instructions/create.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Buffer } from "node:buffer"; -import { type PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; -import * as borsh from "borsh"; -import { MyInstruction } from "."; - -export class Create { - instruction: MyInstruction; - name: string; - - constructor(props: { instruction: MyInstruction; name: string }) { - this.instruction = props.instruction; - this.name = props.name; - } - - toBuffer() { - return Buffer.from(borsh.serialize(CreateSchema, this)); - } - - static fromBuffer(buffer: Buffer) { - return borsh.deserialize(CreateSchema, Create, buffer); - } -} - -export const CreateSchema = new Map([ - [ - Create, - { - kind: "struct", - fields: [ - ["instruction", "u8"], - ["name", "string"], - ], - }, - ], -]); - -export function createCreateUserInstruction( - target: PublicKey, - payer: PublicKey, - programId: PublicKey, - name: string, -): TransactionInstruction { - const instructionObject = new Create({ - instruction: MyInstruction.CreateUser, - name, - }); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: target, isSigner: false, isWritable: true }, - { pubkey: payer, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: programId, - data: instructionObject.toBuffer(), - }); - - return ix; -} diff --git a/basics/close-account/native/ts/instructions/index.ts b/basics/close-account/native/ts/instructions/index.ts deleted file mode 100644 index d3e93a14..00000000 --- a/basics/close-account/native/ts/instructions/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./close"; -export * from "./create"; - -export const MyInstruction = { - CreateUser: 0, - CloseUser: 1, -} as const; diff --git a/basics/close-account/native/ts/state/index.ts b/basics/close-account/native/ts/state/index.ts deleted file mode 100644 index 440a115d..00000000 --- a/basics/close-account/native/ts/state/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Buffer } from "node:buffer"; -import * as borsh from "borsh"; - -export class User { - name: string; - - constructor(props: { - name: string; - }) { - this.name = props.name; - } - - toBase58() { - return borsh.serialize(UserSchema, this).toString(); - } - - toBuffer() { - return Buffer.from(borsh.serialize(UserSchema, this)); - } - - static fromBuffer(buffer: Buffer) { - return borsh.deserialize(UserSchema, User, buffer); - } -} - -export const UserSchema = new Map([ - [ - User, - { - kind: "struct", - fields: [["name", "string"]], - }, - ], -]); diff --git a/basics/close-account/pinocchio/package.json b/basics/close-account/pinocchio/package.json deleted file mode 100644 index 1b568942..00000000 --- a/basics/close-account/pinocchio/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tests/tsconfig.test.json -t 1000000 ./tests/close-account.test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.2.0", - "@types/chai": "^4.3.20", - "@types/mocha": "^9.1.1", - "chai": "^4.5.0", - "mocha": "^9.2.2", - "solana-bankrun": "^0.3.1", - "ts-mocha": "^10.1.0", - "typescript": "^4.9.5" - } -} diff --git a/basics/close-account/pinocchio/pnpm-lock.yaml b/basics/close-account/pinocchio/pnpm-lock.yaml deleted file mode 100644 index 4570230e..00000000 --- a/basics/close-account/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,1342 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.2.0 - version: 5.2.0 - '@types/chai': - specifier: ^4.3.20 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.5.0 - version: 4.5.0 - mocha: - specifier: ^9.2.2 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.1 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.1.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.9.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.28.4': - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.2.0': - resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@24.10.1': - resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.1: - resolution: {integrity: sha512-bY6a+i/lEtBJ/mUxwsCTgevoV1P0foXTVA7UoThzaIWbM+3NDqorf8NBWs5DmqKTFeA1IoNzgvkWjFCPgnzUiQ==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.28.4': {} - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.3.0(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.3.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.3.0(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@4.9.5) - '@solana/errors': 2.3.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.3.0(typescript@4.9.5)': - dependencies: - chalk: 5.6.2 - commander: 14.0.2 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.28.4 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.3.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.2.0': - dependencies: - '@types/node': 24.10.1 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 12.20.55 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@24.10.1': - dependencies: - undici-types: 7.16.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 12.20.55 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 24.10.1 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.12: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@14.0.2: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.12 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.12 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.3.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@7.16.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/close-account/pinocchio/program/tests/tests.rs b/basics/close-account/pinocchio/program/tests/tests.rs index d6b8d11f..7fa1ce93 100644 --- a/basics/close-account/pinocchio/program/tests/tests.rs +++ b/basics/close-account/pinocchio/program/tests/tests.rs @@ -14,7 +14,11 @@ const TRANSACTION_FEE_LAMPORTS: u64 = 5000; fn setup() -> (LiteSVM, Pubkey) { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/close_account_pinocchio_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/close_account_pinocchio_program.so"); svm.add_program(program_id, program_bytes).unwrap(); (svm, program_id) } diff --git a/basics/close-account/pinocchio/tests/close-account.test.ts b/basics/close-account/pinocchio/tests/close-account.test.ts deleted file mode 100644 index 16381881..00000000 --- a/basics/close-account/pinocchio/tests/close-account.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { describe } from "node:test"; - -describe("Close Account!", async () => { - console.log("Close Account"); -}); diff --git a/basics/close-account/pinocchio/tests/fixtures/close_account_pinocchio_program.so b/basics/close-account/pinocchio/tests/fixtures/close_account_pinocchio_program.so deleted file mode 100755 index 4fa09d9fff8243f2a5820f8a012ac0ac527c5408..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19200 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 diff --git a/basics/close-account/pinocchio/tests/tsconfig.test.json b/basics/close-account/pinocchio/tests/tsconfig.test.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/close-account/pinocchio/tests/tsconfig.test.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/close-account/pinocchio/tsconfig.json b/basics/close-account/pinocchio/tsconfig.json deleted file mode 100644 index 8c20b223..00000000 --- a/basics/close-account/pinocchio/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai", "node"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/counter/native/README.md b/basics/counter/native/README.md index 250d59d9..2a8d2dda 100644 --- a/basics/counter/native/README.md +++ b/basics/counter/native/README.md @@ -4,11 +4,12 @@ Counter written in Solana native, using only the Solana toolchain. ## Setup -1. Build the [program](https://solana.com/docs/terminology#program): `cargo build-sbf` -2. Run the tests: `pnpm test` +1. Build the [program](https://solana.com/docs/terminology#program): `cargo build-sbf --manifest-path=./program/Cargo.toml` +2. Run the Rust + LiteSVM tests: `cargo test --manifest-path=./program/Cargo.toml` + +Rebuild the program after every change before re-running the tests: the tests embed the `.so` at compile time, so a stale binary silently tests old code. ## Debugging -1. Start a test validator: `pnpm start-validator` +1. Start a test validator: `solana-test-validator` 2. Listen to program logs: `solana config set -ul && solana logs` -3. Run the tests: `pnpm run-tests` diff --git a/basics/counter/native/package.json b/basics/counter/native/package.json deleted file mode 100644 index 1a180865..00000000 --- a/basics/counter/native/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "counter-solana-native", - "version": "0.1.0", - "description": "Counter program written using only Solana tooling", - "main": "index.js", - "author": "ngundotra", - "license": "Apache-2.0", - "private": false, - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tests/tsconfig.test.json -t 1000000 ./tests/counter.test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "bn.js": "^5.2.2" - } -} diff --git a/basics/counter/native/pnpm-lock.yaml b/basics/counter/native/pnpm-lock.yaml deleted file mode 100644 index 01f3d4a5..00000000 --- a/basics/counter/native/pnpm-lock.yaml +++ /dev/null @@ -1,1357 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@6.0.6) - bn.js: - specifier: ^5.2.2 - version: 5.2.2 - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.5 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.16 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.4.1 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.0(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@6.0.6) - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.19': - resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.12.11': - resolution: {integrity: sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==} - - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.5: - resolution: {integrity: sha512-4mAmr+AEhPYJ9TmDtxF3r3ZcbWy7W8kvZ4PoZYw/Xgp2J7WixjwTgiQZsoTDvch5nimmg3Ay6/0Kuh9oIvVs9A==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.0: - resolution: {integrity: sha512-+NbDncf0U6l3knuacRBiqpjZ2DSp+5lZaAU518gH7/x6qubbui/d000STaIBK+uNTPBS/AL/bCN+7PkXqmA3lA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.0: - resolution: {integrity: sha512-1/F0xdMa4qvc5o6z16FCCbZ5jbdvKvxpx5kyPcMWRiRPwyvi+zltMxciPAYMlg3wslQqGz88uFhrBEzq2eTumQ==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.0: - resolution: {integrity: sha512-U6CANjkmMl+lgNA7UH0GKs5V7LtVIUDzJBZefGGqLfqUNv3EjA/PrrToM0hAOWJgkxSwdz6zW+p5sw5FmnbXtg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.0: - resolution: {integrity: sha512-qJSkCFs0k2n4XtTnyxGMiZsuqO2TiqTYgWjQ+3mZhGNUAMys/Vq8bd7/SyBm6RR7EfVuRXRxZvh+F8oKZ77V4w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.0: - resolution: {integrity: sha512-xsS2CS2xb1Sw4ivNXM0gPz/qpW9BX0neSvt/pnok5L330Nu9xlTnKAY8FhzzqOP9P9sJlGRM787Y6d0yYwt6xQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.0: - resolution: {integrity: sha512-YkH7sa8TB/AoRPzG17CXJtYsRIQHEkEqGLz1Vwc13taXhDBkjO7z6NI5JYw7n0ybRymDHwMYTc7sd+5J40TyVQ==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - utf-8-validate@6.0.6: - resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} - engines: {node: '>=6.14.2'} - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.28.6': {} - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.3.0(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.3.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.3.0(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@4.9.5) - '@solana/errors': 2.3.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.3.0(typescript@4.9.5)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@6.0.6)': - dependencies: - '@babel/runtime': 7.28.6 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.4.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@4.9.5) - agentkeepalive: 4.5.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - node-fetch: 2.7.0 - rpc-websockets: 9.3.5 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.19': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 20.12.11 - - '@types/chai@4.3.16': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.12.11 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@20.12.11': - dependencies: - undici-types: 5.26.5 - - '@types/uuid@10.0.0': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 20.12.11 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 20.12.11 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.9: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.9 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - camelcase@6.3.0: {} - - chai@4.4.1: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@14.0.3: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.1.2: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.4: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - - jayson@4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.1: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.3.5: - dependencies: - '@swc/helpers': 0.5.19 - '@types/uuid': 10.0.0 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.4 - uuid: 11.1.0 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.0: - optional: true - - solana-bankrun-darwin-universal@0.3.0: - optional: true - - solana-bankrun-darwin-x64@0.3.0: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.0: - optional: true - - solana-bankrun-linux-x64-musl@0.3.0: - optional: true - - solana-bankrun@0.3.0(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@6.0.6): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@6.0.6) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.0 - solana-bankrun-darwin-universal: 0.3.0 - solana-bankrun-darwin-x64: 0.3.0 - solana-bankrun-linux-x64-gnu: 0.3.0 - solana-bankrun-linux-x64-musl: 0.3.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.0.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.0.8: {} - - typescript@4.9.5: {} - - undici-types@5.26.5: {} - - utf-8-validate@6.0.6: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - uuid@11.1.0: {} - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/counter/native/program/tests/test.rs b/basics/counter/native/program/tests/test.rs index aae5344b..8fe44523 100644 --- a/basics/counter/native/program/tests/test.rs +++ b/basics/counter/native/program/tests/test.rs @@ -9,11 +9,12 @@ use solana_rent::Rent; use solana_system_interface::instruction::create_account; use solana_transaction::Transaction; -// The .so is built into ../../tests/fixtures by `pnpm build-and-test` (which runs -// `cargo build-sbf --sbf-out-dir=./tests/fixtures` from the package root). Run -// that script (or `cargo build-sbf` with --sbf-out-dir set accordingly) before -// `cargo test`. -const PROGRAM_SO: &[u8] = include_bytes!("../../tests/fixtures/counter_solana_native.so"); +// The .so is built into the workspace target/deploy by +// `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project +// root). Rebuild after every program change: the binary is embedded at +// test-compile time, so a stale .so silently tests old code. +const PROGRAM_SO: &[u8] = + include_bytes!("../../../../../target/deploy/counter_solana_native.so"); fn setup_with_counter() -> (LiteSVM, Pubkey, Keypair, Keypair) { let program_id = Pubkey::new_unique(); diff --git a/basics/counter/native/tests/counter.test.ts b/basics/counter/native/tests/counter.test.ts deleted file mode 100644 index 97784546..00000000 --- a/basics/counter/native/tests/counter.test.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { describe, test } from "node:test"; -import { Keypair, SystemProgram, Transaction, type TransactionInstruction } from "@solana/web3.js"; -import { assert } from "chai"; -import { start } from "solana-bankrun"; -import { COUNTER_ACCOUNT_SIZE, createIncrementInstruction, deserializeCounterAccount, PROGRAM_ID } from "../ts"; - -describe("Counter Solana Native", async () => { - // Randomly generate the program keypair and load the program to solana-bankrun - const context = await start([{ name: "counter_solana_native", programId: PROGRAM_ID }], []); - const client = context.banksClient; - // Get the payer keypair from the context, this will be used to sign transactions with enough lamports - const payer = context.payer; - // Get the rent object to calculate rent for the accounts - const rent = await client.getRent(); - - test("Test allocate counter + increment tx", async () => { - // Randomly generate the account key - // to sign for setting up the Counter state - const counterKeypair = Keypair.generate(); - const counter = counterKeypair.publicKey; - - // Create a TransactionInstruction to interact with our counter program - const allocIx: TransactionInstruction = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: counter, - lamports: Number(rent.minimumBalance(BigInt(COUNTER_ACCOUNT_SIZE))), - space: COUNTER_ACCOUNT_SIZE, - programId: PROGRAM_ID, - }); - const incrementIx: TransactionInstruction = createIncrementInstruction({ counter }, {}); - const tx = new Transaction().add(allocIx).add(incrementIx); - - // Explicitly set the feePayer to be our wallet (this is set to first signer by default) - tx.feePayer = payer.publicKey; - - // Fetch a "timestamp" so validators know this is a recent transaction - const blockhash = context.lastBlockhash; - tx.recentBlockhash = blockhash; - - // Sign the transaction with the payer's keypair - tx.sign(payer, counterKeypair); - - // Send transaction to bankrun - await client.processTransaction(tx); - - // Get the counter account info from network - const counterAccountInfo = await client.getAccount(counter); - assert(counterAccountInfo, "Expected counter account to have been created"); - - // Deserialize the counter & check count has been incremented - const counterAccount = deserializeCounterAccount(Buffer.from(counterAccountInfo.data)); - assert(counterAccount.count.toNumber() === 1, "Expected count to have been 1"); - console.log(`[alloc+increment] count is: ${counterAccount.count.toNumber()}`); - }); - - test("Test allocate tx and increment tx", async () => { - const counterKeypair = Keypair.generate(); - const counter = counterKeypair.publicKey; - - // Check allocate tx - const allocIx: TransactionInstruction = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: counter, - lamports: Number(rent.minimumBalance(BigInt(COUNTER_ACCOUNT_SIZE))), - space: COUNTER_ACCOUNT_SIZE, - programId: PROGRAM_ID, - }); - let tx = new Transaction().add(allocIx); - const blockhash = context.lastBlockhash; - tx.feePayer = payer.publicKey; - tx.recentBlockhash = blockhash; - tx.sign(payer, counterKeypair); - - await client.processTransaction(tx); - - let counterAccountInfo = await client.getAccount(counter); - assert(counterAccountInfo, "Expected counter account to have been created"); - - let counterAccount = deserializeCounterAccount(Buffer.from(counterAccountInfo.data)); - assert(counterAccount.count.toNumber() === 0, "Expected count to have been 0"); - console.log(`[allocate] count is: ${counterAccount.count.toNumber()}`); - - // Check increment tx - const incrementIx: TransactionInstruction = createIncrementInstruction({ counter }, {}); - tx = new Transaction().add(incrementIx); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = blockhash; - tx.sign(payer); - - await client.processTransaction(tx); - - counterAccountInfo = await client.getAccount(counter); - assert(counterAccountInfo, "Expected counter account to have been created"); - - counterAccount = deserializeCounterAccount(Buffer.from(counterAccountInfo.data)); - assert(counterAccount.count.toNumber() === 1, "Expected count to have been 1"); - console.log(`[increment] count is: ${counterAccount.count.toNumber()}`); - }); -}); diff --git a/basics/counter/native/tests/tsconfig.test.json b/basics/counter/native/tests/tsconfig.test.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/counter/native/tests/tsconfig.test.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/counter/native/ts/accounts/counter.ts b/basics/counter/native/ts/accounts/counter.ts deleted file mode 100644 index e89747f9..00000000 --- a/basics/counter/native/ts/accounts/counter.ts +++ /dev/null @@ -1,17 +0,0 @@ -import BN from "bn.js"; - -export type Counter = { - count: BN; -}; - -export const COUNTER_ACCOUNT_SIZE = 8; - -export function deserializeCounterAccount(data: Buffer): Counter { - if (data.byteLength !== 8) { - throw Error("Need exactly 8 bytes to deserialize counter"); - } - - return { - count: new BN(data, "le"), - }; -} diff --git a/basics/counter/native/ts/accounts/index.ts b/basics/counter/native/ts/accounts/index.ts deleted file mode 100644 index bd1575cb..00000000 --- a/basics/counter/native/ts/accounts/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./counter"; diff --git a/basics/counter/native/ts/index.ts b/basics/counter/native/ts/index.ts deleted file mode 100644 index b353a01f..00000000 --- a/basics/counter/native/ts/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { PublicKey } from "@solana/web3.js"; - -export * from "./accounts"; -export * from "./instructions"; - -export const PROGRAM_ID = new PublicKey("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"); diff --git a/basics/counter/native/ts/instructions/createIncrementInstruction.ts b/basics/counter/native/ts/instructions/createIncrementInstruction.ts deleted file mode 100644 index b7290acf..00000000 --- a/basics/counter/native/ts/instructions/createIncrementInstruction.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { type PublicKey, TransactionInstruction } from "@solana/web3.js"; -import { PROGRAM_ID } from "../"; - -export type IncrementInstructionAccounts = { - counter: PublicKey; -}; - -export function createIncrementInstruction(accounts: IncrementInstructionAccounts): TransactionInstruction { - return new TransactionInstruction({ - programId: PROGRAM_ID, - keys: [ - { - pubkey: accounts.counter, - isSigner: false, - isWritable: true, - }, - ], - data: Buffer.from([0x0]), - }); -} diff --git a/basics/counter/native/ts/instructions/index.ts b/basics/counter/native/ts/instructions/index.ts deleted file mode 100644 index 618dcd82..00000000 --- a/basics/counter/native/ts/instructions/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./createIncrementInstruction"; diff --git a/basics/counter/pinocchio/README.md b/basics/counter/pinocchio/README.md index c6701d40..2a4b2d2a 100644 --- a/basics/counter/pinocchio/README.md +++ b/basics/counter/pinocchio/README.md @@ -4,11 +4,12 @@ Counter written using the Pinocchio framework, with only the Solana toolchain. ## Setup -1. Build the [program](https://solana.com/docs/terminology#program): `cargo build-sbf` -2. Run the tests: `pnpm test` +1. Build the [program](https://solana.com/docs/terminology#program): `cargo build-sbf --manifest-path=./program/Cargo.toml` +2. Run the Rust + LiteSVM tests: `cargo test --manifest-path=./program/Cargo.toml` + +Rebuild the program after every change before re-running the tests: the tests embed the `.so` at compile time, so a stale binary silently tests old code. ## Debugging -1. Start a test validator: `pnpm start-validator` +1. Start a test validator: `solana-test-validator` 2. Listen to program logs: `solana config set -ul && solana logs` -3. Run the tests: `pnpm run-tests` diff --git a/basics/counter/pinocchio/package.json b/basics/counter/pinocchio/package.json deleted file mode 100644 index 42c66670..00000000 --- a/basics/counter/pinocchio/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "counter-solana-pinocchio", - "version": "0.1.0", - "description": "Counter program written using only Solana tooling", - "main": "index.js", - "author": "ngundotra", - "license": "Apache-2.0", - "private": false, - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tests/tsconfig.test.json -t 1000000 ./tests/counter.test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4" - } -} diff --git a/basics/counter/pinocchio/pnpm-lock.yaml b/basics/counter/pinocchio/pnpm-lock.yaml deleted file mode 100644 index ed2f0a0c..00000000 --- a/basics/counter/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,1354 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@6.0.6) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.5 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.16 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.4.1 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.0(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@6.0.6) - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.19': - resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.12.11': - resolution: {integrity: sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==} - - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.5: - resolution: {integrity: sha512-4mAmr+AEhPYJ9TmDtxF3r3ZcbWy7W8kvZ4PoZYw/Xgp2J7WixjwTgiQZsoTDvch5nimmg3Ay6/0Kuh9oIvVs9A==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.0: - resolution: {integrity: sha512-+NbDncf0U6l3knuacRBiqpjZ2DSp+5lZaAU518gH7/x6qubbui/d000STaIBK+uNTPBS/AL/bCN+7PkXqmA3lA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.0: - resolution: {integrity: sha512-1/F0xdMa4qvc5o6z16FCCbZ5jbdvKvxpx5kyPcMWRiRPwyvi+zltMxciPAYMlg3wslQqGz88uFhrBEzq2eTumQ==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.0: - resolution: {integrity: sha512-U6CANjkmMl+lgNA7UH0GKs5V7LtVIUDzJBZefGGqLfqUNv3EjA/PrrToM0hAOWJgkxSwdz6zW+p5sw5FmnbXtg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.0: - resolution: {integrity: sha512-qJSkCFs0k2n4XtTnyxGMiZsuqO2TiqTYgWjQ+3mZhGNUAMys/Vq8bd7/SyBm6RR7EfVuRXRxZvh+F8oKZ77V4w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.0: - resolution: {integrity: sha512-xsS2CS2xb1Sw4ivNXM0gPz/qpW9BX0neSvt/pnok5L330Nu9xlTnKAY8FhzzqOP9P9sJlGRM787Y6d0yYwt6xQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.0: - resolution: {integrity: sha512-YkH7sa8TB/AoRPzG17CXJtYsRIQHEkEqGLz1Vwc13taXhDBkjO7z6NI5JYw7n0ybRymDHwMYTc7sd+5J40TyVQ==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - utf-8-validate@6.0.6: - resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} - engines: {node: '>=6.14.2'} - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.28.6': {} - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.3.0(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.3.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.3.0(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@4.9.5) - '@solana/errors': 2.3.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.3.0(typescript@4.9.5)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@6.0.6)': - dependencies: - '@babel/runtime': 7.28.6 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.4.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@4.9.5) - agentkeepalive: 4.5.0 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - node-fetch: 2.7.0 - rpc-websockets: 9.3.5 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.19': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 20.12.11 - - '@types/chai@4.3.16': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.12.11 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@20.12.11': - dependencies: - undici-types: 5.26.5 - - '@types/uuid@10.0.0': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 20.12.11 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 20.12.11 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.9: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.1: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.9 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - camelcase@6.3.0: {} - - chai@4.4.1: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@14.0.3: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.1.2: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.4: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - - jayson@4.3.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.1: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.3.5: - dependencies: - '@swc/helpers': 0.5.19 - '@types/uuid': 10.0.0 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.4 - uuid: 11.1.0 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.0: - optional: true - - solana-bankrun-darwin-universal@0.3.0: - optional: true - - solana-bankrun-darwin-x64@0.3.0: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.0: - optional: true - - solana-bankrun-linux-x64-musl@0.3.0: - optional: true - - solana-bankrun@0.3.0(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@6.0.6): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@6.0.6) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.0 - solana-bankrun-darwin-universal: 0.3.0 - solana-bankrun-darwin-x64: 0.3.0 - solana-bankrun-linux-x64-gnu: 0.3.0 - solana-bankrun-linux-x64-musl: 0.3.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.0.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.0.8: {} - - typescript@4.9.5: {} - - undici-types@5.26.5: {} - - utf-8-validate@6.0.6: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - uuid@11.1.0: {} - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 6.0.6 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/counter/pinocchio/program/tests/test.rs b/basics/counter/pinocchio/program/tests/test.rs index 6f9a333a..403bd78d 100644 --- a/basics/counter/pinocchio/program/tests/test.rs +++ b/basics/counter/pinocchio/program/tests/test.rs @@ -8,11 +8,11 @@ use solana_rent::Rent; use solana_system_interface::instruction::create_account; use solana_transaction::Transaction; -// The .so is built into ../../tests/fixtures by `pnpm build-and-test` (which runs -// `cargo build-sbf --sbf-out-dir=./tests/fixtures` from the package root). Run -// that script (or `cargo build-sbf` with --sbf-out-dir set accordingly) before -// `cargo test`. -const PROGRAM_SO: &[u8] = include_bytes!("../../tests/fixtures/counter_solana_pinocchio.so"); +// The .so is built into the workspace target/deploy by +// `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project +// root). Rebuild after every program change: the binary is embedded at +// test-compile time, so a stale .so silently tests old code. +const PROGRAM_SO: &[u8] = include_bytes!("../../../../../target/deploy/counter_solana_pinocchio.so"); #[test] fn test_counter() { diff --git a/basics/counter/pinocchio/tests/counter.test.ts b/basics/counter/pinocchio/tests/counter.test.ts deleted file mode 100644 index a8e57d96..00000000 --- a/basics/counter/pinocchio/tests/counter.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { describe } from "node:test"; - -describe("Counter Solana Pinocchio", async () => { - console.log("Counter Solana Pinocchio"); -}); diff --git a/basics/counter/pinocchio/tests/tsconfig.test.json b/basics/counter/pinocchio/tests/tsconfig.test.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/counter/pinocchio/tests/tsconfig.test.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/create-account/asm/README.md b/basics/create-account/asm/README.md index 78fabdb9..bf37e452 100644 --- a/basics/create-account/asm/README.md +++ b/basics/create-account/asm/README.md @@ -1,3 +1,10 @@ # create-account-asm-program A Solana SBPF assembly implementation, scaffolded with [sbpf](https://github.com/blueshift-gg/sbpf). + +## Setup + +1. Build the program: `sbpf build` +2. Run the Rust + LiteSVM tests: `cargo test` + +The tests embed the `.so` from `deploy` at compile time, so rebuild after every change or a stale binary silently tests old code. diff --git a/basics/create-account/asm/package.json b/basics/create-account/asm/package.json deleted file mode 100644 index d4462af9..00000000 --- a/basics/create-account/asm/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "sbpf build --deploy-dir ./tests/fixtures && pnpm test", - "build": "sbpf build --deploy-dir /tests/fixtures", - "deploy": "solana program deploy ./test/fixtures/create-account-asm-program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.47.3" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/create-account/asm/pnpm-lock.yaml b/basics/create-account/asm/pnpm-lock.yaml deleted file mode 100644 index 315de63a..00000000 --- a/basics/create-account/asm/pnpm-lock.yaml +++ /dev/null @@ -1,1342 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.47.3 - version: 1.98.2(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.2': - resolution: {integrity: sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 12.20.55 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 12.20.55 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/create-account/asm/tests/test.ts b/basics/create-account/asm/tests/test.ts deleted file mode 100644 index 0ea13fe2..00000000 --- a/basics/create-account/asm/tests/test.ts +++ /dev/null @@ -1,68 +0,0 @@ -import assert from "node:assert"; -import { describe, test } from "node:test"; -import { - Keypair, - LAMPORTS_PER_SOL, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import { start } from "solana-bankrun"; - -describe("Create a system account", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "create-account-asm-program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - test("Create the account via a cross program invocation", async () => { - const newKeypair = Keypair.generate(); - const blockhash = context.lastBlockhash; - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: newKeypair.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: Buffer.alloc(0), - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, newKeypair); - - await client.processTransaction(tx); - - const accountInfo = await client.getAccount(newKeypair.publicKey); - assert.ok(accountInfo, "new account should exist"); - assert.ok(accountInfo.lamports > 0n, "new account should have lamports"); - assert.equal(accountInfo.owner.toString(), SystemProgram.programId.toString()); - }); - - test("Create the account via direct call to system program", async () => { - const newKeypair = Keypair.generate(); - const blockhash = context.lastBlockhash; - - const ix = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: newKeypair.publicKey, - lamports: LAMPORTS_PER_SOL, - space: 0, - programId: SystemProgram.programId, - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, newKeypair); - - await client.processTransaction(tx); - - const accountInfo = await client.getAccount(newKeypair.publicKey); - assert.ok(accountInfo, "new account should exist"); - assert.equal(accountInfo.lamports, BigInt(LAMPORTS_PER_SOL)); - assert.equal(accountInfo.owner.toString(), SystemProgram.programId.toString()); - }); -}); diff --git a/basics/create-account/asm/tsconfig.json b/basics/create-account/asm/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/create-account/asm/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/create-account/native/package.json b/basics/create-account/native/package.json deleted file mode 100644 index 1cbcc238..00000000 --- a/basics/create-account/native/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "solana-bankrun": "^0.3.0", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/create-account/native/pnpm-lock.yaml b/basics/create-account/native/pnpm-lock.yaml deleted file mode 100644 index 6f8339c0..00000000 --- a/basics/create-account/native/pnpm-lock.yaml +++ /dev/null @@ -1,1344 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/create-account/native/program/tests/test.rs b/basics/create-account/native/program/tests/test.rs index da70c8d1..2ec4c52f 100644 --- a/basics/create-account/native/program/tests/test.rs +++ b/basics/create-account/native/program/tests/test.rs @@ -8,7 +8,11 @@ use solana_transaction::Transaction; #[test] fn test_create_account() { let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/create_account_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/create_account_program.so"); let payer = Keypair::new(); let new_keypair = Keypair::new(); diff --git a/basics/create-account/native/tests/test.ts b/basics/create-account/native/tests/test.ts deleted file mode 100644 index 0bc801bd..00000000 --- a/basics/create-account/native/tests/test.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { describe, test } from "node:test"; -import { - Keypair, - LAMPORTS_PER_SOL, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import { start } from "solana-bankrun"; - -describe("Create a system account", async () => { - const PROGRAM_ID = PublicKey.unique(); - - const context = await start([{ name: "create_account_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - test("Create the account via a cross program invocation", async () => { - const newKeypair = Keypair.generate(); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: newKeypair.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: Buffer.alloc(0), - }); - - const tx = new Transaction(); - tx.recentBlockhash = context.lastBlockhash; - tx.add(ix); - tx.sign(payer, newKeypair); - - await client.processTransaction(tx); - - // Verify the account was created - const _accountInfo = await client.getAccount(newKeypair.publicKey); - console.log(`Account with public key ${newKeypair.publicKey} successfully created via CPI`); - }); - - test("Create the account via direct call to system program", async () => { - const newKeypair = Keypair.generate(); - - const ix = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: newKeypair.publicKey, - lamports: LAMPORTS_PER_SOL, - space: 0, - programId: SystemProgram.programId, - }); - - const tx = new Transaction(); - tx.recentBlockhash = context.lastBlockhash; - tx.add(ix); - tx.sign(payer, newKeypair); - - await client.processTransaction(tx); - - // Verify the account was created - const _accountInfo = await client.getAccount(newKeypair.publicKey); - console.log(`Account with public key ${newKeypair.publicKey} successfully created`); - }); -}); diff --git a/basics/create-account/native/tsconfig.json b/basics/create-account/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/create-account/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/create-account/pinocchio/package.json b/basics/create-account/pinocchio/package.json deleted file mode 100644 index 763c5728..00000000 --- a/basics/create-account/pinocchio/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/create-account/pinocchio/pnpm-lock.yaml b/basics/create-account/pinocchio/pnpm-lock.yaml deleted file mode 100644 index 6f8339c0..00000000 --- a/basics/create-account/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,1344 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/create-account/pinocchio/program/tests/test.rs b/basics/create-account/pinocchio/program/tests/test.rs index a5466d03..1747ff6c 100644 --- a/basics/create-account/pinocchio/program/tests/test.rs +++ b/basics/create-account/pinocchio/program/tests/test.rs @@ -8,7 +8,11 @@ use solana_transaction::Transaction; #[test] fn test_create_account() { let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/create_account_pinocchio_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/create_account_pinocchio_program.so"); let payer = Keypair::new(); let new_keypair = Keypair::new(); diff --git a/basics/create-account/pinocchio/tests/test.ts b/basics/create-account/pinocchio/tests/test.ts deleted file mode 100644 index 317ed75e..00000000 --- a/basics/create-account/pinocchio/tests/test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { describe, test } from "node:test"; -import { - Keypair, - LAMPORTS_PER_SOL, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import { start } from "solana-bankrun"; - -describe("Create a system account", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "create_account_pinocchio_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - test("Create the account via a cross program invocation", async () => { - const newKeypair = Keypair.generate(); - const blockhash = context.lastBlockhash; - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: newKeypair.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: Buffer.alloc(0), - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, newKeypair); - - await client.processTransaction(tx); - }); - - test("Create the account via direct call to system program", async () => { - const newKeypair = Keypair.generate(); - const blockhash = context.lastBlockhash; - - const ix = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: newKeypair.publicKey, - lamports: LAMPORTS_PER_SOL, - space: 0, - programId: SystemProgram.programId, - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, newKeypair); - - await client.processTransaction(tx); - console.log(`Account with public key ${newKeypair.publicKey} successfully created`); - }); -}); diff --git a/basics/create-account/pinocchio/tsconfig.json b/basics/create-account/pinocchio/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/create-account/pinocchio/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/cross-program-invocation/native/package.json b/basics/cross-program-invocation/native/package.json deleted file mode 100644 index 91456108..00000000 --- a/basics/cross-program-invocation/native/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "module", - "scripts": { - "build-and-test": "cargo build-sbf --manifest-path=./programs/lever/Cargo.toml --sbf-out-dir=./tests/fixtures && cargo build-sbf --manifest-path=./programs/hand/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build": "cargo build-sbf --manifest-path=./programs/lever/Cargo.toml && cargo build-sbf --manifest-path=./programs/hand/Cargo.toml" - } -} diff --git a/basics/cross-program-invocation/native/pnpm-lock.yaml b/basics/cross-program-invocation/native/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/basics/cross-program-invocation/native/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/basics/cross-program-invocation/native/programs/hand/tests/test.rs b/basics/cross-program-invocation/native/programs/hand/tests/test.rs index d36e03ac..3b1d3cd6 100644 --- a/basics/cross-program-invocation/native/programs/hand/tests/test.rs +++ b/basics/cross-program-invocation/native/programs/hand/tests/test.rs @@ -11,9 +11,14 @@ fn test_cpi() { let hand_program_id = Pubkey::new_unique(); let lever_program_id = Pubkey::new_unique(); let hand_program_bytes = - include_bytes!("../../../tests/fixtures/cross_program_invocatio_native_hand.so"); + // The .so files are built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./programs/hand/Cargo.toml` and + // `cargo build-sbf --manifest-path=./programs/lever/Cargo.toml` (run from the + // project root). Rebuild after every program change: the binaries are embedded + // at test-compile time, so a stale .so silently tests old code. + include_bytes!("../../../target/deploy/cross_program_invocatio_native_hand.so"); let lever_program_bytes = - include_bytes!("../../../tests/fixtures/cross_program_invocatio_native_lever.so"); + include_bytes!("../../../target/deploy/cross_program_invocatio_native_lever.so"); let payer = Keypair::new(); let power_account = Keypair::new(); diff --git a/basics/favorites/native/package.json b/basics/favorites/native/package.json deleted file mode 100644 index 12660898..00000000 --- a/basics/favorites/native/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "@types/node": "^22.8.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/favorites/native/pnpm-lock.yaml b/basics/favorites/native/pnpm-lock.yaml deleted file mode 100644 index 67b55d15..00000000 --- a/basics/favorites/native/pnpm-lock.yaml +++ /dev/null @@ -1,1355 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - '@types/node': - specifier: ^22.8.1 - version: 22.15.19 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/favorites/native/program/tests/test.rs b/basics/favorites/native/program/tests/test.rs index 4b726a6e..436adbc4 100644 --- a/basics/favorites/native/program/tests/test.rs +++ b/basics/favorites/native/program/tests/test.rs @@ -10,7 +10,11 @@ use solana_transaction::Transaction; #[test] fn test_favorites() { let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/favorites_native.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/favorites_native.so"); let mut svm = LiteSVM::new(); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/favorites/native/tests/test.ts b/basics/favorites/native/tests/test.ts deleted file mode 100644 index 13e5e5b3..00000000 --- a/basics/favorites/native/tests/test.ts +++ /dev/null @@ -1,194 +0,0 @@ -import { - type Blockhash, - type Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import { BN } from "bn.js"; -import * as borsh from "borsh"; -import { assert, expect } from "chai"; -import { describe, test } from "mocha"; -import { type BanksClient, type ProgramTestContext, start } from "solana-bankrun"; - -const MyInstruction = { - CreateFav: 0, - GetFav: 1, -} as const; - -const CreateFavSchema = { - struct: { - instruction: "u8", - number: "u64", - color: "string", - hobbies: { array: { type: "string" } }, - }, -}; - -const FavoritesDataSchema = { - struct: { - number: "u64", - color: "string", - hobbies: { array: { type: "string" } }, - }, -}; - -const GetFavSchema = { - struct: { - instruction: "u8", - }, -}; - -type FavoritesData = { - number: number | bigint; - color: string; - hobbies: string[]; -}; - -function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); -} - -describe("Favorites Solana Native", () => { - // Randomly generate the program keypair and load the program to solana-bankrun - const programId = PublicKey.unique(); - - let context: ProgramTestContext; - let client: BanksClient; - let payer: Keypair; - let blockhash: Blockhash; - - beforeEach(async () => { - context = await start([{ name: "favorites_native", programId }], []); - client = context.banksClient; - // Get the payer keypair from the context, this will be used to sign transactions with enough lamports - payer = context.payer; - blockhash = context.lastBlockhash; - }); - - test("Set the favorite pda and cross-check the updated data", async () => { - const favoritesPda = PublicKey.findProgramAddressSync( - [Buffer.from("favorite"), payer.publicKey.toBuffer()], - programId, - )[0]; - const favData = { - instruction: MyInstruction.CreateFav, - number: 42, - color: "blue", - hobbies: ["coding", "reading", "traveling"], - }; - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: favoritesPda, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data: borshSerialize(CreateFavSchema, favData), - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = blockhash; - tx.sign(payer); - tx.recentBlockhash = blockhash; - await client.processTransaction(tx); - - const account = await client.getAccount(favoritesPda); - const data = Buffer.from(account.data); - - const favoritesData = borsh.deserialize(FavoritesDataSchema, data) as FavoritesData; - - console.log("Deserialized data:", favoritesData); - - expect(new BN(favoritesData.number as Buffer, "le").toNumber()).to.equal(favData.number); - expect(favoritesData.color).to.equal(favData.color); - expect(favoritesData.hobbies).to.deep.equal(favData.hobbies); - }); - - test("Check if the test fails if the pda seeds aren't same", async () => { - // We put the wrong seeds knowingly to see if the test fails because of checks - const favoritesPda = PublicKey.findProgramAddressSync( - [Buffer.from("favorite"), payer.publicKey.toBuffer()], - programId, - )[0]; - const favData = { - instruction: MyInstruction.CreateFav, - number: 42, - color: "blue", - hobbies: ["coding", "reading", "traveling"], - }; - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: favoritesPda, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data: borshSerialize(CreateFavSchema, favData), - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = blockhash; - tx.sign(payer); - tx.recentBlockhash = blockhash; - try { - await client.processTransaction(tx); - console.error("Expected the test to fail"); - } catch (_err) { - assert(true); - } - }); - - test("Get the favorite pda and cross-check the data", async () => { - // Creating a new account with payer's pubkey - const favoritesPda = PublicKey.findProgramAddressSync( - [Buffer.from("favorite"), payer.publicKey.toBuffer()], - programId, - )[0]; - const favData = { - instruction: MyInstruction.CreateFav, - number: 42, - color: "hazel", - hobbies: ["singing", "dancing", "skydiving"], - }; - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: favoritesPda, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data: borshSerialize(CreateFavSchema, favData), - }); - - const tx1 = new Transaction().add(ix); - tx1.feePayer = payer.publicKey; - tx1.recentBlockhash = blockhash; - tx1.sign(payer); - tx1.recentBlockhash = blockhash; - await client.processTransaction(tx1); - - // Getting the user's data through the get_pda instruction - const ix2 = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: favoritesPda, isSigner: false, isWritable: false }, - ], - programId, - data: borshSerialize(GetFavSchema, { instruction: MyInstruction.GetFav }), - }); - - const tx = new Transaction().add(ix2); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = blockhash; - tx.sign(payer); - tx.recentBlockhash = blockhash; - await client.processTransaction(tx); - }); -}); diff --git a/basics/favorites/native/tsconfig.json b/basics/favorites/native/tsconfig.json deleted file mode 100644 index 8c20b223..00000000 --- a/basics/favorites/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai", "node"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/favorites/pinocchio/package.json b/basics/favorites/pinocchio/package.json deleted file mode 100644 index 12660898..00000000 --- a/basics/favorites/pinocchio/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "@types/node": "^22.8.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/favorites/pinocchio/pnpm-lock.yaml b/basics/favorites/pinocchio/pnpm-lock.yaml deleted file mode 100644 index 67b55d15..00000000 --- a/basics/favorites/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,1355 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - '@types/node': - specifier: ^22.8.1 - version: 22.15.19 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/favorites/pinocchio/program/tests/test.rs b/basics/favorites/pinocchio/program/tests/test.rs index 8b3eddea..3c4e53ba 100644 --- a/basics/favorites/pinocchio/program/tests/test.rs +++ b/basics/favorites/pinocchio/program/tests/test.rs @@ -8,7 +8,11 @@ use solana_transaction::Transaction; #[test] fn test_favorites() { let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/favorites_pinocchio.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/favorites_pinocchio.so"); let mut svm = LiteSVM::new(); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/favorites/pinocchio/tests/test.ts b/basics/favorites/pinocchio/tests/test.ts deleted file mode 100644 index f63e2f8b..00000000 --- a/basics/favorites/pinocchio/tests/test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { describe } from "mocha"; - -describe("Favorites Solana Pinocchio", () => { - console.log("Favorites Solana Pinocchio"); -}); diff --git a/basics/favorites/pinocchio/tsconfig.json b/basics/favorites/pinocchio/tsconfig.json deleted file mode 100644 index 8c20b223..00000000 --- a/basics/favorites/pinocchio/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai", "node"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/hello-solana/asm/README.md b/basics/hello-solana/asm/README.md index 31c3f6fa..36086aa5 100644 --- a/basics/hello-solana/asm/README.md +++ b/basics/hello-solana/asm/README.md @@ -1,3 +1,10 @@ # hello-solana-asm-program A Solana SBPF assembly implementation, scaffolded with [sbpf](https://github.com/blueshift-gg/sbpf). + +## Setup + +1. Build the program: `sbpf build` +2. Run the Rust + LiteSVM tests: `cargo test` + +The tests embed the `.so` from `deploy/` at compile time, so rebuild after every change or a stale binary silently tests old code. diff --git a/basics/hello-solana/asm/package.json b/basics/hello-solana/asm/package.json deleted file mode 100644 index 5ac94b3b..00000000 --- a/basics/hello-solana/asm/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/index.test.ts", - "build-and-test": "sbpf build --deploy-dir ./tests/fixtures && pnpm test", - "build": "sbpf build", - "deploy": "solana program deploy ./program/target/so/hello_solana_program_pinocchio.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.2.0", - "@types/chai": "^4.3.20", - "@types/mocha": "^9.1.1", - "@types/node": "^22.19.1", - "chai": "^4.5.0", - "mocha": "^9.2.2", - "solana-bankrun": "^0.3.1", - "ts-mocha": "^10.1.0", - "typescript": "^4.9.5" - } -} diff --git a/basics/hello-solana/asm/pnpm-lock.yaml b/basics/hello-solana/asm/pnpm-lock.yaml deleted file mode 100644 index 9d6a0472..00000000 --- a/basics/hello-solana/asm/pnpm-lock.yaml +++ /dev/null @@ -1,1347 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.2.0 - version: 5.2.0 - '@types/chai': - specifier: ^4.3.20 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - '@types/node': - specifier: ^22.19.1 - version: 22.19.11 - chai: - specifier: ^4.5.0 - version: 4.5.0 - mocha: - specifier: ^9.2.2 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.1 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.1.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.9.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.2.0': - resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.19.11': - resolution: {integrity: sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.2.0': - dependencies: - '@types/node': 22.19.11 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.19.11 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.19.11': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.19.11 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.19.11 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/hello-solana/asm/src/lib.rs b/basics/hello-solana/asm/src/lib.rs index 45a8ccab..3057aa1b 100644 --- a/basics/hello-solana/asm/src/lib.rs +++ b/basics/hello-solana/asm/src/lib.rs @@ -10,7 +10,7 @@ mod tests { #[test] fn test_hello_solana() { let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../tests/fixtures/hello-solana-asm-program.so"); + let program_bytes = include_bytes!("../deploy/hello-solana-asm-program.so"); let mut svm = LiteSVM::new(); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/hello-solana/asm/tests/index.test.ts b/basics/hello-solana/asm/tests/index.test.ts deleted file mode 100644 index 2eabbb17..00000000 --- a/basics/hello-solana/asm/tests/index.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { PublicKey, Transaction, TransactionInstruction } from "@solana/web3.js"; -import { assert } from "chai"; -import { type ProgramTestContext, start } from "solana-bankrun"; - -describe("hello-solana", () => { - const PROGRAM_ID = PublicKey.unique(); - - // load program in solana-bankrun - let context: ProgramTestContext; - before(async () => { - context = await start([{ name: "hello-solana-asm-program", programId: PROGRAM_ID }], []); - }); - - it("Say hello!", async () => { - const client = context.banksClient; - const payer = context.payer; - const blockhash = context.lastBlockhash; - // We set up our instruction first. - const ix = new TransactionInstruction({ - keys: [{ pubkey: payer.publicKey, isSigner: true, isWritable: true }], - programId: PROGRAM_ID, - data: Buffer.from([]), // No data - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer); - - // Now we process the transaction - const transaction = await client.processTransaction(tx); - - assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - assert(transaction.logMessages[1] === "Program log: Hello, Solana!"); - }); -}); diff --git a/basics/hello-solana/asm/tsconfig.json b/basics/hello-solana/asm/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/hello-solana/asm/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/hello-solana/native/package.json b/basics/hello-solana/native/package.json deleted file mode 100644 index 85211af3..00000000 --- a/basics/hello-solana/native/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/index.test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/hello_solana_program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/hello-solana/native/pnpm-lock.yaml b/basics/hello-solana/native/pnpm-lock.yaml deleted file mode 100644 index 6f8339c0..00000000 --- a/basics/hello-solana/native/pnpm-lock.yaml +++ /dev/null @@ -1,1344 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/hello-solana/native/program/tests/test.rs b/basics/hello-solana/native/program/tests/test.rs index aa052720..bb9a9ea5 100644 --- a/basics/hello-solana/native/program/tests/test.rs +++ b/basics/hello-solana/native/program/tests/test.rs @@ -8,7 +8,11 @@ use solana_transaction::Transaction; #[test] fn test_hello_solana() { let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/hello_solana_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/hello_solana_program.so"); let mut svm = LiteSVM::new(); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/hello-solana/native/tests/index.test.ts b/basics/hello-solana/native/tests/index.test.ts deleted file mode 100644 index 1c0c85b3..00000000 --- a/basics/hello-solana/native/tests/index.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { describe, test } from "node:test"; -import { PublicKey, Transaction, TransactionInstruction } from "@solana/web3.js"; -import { assert } from "chai"; -import { start } from "solana-bankrun"; - -describe("hello-solana", async () => { - // load program in solana-bankrun - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "hello_solana_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - test("Say hello!", async () => { - const blockhash = context.lastBlockhash; - // We set up our instruction first. - const ix = new TransactionInstruction({ - keys: [{ pubkey: payer.publicKey, isSigner: true, isWritable: true }], - programId: PROGRAM_ID, - data: Buffer.alloc(0), // No data - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer); - - // Now we process the transaction - const transaction = await client.processTransaction(tx); - - assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - assert(transaction.logMessages[1] === "Program log: Hello, Solana!"); - assert(transaction.logMessages[2] === `Program log: Our program's Program ID: ${PROGRAM_ID}`); - assert(transaction.logMessages[3].startsWith(`Program ${PROGRAM_ID} consumed`)); - assert(transaction.logMessages[4] === `Program ${PROGRAM_ID} success`); - assert(transaction.logMessages.length === 5); - }); -}); diff --git a/basics/hello-solana/native/tsconfig.json b/basics/hello-solana/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/hello-solana/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/hello-solana/pinocchio/package.json b/basics/hello-solana/pinocchio/package.json deleted file mode 100644 index 2db96c48..00000000 --- a/basics/hello-solana/pinocchio/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/index.test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/hello_solana_program_pinocchio.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.2.0", - "@types/chai": "^4.3.20", - "@types/mocha": "^9.1.1", - "@types/node": "^22.19.1", - "chai": "^4.5.0", - "mocha": "^9.2.2", - "solana-bankrun": "^0.3.1", - "ts-mocha": "^10.1.0", - "typescript": "^4.9.5" - } -} diff --git a/basics/hello-solana/pinocchio/pnpm-lock.yaml b/basics/hello-solana/pinocchio/pnpm-lock.yaml deleted file mode 100644 index 736d9d29..00000000 --- a/basics/hello-solana/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,1345 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.2.0 - version: 5.2.0 - '@types/chai': - specifier: ^4.3.20 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - '@types/node': - specifier: ^22.19.1 - version: 22.19.1 - chai: - specifier: ^4.5.0 - version: 4.5.0 - mocha: - specifier: ^9.2.2 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.1 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.1.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.9.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.28.4': - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.2.0': - resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.19.1': - resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.1: - resolution: {integrity: sha512-bY6a+i/lEtBJ/mUxwsCTgevoV1P0foXTVA7UoThzaIWbM+3NDqorf8NBWs5DmqKTFeA1IoNzgvkWjFCPgnzUiQ==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.28.4': {} - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.3.0(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.3.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.3.0(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@4.9.5) - '@solana/errors': 2.3.0(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.3.0(typescript@4.9.5)': - dependencies: - chalk: 5.6.2 - commander: 14.0.2 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.28.4 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.3.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.2.0': - dependencies: - '@types/node': 22.19.1 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.19.1 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.19.1': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.19.1 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.19.1 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.12: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@14.0.2: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.12 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.12 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.3.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/hello-solana/pinocchio/program/Cargo.toml b/basics/hello-solana/pinocchio/program/Cargo.toml index 9a21d562..8987790c 100644 --- a/basics/hello-solana/pinocchio/program/Cargo.toml +++ b/basics/hello-solana/pinocchio/program/Cargo.toml @@ -16,3 +16,11 @@ custom-panic = [] [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm.workspace = true +solana-instruction.workspace = true +solana-keypair.workspace = true +solana-native-token.workspace = true +solana-pubkey.workspace = true +solana-transaction.workspace = true diff --git a/basics/hello-solana/pinocchio/program/tests/test.rs b/basics/hello-solana/pinocchio/program/tests/test.rs new file mode 100644 index 00000000..b8fde7f1 --- /dev/null +++ b/basics/hello-solana/pinocchio/program/tests/test.rs @@ -0,0 +1,43 @@ +use litesvm::LiteSVM; +use solana_instruction::{AccountMeta, Instruction}; +use solana_keypair::{Keypair, Signer}; +use solana_native_token::LAMPORTS_PER_SOL; +use solana_pubkey::Pubkey; +use solana_transaction::Transaction; + +// The .so is built into the workspace target/deploy by +// `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project +// root). Rebuild after every program change: the binary is embedded at +// test-compile time, so a stale .so silently tests old code. +const PROGRAM_SO: &[u8] = + include_bytes!("../../../../../target/deploy/hello_solana_program_pinocchio.so"); + +#[test] +fn test_hello_solana() { + let program_id = Pubkey::new_unique(); + + let mut svm = LiteSVM::new(); + svm.add_program(program_id, PROGRAM_SO).unwrap(); + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + let ix = Instruction { + program_id, + accounts: vec![AccountMeta::new(payer.pubkey(), true)], + data: vec![0], + }; + + let tx = Transaction::new_signed_with_payer( + &[ix], + Some(&payer.pubkey()), + &[&payer], + svm.latest_blockhash(), + ); + + let result = svm.send_transaction(tx); + assert!(result.is_ok()); + + let logs = result.unwrap().logs; + assert!(logs.iter().any(|log| log.contains("Hello, Solana!"))); +} diff --git a/basics/hello-solana/pinocchio/tests/index.test.ts b/basics/hello-solana/pinocchio/tests/index.test.ts deleted file mode 100644 index 985c2bef..00000000 --- a/basics/hello-solana/pinocchio/tests/index.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { PublicKey, Transaction, TransactionInstruction } from "@solana/web3.js"; -import { assert } from "chai"; -import { type ProgramTestContext, start } from "solana-bankrun"; - -describe("hello-solana", () => { - const PROGRAM_ID = PublicKey.unique(); - - // load program in solana-bankrun - let context: ProgramTestContext; - before(async () => { - context = await start([{ name: "hello_solana_program_pinocchio", programId: PROGRAM_ID }], []); - }); - - it("Say hello!", async () => { - const client = context.banksClient; - const payer = context.payer; - const blockhash = context.lastBlockhash; - // We set up our instruction first. - const ix = new TransactionInstruction({ - keys: [{ pubkey: payer.publicKey, isSigner: true, isWritable: true }], - programId: PROGRAM_ID, - data: Buffer.from([]), // No data - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer); - - // Now we process the transaction - const transaction = await client.processTransaction(tx); - - assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - assert(transaction.logMessages[1] === "Program log: Hello, Solana!"); - assert(transaction.logMessages[2] === `Program log: [${Array.from(PROGRAM_ID.toBytes()).join(", ")}]`); - assert(transaction.logMessages[3].startsWith(`Program ${PROGRAM_ID} consumed`)); - assert(transaction.logMessages[4] === `Program ${PROGRAM_ID} success`); - assert(transaction.logMessages.length === 5); - }); -}); diff --git a/basics/hello-solana/pinocchio/tsconfig.json b/basics/hello-solana/pinocchio/tsconfig.json deleted file mode 100644 index 8c20b223..00000000 --- a/basics/hello-solana/pinocchio/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai", "node"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/pda-rent-payer/native/package.json b/basics/pda-rent-payer/native/package.json deleted file mode 100644 index 063fb527..00000000 --- a/basics/pda-rent-payer/native/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/pda-rent-payer/native/pnpm-lock.yaml b/basics/pda-rent-payer/native/pnpm-lock.yaml deleted file mode 100644 index 0c029978..00000000 --- a/basics/pda-rent-payer/native/pnpm-lock.yaml +++ /dev/null @@ -1,1352 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/pda-rent-payer/native/program/tests/test.rs b/basics/pda-rent-payer/native/program/tests/test.rs index 337835e5..7259d721 100644 --- a/basics/pda-rent-payer/native/program/tests/test.rs +++ b/basics/pda-rent-payer/native/program/tests/test.rs @@ -10,7 +10,11 @@ use solana_transaction::Transaction; #[test] fn test_pda_rent_payer() { let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/pda_rent_payer_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/pda_rent_payer_program.so"); let mut svm = LiteSVM::new(); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/pda-rent-payer/native/tests/test.ts b/basics/pda-rent-payer/native/tests/test.ts deleted file mode 100644 index 6c3a9c41..00000000 --- a/basics/pda-rent-payer/native/tests/test.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; -import * as borsh from "borsh"; -import { start } from "solana-bankrun"; - -describe("PDA Rent-Payer", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "pda_rent_payer_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - const MyInstruction = { - InitRentVault: 0, - CreateNewAccount: 1, - } as const; - - const InitRentVaultSchema = { - struct: { - instruction: "u8", - fund_lamports: "u64", - }, - }; - - const CreateNewAccountSchema = { - struct: { - instruction: "u8", - }, - }; - - function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); - } - - function deriveRentVaultPda() { - const pda = PublicKey.findProgramAddressSync([Buffer.from("rent_vault")], PROGRAM_ID); - console.log(`PDA: ${pda[0].toBase58()}`); - return pda; - } - - test("Initialize the Rent Vault", async () => { - const blockhash = context.lastBlockhash; - const [rentVaultPda, _] = deriveRentVaultPda(); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: rentVaultPda, isSigner: false, isWritable: true }, - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: borshSerialize(InitRentVaultSchema, { - instruction: MyInstruction.InitRentVault, - fund_lamports: 1000000000, - }), - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer); - - await client.processTransaction(tx); - }); - - test("Create a new account using the Rent Vault", async () => { - const blockhash = context.lastBlockhash; - const newAccount = Keypair.generate(); - const [rentVaultPda, _] = deriveRentVaultPda(); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: newAccount.publicKey, isSigner: true, isWritable: true }, - { pubkey: rentVaultPda, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: borshSerialize(CreateNewAccountSchema, { - instruction: MyInstruction.CreateNewAccount, - }), - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, newAccount); // Add instruction and Sign the transaction - - // Now we process the transaction - await client.processTransaction(tx); - }); -}); diff --git a/basics/pda-rent-payer/native/tsconfig.json b/basics/pda-rent-payer/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/pda-rent-payer/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/pda-rent-payer/pinocchio/package.json b/basics/pda-rent-payer/pinocchio/package.json deleted file mode 100644 index 763c5728..00000000 --- a/basics/pda-rent-payer/pinocchio/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/pda-rent-payer/pinocchio/pnpm-lock.yaml b/basics/pda-rent-payer/pinocchio/pnpm-lock.yaml deleted file mode 100644 index 6f8339c0..00000000 --- a/basics/pda-rent-payer/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,1344 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/pda-rent-payer/pinocchio/program/tests/test.rs b/basics/pda-rent-payer/pinocchio/program/tests/test.rs index ce542922..bbfc7eb4 100644 --- a/basics/pda-rent-payer/pinocchio/program/tests/test.rs +++ b/basics/pda-rent-payer/pinocchio/program/tests/test.rs @@ -8,7 +8,11 @@ use solana_transaction::Transaction; #[test] fn test_pda_rent_payer() { let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/pda_rent_payer_pinocchio_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/pda_rent_payer_pinocchio_program.so"); let mut svm = LiteSVM::new(); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/pda-rent-payer/pinocchio/tests/test.ts b/basics/pda-rent-payer/pinocchio/tests/test.ts deleted file mode 100644 index 836c6aba..00000000 --- a/basics/pda-rent-payer/pinocchio/tests/test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { describe } from "node:test"; - -describe("PDA Rent-Payer", async () => { - console.log("PDA Rent-Payer"); -}); diff --git a/basics/pda-rent-payer/pinocchio/tsconfig.json b/basics/pda-rent-payer/pinocchio/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/pda-rent-payer/pinocchio/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/processing-instructions/native/package.json b/basics/processing-instructions/native/package.json deleted file mode 100644 index 063fb527..00000000 --- a/basics/processing-instructions/native/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/processing-instructions/native/pnpm-lock.yaml b/basics/processing-instructions/native/pnpm-lock.yaml deleted file mode 100644 index 0c029978..00000000 --- a/basics/processing-instructions/native/pnpm-lock.yaml +++ /dev/null @@ -1,1352 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/processing-instructions/native/program/tests/test.rs b/basics/processing-instructions/native/program/tests/test.rs index ebc20d2d..1cf61325 100644 --- a/basics/processing-instructions/native/program/tests/test.rs +++ b/basics/processing-instructions/native/program/tests/test.rs @@ -11,7 +11,11 @@ fn test_processing_ixs() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/processing_instructions_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/processing_instructions_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/processing-instructions/native/tests/test.ts b/basics/processing-instructions/native/tests/test.ts deleted file mode 100644 index e77b0477..00000000 --- a/basics/processing-instructions/native/tests/test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { PublicKey, Transaction, TransactionInstruction } from "@solana/web3.js"; -import * as borsh from "borsh"; -import { start } from "solana-bankrun"; - -describe("custom-instruction-data", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "processing_instructions_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - const InstructionDataSchema = { - struct: { - name: "string", - height: "u32", - }, - }; - - function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); - } - - test("Go to the park!", async () => { - const blockhash = context.lastBlockhash; - - const jimmy = borshSerialize(InstructionDataSchema, { - name: "Jimmy", - height: 3, - }); - const mary = borshSerialize(InstructionDataSchema, { - name: "Mary", - height: 10, - }); - - const ix1 = new TransactionInstruction({ - keys: [{ pubkey: payer.publicKey, isSigner: true, isWritable: true }], - programId: PROGRAM_ID, - data: jimmy, - }); - - const ix2 = new TransactionInstruction({ - ...ix1, - data: mary, - }); - - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix1).add(ix2).sign(payer); - - await client.processTransaction(tx); - }); -}); diff --git a/basics/processing-instructions/native/tsconfig.json b/basics/processing-instructions/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/processing-instructions/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/processing-instructions/pinocchio/package.json b/basics/processing-instructions/pinocchio/package.json deleted file mode 100644 index 763c5728..00000000 --- a/basics/processing-instructions/pinocchio/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/processing-instructions/pinocchio/pnpm-lock.yaml b/basics/processing-instructions/pinocchio/pnpm-lock.yaml deleted file mode 100644 index 6f8339c0..00000000 --- a/basics/processing-instructions/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,1344 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/processing-instructions/pinocchio/program/tests/test.rs b/basics/processing-instructions/pinocchio/program/tests/test.rs index a727fe9c..5502f7ae 100644 --- a/basics/processing-instructions/pinocchio/program/tests/test.rs +++ b/basics/processing-instructions/pinocchio/program/tests/test.rs @@ -10,8 +10,12 @@ fn test_processing_ixs() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. let program_bytes = - include_bytes!("../../tests/fixtures/processing_instructions_pinocchio_program.so"); + include_bytes!("../../../../../target/deploy/processing_instructions_pinocchio_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/processing-instructions/pinocchio/tests/test.ts b/basics/processing-instructions/pinocchio/tests/test.ts deleted file mode 100644 index a4fe7c67..00000000 --- a/basics/processing-instructions/pinocchio/tests/test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { describe } from "node:test"; - -describe("custom-instruction-data", async () => { - console.log("custom-instruction-data"); -}); diff --git a/basics/processing-instructions/pinocchio/tsconfig.json b/basics/processing-instructions/pinocchio/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/processing-instructions/pinocchio/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/program-derived-addresses/native/package.json b/basics/program-derived-addresses/native/package.json deleted file mode 100644 index 95b4a981..00000000 --- a/basics/program-derived-addresses/native/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "fs": "^0.0.1-security", - "borsh": "^2.0.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/program-derived-addresses/native/pnpm-lock.yaml b/basics/program-derived-addresses/native/pnpm-lock.yaml deleted file mode 100644 index 35eeafff..00000000 --- a/basics/program-derived-addresses/native/pnpm-lock.yaml +++ /dev/null @@ -1,1300 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/program-derived-addresses/native/program/tests/test.rs b/basics/program-derived-addresses/native/program/tests/test.rs index 23e7be93..379aa7ce 100644 --- a/basics/program-derived-addresses/native/program/tests/test.rs +++ b/basics/program-derived-addresses/native/program/tests/test.rs @@ -15,7 +15,11 @@ fn test_pda() { let program_id = Pubkey::new_unique(); let program_bytes = - include_bytes!("../../tests/fixtures/program_derived_addresses_native_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + include_bytes!("../../../../../target/deploy/program_derived_addresses_native_program.so"); svm.add_program(program_id, program_bytes).unwrap(); let payer = Keypair::new(); diff --git a/basics/program-derived-addresses/native/tests/test.ts b/basics/program-derived-addresses/native/tests/test.ts deleted file mode 100644 index c4c0d149..00000000 --- a/basics/program-derived-addresses/native/tests/test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; -import * as borsh from "borsh"; -import { start } from "solana-bankrun"; - -describe("PDAs", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start( - [ - { - name: "program_derived_addresses_native_program", - programId: PROGRAM_ID, - }, - ], - [], - ); - const client = context.banksClient; - const payer = context.payer; - const rent = await client.getRent(); - - const PageVisitsSchema = { - struct: { - page_visits: "u32", - bump: "u8", - }, - }; - - // Empty struct - just needs to serialize to zero bytes - const IncrementPageVisitsSchema = { struct: {} }; - - function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); - } - - const testUser = Keypair.generate(); - - test("Create a test user", async () => { - const ix = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - lamports: Number(rent.minimumBalance(BigInt(0))), - newAccountPubkey: testUser.publicKey, - programId: SystemProgram.programId, - space: 0, - }); - - const tx = new Transaction(); - const blockhash = context.lastBlockhash; - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, testUser); // Add instruction and Sign the transaction - - await client.processTransaction(tx); - console.log(`Local Wallet: ${payer.publicKey}`); - console.log(`Created User: ${testUser.publicKey}`); - }); - - function derivePageVisitsPda(userPubkey: PublicKey) { - return PublicKey.findProgramAddressSync([Buffer.from("page_visits"), userPubkey.toBuffer()], PROGRAM_ID); - } - - test("Create the page visits tracking PDA", async () => { - const [pageVisitsPda, pageVisitsBump] = derivePageVisitsPda(testUser.publicKey); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: pageVisitsPda, isSigner: false, isWritable: true }, - { pubkey: testUser.publicKey, isSigner: false, isWritable: false }, - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: borshSerialize(PageVisitsSchema, { - page_visits: 0, - bump: pageVisitsBump, - }), - }); - const tx = new Transaction(); - const blockhash = context.lastBlockhash; - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer); - - await client.processTransaction(tx); - }); - - test("Visit the page!", async () => { - const [pageVisitsPda, _] = derivePageVisitsPda(testUser.publicKey); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: pageVisitsPda, isSigner: false, isWritable: true }, - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - ], - programId: PROGRAM_ID, - data: borshSerialize(IncrementPageVisitsSchema, {}), - }); - const tx = new Transaction(); - const blockhash = context.lastBlockhash; - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer); - - await client.processTransaction(tx); - }); - - test("Visit the page!", async () => { - const [pageVisitsPda, _] = derivePageVisitsPda(testUser.publicKey); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: pageVisitsPda, isSigner: false, isWritable: true }, - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - ], - programId: PROGRAM_ID, - data: borshSerialize(IncrementPageVisitsSchema, {}), - }); - const tx = new Transaction(); - const [blockhash, _block_height] = await client.getLatestBlockhash(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer); - - await client.processTransaction(tx); - }); - - test("Read page visits", async () => { - const [pageVisitsPda, _] = derivePageVisitsPda(testUser.publicKey); - const accountInfo = await client.getAccount(pageVisitsPda); - const readPageVisits = borsh.deserialize(PageVisitsSchema, Buffer.from(accountInfo.data)) as { - page_visits: number; - bump: number; - }; - console.log(`Number of page visits: ${readPageVisits.page_visits}`); - }); -}); diff --git a/basics/program-derived-addresses/native/tsconfig.json b/basics/program-derived-addresses/native/tsconfig.json deleted file mode 100644 index 8634a05d..00000000 --- a/basics/program-derived-addresses/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/program-derived-addresses/pinocchio/package.json b/basics/program-derived-addresses/pinocchio/package.json deleted file mode 100644 index e0feaab0..00000000 --- a/basics/program-derived-addresses/pinocchio/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/program-derived-addresses/pinocchio/pnpm-lock.yaml b/basics/program-derived-addresses/pinocchio/pnpm-lock.yaml deleted file mode 100644 index 78f9a677..00000000 --- a/basics/program-derived-addresses/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,1292 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/program-derived-addresses/pinocchio/program/tests/test.rs b/basics/program-derived-addresses/pinocchio/program/tests/test.rs index 254cae9f..9964f89a 100644 --- a/basics/program-derived-addresses/pinocchio/program/tests/test.rs +++ b/basics/program-derived-addresses/pinocchio/program/tests/test.rs @@ -12,8 +12,12 @@ fn test_pda() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. let program_bytes = - include_bytes!("../../tests/fixtures/program_derived_addresses_pinocchio_program.so"); + include_bytes!("../../../../../target/deploy/program_derived_addresses_pinocchio_program.so"); svm.add_program(program_id, program_bytes).unwrap(); let payer = Keypair::new(); diff --git a/basics/program-derived-addresses/pinocchio/tests/test.ts b/basics/program-derived-addresses/pinocchio/tests/test.ts deleted file mode 100644 index 892781bf..00000000 --- a/basics/program-derived-addresses/pinocchio/tests/test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { describe } from "node:test"; - -describe("PDAs", async () => { - console.log("PDAS"); -}); diff --git a/basics/program-derived-addresses/pinocchio/tsconfig.json b/basics/program-derived-addresses/pinocchio/tsconfig.json deleted file mode 100644 index 8634a05d..00000000 --- a/basics/program-derived-addresses/pinocchio/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/realloc/pinocchio/package.json b/basics/realloc/pinocchio/package.json deleted file mode 100644 index c01413a5..00000000 --- a/basics/realloc/pinocchio/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tests/tsconfig.test.json -t 1000000 ./tests/realloc.test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/realloc/pinocchio/pnpm-lock.yaml b/basics/realloc/pinocchio/pnpm-lock.yaml deleted file mode 100644 index a79f68d4..00000000 --- a/basics/realloc/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,1352 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/realloc/pinocchio/program/tests/test.rs b/basics/realloc/pinocchio/program/tests/test.rs index 389114a3..b4bf2028 100644 --- a/basics/realloc/pinocchio/program/tests/test.rs +++ b/basics/realloc/pinocchio/program/tests/test.rs @@ -10,7 +10,11 @@ fn test_realloc() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/realloc_pinocchio_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/realloc_pinocchio_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/realloc/pinocchio/tests/realloc.test.ts b/basics/realloc/pinocchio/tests/realloc.test.ts deleted file mode 100644 index 4d32049c..00000000 --- a/basics/realloc/pinocchio/tests/realloc.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { describe } from "node:test"; - -describe("Realloc!", async () => { - console.log("Realloc!"); -}); diff --git a/basics/realloc/pinocchio/tests/tsconfig.test.json b/basics/realloc/pinocchio/tests/tsconfig.test.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/realloc/pinocchio/tests/tsconfig.test.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/rent/native/package.json b/basics/rent/native/package.json deleted file mode 100644 index 5ad118cd..00000000 --- a/basics/rent/native/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/rent/native/pnpm-lock.yaml b/basics/rent/native/pnpm-lock.yaml deleted file mode 100644 index 4d6d07c9..00000000 --- a/basics/rent/native/pnpm-lock.yaml +++ /dev/null @@ -1,1363 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/rent/native/program/tests/test.rs b/basics/rent/native/program/tests/test.rs index e2781221..7b1f78db 100644 --- a/basics/rent/native/program/tests/test.rs +++ b/basics/rent/native/program/tests/test.rs @@ -10,7 +10,11 @@ fn test_rent() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/rent/native/tests/test.ts b/basics/rent/native/tests/test.ts deleted file mode 100644 index 1dc1fdee..00000000 --- a/basics/rent/native/tests/test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; -import * as borsh from "borsh"; -import { start } from "solana-bankrun"; - -describe("Create a system account", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - const AddressDataSchema = { - struct: { - name: "string", - address: "string", - }, - }; - - function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); - } - - test("Create the account", async () => { - const newKeypair = Keypair.generate(); - - const addressData = { - name: "Marcus", - address: "123 Main St. San Francisco, CA", - }; - - // We're just going to serialize our object here so we can check - // the size on the client side against the program logs - const addressDataBuffer = borshSerialize(AddressDataSchema, addressData); - console.log(`Address data buffer length: ${addressDataBuffer.length}`); - - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: newKeypair.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: addressDataBuffer, - }); - - const tx = new Transaction(); - const blockhash = context.lastBlockhash; - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, newKeypair); - - await client.processTransaction(tx); - }); -}); diff --git a/basics/rent/native/tsconfig.json b/basics/rent/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/rent/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/rent/pinocchio/package.json b/basics/rent/pinocchio/package.json deleted file mode 100644 index 5ad118cd..00000000 --- a/basics/rent/pinocchio/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/rent/pinocchio/pnpm-lock.yaml b/basics/rent/pinocchio/pnpm-lock.yaml deleted file mode 100644 index 4d6d07c9..00000000 --- a/basics/rent/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,1363 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/rent/pinocchio/program/tests/test.rs b/basics/rent/pinocchio/program/tests/test.rs index 9e7d5c00..0354c0b9 100644 --- a/basics/rent/pinocchio/program/tests/test.rs +++ b/basics/rent/pinocchio/program/tests/test.rs @@ -10,7 +10,11 @@ fn test_rent() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/rent_pinocchio_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/rent_pinocchio_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/rent/pinocchio/tests/test.ts b/basics/rent/pinocchio/tests/test.ts deleted file mode 100644 index 4c97d9a1..00000000 --- a/basics/rent/pinocchio/tests/test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { describe } from "node:test"; - -describe("Create a system account", async () => { - console.log("Create a system account"); -}); diff --git a/basics/rent/pinocchio/tsconfig.json b/basics/rent/pinocchio/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/rent/pinocchio/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/repository-layout/native/package.json b/basics/repository-layout/native/package.json deleted file mode 100644 index 8a9cc795..00000000 --- a/basics/repository-layout/native/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "fs": "^0.0.1-security", - "borsh": "^2.0.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/repository-layout/native/pnpm-lock.yaml b/basics/repository-layout/native/pnpm-lock.yaml deleted file mode 100644 index 288b405f..00000000 --- a/basics/repository-layout/native/pnpm-lock.yaml +++ /dev/null @@ -1,1360 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/repository-layout/native/program/tests/test.rs b/basics/repository-layout/native/program/tests/test.rs index 2db9c57d..e75b5d8e 100644 --- a/basics/repository-layout/native/program/tests/test.rs +++ b/basics/repository-layout/native/program/tests/test.rs @@ -12,7 +12,11 @@ fn test_repo_layout() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/repository_layout_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/repository_layout_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/repository-layout/native/tests/test.ts b/basics/repository-layout/native/tests/test.ts deleted file mode 100644 index d480899f..00000000 --- a/basics/repository-layout/native/tests/test.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { PublicKey, Transaction, TransactionInstruction } from "@solana/web3.js"; -import * as borsh from "borsh"; -import { start } from "solana-bankrun"; - -describe("Carnival", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "repository_layout_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - const CarnivalInstructionSchema = { - struct: { - name: "string", - height: "u32", - ticket_count: "u32", - attraction: "string", - attraction_name: "string", - }, - }; - - type CarnivalInstruction = { - name: string; - height: number; - ticket_count: number; - attraction: string; - attraction_name: string; - }; - - function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); - } - - async function sendCarnivalInstructions(instructionsList: CarnivalInstruction[]) { - const tx = new Transaction(); - for (const ix of instructionsList) { - tx.recentBlockhash = context.lastBlockhash; - tx.add( - new TransactionInstruction({ - keys: [{ pubkey: payer.publicKey, isSigner: true, isWritable: true }], - programId: PROGRAM_ID, - data: borshSerialize(CarnivalInstructionSchema, ix), - }), - ).sign(payer); - } - await client.processTransaction(tx); - } - - test("Go on some rides!", async () => { - await sendCarnivalInstructions([ - { - name: "Jimmy", - height: 36, - ticket_count: 15, - attraction: "ride", - attraction_name: "Scrambler", - }, - { - name: "Mary", - height: 52, - ticket_count: 1, - attraction: "ride", - attraction_name: "Ferris Wheel", - }, - { - name: "Alice", - height: 56, - ticket_count: 15, - attraction: "ride", - attraction_name: "Scrambler", - }, - { - name: "Bob", - height: 49, - ticket_count: 6, - attraction: "ride", - attraction_name: "Tilt-a-Whirl", - }, - ]); - }); - - test("Play some games!", async () => { - await sendCarnivalInstructions([ - { - name: "Jimmy", - height: 36, - ticket_count: 15, - attraction: "game", - attraction_name: "I Got It!", - }, - { - name: "Mary", - height: 52, - ticket_count: 1, - attraction: "game", - attraction_name: "Ring Toss", - }, - { - name: "Alice", - height: 56, - ticket_count: 15, - attraction: "game", - attraction_name: "Ladder Climb", - }, - { - name: "Bob", - height: 49, - ticket_count: 6, - attraction: "game", - attraction_name: "Ring Toss", - }, - ]); - }); - - test("Eat some food!", async () => { - await sendCarnivalInstructions([ - { - name: "Jimmy", - height: 36, - ticket_count: 15, - attraction: "food", - attraction_name: "Taco Shack", - }, - { - name: "Mary", - height: 52, - ticket_count: 1, - attraction: "food", - attraction_name: "Larry's Pizza", - }, - { - name: "Alice", - height: 56, - ticket_count: 15, - attraction: "food", - attraction_name: "Dough Boy's", - }, - { - name: "Bob", - height: 49, - ticket_count: 6, - attraction: "food", - attraction_name: "Dough Boy's", - }, - ]); - }); -}); diff --git a/basics/repository-layout/native/tsconfig.json b/basics/repository-layout/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/repository-layout/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/transfer-sol/asm/README.md b/basics/transfer-sol/asm/README.md index 2a839516..b33aa8a0 100644 --- a/basics/transfer-sol/asm/README.md +++ b/basics/transfer-sol/asm/README.md @@ -1,3 +1,10 @@ # transfer-sol-asm-program A Solana SBPF assembly implementation, scaffolded with [sbpf](https://github.com/blueshift-gg/sbpf). + +## Setup + +1. Build the program: `sbpf build` +2. Run the Rust + LiteSVM tests: `cargo test` + +The tests embed the `.so` from `deploy` at compile time, so rebuild after every change or a stale binary silently tests old code. diff --git a/basics/transfer-sol/asm/package.json b/basics/transfer-sol/asm/package.json deleted file mode 100644 index d889378f..00000000 --- a/basics/transfer-sol/asm/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "sbpf build --deploy-dir ./tests/fixtures && pnpm test", - "build": "sbpf build", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.47.3", - "buffer-layout": "^1.2.2", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/transfer-sol/asm/pnpm-lock.yaml b/basics/transfer-sol/asm/pnpm-lock.yaml deleted file mode 100644 index 6901d9d9..00000000 --- a/basics/transfer-sol/asm/pnpm-lock.yaml +++ /dev/null @@ -1,1359 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.47.3 - version: 1.98.2(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - buffer-layout: - specifier: ^1.2.2 - version: 1.2.2 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.2': - resolution: {integrity: sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer-layout@1.2.2: - resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} - engines: {node: '>=4.5'} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.2(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 12.20.55 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 12.20.55 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer-layout@1.2.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.2(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/transfer-sol/asm/tests/instruction.ts b/basics/transfer-sol/asm/tests/instruction.ts deleted file mode 100644 index 65b1b8d1..00000000 --- a/basics/transfer-sol/asm/tests/instruction.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Buffer } from "node:buffer"; -import { type PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; - -export function createTransferInstruction( - senderPubkey: PublicKey, - recipientPubkey: PublicKey, - programId: PublicKey, - lamports: number, -): TransactionInstruction { - const data = Buffer.alloc(8); - data.writeBigUInt64LE(BigInt(lamports)); - - return new TransactionInstruction({ - keys: [ - { pubkey: senderPubkey, isSigner: true, isWritable: true }, - { pubkey: recipientPubkey, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); -} diff --git a/basics/transfer-sol/asm/tests/test.ts b/basics/transfer-sol/asm/tests/test.ts deleted file mode 100644 index bc8a4d35..00000000 --- a/basics/transfer-sol/asm/tests/test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import assert from "node:assert"; -import { describe, test } from "node:test"; -import { Keypair, LAMPORTS_PER_SOL, PublicKey, Transaction } from "@solana/web3.js"; -import { start } from "solana-bankrun"; -import { createTransferInstruction } from "./instruction"; - -describe("transfer-sol (asm)", async () => { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "transfer-sol-cpi", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - const transferAmount = 1 * LAMPORTS_PER_SOL; - const recipient = Keypair.generate(); - - test("Transfer SOL via CPI to the system program", async () => { - const [payerBefore, recipientBefore] = await getBalances(payer.publicKey, recipient.publicKey, "Beginning"); - - const ix = createTransferInstruction(payer.publicKey, recipient.publicKey, PROGRAM_ID, transferAmount); - - const tx = new Transaction(); - const [blockhash, _] = await client.getLatestBlockhash(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer); - - await client.processTransaction(tx); - - const [payerAfter, recipientAfter] = await getBalances(payer.publicKey, recipient.publicKey, "Resulting"); - - assert( - payerAfter < payerBefore - BigInt(transferAmount), - "Payer balance should decrease by at least the transfer amount", - ); - assert.strictEqual( - recipientAfter, - recipientBefore + BigInt(transferAmount), - "Recipient balance should increase by exactly the transfer amount", - ); - }); - - async function getBalances( - payerPubkey: PublicKey, - recipientPubkey: PublicKey, - timeframe: string, - ): Promise<[bigint, bigint]> { - const payerBalance = await client.getBalance(payerPubkey); - const recipientBalance = await client.getBalance(recipientPubkey); - - console.log(`${timeframe} balances:`); - console.log(` Payer: ${payerBalance}`); - console.log(` Recipient: ${recipientBalance}`); - - return [payerBalance, recipientBalance]; - } -}); diff --git a/basics/transfer-sol/asm/tsconfig.json b/basics/transfer-sol/asm/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/transfer-sol/asm/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/transfer-sol/native/package.json b/basics/transfer-sol/native/package.json deleted file mode 100644 index e4884b98..00000000 --- a/basics/transfer-sol/native/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer-layout": "^1.2.2", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/transfer-sol/native/pnpm-lock.yaml b/basics/transfer-sol/native/pnpm-lock.yaml deleted file mode 100644 index fc03a408..00000000 --- a/basics/transfer-sol/native/pnpm-lock.yaml +++ /dev/null @@ -1,1369 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - borsh: - specifier: ^2.0.0 - version: 2.0.0 - buffer-layout: - specifier: ^1.2.2 - version: 1.2.2 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer-layout@1.2.2: - resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} - engines: {node: '>=4.5'} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer-layout@1.2.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/transfer-sol/native/program/tests/test.rs b/basics/transfer-sol/native/program/tests/test.rs index 1af39a39..5faaeafe 100644 --- a/basics/transfer-sol/native/program/tests/test.rs +++ b/basics/transfer-sol/native/program/tests/test.rs @@ -12,7 +12,11 @@ fn test_transfer_sol() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/transfer_sol_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/transfer_sol_program.so"); svm.add_program(program_id, program_bytes).unwrap(); @@ -97,7 +101,7 @@ fn test_program_transfer_rejects_insufficient_funds() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/transfer_sol_program.so"); + let program_bytes = include_bytes!("../../../../../target/deploy/transfer_sol_program.so"); svm.add_program(program_id, program_bytes).unwrap(); let payer = Keypair::new(); diff --git a/basics/transfer-sol/native/tests/fixtures/transfer_sol_program.so b/basics/transfer-sol/native/tests/fixtures/transfer_sol_program.so deleted file mode 100755 index 6d26be31bd9b9d278e660f0f4c8a7321ccf6b74e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70680 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 bX#L9nY)aF%GlKcpYVLnn { - const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: "transfer_sol_program", programId: PROGRAM_ID }], []); - const client = context.banksClient; - const payer = context.payer; - - const transferAmount = 1 * LAMPORTS_PER_SOL; - const test1Recipient = Keypair.generate(); - const test2Recipient1 = Keypair.generate(); - const test2Recipient2 = Keypair.generate(); - - test("Transfer between accounts using the system program", async () => { - await getBalances(payer.publicKey, test1Recipient.publicKey, "Beginning"); - - const ix = createTransferInstruction( - payer.publicKey, - test1Recipient.publicKey, - PROGRAM_ID, - InstructionType.CpiTransfer, - transferAmount, - ); - - const tx = new Transaction(); - const [blockhash, _] = await client.getLatestBlockhash(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer); - - await client.processTransaction(tx); - - await getBalances(payer.publicKey, test1Recipient.publicKey, "Resulting"); - }); - - test("Create two accounts for the following test", async () => { - const ix = (pubkey: PublicKey) => { - return SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: pubkey, - space: 0, - lamports: 2 * LAMPORTS_PER_SOL, - programId: PROGRAM_ID, - }); - }; - - const tx = new Transaction(); - const [blockhash, _] = await client.getLatestBlockhash(); - tx.recentBlockhash = blockhash; - tx.add(ix(test2Recipient1.publicKey)) - .add(ix(test2Recipient2.publicKey)) - .sign(payer, test2Recipient1, test2Recipient2); - - await client.processTransaction(tx); - }); - - test("Transfer between accounts using our program", async () => { - await getBalances(test2Recipient1.publicKey, test2Recipient2.publicKey, "Beginning"); - - const ix = createTransferInstruction( - test2Recipient1.publicKey, - test2Recipient2.publicKey, - PROGRAM_ID, - InstructionType.ProgramTransfer, - transferAmount, - ); - - const tx = new Transaction(); - const [blockhash, _] = await client.getLatestBlockhash(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, test2Recipient1); - - await client.processTransaction(tx); - - await getBalances(test2Recipient1.publicKey, test2Recipient2.publicKey, "Resulting"); - }); - - async function getBalances(payerPubkey: PublicKey, recipientPubkey: PublicKey, timeframe: string) { - const payerBalance = await client.getBalance(payerPubkey); - const recipientBalance = await client.getBalance(recipientPubkey); - - console.log(`${timeframe} balances:`); - console.log(` Payer: ${payerBalance}`); - console.log(` Recipient: ${recipientBalance}`); - } -}); diff --git a/basics/transfer-sol/native/tsconfig.json b/basics/transfer-sol/native/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/transfer-sol/native/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/transfer-sol/pinocchio/package.json b/basics/transfer-sol/pinocchio/package.json deleted file mode 100644 index 142007bc..00000000 --- a/basics/transfer-sol/pinocchio/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/program.so" - }, - "dependencies": { - "@solana/web3.js": "^1.98.4", - "buffer-layout": "^1.2.2", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } -} diff --git a/basics/transfer-sol/pinocchio/pnpm-lock.yaml b/basics/transfer-sol/pinocchio/pnpm-lock.yaml deleted file mode 100644 index 19b11171..00000000 --- a/basics/transfer-sol/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,1361 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - buffer-layout: - specifier: ^1.2.2 - version: 1.2.2 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.6 - '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.5.0 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) - typescript: - specifier: ^4.3.5 - version: 4.9.5 - -packages: - - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.1.1': - resolution: {integrity: sha512-iPQW3UZ2Vi7QFBo2r9tw0NubtH8EdrhhmZulx6lC8V5a+qjaxovtM/q/UW2BTNpqqHLfO0tIcLyBLrNH4HTWPg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.1.1': - resolution: {integrity: sha512-m20IUPJhPUmPkHSlZ2iMAjJ7PaYUvlMtFhCQYzm9BEBSI6OCvXTG3GAPpAnSGRBfg5y+QNqqmKn4QHU3B6zzCQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.1.1': - resolution: {integrity: sha512-sj6DaWNbSJFvLzT8UZoabMefQUfSW/8tXK7NTiagsDmh+Q87eyQDDC9L3z+mNmx9b6dEf6z660MOIplDD2nfEw==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@22.15.19': - resolution: {integrity: sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer-layout@1.2.2: - resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} - engines: {node: '>=4.5'} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} - engines: {node: '>= 10'} - os: [darwin] - - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} - engines: {node: '>= 10'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/runtime@7.27.1': {} - - '@noble/curves@1.9.1': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/codecs-numbers@2.1.1(typescript@4.9.5)': - dependencies: - '@solana/codecs-core': 2.1.1(typescript@4.9.5) - '@solana/errors': 2.1.1(typescript@4.9.5) - typescript: 4.9.5 - - '@solana/errors@2.1.1(typescript@4.9.5)': - dependencies: - chalk: 5.4.1 - commander: 13.1.0 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.27.1 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.1.1(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.1.1 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@types/bn.js@5.1.6': - dependencies: - '@types/node': 22.15.19 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.19 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@22.15.19': - dependencies: - undici-types: 6.21.0 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.15.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.19 - - '@ungap/promise-all-settled@1.1.2': {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - buffer-from@1.1.2: {} - - buffer-layout@1.2.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@13.1.0: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fs@0.0.1-security: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - - jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - rpc-websockets@9.1.1: - dependencies: - '@swc/helpers': 0.5.17 - '@types/uuid': 8.3.4 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - solana-bankrun-darwin-arm64@0.3.1: - optional: true - - solana-bankrun-darwin-universal@0.3.1: - optional: true - - solana-bankrun-darwin-x64@0.3.1: - optional: true - - solana-bankrun-linux-x64-gnu@0.3.1: - optional: true - - solana-bankrun-linux-x64-musl@0.3.1: - optional: true - - solana-bankrun@0.3.1(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@4.9.5)(utf-8-validate@5.0.10) - bs58: 4.0.1 - optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - ts-mocha@10.1.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - type-detect@4.1.0: {} - - typescript@4.9.5: {} - - undici-types@6.21.0: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/transfer-sol/pinocchio/program/tests/test.rs b/basics/transfer-sol/pinocchio/program/tests/test.rs index 2f1689b3..c7a80c92 100644 --- a/basics/transfer-sol/pinocchio/program/tests/test.rs +++ b/basics/transfer-sol/pinocchio/program/tests/test.rs @@ -11,7 +11,11 @@ fn test_transfer_sol() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/transfer_sol_pinocchio_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/transfer_sol_pinocchio_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/transfer-sol/pinocchio/tests/test.ts b/basics/transfer-sol/pinocchio/tests/test.ts deleted file mode 100644 index 561e1d98..00000000 --- a/basics/transfer-sol/pinocchio/tests/test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { describe } from "node:test"; - -describe("transfer-sol", async () => { - console.log("transfer-sol"); -}); diff --git a/basics/transfer-sol/pinocchio/tsconfig.json b/basics/transfer-sol/pinocchio/tsconfig.json deleted file mode 100644 index cd5d2e3d..00000000 --- a/basics/transfer-sol/pinocchio/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/finance/escrow/native/README.md b/finance/escrow/native/README.md index 43990f6d..961f11b9 100644 --- a/finance/escrow/native/README.md +++ b/finance/escrow/native/README.md @@ -27,17 +27,17 @@ Errors are reported through the named `EscrowError` enum in `program/src/error.r Prerequisites: the [Agave](https://docs.anza.xyz/) toolchain (`cargo build-sbf`) and Rust. -Build the program into the test fixtures directory: +Build the program: ```bash -cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures +cargo build-sbf --manifest-path=./program/Cargo.toml ``` -(`npm run build-and-test` in `package.json` runs the same command.) +This writes the program binary to `target/deploy/escrow_native_program.so`. ## Testing -The tests run against [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm), loading the `.so` built above. After building, run: +The Rust + [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) tests load the `.so` built above. The binary is embedded at test-compile time, so rebuild after every program change or a stale `.so` silently tests old code. After building, run: ```bash cargo test --manifest-path=./program/Cargo.toml diff --git a/finance/escrow/native/package.json b/finance/escrow/native/package.json deleted file mode 100644 index 00385f8d..00000000 --- a/finance/escrow/native/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "scripts": { - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/escrow_native_program.so" - } -} diff --git a/finance/escrow/native/pnpm-lock.yaml b/finance/escrow/native/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/finance/escrow/native/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/finance/escrow/native/program/tests/test.rs b/finance/escrow/native/program/tests/test.rs index bbdf29cf..a7132b48 100644 --- a/finance/escrow/native/program/tests/test.rs +++ b/finance/escrow/native/program/tests/test.rs @@ -118,7 +118,11 @@ struct EscrowSetup { fn setup() -> EscrowSetup { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/escrow_native_program.so"); + // The .so is built into the local target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the + // project root). Rebuild after every program change: the binary is + // embedded at test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../target/deploy/escrow_native_program.so"); svm.add_program(program_id, program_bytes).unwrap(); let payer = Keypair::new(); diff --git a/tokens/create-token/native/package.json b/tokens/create-token/native/package.json deleted file mode 100644 index efd0e67d..00000000 --- a/tokens/create-token/native/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "scripts": { - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/create_token_program.so" - } -} diff --git a/tokens/create-token/native/pnpm-lock.yaml b/tokens/create-token/native/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/tokens/create-token/native/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/tokens/create-token/native/program/tests/test.rs b/tokens/create-token/native/program/tests/test.rs index 874ed008..82b353fe 100644 --- a/tokens/create-token/native/program/tests/test.rs +++ b/tokens/create-token/native/program/tests/test.rs @@ -18,9 +18,13 @@ fn test_create_token_with_metadata() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the + // project root). Rebuild after every program change: the binary is + // embedded at test-compile time, so a stale .so silently tests old code. svm.add_program( program_id, - include_bytes!("../../tests/fixtures/create_token_program.so"), + include_bytes!("../../../../../target/deploy/create_token_program.so"), ) .unwrap(); diff --git a/tokens/nft-minter/native/package.json b/tokens/nft-minter/native/package.json deleted file mode 100644 index a6dfbb45..00000000 --- a/tokens/nft-minter/native/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "scripts": { - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/nft_minter_program.so" - } -} diff --git a/tokens/nft-minter/native/pnpm-lock.yaml b/tokens/nft-minter/native/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/tokens/nft-minter/native/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/tokens/nft-minter/native/program/tests/test.rs b/tokens/nft-minter/native/program/tests/test.rs index 11eabe8b..9ec2daf6 100644 --- a/tokens/nft-minter/native/program/tests/test.rs +++ b/tokens/nft-minter/native/program/tests/test.rs @@ -18,9 +18,13 @@ fn test_create_and_mint_nft() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the + // project root). Rebuild after every program change: the binary is + // embedded at test-compile time, so a stale .so silently tests old code. svm.add_program( program_id, - include_bytes!("../../tests/fixtures/nft_minter_program.so"), + include_bytes!("../../../../../target/deploy/nft_minter_program.so"), ) .unwrap(); svm.add_program( diff --git a/tokens/pda-mint-authority/native/package.json b/tokens/pda-mint-authority/native/package.json deleted file mode 100644 index afd1365d..00000000 --- a/tokens/pda-mint-authority/native/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "scripts": { - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/pda_mint_authority_native_program.so" - } -} diff --git a/tokens/pda-mint-authority/native/pnpm-lock.yaml b/tokens/pda-mint-authority/native/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/tokens/pda-mint-authority/native/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/tokens/pda-mint-authority/native/program/tests/test.rs b/tokens/pda-mint-authority/native/program/tests/test.rs index ea245cac..8cec359b 100644 --- a/tokens/pda-mint-authority/native/program/tests/test.rs +++ b/tokens/pda-mint-authority/native/program/tests/test.rs @@ -18,9 +18,13 @@ fn test_init_create_and_mint_with_pda_authority() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the + // project root). Rebuild after every program change: the binary is + // embedded at test-compile time, so a stale .so silently tests old code. svm.add_program( program_id, - include_bytes!("../../tests/fixtures/pda_mint_authority_native_program.so"), + include_bytes!("../../../../../target/deploy/pda_mint_authority_native_program.so"), ) .unwrap(); svm.add_program( diff --git a/tokens/token-extensions/default-account-state/native/README.md b/tokens/token-extensions/default-account-state/native/README.md index a2f30b8b..4a95471b 100644 --- a/tokens/token-extensions/default-account-state/native/README.md +++ b/tokens/token-extensions/default-account-state/native/README.md @@ -6,3 +6,10 @@ This extension sets a default state for all [token accounts](https://solana.com/ - **initialized:** a normal token account that can transfer, etc. - **frozen:** the owner cannot perform any token actions until the account is unfrozen. + +## Setup + +1. Build the program: `cargo build-sbf --manifest-path=./program/Cargo.toml` +2. Run the Rust + LiteSVM tests: `cargo test --manifest-path=./program/Cargo.toml` + +Rebuild the program after every change before re-running the tests: the tests embed the `.so` at compile time, so a stale binary silently tests old code. diff --git a/tokens/token-extensions/default-account-state/native/package.json b/tokens/token-extensions/default-account-state/native/package.json deleted file mode 100644 index 0f896f4b..00000000 --- a/tokens/token-extensions/default-account-state/native/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "scripts": { - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/token_2022_default_account_state_program.so" - } -} diff --git a/tokens/token-extensions/default-account-state/native/pnpm-lock.yaml b/tokens/token-extensions/default-account-state/native/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/tokens/token-extensions/default-account-state/native/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/tokens/token-extensions/default-account-state/native/program/tests/test.rs b/tokens/token-extensions/default-account-state/native/program/tests/test.rs index 8e99a783..3223c098 100644 --- a/tokens/token-extensions/default-account-state/native/program/tests/test.rs +++ b/tokens/token-extensions/default-account-state/native/program/tests/test.rs @@ -22,8 +22,12 @@ fn test_create_token_with_default_account_state() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the + // project root). Rebuild after every program change: the binary is + // embedded at test-compile time, so a stale .so silently tests old code. let program_bytes = - include_bytes!("../../tests/fixtures/token_2022_default_account_state_program.so"); + include_bytes!("../../../../../../target/deploy/token_2022_default_account_state_program.so"); svm.add_program(program_id, program_bytes).unwrap(); // litesvm bundles the Token Extensions program by default. diff --git a/tokens/token-extensions/mint-close-authority/native/package.json b/tokens/token-extensions/mint-close-authority/native/package.json deleted file mode 100644 index 8b1c7233..00000000 --- a/tokens/token-extensions/mint-close-authority/native/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "scripts": { - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/token_2022_mint_close_authority_program.so" - } -} diff --git a/tokens/token-extensions/mint-close-authority/native/pnpm-lock.yaml b/tokens/token-extensions/mint-close-authority/native/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/tokens/token-extensions/mint-close-authority/native/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs b/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs index 553f096e..206a03f3 100644 --- a/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs +++ b/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs @@ -21,8 +21,12 @@ fn test_create_token_with_mint_close_authority() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the + // project root). Rebuild after every program change: the binary is + // embedded at test-compile time, so a stale .so silently tests old code. let program_bytes = - include_bytes!("../../tests/fixtures/token_2022_mint_close_authority_program.so"); + include_bytes!("../../../../../../target/deploy/token_2022_mint_close_authority_program.so"); svm.add_program(program_id, program_bytes).unwrap(); // litesvm bundles the Token Extensions program by default. diff --git a/tokens/token-extensions/multiple-extensions/native/package.json b/tokens/token-extensions/multiple-extensions/native/package.json deleted file mode 100644 index cf0b1272..00000000 --- a/tokens/token-extensions/multiple-extensions/native/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "scripts": { - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/token_2022_multiple_extensions_program.so" - } -} diff --git a/tokens/token-extensions/multiple-extensions/native/pnpm-lock.yaml b/tokens/token-extensions/multiple-extensions/native/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/tokens/token-extensions/multiple-extensions/native/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/tokens/token-extensions/multiple-extensions/native/program/tests/test.rs b/tokens/token-extensions/multiple-extensions/native/program/tests/test.rs index 2962284c..6e78ba78 100644 --- a/tokens/token-extensions/multiple-extensions/native/program/tests/test.rs +++ b/tokens/token-extensions/multiple-extensions/native/program/tests/test.rs @@ -22,8 +22,12 @@ fn test_create_token_with_multiple_extensions() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the + // project root). Rebuild after every program change: the binary is + // embedded at test-compile time, so a stale .so silently tests old code. let program_bytes = - include_bytes!("../../tests/fixtures/token_2022_multiple_extensions_program.so"); + include_bytes!("../../../../../../target/deploy/token_2022_multiple_extensions_program.so"); svm.add_program(program_id, program_bytes).unwrap(); // litesvm bundles the Token Extensions program by default. diff --git a/tokens/token-extensions/non-transferable/native/package.json b/tokens/token-extensions/non-transferable/native/package.json deleted file mode 100644 index 2591e476..00000000 --- a/tokens/token-extensions/non-transferable/native/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "scripts": { - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/token_2022_non_transferable_program.so" - } -} diff --git a/tokens/token-extensions/non-transferable/native/pnpm-lock.yaml b/tokens/token-extensions/non-transferable/native/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/tokens/token-extensions/non-transferable/native/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/tokens/token-extensions/non-transferable/native/program/tests/test.rs b/tokens/token-extensions/non-transferable/native/program/tests/test.rs index 4927b8f4..0f86e475 100644 --- a/tokens/token-extensions/non-transferable/native/program/tests/test.rs +++ b/tokens/token-extensions/non-transferable/native/program/tests/test.rs @@ -21,8 +21,12 @@ fn test_create_non_transferable_token() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the + // project root). Rebuild after every program change: the binary is + // embedded at test-compile time, so a stale .so silently tests old code. let program_bytes = - include_bytes!("../../tests/fixtures/token_2022_non_transferable_program.so"); + include_bytes!("../../../../../../target/deploy/token_2022_non_transferable_program.so"); svm.add_program(program_id, program_bytes).unwrap(); // litesvm bundles the Token Extensions program by default. diff --git a/tokens/token-extensions/transfer-fee/native/package.json b/tokens/token-extensions/transfer-fee/native/package.json deleted file mode 100644 index e7ece874..00000000 --- a/tokens/token-extensions/transfer-fee/native/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "scripts": { - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/token_2022_transfer_fees_program.so" - } -} diff --git a/tokens/token-extensions/transfer-fee/native/pnpm-lock.yaml b/tokens/token-extensions/transfer-fee/native/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/tokens/token-extensions/transfer-fee/native/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/tokens/token-extensions/transfer-fee/native/program/tests/test.rs b/tokens/token-extensions/transfer-fee/native/program/tests/test.rs index 3c5a9262..db76dbc8 100644 --- a/tokens/token-extensions/transfer-fee/native/program/tests/test.rs +++ b/tokens/token-extensions/transfer-fee/native/program/tests/test.rs @@ -21,7 +21,11 @@ fn test_create_token_with_transfer_fee() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/token_2022_transfer_fees_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the + // project root). Rebuild after every program change: the binary is + // embedded at test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../../target/deploy/token_2022_transfer_fees_program.so"); svm.add_program(program_id, program_bytes).unwrap(); // litesvm bundles the Token Extensions program by default. diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/package.json b/tokens/token-extensions/transfer-hook/block-list/pinocchio/package.json index c520e325..85bc52c7 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/package.json +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/package.json @@ -1,28 +1,18 @@ { "name": "block-list", "version": "1.0.0", - "main": "index.js", "license": "MIT", "engines": { "node": ">=20.18.0" }, "scripts": { "generate-sdks": "pnpx tsx codama.ts", - "test": "node ./tests/run-mocha-with-retry.mjs", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so" + "build": "cargo build-sbf --manifest-path=./program/Cargo.toml", + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml && cargo test --manifest-path=./program/Cargo.toml" }, "dependencies": { "@codama/renderers": "^1.0.19", - "@solana/spl-token": "^0.4.13", - "@solana/web3.js": "^1.98.4", - "@types/chai": "^4.3.20", - "@types/mocha": "^10.0.10", - "chai": "^4.3.10", "codama": "^1.2.11", - "litesvm": "^0.3.0", - "mocha": "^11.1.0", - "ts-mocha": "^11.1.0", "tsx": "^4.19.3" }, "devDependencies": { diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/pnpm-lock.yaml b/tokens/token-extensions/transfer-hook/block-list/pinocchio/pnpm-lock.yaml index 86776a45..f9f46933 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/pnpm-lock.yaml +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/pnpm-lock.yaml @@ -11,33 +11,9 @@ importers: '@codama/renderers': specifier: ^1.0.19 version: 1.0.34(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3) - '@solana/spl-token': - specifier: ^0.4.13 - version: 0.4.14(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3)(utf-8-validate@6.0.6) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) - '@types/chai': - specifier: ^4.3.20 - version: 4.3.20 - '@types/mocha': - specifier: ^10.0.10 - version: 10.0.10 - chai: - specifier: ^4.3.10 - version: 4.5.0 codama: specifier: ^1.2.11 version: 1.6.0 - litesvm: - specifier: ^0.3.0 - version: 0.3.3(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) - mocha: - specifier: ^11.1.0 - version: 11.7.5 - ts-mocha: - specifier: ^11.1.0 - version: 11.1.0(mocha@11.7.5)(ts-node@10.9.2(@types/node@22.19.19)(typescript@6.0.3)) tsx: specifier: ^4.19.3 version: 4.22.0 @@ -48,10 +24,6 @@ importers: packages: - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - '@codama/cli@1.5.1': resolution: {integrity: sha512-Cn9SokOi0IpixbdW1Aus61Qt0GCJhWE/+q1OdcvRBAQ4V0NacCpdf7N9aF9HR/H7AD+LWJa3JtK7pEs69ywM6Q==} hasBin: true @@ -106,10 +78,6 @@ packages: '@codama/visitors@1.6.0': resolution: {integrity: sha512-11/adC2WiH3+iMWluXkb+ae46sjoDm2xztI+CBEeIcBQd6mm4iuJTTRS0yrGfDwAJE1XzI/nc2MrR0Pvn+Rvvw==} - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - '@esbuild/aix-ppc64@0.28.0': resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} engines: {node: '>=18'} @@ -266,85 +234,18 @@ packages: cpu: [x64] os: [win32] - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@solana/buffer-layout-utils@0.2.0': - resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} - engines: {node: '>= 10'} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.0.0-rc.1': - resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - '@solana/codecs-core@3.0.3': resolution: {integrity: sha512-emKykJ3h1DmnDOY29Uv9eJXP8E/FHzvlUBJ6te+5EbKdFjj7vdlKYPfDxOI6iGdXTY+YC/ELtbNBh6QwF2uEDQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' - '@solana/codecs-data-structures@2.0.0-rc.1': - resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.0.0-rc.1': - resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} - peerDependencies: - typescript: '>=5' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - '@solana/codecs-numbers@3.0.3': resolution: {integrity: sha512-pfXkH9J0glrM8qj6389GAn30+cJOxzXLR2FsPOHCUMXrqLhGjMMZAWhsQkpOQ37SGc/7EiQsT/gmyGC7gxHqJQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' - '@solana/codecs-strings@2.0.0-rc.1': - resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - typescript: '>=5' - '@solana/codecs-strings@3.0.3': resolution: {integrity: sha512-VHBXnnTVtcQ1j+7Vrz+qSYo38no+jiHRdGnhFspRXEHNJbllzwKqgBE7YN3qoIXH+MKxgJUcwO5KHmdzf8Wn2A==} engines: {node: '>=20.18.0'} @@ -352,24 +253,6 @@ packages: fastestsmallesttextencoderdecoder: ^1.0.22 typescript: '>=5.3.3' - '@solana/codecs@2.0.0-rc.1': - resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.0.0-rc.1': - resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} - hasBin: true - peerDependencies: - typescript: '>=5' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - '@solana/errors@3.0.3': resolution: {integrity: sha512-1l84xJlHNva6io62PcYfUamwWlc0eM95nHgCrKX0g0cLoC6D6QHYPCEbEVkR+C5UtP9JDgyQM8MFiv+Ei5tO9Q==} engines: {node: '>=20.18.0'} @@ -377,162 +260,15 @@ packages: peerDependencies: typescript: '>=5.3.3' - '@solana/options@2.0.0-rc.1': - resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} - peerDependencies: - typescript: '>=5' - - '@solana/spl-token-group@0.0.7': - resolution: {integrity: sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.95.3 - - '@solana/spl-token-metadata@0.1.6': - resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.95.3 - - '@solana/spl-token@0.4.14': - resolution: {integrity: sha512-u09zr96UBpX4U685MnvQsNzlvw9TiY005hk1vJmJr7gMJldoPG1eYU5/wNEyOA5lkMLiR/gOi9SFD4MefOYEsA==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.95.5 - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.21': - resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} - - '@tsconfig/node10@1.0.12': - resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/mocha@10.0.10': - resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.19.19': resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==} - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - a-sync-waterfall@1.0.1: resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==} - acorn-walk@8.3.5: - resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} - engines: {node: '>=0.4.0'} - - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base-x@5.0.1: - resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - - bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bn.js@5.2.3: - resolution: {integrity: sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@2.1.0: - resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@6.0.0: - resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.1.0: - resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} - engines: {node: '>=6.14.2'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -545,48 +281,14 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - codama@1.6.0: resolution: {integrity: sha512-JKydzwNYJkGjkZ98ipehd3hJksLQU6nYS7x0GPjOwD0wih+xP8q7WCKgleN8LM2sRuC75rfpr3uXLXSpQpBYKA==} hasBin: true - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - commander@14.0.0: resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} engines: {node: '>=20'} @@ -595,66 +297,18 @@ packages: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@5.1.0: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} engines: {node: '>= 6'} - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@4.0.4: - resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} - engines: {node: '>=0.3.1'} - - diff@7.0.0: - resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} - engines: {node: '>=0.3.1'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -667,53 +321,14 @@ packages: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - esbuild@0.28.0: resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} engines: {node: '>=18'} hasBin: true - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - fastestsmallesttextencoderdecoder@1.0.22: resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -722,13 +337,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -737,19 +345,10 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -761,62 +360,13 @@ packages: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jayson@4.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} - hasBin: true - json-stable-stringify@1.3.0: resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} engines: {node: '>= 0.4'} - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - jsonify@0.0.1: resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} @@ -824,93 +374,10 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - litesvm-darwin-arm64@0.3.3: - resolution: {integrity: sha512-81YimsV3ezWjWLgoKixsXfVznaaecbURE3RtECgNb6Din6Za03pKGKGEN4gkyecHkv8uoPaEZv5cl6ARsgeN1Q==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - litesvm-darwin-x64@0.3.3: - resolution: {integrity: sha512-pYietuU165Bl+2eDnVp2Eidiedfjt+pljyyBAfJPbYriaFyG577mU364NiNcsfQ8ZZWbe+ygIEAVq4Ol247+1g==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - litesvm-linux-arm64-musl@0.3.3: - resolution: {integrity: sha512-mkI15rWtNbaJxVFUfh+qnolqnDCZEqhwSZo/XZ48TZNsQ69vAqY00KhyFhTVJ+jeaYCAZTSNamuFIiRBxqVmNg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [musl] - - litesvm-linux-x64-gnu@0.3.3: - resolution: {integrity: sha512-Qai2/E8Eq03w8VKnJDREyiWxwavjykW/H6onE179ayMnBjVVmkj5fN7XF50VV4z73kasx5bpDzBNK8fcaxMdzA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [glibc] - - litesvm-linux-x64-musl@0.3.3: - resolution: {integrity: sha512-bpWZ2f506hbfu1y6bkmuZf+qqtnLDxggpOMTQbibjd+q6faEO3sETWwKGlIgHB99P8wyU+aXKwLSGQX2sJEw6Q==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [musl] - - litesvm@0.3.3: - resolution: {integrity: sha512-QHXjAIXzvG0uAMOza6aJcYl19yTKz3guwq/z0Zml4KnQxyQvPhjaBpUFc5sf2ey/NxMVdqFhoXmL02CXOOomjw==} - engines: {node: '>= 20'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - - minipass@7.1.3: - resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} - engines: {node: '>=16 || 14 >=14.17'} - - mocha@11.7.5: - resolution: {integrity: sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - nunjucks@3.2.4: resolution: {integrity: sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==} engines: {node: '>= 6.9.0'} @@ -925,32 +392,6 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -963,127 +404,18 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.3.9: - resolution: {integrity: sha512-2iQDaTB4g5fDB2ihrTFSJSibCEuxaRi1q7qTW7ZO9/M5/TC+ToHA4D9/ffNLEbAoHNNrcdeP05oATNk44SKZXA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@11.1.0: - resolution: {integrity: sha512-yT7FfzNRCu8ZKkYvAOiH01xNma/vLq6Vit7yINKYFNVP8e5UyrYXSOMIipERTpzVKJQ4Qcos5bQo1tNERNZevQ==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X - ts-node: ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - tsconfig-paths: ^4.X.X - peerDependenciesMeta: - tsconfig-paths: - optional: true - - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - 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 - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.22.0: resolution: {integrity: sha512-8ccZMPD69s1AbKXx0C5ddTNZfNjwV04iIKgjZmKfKxMynEtSYcK0Lh7iQFh53fI5Yu4pb9usgAiqyPmEONaALg==} engines: {node: '>=18.0.0'} hasBin: true - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -1092,96 +424,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - utf-8-validate@6.0.6: - resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} - engines: {node: '>=6.14.2'} - - uuid@14.0.0: - resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). - hasBin: true - - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@9.3.4: - resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.20.1: - resolution: {integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - snapshots: - '@babel/runtime@7.29.2': {} - '@codama/cli@1.5.1': dependencies: '@codama/nodes': 1.6.0 @@ -1303,10 +547,6 @@ snapshots: '@codama/nodes': 1.6.0 '@codama/visitors-core': 1.6.0 - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - '@esbuild/aix-ppc64@0.28.0': optional: true @@ -1385,97 +625,17 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) - bigint-buffer: 1.1.5 - bignumber.js: 9.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.0.0-rc.1(typescript@6.0.3)': - dependencies: - '@solana/errors': 2.0.0-rc.1(typescript@6.0.3) - typescript: 6.0.3 - - '@solana/codecs-core@2.3.0(typescript@6.0.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@6.0.3) - typescript: 6.0.3 - - '@solana/codecs-core@3.0.3(typescript@6.0.3)': + '@solana/codecs-core@3.0.3(typescript@6.0.3)': dependencies: '@solana/errors': 3.0.3(typescript@6.0.3) typescript: 6.0.3 - '@solana/codecs-data-structures@2.0.0-rc.1(typescript@6.0.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@6.0.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@6.0.3) - '@solana/errors': 2.0.0-rc.1(typescript@6.0.3) - typescript: 6.0.3 - - '@solana/codecs-numbers@2.0.0-rc.1(typescript@6.0.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@6.0.3) - '@solana/errors': 2.0.0-rc.1(typescript@6.0.3) - typescript: 6.0.3 - - '@solana/codecs-numbers@2.3.0(typescript@6.0.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@6.0.3) - '@solana/errors': 2.3.0(typescript@6.0.3) - typescript: 6.0.3 - '@solana/codecs-numbers@3.0.3(typescript@6.0.3)': dependencies: '@solana/codecs-core': 3.0.3(typescript@6.0.3) '@solana/errors': 3.0.3(typescript@6.0.3) typescript: 6.0.3 - '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@6.0.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@6.0.3) - '@solana/errors': 2.0.0-rc.1(typescript@6.0.3) - fastestsmallesttextencoderdecoder: 1.0.22 - typescript: 6.0.3 - '@solana/codecs-strings@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3)': dependencies: '@solana/codecs-core': 3.0.3(typescript@6.0.3) @@ -1484,218 +644,20 @@ snapshots: fastestsmallesttextencoderdecoder: 1.0.22 typescript: 6.0.3 - '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@6.0.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@6.0.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@6.0.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3) - '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/errors@2.0.0-rc.1(typescript@6.0.3)': - dependencies: - chalk: 5.6.2 - commander: 12.1.0 - typescript: 6.0.3 - - '@solana/errors@2.3.0(typescript@6.0.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - typescript: 6.0.3 - '@solana/errors@3.0.3(typescript@6.0.3)': dependencies: chalk: 5.6.2 commander: 14.0.0 typescript: 6.0.3 - '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3)': - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@6.0.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@6.0.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@6.0.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3) - '@solana/errors': 2.0.0-rc.1(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/spl-token-group@0.0.7(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3)': - dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3)': - dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - - '@solana/spl-token@0.4.14(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3)(utf-8-validate@6.0.6)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) - '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@6.0.3) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6)': - dependencies: - '@babel/runtime': 7.29.2 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@6.0.3) - agentkeepalive: 4.6.0 - bn.js: 5.2.3 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - node-fetch: 2.7.0 - rpc-websockets: 9.3.9 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.21': - dependencies: - tslib: 2.8.1 - - '@tsconfig/node10@1.0.12': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} - - '@tsconfig/node16@1.0.4': {} - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.19.19 - - '@types/mocha@10.0.10': {} - - '@types/node@12.20.55': {} - '@types/node@22.19.19': dependencies: undici-types: 6.21.0 - '@types/uuid@10.0.0': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.19.19 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.19.19 - a-sync-waterfall@1.0.1: {} - acorn-walk@8.3.5: - dependencies: - acorn: 8.16.0 - - acorn@8.16.0: {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-regex@5.0.1: {} - - ansi-regex@6.2.2: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.3: {} - - arg@4.1.3: {} - - argparse@2.0.1: {} - asap@2.0.6: {} - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base-x@5.0.1: {} - - base64-js@1.5.1: {} - - bigint-buffer@1.1.5: - dependencies: - bindings: 1.5.0 - - bignumber.js@9.3.1: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bn.js@5.2.3: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.3 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@2.1.0: - dependencies: - balanced-match: 1.0.2 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - - bs58@6.0.0: - dependencies: - base-x: 5.0.1 - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.1.0: - dependencies: - node-gyp-build: 4.8.4 - optional: true - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -1713,39 +675,8 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - camelcase@6.3.0: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chalk@5.6.2: {} - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - codama@1.6.0: dependencies: '@codama/cli': 1.5.1 @@ -1754,66 +685,24 @@ snapshots: '@codama/validators': 1.6.0 '@codama/visitors': 1.6.0 - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@12.1.0: {} - commander@14.0.0: {} commander@14.0.3: {} - commander@2.20.3: {} - commander@5.1.0: {} - create-require@1.1.1: {} - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - debug@4.4.3(supports-color@8.1.1): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 - delay@5.0.0: {} - - diff@4.0.4: {} - - diff@7.0.0: {} - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -1822,12 +711,6 @@ snapshots: dependencies: es-errors: 1.3.0 - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - esbuild@0.28.0: optionalDependencies: '@esbuild/aix-ppc64': 0.28.0 @@ -1857,41 +740,13 @@ snapshots: '@esbuild/win32-ia32': 0.28.0 '@esbuild/win32-x64': 0.28.0 - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@5.0.4: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - fastestsmallesttextencoderdecoder@1.0.22: {} - file-uri-to-path@1.0.0: {} - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - fsevents@2.3.3: optional: true function-bind@1.1.2: {} - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -1910,19 +765,8 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - glob@10.5.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - gopd@1.2.0: {} - has-flag@4.0.0: {} - has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 @@ -1933,58 +777,8 @@ snapshots: dependencies: function-bind: 1.1.2 - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-path-inside@3.0.3: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - isarray@2.0.5: {} - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6)): - dependencies: - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6) - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.1: - dependencies: - argparse: 2.0.1 - json-stable-stringify@1.3.0: dependencies: call-bind: 1.0.9 @@ -1993,102 +787,12 @@ snapshots: jsonify: 0.0.1 object-keys: 1.1.1 - json-stringify-safe@5.0.1: {} - jsonify@0.0.1: {} kleur@3.0.3: {} - litesvm-darwin-arm64@0.3.3: - optional: true - - litesvm-darwin-x64@0.3.3: - optional: true - - litesvm-linux-arm64-musl@0.3.3: - optional: true - - litesvm-linux-x64-gnu@0.3.3: - optional: true - - litesvm-linux-x64-musl@0.3.3: - optional: true - - litesvm@0.3.3(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) - bs58: 6.0.0 - fastestsmallesttextencoderdecoder: 1.0.22 - optionalDependencies: - litesvm-darwin-arm64: 0.3.3 - litesvm-darwin-x64: 0.3.3 - litesvm-linux-arm64-musl: 0.3.3 - litesvm-linux-x64-gnu: 0.3.3 - litesvm-linux-x64-musl: 0.3.3 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - lru-cache@10.4.3: {} - - make-error@1.3.6: {} - math-intrinsics@1.1.0: {} - minimatch@9.0.9: - dependencies: - brace-expansion: 2.1.0 - - minipass@7.1.3: {} - - mocha@11.7.5: - dependencies: - browser-stdout: 1.3.1 - chokidar: 4.0.3 - debug: 4.4.3(supports-color@8.1.1) - diff: 7.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 10.5.0 - he: 1.2.0 - is-path-inside: 3.0.3 - js-yaml: 4.1.1 - log-symbols: 4.1.0 - minimatch: 9.0.9 - ms: 2.1.3 - picocolors: 1.1.1 - serialize-javascript: 6.0.2 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 9.3.4 - yargs: 17.7.2 - yargs-parser: 21.1.1 - yargs-unparser: 2.0.0 - - ms@2.1.3: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.4: - optional: true - nunjucks@3.2.4: dependencies: a-sync-waterfall: 1.0.1 @@ -2097,27 +801,6 @@ snapshots: object-keys@1.1.1: {} - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - package-json-from-dist@1.0.1: {} - - path-exists@4.0.0: {} - - path-key@3.1.1: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.3 - - pathval@1.1.1: {} - picocolors@1.1.1: {} prettier@3.8.3: {} @@ -2127,33 +810,6 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@4.1.2: {} - - require-directory@2.1.1: {} - - rpc-websockets@9.3.9: - dependencies: - '@swc/helpers': 0.5.21 - '@types/uuid': 10.0.0 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.4 - uuid: 14.0.0 - ws: 8.20.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 6.0.6 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -2163,162 +819,14 @@ snapshots: gopd: 1.2.0 has-property-descriptors: 1.0.2 - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - signal-exit@4.1.0: {} - sisteransi@1.0.5: {} - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.2.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.2.2 - - strip-json-comments@3.1.1: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - tr46@0.0.3: {} - - ts-mocha@11.1.0(mocha@11.7.5)(ts-node@10.9.2(@types/node@22.19.19)(typescript@6.0.3)): - dependencies: - mocha: 11.7.5 - ts-node: 10.9.2(@types/node@22.19.19)(typescript@6.0.3) - - ts-node@10.9.2(@types/node@22.19.19)(typescript@6.0.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.19.19 - acorn: 8.16.0 - acorn-walk: 8.3.5 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.4 - make-error: 1.3.6 - typescript: 6.0.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - tslib@2.8.1: {} - tsx@4.22.0: dependencies: esbuild: 0.28.0 optionalDependencies: fsevents: 2.3.3 - type-detect@4.1.0: {} - typescript@6.0.3: {} undici-types@6.21.0: {} - - utf-8-validate@6.0.6: - dependencies: - node-gyp-build: 4.8.4 - optional: true - - uuid@14.0.0: {} - - uuid@8.3.2: {} - - v8-compile-cache-lib@3.0.1: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@9.3.4: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 - - ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 6.0.6 - - ws@8.20.1(bufferutil@4.1.0)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 6.0.6 - - y18n@5.0.8: {} - - yargs-parser@21.1.1: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yn@3.1.1: {} - - yocto-queue@0.1.0: {} diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/Cargo.toml b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/Cargo.toml index 0d7907bf..5551305a 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/Cargo.toml +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/Cargo.toml @@ -17,3 +17,14 @@ pinocchio = "0.9.3" pinocchio-pubkey = "0.3.0" pinocchio-system = "0.3.0" pinocchio-log = "0.5.1" + +# The generated Rust client (sdk/rust) is built on solana-program 2.x types, +# so the test stack pins litesvm and SPL crate versions from the same +# generation. Bump these together when the client is regenerated against a +# newer solana-program. +[dev-dependencies] +block-list-client = { workspace = true } +litesvm = "0.6.1" +solana-sdk = "2.2" +spl-token-2022 = "7.0" +spl-associated-token-account = "6.0" diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/tests/test.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/tests/test.rs new file mode 100644 index 00000000..a8227ea1 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/tests/test.rs @@ -0,0 +1,414 @@ +use block_list_client::client::{ + instructions::{ + BlockWallet, Init, SetupExtraMetas, SetupExtraMetasInstructionArgs, UnblockWallet, + }, + programs::BLOCK_LIST_ID, +}; +use litesvm::LiteSVM; +use solana_sdk::{ + compute_budget::ComputeBudgetInstruction, + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + signature::Keypair, + signer::Signer, + system_instruction, + transaction::Transaction, +}; +use spl_associated_token_account::{ + get_associated_token_address_with_program_id, instruction::create_associated_token_account, +}; +use spl_token_2022::{ + extension::ExtensionType, + instruction::{initialize_mint2, mint_to_checked, transfer_checked}, + state::Mint, +}; + +// The .so is built into this project's workspace target/deploy by +// `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the +// project root). Rebuild after every program change: the binary is embedded +// at test-compile time, so a stale .so silently tests old code. +const PROGRAM_SO: &[u8] = include_bytes!("../../target/deploy/block_list.so"); + +const DECIMALS: u8 = 6; +const MINT_AMOUNT: u64 = 1_000 * 10u64.pow(DECIMALS as u32); +const TRANSFER_AMOUNT: u64 = 10 * 10u64.pow(DECIMALS as u32); + +// Hook PDA derivations, mirroring program/src (seeds "config", "wallet_block", +// and the transfer-hook interface's "extra-account-metas"). +fn find_config_pda() -> Pubkey { + Pubkey::find_program_address(&[b"config"], &BLOCK_LIST_ID).0 +} + +fn find_wallet_block_pda(wallet: &Pubkey) -> Pubkey { + Pubkey::find_program_address(&[b"wallet_block", wallet.as_ref()], &BLOCK_LIST_ID).0 +} + +fn find_extra_metas_pda(mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address(&[b"extra-account-metas", mint.as_ref()], &BLOCK_LIST_ID).0 +} + +enum ExtraMode { + Empty, + SourceOnly, +} + +#[allow(clippy::too_many_arguments)] +fn build_transfer_with_hook_accounts( + source: &Pubkey, + mint: &Pubkey, + destination: &Pubkey, + owner: &Pubkey, + source_owner: &Pubkey, + extra_mode: ExtraMode, +) -> Instruction { + let mut instruction = transfer_checked( + &spl_token_2022::id(), + source, + mint, + destination, + owner, + &[], + TRANSFER_AMOUNT, + DECIMALS, + ) + .unwrap(); + + // Token Extensions invokes the hook with these trailing accounts in this + // order: + // validation_pda (extra-account-metas) + // resolved wallet_block for the source TA (when listed in the metas) + // The hook program id is appended last so the Token Extensions transfer + // instruction handler can CPI into it (it strips that entry from the hook + // accounts list). + instruction.accounts.push(AccountMeta::new_readonly( + find_extra_metas_pda(mint), + false, + )); + if let ExtraMode::SourceOnly = extra_mode { + instruction.accounts.push(AccountMeta::new_readonly( + find_wallet_block_pda(source_owner), + false, + )); + } + instruction + .accounts + .push(AccountMeta::new_readonly(BLOCK_LIST_ID, false)); + instruction +} + +fn send_expecting_success( + svm: &mut LiteSVM, + instructions: &[Instruction], + payer: &Keypair, + signers: &[&Keypair], + label: &str, +) { + // Identical transactions across steps (same signers, instruction, and + // blockhash) collide on signature and are rejected as AlreadyProcessed. + // Expiring first gives each send a fresh blockhash and unique signature. + svm.expire_blockhash(); + let transaction = Transaction::new_signed_with_payer( + instructions, + Some(&payer.pubkey()), + signers, + svm.latest_blockhash(), + ); + if let Err(failure) = svm.send_transaction(transaction) { + panic!("{label} failed: {:?}\nlogs:\n{}", failure.err, failure.meta.logs.join("\n")); + } +} + +fn send_expecting_failure( + svm: &mut LiteSVM, + instructions: &[Instruction], + payer: &Keypair, + signers: &[&Keypair], + label: &str, +) -> Vec { + svm.expire_blockhash(); + let transaction = Transaction::new_signed_with_payer( + instructions, + Some(&payer.pubkey()), + signers, + svm.latest_blockhash(), + ); + match svm.send_transaction(transaction) { + Ok(_) => panic!("{label} unexpectedly succeeded"), + Err(failure) => failure.meta.logs, + } +} + +fn read_blocked_wallets_count(svm: &LiteSVM) -> u64 { + let config = svm.get_account(&find_config_pda()).unwrap(); + // Config layout: discriminator(1) | authority(32) | blocked_wallets_count(8). + u64::from_le_bytes(config.data[33..41].try_into().unwrap()) +} + +#[test] +fn block_list_transfer_hook_lifecycle() { + let mut svm = LiteSVM::new(); + svm.add_program(BLOCK_LIST_ID, PROGRAM_SO); + + let payer = Keypair::new(); + let wallet_a = Keypair::new(); + let wallet_b = Keypair::new(); + let mint_keypair = Keypair::new(); + svm.airdrop(&payer.pubkey(), 1_000_000_000).unwrap(); + svm.airdrop(&wallet_a.pubkey(), 100_000_000).unwrap(); + + // init: creates the config PDA owned by the hook program. + let init_instruction = Init { + authority: payer.pubkey(), + config: find_config_pda(), + system_program: solana_sdk::system_program::id(), + } + .instruction(); + send_expecting_success(&mut svm, &[init_instruction], &payer, &[&payer], "init"); + + let config = svm.get_account(&find_config_pda()).unwrap(); + assert_eq!(config.data.len(), 41, "config account size"); + assert_eq!(config.data[0], 0x01, "config discriminator"); + assert_eq!( + Pubkey::try_from(&config.data[1..33]).unwrap(), + payer.pubkey(), + "config authority" + ); + assert_eq!(read_blocked_wallets_count(&svm), 0); + + // Create a Token Extensions mint with the TransferHook extension pointing + // at the block-list program, then write the (empty) extra-metas account. + let mint_len = + ExtensionType::try_calculate_account_len::(&[ExtensionType::TransferHook]).unwrap(); + let mint_rent = svm.minimum_balance_for_rent_exemption(mint_len); + let create_mint_account_instruction = system_instruction::create_account( + &payer.pubkey(), + &mint_keypair.pubkey(), + mint_rent, + mint_len as u64, + &spl_token_2022::id(), + ); + let init_hook_instruction = spl_token_2022::extension::transfer_hook::instruction::initialize( + &spl_token_2022::id(), + &mint_keypair.pubkey(), + Some(payer.pubkey()), + Some(BLOCK_LIST_ID), + ) + .unwrap(); + let init_mint_instruction = initialize_mint2( + &spl_token_2022::id(), + &mint_keypair.pubkey(), + &payer.pubkey(), + None, + DECIMALS, + ) + .unwrap(); + send_expecting_success( + &mut svm, + &[ + create_mint_account_instruction, + init_hook_instruction, + init_mint_instruction, + ], + &payer, + &[&payer, &mint_keypair], + "create-mint", + ); + + let setup_extra_metas_instruction = SetupExtraMetas { + authority: payer.pubkey(), + config: find_config_pda(), + mint: mint_keypair.pubkey(), + extra_metas: find_extra_metas_pda(&mint_keypair.pubkey()), + system_program: solana_sdk::system_program::id(), + } + .instruction(SetupExtraMetasInstructionArgs { + check_both_wallets: false, + }); + send_expecting_success( + &mut svm, + &[setup_extra_metas_instruction.clone()], + &payer, + &[&payer], + "setup_extra_metas (empty)", + ); + let extra_metas = svm + .get_account(&find_extra_metas_pda(&mint_keypair.pubkey())) + .unwrap(); + // Empty ExtraAccountMetaList = 8 byte TLV header + 4 bytes length + 4 bytes count. + assert_eq!(extra_metas.data.len(), 16, "empty extra-metas data length"); + + // Create both ATAs and mint to wallet A. + let ata_a = get_associated_token_address_with_program_id( + &wallet_a.pubkey(), + &mint_keypair.pubkey(), + &spl_token_2022::id(), + ); + let ata_b = get_associated_token_address_with_program_id( + &wallet_b.pubkey(), + &mint_keypair.pubkey(), + &spl_token_2022::id(), + ); + let create_ata_a = create_associated_token_account( + &payer.pubkey(), + &wallet_a.pubkey(), + &mint_keypair.pubkey(), + &spl_token_2022::id(), + ); + let create_ata_b = create_associated_token_account( + &payer.pubkey(), + &wallet_b.pubkey(), + &mint_keypair.pubkey(), + &spl_token_2022::id(), + ); + let mint_to_a = mint_to_checked( + &spl_token_2022::id(), + &mint_keypair.pubkey(), + &ata_a, + &payer.pubkey(), + &[], + MINT_AMOUNT, + DECIMALS, + ) + .unwrap(); + send_expecting_success( + &mut svm, + &[create_ata_a, create_ata_b, mint_to_a], + &payer, + &[&payer], + "create-atas+mint", + ); + let ata_a_data_len = svm.get_account(&ata_a).unwrap().data.len(); + assert!( + ata_a_data_len > 165, + "ATA has extension data (immutable owner)" + ); + + // Transfer succeeds while the source wallet is not blocked. + let transfer_unblocked = build_transfer_with_hook_accounts( + &ata_a, + &mint_keypair.pubkey(), + &ata_b, + &wallet_a.pubkey(), + &wallet_a.pubkey(), + ExtraMode::Empty, + ); + send_expecting_success( + &mut svm, + &[ + ComputeBudgetInstruction::set_compute_unit_limit(400_000), + transfer_unblocked, + ], + &wallet_a, + &[&wallet_a], + "transfer (unblocked)", + ); + + // block_wallet: creates wallet A's wallet_block PDA and bumps the count. + let block_instruction = BlockWallet { + authority: payer.pubkey(), + config: find_config_pda(), + wallet: wallet_a.pubkey(), + wallet_block: find_wallet_block_pda(&wallet_a.pubkey()), + system_program: solana_sdk::system_program::id(), + } + .instruction(); + send_expecting_success(&mut svm, &[block_instruction], &payer, &[&payer], "block_wallet A"); + let wallet_block = svm + .get_account(&find_wallet_block_pda(&wallet_a.pubkey())) + .unwrap(); + assert_eq!(wallet_block.data[0], 0x02, "wallet_block discriminator"); + assert_eq!(read_blocked_wallets_count(&svm), 1); + + // With a nonzero blocked count, setup_extra_metas writes the source + // wallet_block dependency into the metas: 16-byte header + one 35-byte + // ExtraAccountMeta entry. + send_expecting_success( + &mut svm, + &[setup_extra_metas_instruction], + &payer, + &[&payer], + "setup_extra_metas (source dep)", + ); + let extra_metas = svm + .get_account(&find_extra_metas_pda(&mint_keypair.pubkey())) + .unwrap(); + assert_eq!( + extra_metas.data.len(), + 51, + "source-dependency extra-metas data length" + ); + + // Transfer from the blocked source wallet fails with + // BlockListError::AccountBlocked (variant index 2 -> custom code 0x2). + let transfer_blocked = build_transfer_with_hook_accounts( + &ata_a, + &mint_keypair.pubkey(), + &ata_b, + &wallet_a.pubkey(), + &wallet_a.pubkey(), + ExtraMode::SourceOnly, + ); + let logs = send_expecting_failure( + &mut svm, + &[ + ComputeBudgetInstruction::set_compute_unit_limit(400_000), + transfer_blocked, + ], + &wallet_a, + &[&wallet_a], + "transfer-from-blocked", + ); + let joined_logs = logs.join("\n"); + assert!( + joined_logs.contains("custom program error: 0x2"), + "expected AccountBlocked (custom 0x2) error in logs, got:\n{joined_logs}" + ); + + // unblock_wallet: closes the wallet_block PDA and decrements the count. + let unblock_instruction = UnblockWallet { + authority: payer.pubkey(), + config: find_config_pda(), + wallet_block: find_wallet_block_pda(&wallet_a.pubkey()), + system_program: solana_sdk::system_program::id(), + } + .instruction(); + send_expecting_success( + &mut svm, + &[unblock_instruction], + &payer, + &[&payer], + "unblock_wallet A", + ); + // After close the runtime reports either no account or a drained shell + // (zero lamports, empty data) depending on whether the slot advanced. + let closed_wallet_block = svm.get_account(&find_wallet_block_pda(&wallet_a.pubkey())); + assert!( + closed_wallet_block + .map(|account| account.lamports == 0 && account.data.is_empty()) + .unwrap_or(true), + "wallet_block PDA closed" + ); + assert_eq!(read_blocked_wallets_count(&svm), 0); + + // Re-issue the transfer with the (now-closed) wallet_block PDA still in + // the extra metas. The closed account is empty, so the hook no longer + // blocks the transfer. + let transfer_after_unblock = build_transfer_with_hook_accounts( + &ata_a, + &mint_keypair.pubkey(), + &ata_b, + &wallet_a.pubkey(), + &wallet_a.pubkey(), + ExtraMode::SourceOnly, + ); + send_expecting_success( + &mut svm, + &[ + ComputeBudgetInstruction::set_compute_unit_limit(400_000), + transfer_after_unblock, + ], + &wallet_a, + &[&wallet_a], + "transfer (after unblock)", + ); +} diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/run-mocha-with-retry.mjs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/run-mocha-with-retry.mjs deleted file mode 100644 index 8b3a370a..00000000 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/run-mocha-with-retry.mjs +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env node -/* - * litesvm's native binding (an N-API addon written in Rust) intermittently - * aborts with `terminate called after throwing an instance of 'std::bad_alloc'` - * when our pinocchio block-list program runs as a TransferHook for Token Extensions. - * The crash is inside the prebuilt .node binary, well outside our program. - * - * The functional behaviour the tests exercise is correct: when the same test - * file makes it through without the abort, every assertion passes. We can't - * fix a memory-corruption bug inside a compiled .node file from here, so - * instead we keep launching mocha until we get a clean run (or exhaust the - * retry budget). Each invocation is a brand-new Node process, so any state - * leaked by the previous run is gone before we retry. - * - * `bad_alloc` shows up as: - * - exit signal SIGABRT, when our wrapper is the direct child of mocha, OR - * - exit code non-zero + the string "std::bad_alloc" in the captured output - * when an intermediate process (e.g. pnpm) wraps the abort. - */ -import { spawn } from "node:child_process"; - -const MAX_TRIES = 20; - -const BAD_ALLOC_MARKER = "std::bad_alloc"; - -function runOnce() { - return new Promise((resolve) => { - const stdoutChunks = []; - const stderrChunks = []; - const child = spawn( - "pnpm", - ["ts-mocha", "-p", "./tests/tsconfig.test.json", "-t", "1000000", "./tests/test.spec.ts"], - { stdio: ["inherit", "pipe", "pipe"] }, - ); - child.stdout.on("data", (chunk) => { - stdoutChunks.push(chunk); - process.stdout.write(chunk); - }); - child.stderr.on("data", (chunk) => { - stderrChunks.push(chunk); - process.stderr.write(chunk); - }); - child.on("close", (code, signal) => { - const stdout = Buffer.concat(stdoutChunks).toString("utf8"); - const stderr = Buffer.concat(stderrChunks).toString("utf8"); - const hitBadAlloc = - signal === "SIGABRT" || stdout.includes(BAD_ALLOC_MARKER) || stderr.includes(BAD_ALLOC_MARKER); - resolve({ code, signal, hitBadAlloc, stdout, stderr }); - }); - }); -} - -let lastResult = { code: 1, signal: null }; - -for (let attempt = 1; attempt <= MAX_TRIES; attempt++) { - console.log(`\n[run-mocha-with-retry] attempt ${attempt}/${MAX_TRIES}`); - const result = await runOnce(); - lastResult = result; - - if (result.code === 0 && !result.hitBadAlloc) { - console.log(`[run-mocha-with-retry] clean pass on attempt ${attempt}`); - process.exit(0); - } - - // A `bad_alloc` abort can fire AFTER mocha has reported all tests as - // passing. Treat that as a successful test run: if the captured output - // contains a mocha summary with no failing tests, accept it. - if (result.hitBadAlloc) { - const passMatch = result.stdout.match(/(\d+)\s+passing/); - const failMatch = result.stdout.match(/(\d+)\s+failing/); - const passing = passMatch ? Number(passMatch[1]) : 0; - const failing = failMatch ? Number(failMatch[1]) : 0; - if (passing > 0 && failing === 0) { - console.log( - `[run-mocha-with-retry] all ${passing} tests passed on attempt ${attempt}; bad_alloc fired after the run, ignoring`, - ); - process.exit(0); - } - console.log( - `[run-mocha-with-retry] hit known litesvm bad_alloc mid-run (${passing} passing, ${failing} failing), retrying...`, - ); - continue; - } - - console.log(`[run-mocha-with-retry] real failure (exit ${result.code}, signal ${result.signal}), bailing`); - process.exit(result.code ?? 1); -} - -console.log( - `[run-mocha-with-retry] exhausted ${MAX_TRIES} attempts, last exit ${JSON.stringify({ code: lastResult.code, signal: lastResult.signal })}`, -); -process.exit(lastResult.code ?? 1); diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/test.spec.ts b/tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/test.spec.ts deleted file mode 100644 index cf0fc13b..00000000 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/test.spec.ts +++ /dev/null @@ -1,419 +0,0 @@ -import { Buffer } from "node:buffer"; -import * as path from "node:path"; -import { - ASSOCIATED_TOKEN_PROGRAM_ID, - createAssociatedTokenAccountInstruction, - createInitializeMintInstruction, - createInitializeTransferHookInstruction, - createMintToCheckedInstruction, - createTransferCheckedInstruction, - ExtensionType, - getAssociatedTokenAddressSync, - getMintLen, - TOKEN_2022_PROGRAM_ID, -} from "@solana/spl-token"; -import { - ComputeBudgetProgram, - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import { assert } from "chai"; -import { FailedTransactionMetadata, LiteSVM, type TransactionMetadata } from "litesvm"; -import { before, describe, it } from "mocha"; - -// Program ID baked into the onchain program (`declare_id!` in program/src/lib.rs). -const BLOCK_LIST_PROGRAM_ID = new PublicKey("BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf"); -const PROGRAM_SO_PATH = path.resolve(__dirname, "fixtures/block_list.so"); - -// Instruction discriminators from program/src/instructions/*.rs. -const INIT_DISCRIMINATOR = 0xf1; -const BLOCK_WALLET_DISCRIMINATOR = 0xf2; -const UNBLOCK_WALLET_DISCRIMINATOR = 0xf3; -const SETUP_EXTRA_METAS_DISCRIMINATOR = 0x6a; - -function findConfigPda(): PublicKey { - return PublicKey.findProgramAddressSync([Buffer.from("config")], BLOCK_LIST_PROGRAM_ID)[0]; -} - -function findWalletBlockPda(wallet: PublicKey): PublicKey { - return PublicKey.findProgramAddressSync([Buffer.from("wallet_block"), wallet.toBuffer()], BLOCK_LIST_PROGRAM_ID)[0]; -} - -function findExtraMetasPda(mint: PublicKey): PublicKey { - return PublicKey.findProgramAddressSync( - [Buffer.from("extra-account-metas"), mint.toBuffer()], - BLOCK_LIST_PROGRAM_ID, - )[0]; -} - -function buildInitIx(authority: PublicKey): TransactionInstruction { - return new TransactionInstruction({ - programId: BLOCK_LIST_PROGRAM_ID, - keys: [ - { pubkey: authority, isSigner: true, isWritable: true }, - { pubkey: findConfigPda(), isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - data: Buffer.from([INIT_DISCRIMINATOR]), - }); -} - -function buildBlockWalletIx(authority: PublicKey, wallet: PublicKey): TransactionInstruction { - return new TransactionInstruction({ - programId: BLOCK_LIST_PROGRAM_ID, - keys: [ - { pubkey: authority, isSigner: true, isWritable: true }, - { pubkey: findConfigPda(), isSigner: false, isWritable: true }, - { pubkey: wallet, isSigner: false, isWritable: false }, - { pubkey: findWalletBlockPda(wallet), isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - data: Buffer.from([BLOCK_WALLET_DISCRIMINATOR]), - }); -} - -function buildUnblockWalletIx(authority: PublicKey, wallet: PublicKey): TransactionInstruction { - return new TransactionInstruction({ - programId: BLOCK_LIST_PROGRAM_ID, - keys: [ - { pubkey: authority, isSigner: true, isWritable: true }, - { pubkey: findConfigPda(), isSigner: false, isWritable: true }, - { pubkey: findWalletBlockPda(wallet), isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - data: Buffer.from([UNBLOCK_WALLET_DISCRIMINATOR]), - }); -} - -function buildSetupExtraMetasIx( - authority: PublicKey, - mint: PublicKey, - checkBothWallets: boolean, -): TransactionInstruction { - // Second byte is the optional `checkBothWallets` flag read by the program - // when blocked_wallets_count > 0 (see program/src/instructions/setup_extra_metas.rs). - const data = Buffer.from([SETUP_EXTRA_METAS_DISCRIMINATOR, checkBothWallets ? 1 : 0]); - return new TransactionInstruction({ - programId: BLOCK_LIST_PROGRAM_ID, - keys: [ - { pubkey: authority, isSigner: true, isWritable: true }, - { pubkey: findConfigPda(), isSigner: false, isWritable: false }, - { pubkey: mint, isSigner: false, isWritable: false }, - { pubkey: findExtraMetasPda(mint), isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - data, - }); -} - -function buildTransferIxWithHookAccounts(args: { - source: PublicKey; - mint: PublicKey; - destination: PublicKey; - owner: PublicKey; - amount: bigint; - decimals: number; - sourceOwner: PublicKey; - destinationOwner: PublicKey; - extraMode: "empty" | "source-only" | "both"; -}): TransactionInstruction { - const baseIx = createTransferCheckedInstruction( - args.source, - args.mint, - args.destination, - args.owner, - args.amount, - args.decimals, - [], - TOKEN_2022_PROGRAM_ID, - ); - - const extraKeys: { pubkey: PublicKey; isSigner: boolean; isWritable: boolean }[] = []; - if (args.extraMode === "source-only" || args.extraMode === "both") { - extraKeys.push({ - pubkey: findWalletBlockPda(args.sourceOwner), - isSigner: false, - isWritable: false, - }); - } - if (args.extraMode === "both") { - extraKeys.push({ - pubkey: findWalletBlockPda(args.destinationOwner), - isSigner: false, - isWritable: false, - }); - } - - // Token Extensions invokes the hook with these trailing accounts in this order: - // [4] validation_pda (extra-account-metas) - // [5] resolved wallet_block for the source TA (when present) - // [6] resolved wallet_block for the destination TA (when present) - // The hook program also needs the hook program id to be addressable so the - // Token Extensions transfer instruction handler can CPI into it; we append - // that at the very end (Token Extensions strips it from the hook accounts list). - return new TransactionInstruction({ - programId: baseIx.programId, - data: baseIx.data, - keys: [ - ...baseIx.keys, - { pubkey: findExtraMetasPda(args.mint), isSigner: false, isWritable: false }, - ...extraKeys, - { pubkey: BLOCK_LIST_PROGRAM_ID, isSigner: false, isWritable: false }, - ], - }); -} - -function expectTxOk(svm: LiteSVM, tx: Transaction, signers: Keypair[], label: string): TransactionMetadata { - // litesvm reuses blockhashes; without expiring, identical txs across tests - // (same signers, same ix, same blockhash) collide on signature and are - // rejected as `AlreadyProcessed`. We expire before every send so each tx - // gets a fresh blockhash and a unique signature. - svm.expireBlockhash(); - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(...signers); - const res = svm.sendTransaction(tx); - if (res instanceof FailedTransactionMetadata) { - const logs = res.meta().logs().join("\n"); - throw new Error(`${label} failed: ${res.err()}\nlogs:\n${logs}`); - } - return res; -} - -function expectTxFails(svm: LiteSVM, tx: Transaction, signers: Keypair[], label: string): string[] { - svm.expireBlockhash(); - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(...signers); - const res = svm.sendTransaction(tx); - if (!(res instanceof FailedTransactionMetadata)) { - throw new Error(`${label} unexpectedly succeeded`); - } - return res.meta().logs(); -} - -describe("block-list pinocchio transfer-hook", () => { - let svm: LiteSVM; - let payer: Keypair; - let mintKeypair: Keypair; - let walletA: Keypair; - let walletB: Keypair; - let ataA: PublicKey; - let ataB: PublicKey; - - const DECIMALS = 6; - const MINT_AMOUNT = 1_000n * 10n ** BigInt(DECIMALS); - const TRANSFER_AMOUNT = 10n * 10n ** BigInt(DECIMALS); - - before(() => { - svm = new LiteSVM(); - svm.addProgramFromFile(BLOCK_LIST_PROGRAM_ID, PROGRAM_SO_PATH); - payer = Keypair.generate(); - walletA = Keypair.generate(); - walletB = Keypair.generate(); - mintKeypair = Keypair.generate(); - svm.airdrop(payer.publicKey, 1_000_000_000n); - svm.airdrop(walletA.publicKey, 100_000_000n); - }); - - it("init: creates the config PDA", () => { - const tx = new Transaction().add(buildInitIx(payer.publicKey)); - expectTxOk(svm, tx, [payer], "init"); - - const config = svm.getAccount(findConfigPda()); - assert.isNotNull(config, "config PDA should exist after init"); - // Layout: discriminator(1) | authority(32) | blocked_wallets_count(8). - assert.strictEqual(config!.data.length, 41); - assert.strictEqual(config!.data[0], 0x01, "config discriminator"); - assert.strictEqual( - new PublicKey(config!.data.slice(1, 33)).toBase58(), - payer.publicKey.toBase58(), - "config authority", - ); - const view = new DataView(config!.data.buffer, config!.data.byteOffset + 33, 8); - assert.strictEqual(view.getBigUint64(0, true), 0n, "blocked_wallets_count starts at 0"); - }); - - it("creates a Token Extensions mint with TransferHook -> block-list, plus extra metas", () => { - const mintLen = getMintLen([ExtensionType.TransferHook]); - const mintRent = svm.minimumBalanceForRentExemption(BigInt(mintLen)); - - const createMintAccountIx = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: mintKeypair.publicKey, - lamports: Number(mintRent), - space: mintLen, - programId: TOKEN_2022_PROGRAM_ID, - }); - const initHookIx = createInitializeTransferHookInstruction( - mintKeypair.publicKey, - payer.publicKey, - BLOCK_LIST_PROGRAM_ID, - TOKEN_2022_PROGRAM_ID, - ); - const initMintIx = createInitializeMintInstruction( - mintKeypair.publicKey, - DECIMALS, - payer.publicKey, - null, - TOKEN_2022_PROGRAM_ID, - ); - - const tx = new Transaction().add(createMintAccountIx, initHookIx, initMintIx); - expectTxOk(svm, tx, [payer, mintKeypair], "create-mint"); - - // Setup the extra-metas account. With 0 blocked wallets this writes the - // EMPTY ExtraAccountMetaList shape. - const setupTx = new Transaction().add(buildSetupExtraMetasIx(payer.publicKey, mintKeypair.publicKey, false)); - expectTxOk(svm, setupTx, [payer], "setup_extra_metas (empty)"); - - const extraMetas = svm.getAccount(findExtraMetasPda(mintKeypair.publicKey)); - assert.isNotNull(extraMetas, "extra-metas PDA exists"); - // Empty ExtraAccountMetaList = 8 byte TLV header + 4 bytes length + 4 bytes count = 16 bytes. - assert.strictEqual(extraMetas!.data.length, 16, "empty extra-metas data length"); - }); - - it("creates ATAs with the ImmutableOwner extension and mints to wallet A", () => { - ataA = getAssociatedTokenAddressSync( - mintKeypair.publicKey, - walletA.publicKey, - false, - TOKEN_2022_PROGRAM_ID, - ASSOCIATED_TOKEN_PROGRAM_ID, - ); - ataB = getAssociatedTokenAddressSync( - mintKeypair.publicKey, - walletB.publicKey, - false, - TOKEN_2022_PROGRAM_ID, - ASSOCIATED_TOKEN_PROGRAM_ID, - ); - - const createA = createAssociatedTokenAccountInstruction( - payer.publicKey, - ataA, - walletA.publicKey, - mintKeypair.publicKey, - TOKEN_2022_PROGRAM_ID, - ASSOCIATED_TOKEN_PROGRAM_ID, - ); - const createB = createAssociatedTokenAccountInstruction( - payer.publicKey, - ataB, - walletB.publicKey, - mintKeypair.publicKey, - TOKEN_2022_PROGRAM_ID, - ASSOCIATED_TOKEN_PROGRAM_ID, - ); - const mintToA = createMintToCheckedInstruction( - mintKeypair.publicKey, - ataA, - payer.publicKey, - MINT_AMOUNT, - DECIMALS, - [], - TOKEN_2022_PROGRAM_ID, - ); - - expectTxOk(svm, new Transaction().add(createA, createB, mintToA), [payer], "create-atas+mint"); - - const ataAData = svm.getAccount(ataA)!.data; - assert.isAbove(ataAData.length, 165, "ATA has extension data (immutable owner)"); - }); - - it("transfer succeeds when source wallet is not blocked", () => { - const tx = new Transaction().add( - ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }), - buildTransferIxWithHookAccounts({ - source: ataA, - mint: mintKeypair.publicKey, - destination: ataB, - owner: walletA.publicKey, - amount: TRANSFER_AMOUNT, - decimals: DECIMALS, - sourceOwner: walletA.publicKey, - destinationOwner: walletB.publicKey, - extraMode: "empty", - }), - ); - expectTxOk(svm, tx, [walletA], "transfer (unblocked)"); - }); - - it("block_wallet: blocks wallet A and bumps blocked_wallets_count", () => { - const tx = new Transaction().add(buildBlockWalletIx(payer.publicKey, walletA.publicKey)); - expectTxOk(svm, tx, [payer], "block_wallet A"); - - const wb = svm.getAccount(findWalletBlockPda(walletA.publicKey)); - assert.isNotNull(wb, "wallet_block PDA created"); - assert.strictEqual(wb!.data[0], 0x02, "wallet_block discriminator"); - - const config = svm.getAccount(findConfigPda())!; - const view = new DataView(config.data.buffer, config.data.byteOffset + 33, 8); - assert.strictEqual(view.getBigUint64(0, true), 1n, "blocked_wallets_count == 1"); - }); - - it("transfer from blocked source wallet fails with AccountBlocked", () => { - const setupTx = new Transaction().add(buildSetupExtraMetasIx(payer.publicKey, mintKeypair.publicKey, false)); - expectTxOk(svm, setupTx, [payer], "setup_extra_metas (source dep)"); - - const extraMetas = svm.getAccount(findExtraMetasPda(mintKeypair.publicKey))!; - // 16-byte header + 35 bytes per ExtraAccountMeta entry = 51. - assert.strictEqual(extraMetas.data.length, 51, "source-dependency extra-metas data length"); - - const tx = new Transaction().add( - ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }), - buildTransferIxWithHookAccounts({ - source: ataA, - mint: mintKeypair.publicKey, - destination: ataB, - owner: walletA.publicKey, - amount: TRANSFER_AMOUNT, - decimals: DECIMALS, - sourceOwner: walletA.publicKey, - destinationOwner: walletB.publicKey, - extraMode: "source-only", - }), - ); - const logs = expectTxFails(svm, tx, [walletA], "transfer-from-blocked"); - const joined = logs.join("\n"); - // `BlockListError::AccountBlocked` is variant index 2 -> custom code 0x2. - // The hook returns this when the source wallet has a wallet_block PDA. - assert.match( - joined, - /custom program error: 0x2/, - `expected AccountBlocked (custom 0x2) error in logs, got:\n${joined}`, - ); - }); - - it("unblock_wallet: unblocks wallet A, blocked_wallets_count decrements, transfers work again", () => { - const tx = new Transaction().add(buildUnblockWalletIx(payer.publicKey, walletA.publicKey)); - expectTxOk(svm, tx, [payer], "unblock_wallet A"); - - assert.isNull(svm.getAccount(findWalletBlockPda(walletA.publicKey)), "wallet_block PDA closed"); - - const config = svm.getAccount(findConfigPda())!; - const view = new DataView(config.data.buffer, config.data.byteOffset + 33, 8); - assert.strictEqual(view.getBigUint64(0, true), 0n, "blocked_wallets_count back to 0"); - - // Re-issue the transfer with the (now-closed) wallet_block PDA still in - // the extra metas. After unblock the wallet_block account no longer - // exists onchain (lamports drained, data zeroed), so `data_is_empty()` is - // true in the hook and the transfer is no longer blocked. - const transferTx = new Transaction().add( - ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }), - buildTransferIxWithHookAccounts({ - source: ataA, - mint: mintKeypair.publicKey, - destination: ataB, - owner: walletA.publicKey, - amount: TRANSFER_AMOUNT, - decimals: DECIMALS, - sourceOwner: walletA.publicKey, - destinationOwner: walletB.publicKey, - extraMode: "source-only", - }), - ); - expectTxOk(svm, transferTx, [walletA], "transfer (after unblock)"); - }); -}); diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/tsconfig.test.json b/tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/tsconfig.test.json deleted file mode 100644 index f82d96f9..00000000 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/tests/tsconfig.test.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai", "node"], - "typeRoots": ["../node_modules/@types"], - "lib": ["es2020"], - "module": "commonjs", - "target": "es2020", - "esModuleInterop": true, - "resolveJsonModule": true, - "strict": false - } -} diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/tsconfig.json b/tokens/token-extensions/transfer-hook/block-list/pinocchio/tsconfig.json deleted file mode 100644 index 5d56bcf2..00000000 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "module": "CommonJS", - "moduleResolution": "node", - "esModuleInterop": true, - "types": ["mocha", "node"], - "strict": true, - "skipLibCheck": true - }, - "include": ["**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/tokens/token-extensions/transfer-hook/block-list/readme.md b/tokens/token-extensions/transfer-hook/block-list/readme.md index cc0686cb..af6281d4 100644 --- a/tokens/token-extensions/transfer-hook/block-list/readme.md +++ b/tokens/token-extensions/transfer-hook/block-list/readme.md @@ -92,6 +92,15 @@ cd cli cargo build ``` +## Testing + +The tests are Rust + LiteSVM, in [`pinocchio/program/tests/`](pinocchio/program/tests/). Build the program first - the tests embed the `.so` at compile time, so rebuild after every program change or a stale binary silently tests old code: + +```bash +cargo build-sbf --manifest-path=./program/Cargo.toml +cargo test --manifest-path=./program/Cargo.toml +``` + ## Setup ### Block list diff --git a/tokens/token-minter/native/package.json b/tokens/token-minter/native/package.json deleted file mode 100644 index d9bf5e55..00000000 --- a/tokens/token-minter/native/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "scripts": { - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/token_minter_native_program.so" - } -} diff --git a/tokens/token-minter/native/pnpm-lock.yaml b/tokens/token-minter/native/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/tokens/token-minter/native/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/tokens/token-minter/native/program/tests/test.rs b/tokens/token-minter/native/program/tests/test.rs index 553c06ea..11e3244e 100644 --- a/tokens/token-minter/native/program/tests/test.rs +++ b/tokens/token-minter/native/program/tests/test.rs @@ -33,9 +33,13 @@ fn test_create_and_mint() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the + // project root). Rebuild after every program change: the binary is + // embedded at test-compile time, so a stale .so silently tests old code. svm.add_program( program_id, - include_bytes!("../../tests/fixtures/token_minter_native_program.so"), + include_bytes!("../../../../../target/deploy/token_minter_native_program.so"), ) .unwrap(); svm.add_program( diff --git a/tokens/transfer-tokens/native/package.json b/tokens/transfer-tokens/native/package.json deleted file mode 100644 index 935732df..00000000 --- a/tokens/transfer-tokens/native/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "scripts": { - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/transfer_tokens_program.so" - } -} diff --git a/tokens/transfer-tokens/native/pnpm-lock.yaml b/tokens/transfer-tokens/native/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/tokens/transfer-tokens/native/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/tokens/transfer-tokens/native/program/tests/test.rs b/tokens/transfer-tokens/native/program/tests/test.rs index b33b771f..c3a2337d 100644 --- a/tokens/transfer-tokens/native/program/tests/test.rs +++ b/tokens/transfer-tokens/native/program/tests/test.rs @@ -27,9 +27,13 @@ fn test_create_mint_and_transfer_spl() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the + // project root). Rebuild after every program change: the binary is + // embedded at test-compile time, so a stale .so silently tests old code. svm.add_program( program_id, - include_bytes!("../../tests/fixtures/transfer_tokens_program.so"), + include_bytes!("../../../../../target/deploy/transfer_tokens_program.so"), ) .unwrap(); svm.add_program( diff --git a/tools/shank-and-codama/native/README.md b/tools/shank-and-codama/native/README.md index a92bbf53..b72e88d9 100644 --- a/tools/shank-and-codama/native/README.md +++ b/tools/shank-and-codama/native/README.md @@ -7,10 +7,10 @@ IDL, [Codama](https://github.com/codama-idl/codama) turns it into a typed client in the language of your choice. This example is a small "car rental service" program. It is annotated with Shank -macros, Shank extracts the IDL, and Codama renders a TypeScript client -(`@solana/kit`-based) from that IDL. An in-process [LiteSVM](https://github.com/litesvm/litesvm) -test then drives the program through the generated client - no validator or -devnet required, so it runs in CI. +macros, Shank extracts the IDL, and Codama renders a Rust client from that IDL. +An in-process Rust + [LiteSVM](https://github.com/litesvm/litesvm) test then +drives the program through the generated client - no validator or devnet +required, so it runs in CI. ## Shank @@ -77,28 +77,30 @@ It understands Shank IDLs out of the box. Install the pieces used here: ```bash -pnpm add codama @codama/nodes-from-anchor @codama/renderers-js @solana/kit +pnpm add codama @codama/nodes-from-anchor @codama/renderers-rust ``` The generator script ([`codama.ts`](./codama.ts)) reads the Shank IDL, sets its `origin` to `"shank"` so the `u8` discriminants are honoured, builds a Codama -root node, and renders a TypeScript client: +root node, and renders a Rust client: ```ts import { rootNodeFromAnchor } from "@codama/nodes-from-anchor"; -import { renderVisitor } from "@codama/renderers-js"; +import { renderVisitor } from "@codama/renderers-rust"; import { createFromRoot } from "codama"; const idl = JSON.parse(readFileSync(idlPath, "utf-8")); const codama = createFromRoot( rootNodeFromAnchor({ ...idl, metadata: { ...idl.metadata, origin: "shank" } }), ); -await codama.accept(renderVisitor(outDir, { deleteFolderBeforeRendering: true })); +await codama.accept( + renderVisitor(outDir, { deleteFolderBeforeRendering: true, crateFolder: crateDir }), +); ``` -> Codama also ships `@codama/renderers-rust` if you want a Rust client instead of -> a TypeScript one - swap `renderVisitor` from `@codama/renderers-js` for the Rust -> renderer. +> Codama also ships `@codama/renderers-js` if you want a TypeScript client +> instead of a Rust one - swap `renderVisitor` from `@codama/renderers-rust` +> for the JS renderer. Generate the client: @@ -106,21 +108,32 @@ Generate the client: pnpm generate-client ``` -The generated TypeScript client lands in `tests/generated/`. +The generated module lands in `clients/rust/src/generated/`, wrapped by the +hand-written `car-rental-service-client` crate +([`clients/rust/Cargo.toml`](./clients/rust/Cargo.toml)) that the tests import. ## Build and test ```bash -pnpm install -pnpm build # cargo build-sbf -> program/target/so/car_rental_service.so -pnpm build-and-test # build, regenerate the client, then run the LiteSVM test +pnpm build # cargo build-sbf -> program/target/deploy/car_rental_service.so +pnpm build-and-test # build the program, then run the Rust + LiteSVM tests +``` + +Or without pnpm: + +```bash +cargo build-sbf --manifest-path=./program/Cargo.toml +cargo test --manifest-path=./program/Cargo.toml ``` -The test ([`tests/test.ts`](./tests/test.ts)) loads the compiled `.so` into a -[LiteSVM](https://github.com/litesvm/litesvm) instance and drives the full -rental lifecycle (`add_car`, `book_rental`, `pick_up_car`, `return_car`) -through the generated client, asserting on the resulting onchain account -state. It also asserts the program's account validation: a payer that did not -sign, a rental account owned by the wrong program, and an out-of-order status -transition (returning a car that was never picked up) are all rejected with -the named errors from `program/src/error.rs`. +Rebuild the program after every change before re-running the tests: the tests +embed the `.so` at compile time, so a stale binary silently tests old code. + +The tests ([`program/tests/test.rs`](./program/tests/test.rs)) load the +compiled `.so` into a [LiteSVM](https://github.com/litesvm/litesvm) instance +and drive the full rental lifecycle (`add_car`, `book_rental`, `pick_up_car`, +`return_car`) through the generated client, asserting on the resulting onchain +account state. They also assert the program's account validation: a payer that +did not sign, a rental account owned by the wrong program, and an out-of-order +status transition (returning a car that was never picked up) are all rejected +with the named errors from `program/src/error.rs`. diff --git a/tools/shank-and-codama/native/clients/rust/Cargo.toml b/tools/shank-and-codama/native/clients/rust/Cargo.toml new file mode 100644 index 00000000..f02e7035 --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/Cargo.toml @@ -0,0 +1,32 @@ +# Wrapper crate for the Codama-generated client in src/generated/. +# Regenerate the contents of src/generated/ with `pnpm generate-client`; +# this manifest and src/lib.rs are hand-written and stay put. +[package] +name = "car-rental-service-client" +version = "0.1.0" +edition = "2021" + +# Standalone, like the program crate: this example is intentionally not part +# of the repository root workspace. +[workspace] + +[lib] +name = "car_rental_service_client" + +[dependencies] +borsh = { version = "1.5", features = ["derive"] } +num-derive = "0.4" +num-traits = "0.2" +solana-account-info = "3.0" +solana-cpi = "3.0" +solana-instruction = "3.0" +solana-program-error = "3.0" +# borsh feature: the generated Car/RentalOrder account structs borsh-derive +# over Pubkey fields. +solana-pubkey = { version = "3.0", features = ["borsh"] } + +[features] +# The generated code also supports "fetch" (RPC account fetching via +# solana-client) and "anchor" (anchor-lang trait impls); neither is needed by +# the LiteSVM tests, so their optional dependencies are not declared here. +default = [] diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/accounts/car.rs b/tools/shank-and-codama/native/clients/rust/src/generated/accounts/car.rs new file mode 100644 index 00000000..255751e0 --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/accounts/car.rs @@ -0,0 +1,124 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + +use borsh::BorshSerialize; +use borsh::BorshDeserialize; + + +#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +pub struct Car { +pub year: u16, +pub make: String, +pub model: String, +} + + + + +impl Car { + + + + #[inline(always)] + pub fn from_bytes(data: &[u8]) -> Result { + let mut data = data; + Self::deserialize(&mut data) + } +} + +impl<'a> TryFrom<&solana_account_info::AccountInfo<'a>> for Car { + type Error = std::io::Error; + + fn try_from(account_info: &solana_account_info::AccountInfo<'a>) -> Result { + let mut data: &[u8] = &(*account_info.data).borrow(); + Self::deserialize(&mut data) + } +} + +#[cfg(feature = "fetch")] +pub fn fetch_car( + rpc: &solana_client::rpc_client::RpcClient, + address: &solana_pubkey::Pubkey, +) -> Result, std::io::Error> { + let accounts = fetch_all_car(rpc, &[*address])?; + Ok(accounts[0].clone()) +} + +#[cfg(feature = "fetch")] +pub fn fetch_all_car( + rpc: &solana_client::rpc_client::RpcClient, + addresses: &[solana_pubkey::Pubkey], +) -> Result>, std::io::Error> { + let accounts = rpc.get_multiple_accounts(addresses) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; + let mut decoded_accounts: Vec> = Vec::new(); + for i in 0..addresses.len() { + let address = addresses[i]; + let account = accounts[i].as_ref() + .ok_or(std::io::Error::new(std::io::ErrorKind::Other, format!("Account not found: {}", address)))?; + let data = Car::from_bytes(&account.data)?; + decoded_accounts.push(crate::shared::DecodedAccount { address, account: account.clone(), data }); + } + Ok(decoded_accounts) +} + +#[cfg(feature = "fetch")] +pub fn fetch_maybe_car( + rpc: &solana_client::rpc_client::RpcClient, + address: &solana_pubkey::Pubkey, +) -> Result, std::io::Error> { + let accounts = fetch_all_maybe_car(rpc, &[*address])?; + Ok(accounts[0].clone()) +} + +#[cfg(feature = "fetch")] +pub fn fetch_all_maybe_car( + rpc: &solana_client::rpc_client::RpcClient, + addresses: &[solana_pubkey::Pubkey], +) -> Result>, std::io::Error> { + let accounts = rpc.get_multiple_accounts(addresses) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; + let mut decoded_accounts: Vec> = Vec::new(); + for i in 0..addresses.len() { + let address = addresses[i]; + if let Some(account) = accounts[i].as_ref() { + let data = Car::from_bytes(&account.data)?; + decoded_accounts.push(crate::shared::MaybeAccount::Exists(crate::shared::DecodedAccount { address, account: account.clone(), data })); + } else { + decoded_accounts.push(crate::shared::MaybeAccount::NotFound(address)); + } + } + Ok(decoded_accounts) +} + + #[cfg(feature = "anchor")] + impl anchor_lang::AccountDeserialize for Car { + fn try_deserialize_unchecked(buf: &mut &[u8]) -> anchor_lang::Result { + Ok(Self::deserialize(buf)?) + } + } + + #[cfg(feature = "anchor")] + impl anchor_lang::AccountSerialize for Car {} + + #[cfg(feature = "anchor")] + impl anchor_lang::Owner for Car { + fn owner() -> Pubkey { + crate::CAR_RENTAL_SERVICE_ID + } + } + + #[cfg(feature = "anchor-idl-build")] + impl anchor_lang::IdlBuild for Car {} + + + #[cfg(feature = "anchor-idl-build")] + impl anchor_lang::Discriminator for Car { + const DISCRIMINATOR: &[u8] = &[0; 8]; + } + diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/accounts/mod.rs b/tools/shank-and-codama/native/clients/rust/src/generated/accounts/mod.rs new file mode 100644 index 00000000..261eb7b2 --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/accounts/mod.rs @@ -0,0 +1,13 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + + pub(crate) mod r#car; + pub(crate) mod r#rental_order; + + pub use self::r#car::*; + pub use self::r#rental_order::*; + diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/accounts/rental_order.rs b/tools/shank-and-codama/native/clients/rust/src/generated/accounts/rental_order.rs new file mode 100644 index 00000000..faec0c4d --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/accounts/rental_order.rs @@ -0,0 +1,130 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + +use solana_pubkey::Pubkey; +use crate::generated::types::RentalOrderStatus; +use borsh::BorshSerialize; +use borsh::BorshDeserialize; + + +#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +pub struct RentalOrder { +#[cfg_attr(feature = "serde", serde(with = "serde_with::As::"))] +pub car: Pubkey, +pub name: String, +pub pick_up_date: String, +pub return_date: String, +pub price: u64, +pub status: RentalOrderStatus, +} + + + + +impl RentalOrder { + + + + #[inline(always)] + pub fn from_bytes(data: &[u8]) -> Result { + let mut data = data; + Self::deserialize(&mut data) + } +} + +impl<'a> TryFrom<&solana_account_info::AccountInfo<'a>> for RentalOrder { + type Error = std::io::Error; + + fn try_from(account_info: &solana_account_info::AccountInfo<'a>) -> Result { + let mut data: &[u8] = &(*account_info.data).borrow(); + Self::deserialize(&mut data) + } +} + +#[cfg(feature = "fetch")] +pub fn fetch_rental_order( + rpc: &solana_client::rpc_client::RpcClient, + address: &solana_pubkey::Pubkey, +) -> Result, std::io::Error> { + let accounts = fetch_all_rental_order(rpc, &[*address])?; + Ok(accounts[0].clone()) +} + +#[cfg(feature = "fetch")] +pub fn fetch_all_rental_order( + rpc: &solana_client::rpc_client::RpcClient, + addresses: &[solana_pubkey::Pubkey], +) -> Result>, std::io::Error> { + let accounts = rpc.get_multiple_accounts(addresses) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; + let mut decoded_accounts: Vec> = Vec::new(); + for i in 0..addresses.len() { + let address = addresses[i]; + let account = accounts[i].as_ref() + .ok_or(std::io::Error::new(std::io::ErrorKind::Other, format!("Account not found: {}", address)))?; + let data = RentalOrder::from_bytes(&account.data)?; + decoded_accounts.push(crate::shared::DecodedAccount { address, account: account.clone(), data }); + } + Ok(decoded_accounts) +} + +#[cfg(feature = "fetch")] +pub fn fetch_maybe_rental_order( + rpc: &solana_client::rpc_client::RpcClient, + address: &solana_pubkey::Pubkey, +) -> Result, std::io::Error> { + let accounts = fetch_all_maybe_rental_order(rpc, &[*address])?; + Ok(accounts[0].clone()) +} + +#[cfg(feature = "fetch")] +pub fn fetch_all_maybe_rental_order( + rpc: &solana_client::rpc_client::RpcClient, + addresses: &[solana_pubkey::Pubkey], +) -> Result>, std::io::Error> { + let accounts = rpc.get_multiple_accounts(addresses) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; + let mut decoded_accounts: Vec> = Vec::new(); + for i in 0..addresses.len() { + let address = addresses[i]; + if let Some(account) = accounts[i].as_ref() { + let data = RentalOrder::from_bytes(&account.data)?; + decoded_accounts.push(crate::shared::MaybeAccount::Exists(crate::shared::DecodedAccount { address, account: account.clone(), data })); + } else { + decoded_accounts.push(crate::shared::MaybeAccount::NotFound(address)); + } + } + Ok(decoded_accounts) +} + + #[cfg(feature = "anchor")] + impl anchor_lang::AccountDeserialize for RentalOrder { + fn try_deserialize_unchecked(buf: &mut &[u8]) -> anchor_lang::Result { + Ok(Self::deserialize(buf)?) + } + } + + #[cfg(feature = "anchor")] + impl anchor_lang::AccountSerialize for RentalOrder {} + + #[cfg(feature = "anchor")] + impl anchor_lang::Owner for RentalOrder { + fn owner() -> Pubkey { + crate::CAR_RENTAL_SERVICE_ID + } + } + + #[cfg(feature = "anchor-idl-build")] + impl anchor_lang::IdlBuild for RentalOrder {} + + + #[cfg(feature = "anchor-idl-build")] + impl anchor_lang::Discriminator for RentalOrder { + const DISCRIMINATOR: &[u8] = &[0; 8]; + } + diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/errors/mod.rs b/tools/shank-and-codama/native/clients/rust/src/generated/errors/mod.rs new file mode 100644 index 00000000..8d9ee9d2 --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/errors/mod.rs @@ -0,0 +1,9 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + + + diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/add_car.rs b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/add_car.rs new file mode 100644 index 00000000..093bad16 --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/add_car.rs @@ -0,0 +1,422 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + +use borsh::BorshSerialize; +use borsh::BorshDeserialize; + +pub const ADD_CAR_DISCRIMINATOR: u8 = 0; + +/// Accounts. +#[derive(Debug)] +pub struct AddCar { + /// The account that will represent the Car being created + + + + pub car_account: solana_pubkey::Pubkey, + /// Fee payer + + + + pub payer: solana_pubkey::Pubkey, + /// The System Program + + + + pub system_program: solana_pubkey::Pubkey, + } + +impl AddCar { + pub fn instruction(&self, args: AddCarInstructionArgs) -> solana_instruction::Instruction { + self.instruction_with_remaining_accounts(args, &[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::vec_init_then_push)] + pub fn instruction_with_remaining_accounts(&self, args: AddCarInstructionArgs, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction { + let mut accounts = Vec::with_capacity(3+ remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( + self.car_account, + false + )); + accounts.push(solana_instruction::AccountMeta::new( + self.payer, + true + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( + self.system_program, + false + )); + accounts.extend_from_slice(remaining_accounts); + let mut data = AddCarInstructionData::new().try_to_vec().unwrap(); + let mut args = args.try_to_vec().unwrap(); + data.append(&mut args); + + solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + } + } +} + +#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + pub struct AddCarInstructionData { + discriminator: u8, + } + +impl AddCarInstructionData { + pub fn new() -> Self { + Self { + discriminator: 0, + } + } + + pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { + borsh::to_vec(self) + } + } + +impl Default for AddCarInstructionData { + fn default() -> Self { + Self::new() + } +} + +#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + pub struct AddCarInstructionArgs { + pub year: u16, + pub make: String, + pub model: String, + } + +impl AddCarInstructionArgs { + pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { + borsh::to_vec(self) + } +} + + +/// Instruction builder for `AddCar`. +/// +/// ### Accounts: +/// + /// 0. `[writable]` car_account + /// 1. `[writable, signer]` payer + /// 2. `[optional]` system_program (default to `11111111111111111111111111111111`) +#[derive(Clone, Debug, Default)] +pub struct AddCarBuilder { + car_account: Option, + payer: Option, + system_program: Option, + year: Option, + make: Option, + model: Option, + __remaining_accounts: Vec, +} + +impl AddCarBuilder { + pub fn new() -> Self { + Self::default() + } + /// The account that will represent the Car being created +#[inline(always)] + pub fn car_account(&mut self, car_account: solana_pubkey::Pubkey) -> &mut Self { + self.car_account = Some(car_account); + self + } + /// Fee payer +#[inline(always)] + pub fn payer(&mut self, payer: solana_pubkey::Pubkey) -> &mut Self { + self.payer = Some(payer); + self + } + /// `[optional account, default to '11111111111111111111111111111111']` +/// The System Program +#[inline(always)] + pub fn system_program(&mut self, system_program: solana_pubkey::Pubkey) -> &mut Self { + self.system_program = Some(system_program); + self + } + #[inline(always)] + pub fn year(&mut self, year: u16) -> &mut Self { + self.year = Some(year); + self + } + #[inline(always)] + pub fn make(&mut self, make: String) -> &mut Self { + self.make = Some(make); + self + } + #[inline(always)] + pub fn model(&mut self, model: String) -> &mut Self { + self.model = Some(model); + self + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self { + self.__remaining_accounts.push(account); + self + } + /// Add additional accounts to the instruction. + #[inline(always)] + pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self { + self.__remaining_accounts.extend_from_slice(accounts); + self + } + #[allow(clippy::clone_on_copy)] + pub fn instruction(&self) -> solana_instruction::Instruction { + let accounts = AddCar { + car_account: self.car_account.expect("car_account is not set"), + payer: self.payer.expect("payer is not set"), + system_program: self.system_program.unwrap_or(solana_pubkey::pubkey!("11111111111111111111111111111111")), + }; + let args = AddCarInstructionArgs { + year: self.year.clone().expect("year is not set"), + make: self.make.clone().expect("make is not set"), + model: self.model.clone().expect("model is not set"), + }; + + accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts) + } +} + + /// `add_car` CPI accounts. + pub struct AddCarCpiAccounts<'a, 'b> { + /// The account that will represent the Car being created + + + + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + + + + pub payer: &'b solana_account_info::AccountInfo<'a>, + /// The System Program + + + + pub system_program: &'b solana_account_info::AccountInfo<'a>, + } + +/// `add_car` CPI instruction. +pub struct AddCarCpi<'a, 'b> { + /// The program to invoke. + pub __program: &'b solana_account_info::AccountInfo<'a>, + /// The account that will represent the Car being created + + + + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + + + + pub payer: &'b solana_account_info::AccountInfo<'a>, + /// The System Program + + + + pub system_program: &'b solana_account_info::AccountInfo<'a>, + /// The arguments for the instruction. + pub __args: AddCarInstructionArgs, + } + +impl<'a, 'b> AddCarCpi<'a, 'b> { + pub fn new( + program: &'b solana_account_info::AccountInfo<'a>, + accounts: AddCarCpiAccounts<'a, 'b>, + args: AddCarInstructionArgs, + ) -> Self { + Self { + __program: program, + car_account: accounts.car_account, + payer: accounts.payer, + system_program: accounts.system_program, + __args: args, + } + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], &[]) + } + #[inline(always)] + pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) + } + #[inline(always)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed_with_remaining_accounts( + &self, + signers_seeds: &[&[&[u8]]], + remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)] + ) -> solana_program_error::ProgramResult { + let mut accounts = Vec::with_capacity(3+ remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( + *self.car_account.key, + false + )); + accounts.push(solana_instruction::AccountMeta::new( + *self.payer.key, + true + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( + *self.system_program.key, + false + )); + remaining_accounts.iter().for_each(|remaining_account| { + accounts.push(solana_instruction::AccountMeta { + pubkey: *remaining_account.0.key, + is_signer: remaining_account.1, + is_writable: remaining_account.2, + }) + }); + let mut data = AddCarInstructionData::new().try_to_vec().unwrap(); + let mut args = self.__args.try_to_vec().unwrap(); + data.append(&mut args); + + let instruction = solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + }; + let mut account_infos = Vec::with_capacity(4 + remaining_accounts.len()); + account_infos.push(self.__program.clone()); + account_infos.push(self.car_account.clone()); + account_infos.push(self.payer.clone()); + account_infos.push(self.system_program.clone()); + remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); + + if signers_seeds.is_empty() { + solana_cpi::invoke(&instruction, &account_infos) + } else { + solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds) + } + } +} + +/// Instruction builder for `AddCar` via CPI. +/// +/// ### Accounts: +/// + /// 0. `[writable]` car_account + /// 1. `[writable, signer]` payer + /// 2. `[]` system_program +#[derive(Clone, Debug)] +pub struct AddCarCpiBuilder<'a, 'b> { + instruction: Box>, +} + +impl<'a, 'b> AddCarCpiBuilder<'a, 'b> { + pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self { + let instruction = Box::new(AddCarCpiBuilderInstruction { + __program: program, + car_account: None, + payer: None, + system_program: None, + year: None, + make: None, + model: None, + __remaining_accounts: Vec::new(), + }); + Self { instruction } + } + /// The account that will represent the Car being created +#[inline(always)] + pub fn car_account(&mut self, car_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.car_account = Some(car_account); + self + } + /// Fee payer +#[inline(always)] + pub fn payer(&mut self, payer: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.payer = Some(payer); + self + } + /// The System Program +#[inline(always)] + pub fn system_program(&mut self, system_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.system_program = Some(system_program); + self + } + #[inline(always)] + pub fn year(&mut self, year: u16) -> &mut Self { + self.instruction.year = Some(year); + self + } + #[inline(always)] + pub fn make(&mut self, make: String) -> &mut Self { + self.instruction.make = Some(make); + self + } + #[inline(always)] + pub fn model(&mut self, model: String) -> &mut Self { + self.instruction.model = Some(model); + self + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self { + self.instruction.__remaining_accounts.push((account, is_writable, is_signer)); + self + } + /// Add additional accounts to the instruction. + /// + /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, + /// and a `bool` indicating whether the account is a signer or not. + #[inline(always)] + pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self { + self.instruction.__remaining_accounts.extend_from_slice(accounts); + self + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed(&[]) + } + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + let args = AddCarInstructionArgs { + year: self.instruction.year.clone().expect("year is not set"), + make: self.instruction.make.clone().expect("make is not set"), + model: self.instruction.model.clone().expect("model is not set"), + }; + let instruction = AddCarCpi { + __program: self.instruction.__program, + + car_account: self.instruction.car_account.expect("car_account is not set"), + + payer: self.instruction.payer.expect("payer is not set"), + + system_program: self.instruction.system_program.expect("system_program is not set"), + __args: args, + }; + instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts) + } +} + +#[derive(Clone, Debug)] +struct AddCarCpiBuilderInstruction<'a, 'b> { + __program: &'b solana_account_info::AccountInfo<'a>, + car_account: Option<&'b solana_account_info::AccountInfo<'a>>, + payer: Option<&'b solana_account_info::AccountInfo<'a>>, + system_program: Option<&'b solana_account_info::AccountInfo<'a>>, + year: Option, + make: Option, + model: Option, + /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. + __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>, +} + diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/book_rental.rs b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/book_rental.rs new file mode 100644 index 00000000..ff49ad27 --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/book_rental.rs @@ -0,0 +1,483 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + +use borsh::BorshSerialize; +use borsh::BorshDeserialize; + +pub const BOOK_RENTAL_DISCRIMINATOR: u8 = 1; + +/// Accounts. +#[derive(Debug)] +pub struct BookRental { + /// The account that will represent the actual order for the rental + + + + pub rental_account: solana_pubkey::Pubkey, + /// The account representing the Car being rented in this order + + + + pub car_account: solana_pubkey::Pubkey, + /// Fee payer + + + + pub payer: solana_pubkey::Pubkey, + /// The System Program + + + + pub system_program: solana_pubkey::Pubkey, + } + +impl BookRental { + pub fn instruction(&self, args: BookRentalInstructionArgs) -> solana_instruction::Instruction { + self.instruction_with_remaining_accounts(args, &[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::vec_init_then_push)] + pub fn instruction_with_remaining_accounts(&self, args: BookRentalInstructionArgs, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction { + let mut accounts = Vec::with_capacity(4+ remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( + self.rental_account, + false + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( + self.car_account, + false + )); + accounts.push(solana_instruction::AccountMeta::new( + self.payer, + true + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( + self.system_program, + false + )); + accounts.extend_from_slice(remaining_accounts); + let mut data = BookRentalInstructionData::new().try_to_vec().unwrap(); + let mut args = args.try_to_vec().unwrap(); + data.append(&mut args); + + solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + } + } +} + +#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + pub struct BookRentalInstructionData { + discriminator: u8, + } + +impl BookRentalInstructionData { + pub fn new() -> Self { + Self { + discriminator: 1, + } + } + + pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { + borsh::to_vec(self) + } + } + +impl Default for BookRentalInstructionData { + fn default() -> Self { + Self::new() + } +} + +#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + pub struct BookRentalInstructionArgs { + pub name: String, + pub pick_up_date: String, + pub return_date: String, + pub price: u64, + } + +impl BookRentalInstructionArgs { + pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { + borsh::to_vec(self) + } +} + + +/// Instruction builder for `BookRental`. +/// +/// ### Accounts: +/// + /// 0. `[writable]` rental_account + /// 1. `[]` car_account + /// 2. `[writable, signer]` payer + /// 3. `[optional]` system_program (default to `11111111111111111111111111111111`) +#[derive(Clone, Debug, Default)] +pub struct BookRentalBuilder { + rental_account: Option, + car_account: Option, + payer: Option, + system_program: Option, + name: Option, + pick_up_date: Option, + return_date: Option, + price: Option, + __remaining_accounts: Vec, +} + +impl BookRentalBuilder { + pub fn new() -> Self { + Self::default() + } + /// The account that will represent the actual order for the rental +#[inline(always)] + pub fn rental_account(&mut self, rental_account: solana_pubkey::Pubkey) -> &mut Self { + self.rental_account = Some(rental_account); + self + } + /// The account representing the Car being rented in this order +#[inline(always)] + pub fn car_account(&mut self, car_account: solana_pubkey::Pubkey) -> &mut Self { + self.car_account = Some(car_account); + self + } + /// Fee payer +#[inline(always)] + pub fn payer(&mut self, payer: solana_pubkey::Pubkey) -> &mut Self { + self.payer = Some(payer); + self + } + /// `[optional account, default to '11111111111111111111111111111111']` +/// The System Program +#[inline(always)] + pub fn system_program(&mut self, system_program: solana_pubkey::Pubkey) -> &mut Self { + self.system_program = Some(system_program); + self + } + #[inline(always)] + pub fn name(&mut self, name: String) -> &mut Self { + self.name = Some(name); + self + } + #[inline(always)] + pub fn pick_up_date(&mut self, pick_up_date: String) -> &mut Self { + self.pick_up_date = Some(pick_up_date); + self + } + #[inline(always)] + pub fn return_date(&mut self, return_date: String) -> &mut Self { + self.return_date = Some(return_date); + self + } + #[inline(always)] + pub fn price(&mut self, price: u64) -> &mut Self { + self.price = Some(price); + self + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self { + self.__remaining_accounts.push(account); + self + } + /// Add additional accounts to the instruction. + #[inline(always)] + pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self { + self.__remaining_accounts.extend_from_slice(accounts); + self + } + #[allow(clippy::clone_on_copy)] + pub fn instruction(&self) -> solana_instruction::Instruction { + let accounts = BookRental { + rental_account: self.rental_account.expect("rental_account is not set"), + car_account: self.car_account.expect("car_account is not set"), + payer: self.payer.expect("payer is not set"), + system_program: self.system_program.unwrap_or(solana_pubkey::pubkey!("11111111111111111111111111111111")), + }; + let args = BookRentalInstructionArgs { + name: self.name.clone().expect("name is not set"), + pick_up_date: self.pick_up_date.clone().expect("pick_up_date is not set"), + return_date: self.return_date.clone().expect("return_date is not set"), + price: self.price.clone().expect("price is not set"), + }; + + accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts) + } +} + + /// `book_rental` CPI accounts. + pub struct BookRentalCpiAccounts<'a, 'b> { + /// The account that will represent the actual order for the rental + + + + pub rental_account: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the Car being rented in this order + + + + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + + + + pub payer: &'b solana_account_info::AccountInfo<'a>, + /// The System Program + + + + pub system_program: &'b solana_account_info::AccountInfo<'a>, + } + +/// `book_rental` CPI instruction. +pub struct BookRentalCpi<'a, 'b> { + /// The program to invoke. + pub __program: &'b solana_account_info::AccountInfo<'a>, + /// The account that will represent the actual order for the rental + + + + pub rental_account: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the Car being rented in this order + + + + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + + + + pub payer: &'b solana_account_info::AccountInfo<'a>, + /// The System Program + + + + pub system_program: &'b solana_account_info::AccountInfo<'a>, + /// The arguments for the instruction. + pub __args: BookRentalInstructionArgs, + } + +impl<'a, 'b> BookRentalCpi<'a, 'b> { + pub fn new( + program: &'b solana_account_info::AccountInfo<'a>, + accounts: BookRentalCpiAccounts<'a, 'b>, + args: BookRentalInstructionArgs, + ) -> Self { + Self { + __program: program, + rental_account: accounts.rental_account, + car_account: accounts.car_account, + payer: accounts.payer, + system_program: accounts.system_program, + __args: args, + } + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], &[]) + } + #[inline(always)] + pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) + } + #[inline(always)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed_with_remaining_accounts( + &self, + signers_seeds: &[&[&[u8]]], + remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)] + ) -> solana_program_error::ProgramResult { + let mut accounts = Vec::with_capacity(4+ remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( + *self.rental_account.key, + false + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( + *self.car_account.key, + false + )); + accounts.push(solana_instruction::AccountMeta::new( + *self.payer.key, + true + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( + *self.system_program.key, + false + )); + remaining_accounts.iter().for_each(|remaining_account| { + accounts.push(solana_instruction::AccountMeta { + pubkey: *remaining_account.0.key, + is_signer: remaining_account.1, + is_writable: remaining_account.2, + }) + }); + let mut data = BookRentalInstructionData::new().try_to_vec().unwrap(); + let mut args = self.__args.try_to_vec().unwrap(); + data.append(&mut args); + + let instruction = solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + }; + let mut account_infos = Vec::with_capacity(5 + remaining_accounts.len()); + account_infos.push(self.__program.clone()); + account_infos.push(self.rental_account.clone()); + account_infos.push(self.car_account.clone()); + account_infos.push(self.payer.clone()); + account_infos.push(self.system_program.clone()); + remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); + + if signers_seeds.is_empty() { + solana_cpi::invoke(&instruction, &account_infos) + } else { + solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds) + } + } +} + +/// Instruction builder for `BookRental` via CPI. +/// +/// ### Accounts: +/// + /// 0. `[writable]` rental_account + /// 1. `[]` car_account + /// 2. `[writable, signer]` payer + /// 3. `[]` system_program +#[derive(Clone, Debug)] +pub struct BookRentalCpiBuilder<'a, 'b> { + instruction: Box>, +} + +impl<'a, 'b> BookRentalCpiBuilder<'a, 'b> { + pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self { + let instruction = Box::new(BookRentalCpiBuilderInstruction { + __program: program, + rental_account: None, + car_account: None, + payer: None, + system_program: None, + name: None, + pick_up_date: None, + return_date: None, + price: None, + __remaining_accounts: Vec::new(), + }); + Self { instruction } + } + /// The account that will represent the actual order for the rental +#[inline(always)] + pub fn rental_account(&mut self, rental_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.rental_account = Some(rental_account); + self + } + /// The account representing the Car being rented in this order +#[inline(always)] + pub fn car_account(&mut self, car_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.car_account = Some(car_account); + self + } + /// Fee payer +#[inline(always)] + pub fn payer(&mut self, payer: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.payer = Some(payer); + self + } + /// The System Program +#[inline(always)] + pub fn system_program(&mut self, system_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.system_program = Some(system_program); + self + } + #[inline(always)] + pub fn name(&mut self, name: String) -> &mut Self { + self.instruction.name = Some(name); + self + } + #[inline(always)] + pub fn pick_up_date(&mut self, pick_up_date: String) -> &mut Self { + self.instruction.pick_up_date = Some(pick_up_date); + self + } + #[inline(always)] + pub fn return_date(&mut self, return_date: String) -> &mut Self { + self.instruction.return_date = Some(return_date); + self + } + #[inline(always)] + pub fn price(&mut self, price: u64) -> &mut Self { + self.instruction.price = Some(price); + self + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self { + self.instruction.__remaining_accounts.push((account, is_writable, is_signer)); + self + } + /// Add additional accounts to the instruction. + /// + /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, + /// and a `bool` indicating whether the account is a signer or not. + #[inline(always)] + pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self { + self.instruction.__remaining_accounts.extend_from_slice(accounts); + self + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed(&[]) + } + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + let args = BookRentalInstructionArgs { + name: self.instruction.name.clone().expect("name is not set"), + pick_up_date: self.instruction.pick_up_date.clone().expect("pick_up_date is not set"), + return_date: self.instruction.return_date.clone().expect("return_date is not set"), + price: self.instruction.price.clone().expect("price is not set"), + }; + let instruction = BookRentalCpi { + __program: self.instruction.__program, + + rental_account: self.instruction.rental_account.expect("rental_account is not set"), + + car_account: self.instruction.car_account.expect("car_account is not set"), + + payer: self.instruction.payer.expect("payer is not set"), + + system_program: self.instruction.system_program.expect("system_program is not set"), + __args: args, + }; + instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts) + } +} + +#[derive(Clone, Debug)] +struct BookRentalCpiBuilderInstruction<'a, 'b> { + __program: &'b solana_account_info::AccountInfo<'a>, + rental_account: Option<&'b solana_account_info::AccountInfo<'a>>, + car_account: Option<&'b solana_account_info::AccountInfo<'a>>, + payer: Option<&'b solana_account_info::AccountInfo<'a>>, + system_program: Option<&'b solana_account_info::AccountInfo<'a>>, + name: Option, + pick_up_date: Option, + return_date: Option, + price: Option, + /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. + __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>, +} + diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/mod.rs b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/mod.rs new file mode 100644 index 00000000..8e13c5d2 --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/mod.rs @@ -0,0 +1,17 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + + pub(crate) mod r#add_car; + pub(crate) mod r#book_rental; + pub(crate) mod r#pick_up_car; + pub(crate) mod r#return_car; + + pub use self::r#add_car::*; + pub use self::r#book_rental::*; + pub use self::r#pick_up_car::*; + pub use self::r#return_car::*; + diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/pick_up_car.rs b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/pick_up_car.rs new file mode 100644 index 00000000..04357606 --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/pick_up_car.rs @@ -0,0 +1,350 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + +use borsh::BorshSerialize; +use borsh::BorshDeserialize; + +pub const PICK_UP_CAR_DISCRIMINATOR: u8 = 2; + +/// Accounts. +#[derive(Debug)] +pub struct PickUpCar { + /// The account representing the active rental + + + + pub rental_account: solana_pubkey::Pubkey, + /// The account representing the Car being rented in this order + + + + pub car_account: solana_pubkey::Pubkey, + /// Fee payer + + + + pub payer: solana_pubkey::Pubkey, + } + +impl PickUpCar { + pub fn instruction(&self) -> solana_instruction::Instruction { + self.instruction_with_remaining_accounts(&[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::vec_init_then_push)] + pub fn instruction_with_remaining_accounts(&self, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction { + let mut accounts = Vec::with_capacity(3+ remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( + self.rental_account, + false + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( + self.car_account, + false + )); + accounts.push(solana_instruction::AccountMeta::new( + self.payer, + true + )); + accounts.extend_from_slice(remaining_accounts); + let data = PickUpCarInstructionData::new().try_to_vec().unwrap(); + + solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + } + } +} + +#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + pub struct PickUpCarInstructionData { + discriminator: u8, + } + +impl PickUpCarInstructionData { + pub fn new() -> Self { + Self { + discriminator: 2, + } + } + + pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { + borsh::to_vec(self) + } + } + +impl Default for PickUpCarInstructionData { + fn default() -> Self { + Self::new() + } +} + + + +/// Instruction builder for `PickUpCar`. +/// +/// ### Accounts: +/// + /// 0. `[writable]` rental_account + /// 1. `[]` car_account + /// 2. `[writable, signer]` payer +#[derive(Clone, Debug, Default)] +pub struct PickUpCarBuilder { + rental_account: Option, + car_account: Option, + payer: Option, + __remaining_accounts: Vec, +} + +impl PickUpCarBuilder { + pub fn new() -> Self { + Self::default() + } + /// The account representing the active rental +#[inline(always)] + pub fn rental_account(&mut self, rental_account: solana_pubkey::Pubkey) -> &mut Self { + self.rental_account = Some(rental_account); + self + } + /// The account representing the Car being rented in this order +#[inline(always)] + pub fn car_account(&mut self, car_account: solana_pubkey::Pubkey) -> &mut Self { + self.car_account = Some(car_account); + self + } + /// Fee payer +#[inline(always)] + pub fn payer(&mut self, payer: solana_pubkey::Pubkey) -> &mut Self { + self.payer = Some(payer); + self + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self { + self.__remaining_accounts.push(account); + self + } + /// Add additional accounts to the instruction. + #[inline(always)] + pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self { + self.__remaining_accounts.extend_from_slice(accounts); + self + } + #[allow(clippy::clone_on_copy)] + pub fn instruction(&self) -> solana_instruction::Instruction { + let accounts = PickUpCar { + rental_account: self.rental_account.expect("rental_account is not set"), + car_account: self.car_account.expect("car_account is not set"), + payer: self.payer.expect("payer is not set"), + }; + + accounts.instruction_with_remaining_accounts(&self.__remaining_accounts) + } +} + + /// `pick_up_car` CPI accounts. + pub struct PickUpCarCpiAccounts<'a, 'b> { + /// The account representing the active rental + + + + pub rental_account: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the Car being rented in this order + + + + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + + + + pub payer: &'b solana_account_info::AccountInfo<'a>, + } + +/// `pick_up_car` CPI instruction. +pub struct PickUpCarCpi<'a, 'b> { + /// The program to invoke. + pub __program: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the active rental + + + + pub rental_account: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the Car being rented in this order + + + + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + + + + pub payer: &'b solana_account_info::AccountInfo<'a>, + } + +impl<'a, 'b> PickUpCarCpi<'a, 'b> { + pub fn new( + program: &'b solana_account_info::AccountInfo<'a>, + accounts: PickUpCarCpiAccounts<'a, 'b>, + ) -> Self { + Self { + __program: program, + rental_account: accounts.rental_account, + car_account: accounts.car_account, + payer: accounts.payer, + } + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], &[]) + } + #[inline(always)] + pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) + } + #[inline(always)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed_with_remaining_accounts( + &self, + signers_seeds: &[&[&[u8]]], + remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)] + ) -> solana_program_error::ProgramResult { + let mut accounts = Vec::with_capacity(3+ remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( + *self.rental_account.key, + false + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( + *self.car_account.key, + false + )); + accounts.push(solana_instruction::AccountMeta::new( + *self.payer.key, + true + )); + remaining_accounts.iter().for_each(|remaining_account| { + accounts.push(solana_instruction::AccountMeta { + pubkey: *remaining_account.0.key, + is_signer: remaining_account.1, + is_writable: remaining_account.2, + }) + }); + let data = PickUpCarInstructionData::new().try_to_vec().unwrap(); + + let instruction = solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + }; + let mut account_infos = Vec::with_capacity(4 + remaining_accounts.len()); + account_infos.push(self.__program.clone()); + account_infos.push(self.rental_account.clone()); + account_infos.push(self.car_account.clone()); + account_infos.push(self.payer.clone()); + remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); + + if signers_seeds.is_empty() { + solana_cpi::invoke(&instruction, &account_infos) + } else { + solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds) + } + } +} + +/// Instruction builder for `PickUpCar` via CPI. +/// +/// ### Accounts: +/// + /// 0. `[writable]` rental_account + /// 1. `[]` car_account + /// 2. `[writable, signer]` payer +#[derive(Clone, Debug)] +pub struct PickUpCarCpiBuilder<'a, 'b> { + instruction: Box>, +} + +impl<'a, 'b> PickUpCarCpiBuilder<'a, 'b> { + pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self { + let instruction = Box::new(PickUpCarCpiBuilderInstruction { + __program: program, + rental_account: None, + car_account: None, + payer: None, + __remaining_accounts: Vec::new(), + }); + Self { instruction } + } + /// The account representing the active rental +#[inline(always)] + pub fn rental_account(&mut self, rental_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.rental_account = Some(rental_account); + self + } + /// The account representing the Car being rented in this order +#[inline(always)] + pub fn car_account(&mut self, car_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.car_account = Some(car_account); + self + } + /// Fee payer +#[inline(always)] + pub fn payer(&mut self, payer: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.payer = Some(payer); + self + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self { + self.instruction.__remaining_accounts.push((account, is_writable, is_signer)); + self + } + /// Add additional accounts to the instruction. + /// + /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, + /// and a `bool` indicating whether the account is a signer or not. + #[inline(always)] + pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self { + self.instruction.__remaining_accounts.extend_from_slice(accounts); + self + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed(&[]) + } + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + let instruction = PickUpCarCpi { + __program: self.instruction.__program, + + rental_account: self.instruction.rental_account.expect("rental_account is not set"), + + car_account: self.instruction.car_account.expect("car_account is not set"), + + payer: self.instruction.payer.expect("payer is not set"), + }; + instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts) + } +} + +#[derive(Clone, Debug)] +struct PickUpCarCpiBuilderInstruction<'a, 'b> { + __program: &'b solana_account_info::AccountInfo<'a>, + rental_account: Option<&'b solana_account_info::AccountInfo<'a>>, + car_account: Option<&'b solana_account_info::AccountInfo<'a>>, + payer: Option<&'b solana_account_info::AccountInfo<'a>>, + /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. + __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>, +} + diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/return_car.rs b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/return_car.rs new file mode 100644 index 00000000..c937df64 --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/return_car.rs @@ -0,0 +1,350 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + +use borsh::BorshSerialize; +use borsh::BorshDeserialize; + +pub const RETURN_CAR_DISCRIMINATOR: u8 = 3; + +/// Accounts. +#[derive(Debug)] +pub struct ReturnCar { + /// The account representing the active rental + + + + pub rental_account: solana_pubkey::Pubkey, + /// The account representing the Car being rented in this order + + + + pub car_account: solana_pubkey::Pubkey, + /// Fee payer + + + + pub payer: solana_pubkey::Pubkey, + } + +impl ReturnCar { + pub fn instruction(&self) -> solana_instruction::Instruction { + self.instruction_with_remaining_accounts(&[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::vec_init_then_push)] + pub fn instruction_with_remaining_accounts(&self, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction { + let mut accounts = Vec::with_capacity(3+ remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( + self.rental_account, + false + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( + self.car_account, + false + )); + accounts.push(solana_instruction::AccountMeta::new( + self.payer, + true + )); + accounts.extend_from_slice(remaining_accounts); + let data = ReturnCarInstructionData::new().try_to_vec().unwrap(); + + solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + } + } +} + +#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + pub struct ReturnCarInstructionData { + discriminator: u8, + } + +impl ReturnCarInstructionData { + pub fn new() -> Self { + Self { + discriminator: 3, + } + } + + pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { + borsh::to_vec(self) + } + } + +impl Default for ReturnCarInstructionData { + fn default() -> Self { + Self::new() + } +} + + + +/// Instruction builder for `ReturnCar`. +/// +/// ### Accounts: +/// + /// 0. `[writable]` rental_account + /// 1. `[]` car_account + /// 2. `[writable, signer]` payer +#[derive(Clone, Debug, Default)] +pub struct ReturnCarBuilder { + rental_account: Option, + car_account: Option, + payer: Option, + __remaining_accounts: Vec, +} + +impl ReturnCarBuilder { + pub fn new() -> Self { + Self::default() + } + /// The account representing the active rental +#[inline(always)] + pub fn rental_account(&mut self, rental_account: solana_pubkey::Pubkey) -> &mut Self { + self.rental_account = Some(rental_account); + self + } + /// The account representing the Car being rented in this order +#[inline(always)] + pub fn car_account(&mut self, car_account: solana_pubkey::Pubkey) -> &mut Self { + self.car_account = Some(car_account); + self + } + /// Fee payer +#[inline(always)] + pub fn payer(&mut self, payer: solana_pubkey::Pubkey) -> &mut Self { + self.payer = Some(payer); + self + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self { + self.__remaining_accounts.push(account); + self + } + /// Add additional accounts to the instruction. + #[inline(always)] + pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self { + self.__remaining_accounts.extend_from_slice(accounts); + self + } + #[allow(clippy::clone_on_copy)] + pub fn instruction(&self) -> solana_instruction::Instruction { + let accounts = ReturnCar { + rental_account: self.rental_account.expect("rental_account is not set"), + car_account: self.car_account.expect("car_account is not set"), + payer: self.payer.expect("payer is not set"), + }; + + accounts.instruction_with_remaining_accounts(&self.__remaining_accounts) + } +} + + /// `return_car` CPI accounts. + pub struct ReturnCarCpiAccounts<'a, 'b> { + /// The account representing the active rental + + + + pub rental_account: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the Car being rented in this order + + + + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + + + + pub payer: &'b solana_account_info::AccountInfo<'a>, + } + +/// `return_car` CPI instruction. +pub struct ReturnCarCpi<'a, 'b> { + /// The program to invoke. + pub __program: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the active rental + + + + pub rental_account: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the Car being rented in this order + + + + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + + + + pub payer: &'b solana_account_info::AccountInfo<'a>, + } + +impl<'a, 'b> ReturnCarCpi<'a, 'b> { + pub fn new( + program: &'b solana_account_info::AccountInfo<'a>, + accounts: ReturnCarCpiAccounts<'a, 'b>, + ) -> Self { + Self { + __program: program, + rental_account: accounts.rental_account, + car_account: accounts.car_account, + payer: accounts.payer, + } + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], &[]) + } + #[inline(always)] + pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) + } + #[inline(always)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed_with_remaining_accounts( + &self, + signers_seeds: &[&[&[u8]]], + remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)] + ) -> solana_program_error::ProgramResult { + let mut accounts = Vec::with_capacity(3+ remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( + *self.rental_account.key, + false + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( + *self.car_account.key, + false + )); + accounts.push(solana_instruction::AccountMeta::new( + *self.payer.key, + true + )); + remaining_accounts.iter().for_each(|remaining_account| { + accounts.push(solana_instruction::AccountMeta { + pubkey: *remaining_account.0.key, + is_signer: remaining_account.1, + is_writable: remaining_account.2, + }) + }); + let data = ReturnCarInstructionData::new().try_to_vec().unwrap(); + + let instruction = solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + }; + let mut account_infos = Vec::with_capacity(4 + remaining_accounts.len()); + account_infos.push(self.__program.clone()); + account_infos.push(self.rental_account.clone()); + account_infos.push(self.car_account.clone()); + account_infos.push(self.payer.clone()); + remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); + + if signers_seeds.is_empty() { + solana_cpi::invoke(&instruction, &account_infos) + } else { + solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds) + } + } +} + +/// Instruction builder for `ReturnCar` via CPI. +/// +/// ### Accounts: +/// + /// 0. `[writable]` rental_account + /// 1. `[]` car_account + /// 2. `[writable, signer]` payer +#[derive(Clone, Debug)] +pub struct ReturnCarCpiBuilder<'a, 'b> { + instruction: Box>, +} + +impl<'a, 'b> ReturnCarCpiBuilder<'a, 'b> { + pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self { + let instruction = Box::new(ReturnCarCpiBuilderInstruction { + __program: program, + rental_account: None, + car_account: None, + payer: None, + __remaining_accounts: Vec::new(), + }); + Self { instruction } + } + /// The account representing the active rental +#[inline(always)] + pub fn rental_account(&mut self, rental_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.rental_account = Some(rental_account); + self + } + /// The account representing the Car being rented in this order +#[inline(always)] + pub fn car_account(&mut self, car_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.car_account = Some(car_account); + self + } + /// Fee payer +#[inline(always)] + pub fn payer(&mut self, payer: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.payer = Some(payer); + self + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self { + self.instruction.__remaining_accounts.push((account, is_writable, is_signer)); + self + } + /// Add additional accounts to the instruction. + /// + /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, + /// and a `bool` indicating whether the account is a signer or not. + #[inline(always)] + pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self { + self.instruction.__remaining_accounts.extend_from_slice(accounts); + self + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed(&[]) + } + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + let instruction = ReturnCarCpi { + __program: self.instruction.__program, + + rental_account: self.instruction.rental_account.expect("rental_account is not set"), + + car_account: self.instruction.car_account.expect("car_account is not set"), + + payer: self.instruction.payer.expect("payer is not set"), + }; + instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts) + } +} + +#[derive(Clone, Debug)] +struct ReturnCarCpiBuilderInstruction<'a, 'b> { + __program: &'b solana_account_info::AccountInfo<'a>, + rental_account: Option<&'b solana_account_info::AccountInfo<'a>>, + car_account: Option<&'b solana_account_info::AccountInfo<'a>>, + payer: Option<&'b solana_account_info::AccountInfo<'a>>, + /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. + __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>, +} + diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/mod.rs b/tools/shank-and-codama/native/clients/rust/src/generated/mod.rs new file mode 100644 index 00000000..fb2c5f72 --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/mod.rs @@ -0,0 +1,15 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + + pub mod accounts; + pub mod errors; + pub mod instructions; + pub mod programs; + pub mod shared; + pub mod types; + + pub(crate) use programs::*; diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/programs.rs b/tools/shank-and-codama/native/clients/rust/src/generated/programs.rs new file mode 100644 index 00000000..a18a3ad6 --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/programs.rs @@ -0,0 +1,13 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + +use solana_pubkey::{pubkey, Pubkey}; + + + /// `car_rental_service` program ID. + pub const CAR_RENTAL_SERVICE_ID: Pubkey = pubkey!("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"); + diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/shared.rs b/tools/shank-and-codama/native/clients/rust/src/generated/shared.rs new file mode 100644 index 00000000..76fa92ec --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/shared.rs @@ -0,0 +1,26 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + + + + + #[cfg(feature = "fetch")] + #[derive(Debug, Clone)] + pub struct DecodedAccount { + pub address: solana_pubkey::Pubkey, + pub account: solana_account::Account, + pub data: T, + } + + #[cfg(feature = "fetch")] + #[derive(Debug, Clone)] + pub enum MaybeAccount { + Exists(DecodedAccount), + NotFound(solana_pubkey::Pubkey), + } + + diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/types/mod.rs b/tools/shank-and-codama/native/clients/rust/src/generated/types/mod.rs new file mode 100644 index 00000000..1bd40ad1 --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/types/mod.rs @@ -0,0 +1,11 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + + pub(crate) mod r#rental_order_status; + + pub use self::r#rental_order_status::*; + diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/types/rental_order_status.rs b/tools/shank-and-codama/native/clients/rust/src/generated/types/rental_order_status.rs new file mode 100644 index 00000000..42ebc44e --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/generated/types/rental_order_status.rs @@ -0,0 +1,20 @@ +//! This code was AUTOGENERATED using the codama library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun codama to update it. +//! +//! +//! + +use borsh::BorshSerialize; +use borsh::BorshDeserialize; +use num_derive::FromPrimitive; + +#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq, Copy, PartialOrd, Hash, FromPrimitive)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +pub enum RentalOrderStatus { +Created, +PickedUp, +Returned, +} + + diff --git a/tools/shank-and-codama/native/clients/rust/src/lib.rs b/tools/shank-and-codama/native/clients/rust/src/lib.rs new file mode 100644 index 00000000..136e9a24 --- /dev/null +++ b/tools/shank-and-codama/native/clients/rust/src/lib.rs @@ -0,0 +1,2 @@ +pub mod generated; +pub use generated::*; diff --git a/tools/shank-and-codama/native/codama.ts b/tools/shank-and-codama/native/codama.ts index 6117001a..d509c285 100644 --- a/tools/shank-and-codama/native/codama.ts +++ b/tools/shank-and-codama/native/codama.ts @@ -1,24 +1,26 @@ // Codama client generator. // // Reads the Shank-generated IDL (program/idl/car_rental_service.json) and emits -// a TypeScript client built on @solana/kit into tests/generated/. +// a Rust client into clients/rust/src/generated/. The wrapper crate at +// clients/rust/ re-exports the generated module; the program's Rust + LiteSVM +// tests (program/tests/) drive the program through it. // // Flow: read IDL -> rootNodeFromAnchor (origin = "shank" so the u8 instruction -// discriminants are interpreted correctly) -> createFromRoot -> render JS. +// discriminants are interpreted correctly) -> createFromRoot -> render Rust. // // Run with: pnpm generate-client -import { readFileSync, rmSync } from "node:fs"; +import { readFileSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import { type AnchorIdl, rootNodeFromAnchor } from "@codama/nodes-from-anchor"; -import { renderVisitor } from "@codama/renderers-js"; +import { renderVisitor } from "@codama/renderers-rust"; import { createFromRoot } from "codama"; const here = dirname(fileURLToPath(import.meta.url)); const idlPath = join(here, "program", "idl", "car_rental_service.json"); -const outDir = join(here, "tests", "generated"); +const outDir = join(here, "clients", "rust", "src", "generated"); const idl = JSON.parse(readFileSync(idlPath, "utf-8")) as AnchorIdl; @@ -33,12 +35,11 @@ const idlWithOrigin = { const codama = createFromRoot(rootNodeFromAnchor(idlWithOrigin)); -await codama.accept(renderVisitor(outDir, { deleteFolderBeforeRendering: true })); +await codama.accept( + renderVisitor(outDir, { + deleteFolderBeforeRendering: true, + crateFolder: join(here, "clients", "rust"), + }), +); -// The renderer drops a standalone `package.json` (declaring an implicit CommonJS -// package) at the output root. That would shadow this example's -// `"type": "module"` setting and break ESM resolution of the generated `.ts` -// files when the test imports them via tsx, so remove it. -rmSync(join(outDir, "package.json"), { force: true }); - -console.log(`Codama: generated TypeScript client in ${outDir}`); +console.log(`Codama: generated Rust client in ${outDir}`); diff --git a/tools/shank-and-codama/native/package.json b/tools/shank-and-codama/native/package.json index fa3ee05d..1a51e16c 100644 --- a/tools/shank-and-codama/native/package.json +++ b/tools/shank-and-codama/native/package.json @@ -1,20 +1,16 @@ { "type": "module", "scripts": { - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", + "build": "cargo build-sbf --manifest-path=./program/Cargo.toml", "generate-idl": "shank idl --crate-root ./program --out-dir ./program/idl", "generate-client": "tsx ./codama.ts", - "test": "node --import tsx --test ./tests/test.ts", - "build-and-test": "pnpm build && pnpm generate-client && pnpm test" + "test": "cargo test --manifest-path=./program/Cargo.toml", + "build-and-test": "pnpm build && pnpm test" }, "dependencies": { "@codama/nodes-from-anchor": "^1.5.0", - "@codama/renderers-js": "^2.2.0", - "@solana-program/system": "^0.12.2", - "@solana/program-client-core": "^6.9.0", - "@solana/kit": "^6.9.0", - "codama": "^1.7.0", - "litesvm": "^1.1.0" + "@codama/renderers-rust": "^1.1.2", + "codama": "^1.7.0" }, "devDependencies": { "@types/node": "^25.9.1", diff --git a/tools/shank-and-codama/native/pnpm-lock.yaml b/tools/shank-and-codama/native/pnpm-lock.yaml index 69219aeb..1e8bebe4 100644 --- a/tools/shank-and-codama/native/pnpm-lock.yaml +++ b/tools/shank-and-codama/native/pnpm-lock.yaml @@ -11,24 +11,12 @@ importers: '@codama/nodes-from-anchor': specifier: ^1.5.0 version: 1.5.0(typescript@5.9.3) - '@codama/renderers-js': - specifier: ^2.2.0 - version: 2.2.0(typescript@5.9.3) - '@solana-program/system': - specifier: ^0.12.2 - version: 0.12.2(@solana/kit@6.9.0(typescript@5.9.3)) - '@solana/kit': - specifier: ^6.9.0 - version: 6.9.0(typescript@5.9.3) - '@solana/program-client-core': - specifier: ^6.9.0 - version: 6.9.0(typescript@5.9.3) + '@codama/renderers-rust': + specifier: ^1.1.2 + version: 1.2.9(typescript@5.9.3) codama: specifier: ^1.7.0 version: 1.7.0 - litesvm: - specifier: ^1.1.0 - version: 1.1.0(typescript@5.9.3) devDependencies: '@types/node': specifier: ^25.9.1 @@ -65,8 +53,8 @@ packages: '@codama/renderers-core@1.3.8': resolution: {integrity: sha512-xy9Qb5BLYTi1OyvlRhRD7n0HUevOQ3QcHSPq9N3kqoUOgL2ziXPXvoejzzLC0OkvA16M7WvK3ihNx/nf4UEClQ==} - '@codama/renderers-js@2.2.0': - resolution: {integrity: sha512-/GWVnB329kMkeqlOqX+NWQAmd1k6yybVOp7C5X+LEvrZ2A5w1saQwWFbBMCq/EQPqnFU+CRFoG/+7KubAEa73Q==} + '@codama/renderers-rust@1.2.9': + resolution: {integrity: sha512-6sc/g8LYHEa3MFqakEBRJito/1liv1jE1b6P1gGRz7z84YiGscPKh0pbcELlLPxyLraNTBYSA6V9EXrj2LLvIA==} engines: {node: '>=20.18.0'} '@codama/validators@1.7.0': @@ -238,43 +226,6 @@ packages: resolution: {integrity: sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==} engines: {node: '>= 20.19.0'} - '@solana-program/system@0.12.2': - resolution: {integrity: sha512-MaBeOxlvTruQhA7UYkOb3hVTEHPPagOtd+PvTm6a8rGgvEAP0kD4BbC37NceOaR4ABNqdaCmD5OMVRKgrE6KAg==} - peerDependencies: - '@solana/kit': ^6.4.0 - - '@solana-program/token@0.13.0': - resolution: {integrity: sha512-/Apjrd5lwOJGrPB0J5Rv7EBeclvyEBQPAGA85Scm7wBH+GpkbdLDM9uK3TNg8jjFKyWQYai/JtPHbrx7VgFLSg==} - peerDependencies: - '@solana/kit': ^6.5.0 - - '@solana/accounts@6.9.0': - resolution: {integrity: sha512-g36AJreJrgf9AAjOfbdFHEFUTymBgzbWHoEDElZ+fDKvqBINDiUVKzDApwc7C7kGPMFqQBaoEHnQRxf2IqfKZQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/addresses@6.9.0': - resolution: {integrity: sha512-tWnG2L6lo/ZhcMT019F3myDsH87MM8EZbTO0cgwgvVPlEdIGblROFF3tGVrb7FVCOlbPI0ONCFyPbnrmR58LsA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/assertions@6.9.0': - resolution: {integrity: sha512-FjWWD6e0in+HFsHMvU2zKCbyPfKtDW6iGXZZ9+Qg1QUYpO1AEObsya3F7hb9RkZKUueK4WwWAQnIuvEUp3A1uA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - '@solana/codecs-core@5.5.1': resolution: {integrity: sha512-TgBt//bbKBct0t6/MpA8ElaOA3sa8eYVvR7LGslCZ84WiAwwjCY0lW/lOYsFHJQzwREMdUyuEyy5YWBKtdh8Rw==} engines: {node: '>=20.18.0'} @@ -284,15 +235,6 @@ packages: typescript: optional: true - '@solana/codecs-core@6.9.0': - resolution: {integrity: sha512-F2BmLecG/1nTtnjyD509NsEc254pxJKa2bpvotymv1lL1WfEn3zchcZ9SMIiLyL4G6J8b9F3OKIq2YSZho2AOQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - '@solana/codecs-data-structures@5.5.1': resolution: {integrity: sha512-97bJWGyUY9WvBz3mX1UV3YPWGDTez6btCfD0ip3UVEXJbItVuUiOkzcO5iFDUtQT5riKT6xC+Mzl+0nO76gd0w==} engines: {node: '>=20.18.0'} @@ -302,15 +244,6 @@ packages: typescript: optional: true - '@solana/codecs-data-structures@6.9.0': - resolution: {integrity: sha512-f7GYtiHafvJDhqiwzUUSr/6AYSK4DCw6quPmA80NZGtkNiFa+g6LoJy2wbC0wp2dxvCwNpxf6x3ILCYRutAvvg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - '@solana/codecs-numbers@5.5.1': resolution: {integrity: sha512-rllMIZAHqmtvC0HO/dc/21wDuWaD0B8Ryv8o+YtsICQBuiL/0U4AGwH7Pi5GNFySYk0/crSuwfIqQFtmxNSPFw==} engines: {node: '>=20.18.0'} @@ -320,15 +253,6 @@ packages: typescript: optional: true - '@solana/codecs-numbers@6.9.0': - resolution: {integrity: sha512-XMI0FOHV2h7yPAllxWCX8z+J1msidNjXzN1mRjH5KR6C+vfzyKa2xWHve0bNSV/bjVAhqqhc7dQCpBKuF4+ScQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - '@solana/codecs-strings@5.5.1': resolution: {integrity: sha512-7klX4AhfHYA+uKKC/nxRGP2MntbYQCR3N6+v7bk1W/rSxYuhNmt+FN8aoThSZtWIKwN6BEyR1167ka8Co1+E7A==} engines: {node: '>=20.18.0'} @@ -341,18 +265,6 @@ packages: typescript: optional: true - '@solana/codecs-strings@6.9.0': - resolution: {integrity: sha512-PTqYQxMsmdfEEq29bV1AnALD4FjFEsSxOj1fYNqooOSTEQEpUoYEQtsd55/kBsnIKltXbvYwXYXBusm19n1sQA==} - engines: {node: '>=20.18.0'} - peerDependencies: - fastestsmallesttextencoderdecoder: ^1.0.22 - typescript: '>=5.4.0' - peerDependenciesMeta: - fastestsmallesttextencoderdecoder: - optional: true - typescript: - optional: true - '@solana/codecs@5.5.1': resolution: {integrity: sha512-Vea29nJub/bXjfzEV7ZZQ/PWr1pYLZo3z0qW0LQL37uKKVzVFRQlwetd7INk3YtTD3xm9WUYr7bCvYUk3uKy2g==} engines: {node: '>=20.18.0'} @@ -362,15 +274,6 @@ packages: typescript: optional: true - '@solana/codecs@6.9.0': - resolution: {integrity: sha512-oWOybKa1PTGI1D/FyrvGKralADM1jmVZC2AtgEo+4JTKG0+i1p9ZbwNY2UcJqdYsDMDaGHAx0LMAid9LDCxXTQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - '@solana/errors@5.5.1': resolution: {integrity: sha512-vFO3p+S7HoyyrcAectnXbdsMfwUzY2zYFUc2DEe5BwpiE9J1IAxPBGjOWO6hL1bbYdBrlmjNx8DXCslqS+Kcmg==} engines: {node: '>=20.18.0'} @@ -381,97 +284,6 @@ packages: typescript: optional: true - '@solana/errors@6.9.0': - resolution: {integrity: sha512-7i+b07KMnkbHvFlz7uWade3jvyc22UmVm8o9taxPK8YV3JNM/NkS8oQFvMac2MIaLPAlEs7I8MHyVLUal1yY4g==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/fast-stable-stringify@6.9.0': - resolution: {integrity: sha512-l14zGVsURbT5Aox/kLFQywqV4VaE9/j3h2EvCu9oULVPMwzQB6yezJb1/KyiDwhm/RscooPd0gFQFIKEGQbayw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/fixed-points@6.9.0': - resolution: {integrity: sha512-0K7mbYC4jdAZFlXqXjpNanmEyZxk7K9NtXDLc1zuhGuxwH8J9guvohwdw2V7TQ9bfjCYsprY3Tp2kUVQpECGmA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/functional@6.9.0': - resolution: {integrity: sha512-sgNHOaIjETZZuziZdlwPsU5EjBVj5M0dUbwrSQTTNZe0SxX3pQ1QFVcs5KyvdS7AQcpBVdLjx4CfQjdKXk52GA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/instruction-plans@6.9.0': - resolution: {integrity: sha512-SxTSOetEKD+WPzvDuYRsP1+KkwUp8KqL1n7oFx9ThxjyfEY0ly0i9KdbvX5yYVDOA2TSwrltgdu14y/Pf6y3Cg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/instructions@6.9.0': - resolution: {integrity: sha512-LZfJx3bGdUSbGaswoOEPHygticqkCg3TusRczPJXyCmKhoQzPCcGQQ99qMzP7Wg8pEV5tWA5t7tycf8E237ydg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/keys@6.9.0': - resolution: {integrity: sha512-1g2QARiqSjNqT0EIqLDLQ5vRm7hCsbqgFwFAp5GsMV/8BTYT8s1Ct2wLHDZiJ4eAX6beTHVf8LbOBfVejtn3oQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/kit@6.9.0': - resolution: {integrity: sha512-k7BRz7Akfv8wiRtlCR/xUyDLfuMfYMelMR1+AC5KgwaRRJReDF0BucMLNN1In7WoI+KuWwr1OKv4na/oKpyeAQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/nominal-types@6.9.0': - resolution: {integrity: sha512-ouhrnY7a6nsLXRGcariwcmHDdXroCNqOuzwtdjKt2c8e8Drwao9yxPH2VoViNgpq8IGNJeQMEI1TVnoJZRn0gw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/offchain-messages@6.9.0': - resolution: {integrity: sha512-qK3tqRPb+E0kmTz5qFXZbEdF4pyzfOWRZjyVESHVGemDDeGzZ1SV3zAxcA6HBCnv4wCBnlyaDPw8t+5sryNMAw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - '@solana/options@5.5.1': resolution: {integrity: sha512-eo971c9iLNLmk+yOFyo7yKIJzJ/zou6uKpy6mBuyb/thKtS/haiKIc3VLhyTXty3OH2PW8yOlORJnv4DexJB8A==} engines: {node: '>=20.18.0'} @@ -481,225 +293,15 @@ packages: typescript: optional: true - '@solana/options@6.9.0': - resolution: {integrity: sha512-H5ZRWNzzLMwHU/fRU9aVx+3TaMN4gDNCUYxsZxq0h7mqiwxFy6mpy95xPsfdldthCHDYtYnUTxe2sBatGbNHig==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/plugin-core@6.9.0': - resolution: {integrity: sha512-KslLSnzY8zbGZibEBVMVUm2ZS8T2xf+cut7F65VjWPoWNAxU+p7933wsMz/az6CF7b65RI7iU3HhCr5/5QF50w==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/plugin-interfaces@6.9.0': - resolution: {integrity: sha512-Qj4sk9thkM1UgnFXvWIoezd/CbqpX/2jigLBDsMB5Ed/gmFlkBSTL127LFDSY3OtzBpXl4hROs+Zqv+5xqtguA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/program-client-core@6.9.0': - resolution: {integrity: sha512-+iUnsddhs72QoBJoUO+/yHUXoBvYWa1sGCBRJk35zeg8j7ZXEwRkk6eX0VOrUPxhEpQbYJsIOCrIYApNIt8RFw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/programs@6.9.0': - resolution: {integrity: sha512-L9LAnQtfFFcCDLcbbnxhUtgAmu/kS4aRmrVncdnX5CFyQshlpo0/Qhrq3UA7vnhute4gjYV4pFT+64onH5qGEQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/promises@6.9.0': - resolution: {integrity: sha512-227PlXRi6KZX4ODYTkJitr9InSa79NTquI72slay4gzxO9VmMepgvYdMAX6kawdN5pt+VzaklKhNhWXk50Pi9g==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-api@6.9.0': - resolution: {integrity: sha512-3KhXS6A1ie6GqTywW/KEMSXJ1VJEU66fxjhuiiqPILuJstP7kex3ycr3H6DirKydUsy6gaKaPN43rE+LfyS7OA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-parsed-types@6.9.0': - resolution: {integrity: sha512-6ThH8izY+DWDyrVOOlS40vTcFjwjCinjfqnId7zhRk8OxhkfHQ/iEj+OnGwD4Yhe8pGdVa7GNVYlrQgQgzQ3eQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-spec-types@6.9.0': - resolution: {integrity: sha512-A4fY1JRrcKqX3EfttO4Q8L97nGPqdjfekAV0eDyxN5nu9ngf5p7GKenkl7AYDoHLNr6ZX/C96cRADxXjsRJ0iA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-spec@6.9.0': - resolution: {integrity: sha512-3yHRoChc0IpsJbUq0/94l+ar3t9U3Ax58W0HON7eyYe7zFP10UAxpkHn7DPch9DeALyuGph8kVnvl+kXRgJlGg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-subscriptions-api@6.9.0': - resolution: {integrity: sha512-UA/rPQeNx6zQMUFcS8PPPuB4vzUOtSzIY/igMH0DRoP020NyES2GguIb7Zo7sqDNi4n0gkQRhoW4dPVotcNKdA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-subscriptions-channel-websocket@6.9.0': - resolution: {integrity: sha512-kT8Yne9HjJD2gooaOFNSyKrvaIfOy2GR0Ymv8OfecBCwFStdz+SPo5eYXq8ZWoZbr5E/MMpHgqsHBanqa2Ffyg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-subscriptions-spec@6.9.0': - resolution: {integrity: sha512-DbaG67s99vRZQxFMK80UQ7DEKkRJK6JEZeYg/U5UttD6n7ax/vct7qopxGnrt4RCkaaac2fU8Sr+fcnvWQweUg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-subscriptions@6.9.0': - resolution: {integrity: sha512-IMctZQaMxzvRACQ6ooW98lP+7tVoUJnRgOZtkAdzgBizldQAYPIKd3MulP0jbQPCMfdPsa2Hs0NBcUwfgonq3w==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-transformers@6.9.0': - resolution: {integrity: sha512-dg4LK2wEBpaY+KRk/SJIkYvrvjdsc1AwD4bkmGY4Fp7EwVlvwBQShAQn78Qi4IP0WQ/0n9ncFyUxgcB1Y01ZuQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-transport-http@6.9.0': - resolution: {integrity: sha512-4gy30fWJcS6jrcXCoP/optFpGJ/gD9xdkE8wDbe1Ys/Y+e4XjyBt45xtTnbdmMdukvdRX+oXS3zgUIYoagpNzQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc-types@6.9.0': - resolution: {integrity: sha512-iFhPzZK3qiQ1lhfNTNBTI7BIs5PfWZSgRLD3enKm8ZAQggzvUklfO3KPh47jVsc/Jsr1UGPH8M3o3m17qjO1Cg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/rpc@6.9.0': - resolution: {integrity: sha512-ny1Kt20+oq3xZErNA56+Magmb2JKYfQgHwZTsBmHKVl/9mBpv1y1+ygV+KNiiX/wWXWstLbdIo1jgPwZPbU2Vg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/signers@6.9.0': - resolution: {integrity: sha512-x7WyoRm9IORMqeSqNivZgyY+RERPkmqWxpINPD13kUH+oaZzonORIgxk2Lz+u5iPRXiJPkdRPrQ4FoFWv8i6kQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/subscribable@6.9.0': - resolution: {integrity: sha512-YV0/BrJNfepf10CTfLwD7kRY1kkELDHd+BbHJZhBeiuiXTY3xQTvvx1RFs3NtfFCcTHG25Uh8NpRacQJnxSSIQ==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/sysvars@6.9.0': - resolution: {integrity: sha512-e0e+QKr/th9t/O2N1oUoJmcodLghzAtWKUlGb1zyYub0/WJrPImnKqJqp/gDP4tK98mJxopPMcprCeHk4B+TQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/transaction-confirmation@6.9.0': - resolution: {integrity: sha512-fzYCOih7hhtBzzNSkAnxMjeFeQ8U7e27k9i0RsgQc3/e3OCynF5HoIVNhhqZbwfIBKiaD4ginJR6slRnfqO32Q==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/transaction-messages@6.9.0': - resolution: {integrity: sha512-OWpryt0w6SHlwHx12Vd1wvx2QwSGBXAIUEHTCtkctcM3AaZRy5cIl7CAq9iD5PgahUsaOyRLBV0zlCJcC2JrJA==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - '@solana/transactions@6.9.0': - resolution: {integrity: sha512-uKPzLwHbjwChfVl82he17ntkh02PfgnMMhN7uOAC+VbkIt1O+EEw8sX87gi6kdG/EV+QBDQXm9PLAo5W0tYylw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - '@types/node@25.9.1': resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} + a-sync-waterfall@1.0.1: + resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -728,6 +330,10 @@ packages: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -794,58 +400,24 @@ packages: jsonify@0.0.1: resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - litesvm-darwin-arm64@1.1.0: - resolution: {integrity: sha512-SjcivEOOjBk65U6TgIeMJ7CCnHNKQXHx0qf6K6GIFZC1aHTg7ePrEi+WhAQD6VUBMdDHIMCVKC/uXnXPi6EKIw==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - litesvm-darwin-x64@1.1.0: - resolution: {integrity: sha512-hTs+eZ9sHVZXhjggpnn/8A/E+Nt/E6Gf8E2ejdWWL9bBQKmq1Y0VcrDpORbIvqqRpTLHXqbxCuH1wQB2C8frJg==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - litesvm-linux-arm64-gnu@1.1.0: - resolution: {integrity: sha512-6EjJ6+E+1SUXdJmCyeyhvlKhNncccqQNH241+P8d4E72rE3zuFxeCtLHhusCQk2p/Xau3dBI0qTLogZ1F1IGSA==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - litesvm-linux-arm64-musl@1.1.0: - resolution: {integrity: sha512-mNuBOfX6GnDFT2i/kYPWud7eZGe57dDP0u4lwiSTQPRE0BxQbGZT2aEwX8LTwbonhbc6HSt50LamaZZzK4h4ig==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [musl] - - litesvm-linux-x64-gnu@1.1.0: - resolution: {integrity: sha512-Ot8RgUVlMKzKJi2nVDxaHVo0hjB5vtYTomYNIf26mIA32DOy0+dQfwOqUhynhvvSMxN3VFec3r/OtCnk6lRBrw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [glibc] - - litesvm-linux-x64-musl@1.1.0: - resolution: {integrity: sha512-6kmneOIsTBSActELRTwxIYVJOVaLm3P6uwlmkqc9BUtDAQ7bRdRmwREWSbM8XxKBGw2LjiUfgRJ5WJGYo8fUFg==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [musl] - - litesvm@1.1.0: - resolution: {integrity: sha512-UOlMIEst50gSUyPnC2pGjGLygH8iC/GOqnNXQIHc8iGwD76m44ReeA/0h0vu/AIieZ2zG5/ERLxFV0kdNxkNsA==} - engines: {node: '>= 20'} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + nunjucks@3.2.4: + resolution: {integrity: sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==} + engines: {node: '>= 6.9.0'} + hasBin: true + peerDependencies: + chokidar: ^3.3.0 + peerDependenciesMeta: + chokidar: + optional: true + object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -853,20 +425,10 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - prettier@3.8.3: - resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} - engines: {node: '>=14'} - hasBin: true - prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} - semver@7.8.2: - resolution: {integrity: sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==} - engines: {node: '>=10'} - hasBin: true - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -887,21 +449,6 @@ packages: undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} - undici-types@8.3.0: - resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} - - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - snapshots: '@codama/cli@1.5.2': @@ -948,16 +495,16 @@ snapshots: '@codama/nodes': 1.7.0 '@codama/visitors-core': 1.7.0 - '@codama/renderers-js@2.2.0(typescript@5.9.3)': + '@codama/renderers-rust@1.2.9(typescript@5.9.3)': dependencies: '@codama/errors': 1.7.0 '@codama/nodes': 1.7.0 '@codama/renderers-core': 1.3.8 '@codama/visitors-core': 1.7.0 - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - prettier: 3.8.3 - semver: 7.8.2 + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + nunjucks: 3.2.4 transitivePeerDependencies: + - chokidar - fastestsmallesttextencoderdecoder - typescript @@ -1059,58 +606,12 @@ snapshots: '@noble/hashes@2.2.0': {} - '@solana-program/system@0.12.2(@solana/kit@6.9.0(typescript@5.9.3))': - dependencies: - '@solana/kit': 6.9.0(typescript@5.9.3) - - '@solana-program/token@0.13.0(@solana/kit@6.9.0(typescript@5.9.3))': - dependencies: - '@solana-program/system': 0.12.2(@solana/kit@6.9.0(typescript@5.9.3)) - '@solana/kit': 6.9.0(typescript@5.9.3) - - '@solana/accounts@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/addresses@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/assertions': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/assertions@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - '@solana/codecs-core@5.5.1(typescript@5.9.3)': dependencies: '@solana/errors': 5.5.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/codecs-core@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - '@solana/codecs-data-structures@5.5.1(typescript@5.9.3)': dependencies: '@solana/codecs-core': 5.5.1(typescript@5.9.3) @@ -1119,14 +620,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/codecs-data-structures@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - '@solana/codecs-numbers@5.5.1(typescript@5.9.3)': dependencies: '@solana/codecs-core': 5.5.1(typescript@5.9.3) @@ -1134,13 +627,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/codecs-numbers@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - '@solana/codecs-strings@5.5.1(typescript@5.9.3)': dependencies: '@solana/codecs-core': 5.5.1(typescript@5.9.3) @@ -1149,14 +635,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/codecs-strings@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - '@solana/codecs@5.5.1(typescript@5.9.3)': dependencies: '@solana/codecs-core': 5.5.1(typescript@5.9.3) @@ -1169,19 +647,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/codecs@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/fixed-points': 6.9.0(typescript@5.9.3) - '@solana/options': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/errors@5.5.1(typescript@5.9.3)': dependencies: chalk: 5.6.2 @@ -1189,114 +654,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/errors@6.9.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.3 - optionalDependencies: - typescript: 5.9.3 - - '@solana/fast-stable-stringify@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/fixed-points@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/functional@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/instruction-plans@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/instructions': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/promises': 6.9.0(typescript@5.9.3) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - '@solana/transactions': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/instructions@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/keys@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/assertions': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - '@solana/promises': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/kit@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/accounts': 6.9.0(typescript@5.9.3) - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/instruction-plans': 6.9.0(typescript@5.9.3) - '@solana/instructions': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/offchain-messages': 6.9.0(typescript@5.9.3) - '@solana/plugin-core': 6.9.0(typescript@5.9.3) - '@solana/plugin-interfaces': 6.9.0(typescript@5.9.3) - '@solana/program-client-core': 6.9.0(typescript@5.9.3) - '@solana/programs': 6.9.0(typescript@5.9.3) - '@solana/rpc': 6.9.0(typescript@5.9.3) - '@solana/rpc-api': 6.9.0(typescript@5.9.3) - '@solana/rpc-parsed-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/signers': 6.9.0(typescript@5.9.3) - '@solana/subscribable': 6.9.0(typescript@5.9.3) - '@solana/sysvars': 6.9.0(typescript@5.9.3) - '@solana/transaction-confirmation': 6.9.0(typescript@5.9.3) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - '@solana/transactions': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - bufferutil - - fastestsmallesttextencoderdecoder - - utf-8-validate - - '@solana/nominal-types@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/offchain-messages@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@solana/options@5.5.1(typescript@5.9.3)': dependencies: '@solana/codecs-core': 5.5.1(typescript@5.9.3) @@ -1309,298 +666,14 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/options@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/plugin-core@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/plugin-interfaces@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/instruction-plans': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/signers': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/program-client-core@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/accounts': 6.9.0(typescript@5.9.3) - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/instruction-plans': 6.9.0(typescript@5.9.3) - '@solana/instructions': 6.9.0(typescript@5.9.3) - '@solana/plugin-interfaces': 6.9.0(typescript@5.9.3) - '@solana/rpc-api': 6.9.0(typescript@5.9.3) - '@solana/signers': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/programs@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/promises@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/rpc-api@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/rpc-parsed-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - '@solana/transactions': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/rpc-parsed-types@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/rpc-spec-types@6.9.0(typescript@5.9.3)': - optionalDependencies: - typescript: 5.9.3 - - '@solana/rpc-spec@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/rpc-subscriptions-api@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - '@solana/transactions': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/rpc-subscriptions-channel-websocket@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) - '@solana/subscribable': 6.9.0(typescript@5.9.3) - ws: 8.21.0 - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@solana/rpc-subscriptions-spec@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/promises': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - '@solana/subscribable': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/rpc-subscriptions@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/promises': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions-api': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions-channel-websocket': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/subscribable': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - bufferutil - - fastestsmallesttextencoderdecoder - - utf-8-validate - - '@solana/rpc-transformers@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/rpc-transport-http@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - undici-types: 8.3.0 - optionalDependencies: - typescript: 5.9.3 - - '@solana/rpc-types@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/fixed-points': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/rpc@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/rpc-api': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec': 6.9.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.9.0(typescript@5.9.3) - '@solana/rpc-transport-http': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/signers@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/instructions': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - '@solana/offchain-messages': 6.9.0(typescript@5.9.3) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - '@solana/transactions': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/subscribable@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - '@solana/sysvars@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/accounts': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/transaction-confirmation@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/promises': 6.9.0(typescript@5.9.3) - '@solana/rpc': 6.9.0(typescript@5.9.3) - '@solana/rpc-subscriptions': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - '@solana/transactions': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - bufferutil - - fastestsmallesttextencoderdecoder - - utf-8-validate - - '@solana/transaction-messages@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/instructions': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - '@solana/transactions@6.9.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.9.0(typescript@5.9.3) - '@solana/codecs-core': 6.9.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.9.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.9.0(typescript@5.9.3) - '@solana/codecs-strings': 6.9.0(typescript@5.9.3) - '@solana/errors': 6.9.0(typescript@5.9.3) - '@solana/functional': 6.9.0(typescript@5.9.3) - '@solana/instructions': 6.9.0(typescript@5.9.3) - '@solana/keys': 6.9.0(typescript@5.9.3) - '@solana/nominal-types': 6.9.0(typescript@5.9.3) - '@solana/rpc-types': 6.9.0(typescript@5.9.3) - '@solana/transaction-messages': 6.9.0(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - '@types/node@25.9.1': dependencies: undici-types: 7.24.6 + a-sync-waterfall@1.0.1: {} + + asap@2.0.6: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -1632,6 +705,8 @@ snapshots: commander@14.0.3: {} + commander@5.1.0: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -1730,57 +805,23 @@ snapshots: kleur@3.0.3: {} - litesvm-darwin-arm64@1.1.0: - optional: true - - litesvm-darwin-x64@1.1.0: - optional: true - - litesvm-linux-arm64-gnu@1.1.0: - optional: true - - litesvm-linux-arm64-musl@1.1.0: - optional: true - - litesvm-linux-x64-gnu@1.1.0: - optional: true - - litesvm-linux-x64-musl@1.1.0: - optional: true + math-intrinsics@1.1.0: {} - litesvm@1.1.0(typescript@5.9.3): + nunjucks@3.2.4: dependencies: - '@solana-program/system': 0.12.2(@solana/kit@6.9.0(typescript@5.9.3)) - '@solana-program/token': 0.13.0(@solana/kit@6.9.0(typescript@5.9.3)) - '@solana/kit': 6.9.0(typescript@5.9.3) - optionalDependencies: - litesvm-darwin-arm64: 1.1.0 - litesvm-darwin-x64: 1.1.0 - litesvm-linux-arm64-gnu: 1.1.0 - litesvm-linux-arm64-musl: 1.1.0 - litesvm-linux-x64-gnu: 1.1.0 - litesvm-linux-x64-musl: 1.1.0 - transitivePeerDependencies: - - bufferutil - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - - math-intrinsics@1.1.0: {} + a-sync-waterfall: 1.0.1 + asap: 2.0.6 + commander: 5.1.0 object-keys@1.1.1: {} picocolors@1.1.1: {} - prettier@3.8.3: {} - prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - semver@7.8.2: {} - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -1801,7 +842,3 @@ snapshots: typescript@5.9.3: {} undici-types@7.24.6: {} - - undici-types@8.3.0: {} - - ws@8.21.0: {} diff --git a/tools/shank-and-codama/native/program/Cargo.lock b/tools/shank-and-codama/native/program/Cargo.lock index a30bf730..57ec182b 100644 --- a/tools/shank-and-codama/native/program/Cargo.lock +++ b/tools/shank-and-codama/native/program/Cargo.lock @@ -2,12 +2,385 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common 0.1.7", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes-gcm-siv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "polyval", + "subtle", + "zeroize", +] + +[[package]] +name = "agave-feature-set" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe79fc4c114c51ea8461d829bb49853a21a76c7c8ef20e9041b071558f628ce" +dependencies = [ + "ahash", + "solana-epoch-schedule", + "solana-hash 3.1.0", + "solana-pubkey 3.0.0", + "solana-sha256-hasher", + "solana-svm-feature-set", +] + +[[package]] +name = "agave-reserved-account-keys" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e8ceb5117fa390898f473b0d165f88482a2b36fb4a47441d8b40e22823207cb" +dependencies = [ + "agave-feature-set", + "solana-pubkey 3.0.0", + "solana-sdk-ids", +] + +[[package]] +name = "agave-syscalls" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98807b80e4367cc38c2b24ea30d6d16466553982aeedb0b0cb2c70bbae8ba5b0" +dependencies = [ + "bincode", + "libsecp256k1", + "num-traits", + "solana-account", + "solana-account-info", + "solana-big-mod-exp", + "solana-blake3-hasher", + "solana-bn254", + "solana-clock", + "solana-cpi", + "solana-curve25519", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keccak-hasher", + "solana-loader-v3-interface", + "solana-poseidon", + "solana-program-entrypoint", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-secp256k1-recover", + "solana-sha256-hasher", + "solana-stable-layout", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-type-overrides", + "solana-sysvar 3.1.1", + "solana-sysvar-id", + "solana-transaction-context", + "thiserror 2.0.18", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "anyhow" version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive 0.4.2", + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.6", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.6", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -20,6 +393,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + [[package]] name = "autocfg" version = "1.5.1" @@ -32,6 +411,12 @@ 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.22.1" @@ -71,6 +456,16 @@ dependencies = [ "cfg-if", "constant_time_eq", "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", ] [[package]] @@ -82,6 +477,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + [[package]] name = "borsh" version = "1.6.1" @@ -115,6 +519,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + [[package]] name = "bv" version = "0.11.1" @@ -130,6 +540,9 @@ 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" @@ -142,6 +555,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" version = "1.11.1" @@ -154,9 +573,30 @@ version = "0.1.0" dependencies = [ "borsh", "borsh-derive", + "car-rental-service-client", + "litesvm", "shank", + "solana-account", + "solana-instruction", + "solana-keypair", "solana-program", - "solana-system-interface", + "solana-pubkey 3.0.0", + "solana-system-interface 3.2.0", + "solana-transaction", +] + +[[package]] +name = "car-rental-service-client" +version = "0.1.0" +dependencies = [ + "borsh", + "num-derive", + "num-traits", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-program-error", + "solana-pubkey 3.0.0", ] [[package]] @@ -182,16 +622,56 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] -name = "const-oid" -version = "0.9.6" +name = "cfg_eval" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] [[package]] -name = "constant_time_eq" -version = "0.4.2" +name = "cipher" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.7", + "inout", +] + +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "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.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" [[package]] name = "cpufeatures" @@ -211,6 +691,12 @@ dependencies = [ "libc", ] +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + [[package]] name = "crypto-bigint" version = "0.5.5" @@ -218,7 +704,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -230,9 +716,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -242,10 +756,11 @@ dependencies = [ "cfg-if", "cpufeatures 0.2.17", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", - "rand_core", + "rand_core 0.6.4", "rustc_version", + "serde", "subtle", "zeroize", ] @@ -305,18 +820,61 @@ dependencies = [ "zeroize", ] +[[package]] +name = "derivation-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[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", + "block-buffer 0.10.4", "const-oid", - "crypto-common", + "crypto-common 0.1.7", "subtle", ] +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "crypto-common 0.2.2", + "ctutils", +] + +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + [[package]] name = "ecdsa" version = "0.16.9" @@ -324,13 +882,56 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", "spki", ] +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core 0.6.4", + "serde", + "sha2 0.10.9", + "subtle", + "zeroize", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + [[package]] name = "elliptic-curve" version = "0.13.8" @@ -339,17 +940,57 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", ] +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685adfa4d6f3d765a26bc5dbc936577de9abf756c1feeb3089b01dd395034842" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -368,7 +1009,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -408,6 +1049,36 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "059c31d7d36c43fe39d89e55711858b4da8be7eb6dabac23c7289b1a19489406" +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -419,15 +1090,40 @@ dependencies = [ "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.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "wasi", + "r-efi", + "wasip2", ] [[package]] @@ -437,10 +1133,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.4", "subtle", ] +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", +] + [[package]] name = "hashbrown" version = "0.17.1" @@ -453,7 +1176,16 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", +] + +[[package]] +name = "hybrid-array" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +dependencies = [ + "typenum", ] [[package]] @@ -469,7 +1201,69 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.17.1", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2025f20d7a4fa7785846e7b63d10a76d3f1cee98ee5cb79ea59703f95e42162" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", ] [[package]] @@ -482,7 +1276,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "sha2", + "sha2 0.10.9", "signature", ] @@ -508,57 +1302,272 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] -name = "lock_api" -version = "0.4.14" +name = "libsecp256k1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" dependencies = [ - "scopeguard", + "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 = "log" -version = "0.4.32" +name = "libsecp256k1-core" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] [[package]] -name = "memchr" -version = "2.8.1" +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] [[package]] -name = "memoffset" -version = "0.9.1" +name = "libsecp256k1-gen-genmult" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" dependencies = [ - "autocfg", + "libsecp256k1-core", ] [[package]] -name = "num-bigint" -version = "0.4.6" +name = "light-poseidon" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" dependencies = [ - "num-integer", - "num-traits", + "ark-bn254 0.4.0", + "ark-ff 0.4.2", + "num-bigint 0.4.6", + "thiserror 1.0.69", ] [[package]] -name = "num-integer" -version = "0.1.46" +name = "light-poseidon" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "47a1ccadd0bb5a32c196da536fd72c59183de24a055f6bf0513bf845fefab862" dependencies = [ - "num-traits", + "ark-bn254 0.5.0", + "ark-ff 0.5.0", + "num-bigint 0.4.6", + "thiserror 1.0.69", ] [[package]] -name = "num-traits" -version = "0.2.19" +name = "litesvm" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "347d8c652d592c618ac996f2ab21f8c0b0f2da3fbbca227a6887ee61bb75f2de" +dependencies = [ + "agave-feature-set", + "agave-reserved-account-keys", + "agave-syscalls", + "ansi_term", + "bincode", + "indexmap", + "itertools 0.14.0", + "log", + "serde", + "solana-account", + "solana-address 2.6.1", + "solana-address-lookup-table-interface", + "solana-bpf-loader-program", + "solana-builtins", + "solana-clock", + "solana-compute-budget", + "solana-compute-budget-instruction", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-feature-gate-interface", + "solana-fee", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction", + "solana-instructions-sysvar", + "solana-keypair", + "solana-last-restart-slot", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-message", + "solana-native-token", + "solana-nonce", + "solana-nonce-account", + "solana-precompile-error", + "solana-program-error", + "solana-program-runtime", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-sha256-hasher", + "solana-signature", + "solana-signer", + "solana-slot-hashes", + "solana-slot-history", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-log-collector", + "solana-svm-timings", + "solana-svm-transaction", + "solana-system-interface 2.0.0", + "solana-system-program", + "solana-sysvar 3.1.1", + "solana-sysvar-id", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "thiserror 2.0.18", +] + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" + +[[package]] +name = "memchr" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint 0.2.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[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-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "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-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ @@ -571,6 +1580,12 @@ version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +[[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.5" @@ -594,12 +1609,48 @@ dependencies = [ "windows-link", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pastey" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + [[package]] name = "pkcs8" version = "0.10.2" @@ -610,6 +1661,27 @@ dependencies = [ "spki", ] +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + [[package]] name = "proc-macro-crate" version = "3.5.0" @@ -628,6 +1700,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "qualifier_attr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "quote" version = "1.0.45" @@ -637,13 +1729,110 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.7.3" +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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[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_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[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", + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[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]] @@ -665,6 +1854,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + [[package]] name = "rustc_version" version = "0.4.1" @@ -674,6 +1869,12 @@ dependencies = [ "semver", ] +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "scopeguard" version = "1.2.0" @@ -710,6 +1911,25 @@ dependencies = [ "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.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -730,6 +1950,54 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "serde_json" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_with" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +dependencies = [ + "serde_core", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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 0.2.17", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.9" @@ -738,7 +2006,7 @@ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures 0.2.17", - "digest", + "digest 0.10.7", ] [[package]] @@ -753,7 +2021,7 @@ version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" dependencies = [ - "digest", + "digest 0.10.7", "keccak", ] @@ -815,16 +2083,40 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", - "rand_core", + "digest 0.10.7", + "rand_core 0.6.4", ] +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + [[package]] name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "solana-account" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efc0ed36decb689413b9da5d57f2be49eea5bebb3cf7897015167b0c4336e731" +dependencies = [ + "bincode", + "serde", + "serde_bytes", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-sysvar 3.1.1", +] + [[package]] name = "solana-account-info" version = "3.1.1" @@ -833,11 +2125,20 @@ checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" dependencies = [ "bincode", "serde_core", - "solana-address", + "solana-address 2.6.1", "solana-program-error", "solana-program-memory", ] +[[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.1", +] + [[package]] name = "solana-address" version = "2.6.1" @@ -861,6 +2162,24 @@ dependencies = [ "wincode", ] +[[package]] +name = "solana-address-lookup-table-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115b4f773acc4f3f3cb986b0d335e9845c0368c82b0940410935bc11ae065578" +dependencies = [ + "bincode", + "bytemuck", + "serde", + "serde_derive", + "solana-clock", + "solana-instruction", + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-slot-hashes", +] + [[package]] name = "solana-atomic-u64" version = "3.0.1" @@ -876,11 +2195,22 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30c80fb6d791b3925d5ec4bf23a7c169ef5090c013059ec3ed7d0b2c04efa085" dependencies = [ - "num-bigint", + "num-bigint 0.4.6", "num-traits", "solana-define-syscall 3.0.0", ] +[[package]] +name = "solana-bincode" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278a1a5bad62cd9da89ac8d4b7ec444e83caa8ae96aa656dfc27684b28d49a5d" +dependencies = [ + "bincode", + "serde_core", + "solana-instruction-error", +] + [[package]] name = "solana-blake3-hasher" version = "3.1.0" @@ -889,7 +2219,22 @@ checksum = "7116e1d942a2432ca3f514625104757ab8a56233787e95144c93950029e31176" dependencies = [ "blake3", "solana-define-syscall 4.0.1", - "solana-hash", + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-bn254" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ff13a8867fcc7b0f1114764e1bf6191b4551dcaf93729ddc676cd4ec6abc9f" +dependencies = [ + "ark-bn254 0.5.0", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "bytemuck", + "solana-define-syscall 5.1.0", + "thiserror 2.0.18", ] [[package]] @@ -901,6 +2246,73 @@ dependencies = [ "borsh", ] +[[package]] +name = "solana-bpf-loader-program" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb423db3faa08533a122f867456bb5b7aab211818af004552ea6df5f3c43ef49" +dependencies = [ + "agave-syscalls", + "bincode", + "qualifier_attr", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-instruction", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-packet", + "solana-program-entrypoint", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-transaction-context", +] + +[[package]] +name = "solana-builtins" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc47a5aefa70261825037efd942c2c78a600f4dcc110d59808b359c5d37aa941" +dependencies = [ + "agave-feature-set", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-hash 3.1.0", + "solana-loader-v4-program", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-program", + "solana-vote-program", + "solana-zk-elgamal-proof-program", + "solana-zk-token-proof-program", +] + +[[package]] +name = "solana-builtins-default-costs" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a91f5db54bebaffb93e8bd0d85575139597de7cb1ac32f040442fd66bc90ed0" +dependencies = [ + "agave-feature-set", + "ahash", + "log", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-loader-v4-program", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-program", + "solana-vote-program", +] + [[package]] name = "solana-clock" version = "3.1.0" @@ -914,6 +2326,57 @@ dependencies = [ "solana-sysvar-id", ] +[[package]] +name = "solana-compute-budget" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de86231371bf26dbcf473a0ea7ca424184db0c7720fafbb899d2fca2eaf1ac2" +dependencies = [ + "solana-fee-structure", + "solana-program-runtime", +] + +[[package]] +name = "solana-compute-budget-instruction" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27f3d546bf7f979423b8cca3c16ac9b51c80104b5f6bba77ef90b41aa00ec96d" +dependencies = [ + "agave-feature-set", + "log", + "solana-borsh", + "solana-builtins-default-costs", + "solana-compute-budget", + "solana-compute-budget-interface", + "solana-instruction", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-svm-transaction", + "solana-transaction-error", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-compute-budget-interface" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8292c436b269ad23cecc8b24f7da3ab07ca111661e25e00ce0e1d22771951ab9" +dependencies = [ + "borsh", + "solana-instruction", + "solana-sdk-ids", +] + +[[package]] +name = "solana-compute-budget-program" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b54b78862ca94a2a86354c22f2789ffd095c5f972c15ca104020697dd2cf3409" +dependencies = [ + "solana-program-runtime", +] + [[package]] name = "solana-cpi" version = "3.1.0" @@ -924,10 +2387,24 @@ dependencies = [ "solana-define-syscall 4.0.1", "solana-instruction", "solana-program-error", - "solana-pubkey", + "solana-pubkey 4.2.0", "solana-stable-layout", ] +[[package]] +name = "solana-curve25519" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aff7432cdf2ec6a44ac06b4d64d2ee006f6c0066d6456e032a7fe25be40cd5c" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "solana-define-syscall 3.0.0", + "subtle", + "thiserror 2.0.18", +] + [[package]] name = "solana-define-syscall" version = "3.0.0" @@ -946,6 +2423,17 @@ version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21e14a4f604117f379840956a8fc8695e4c84f5b0ebed192f31f60d9b85d581d" +[[package]] +name = "solana-derivation-path" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff71743072690fdbdfcdc37700ae1cb77485aaad49019473a81aee099b1e0b8c" +dependencies = [ + "derivation-path", + "qstring", + "uriparse", +] + [[package]] name = "solana-epoch-rewards" version = "3.0.2" @@ -954,7 +2442,7 @@ checksum = "1cddf2388b28291210d9aa60690740733cab527531f06ed153c4d388951e407c" dependencies = [ "serde", "serde_derive", - "solana-hash", + "solana-hash 4.4.0", "solana-sdk-ids", "solana-sdk-macro", "solana-sysvar-id", @@ -980,7 +2468,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "027e6d0b9e7daac5b2ac7c3f9ca1b727861121d9ef05084cf435ff736051e7c2" dependencies = [ "solana-define-syscall 5.1.0", - "solana-pubkey", + "solana-pubkey 4.2.0", ] [[package]] @@ -991,13 +2479,43 @@ checksum = "0eb265ff95e28eceda117e2e3d2d2a611ecbbfe911dfeeeecd1521814540ffab" dependencies = [ "serde", "serde_derive", - "solana-hash", + "solana-hash 4.4.0", "solana-instruction", "solana-nonce", - "solana-pubkey", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-system-interface 3.2.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-feature-gate-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-account", + "solana-account-info", + "solana-instruction", + "solana-program-error", + "solana-pubkey 4.2.0", + "solana-rent 4.2.0", "solana-sdk-ids", - "solana-system-interface", - "thiserror", + "solana-system-interface 3.2.0", +] + +[[package]] +name = "solana-fee" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c276ea9723bfb6bf9fa2bcde1fa652140b0879d258c78a482533c9c01f71f416" +dependencies = [ + "agave-feature-set", + "solana-fee-structure", + "solana-svm-transaction", ] [[package]] @@ -1011,6 +2529,21 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "solana-fee-structure" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2abdb1223eea8ec64136f39cb1ffcf257e00f915c957c35c0dd9e3f4e700b0" + +[[package]] +name = "solana-hash" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "337c246447142f660f778cf6cb582beba8e28deb05b3b24bfb9ffd7c562e5f41" +dependencies = [ + "solana-hash 4.4.0", +] + [[package]] name = "solana-hash" version = "4.4.0" @@ -1023,6 +2556,8 @@ dependencies = [ "five8", "serde", "serde_derive", + "solana-atomic-u64", + "solana-sanitize", ] [[package]] @@ -1037,7 +2572,7 @@ dependencies = [ "serde_derive", "solana-define-syscall 5.1.0", "solana-instruction-error", - "solana-pubkey", + "solana-pubkey 4.2.0", ] [[package]] @@ -1047,6 +2582,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0b188842592fdf6cb96f55263ae1bf11713ab5114401d1d5a881ed7cc41bef6" dependencies = [ "num-traits", + "serde", + "serde_derive", "solana-program-error", ] @@ -1075,7 +2612,23 @@ checksum = "ed1c0d16d6fdeba12291a1f068cdf0d479d9bff1141bf44afd7aa9d485f65ef8" dependencies = [ "sha3", "solana-define-syscall 4.0.1", - "solana-hash", + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-keypair" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "263d614c12aa267a3278703175fd6440552ca61bc960b5a02a4482720c53438b" +dependencies = [ + "ed25519-dalek", + "five8", + "five8_core", + "rand 0.9.4", + "solana-address 2.6.1", + "solana-seed-phrase", + "solana-signature", + "solana-signer", ] [[package]] @@ -1091,6 +2644,79 @@ dependencies = [ "solana-sysvar-id", ] +[[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", + "solana-pubkey 4.2.0", + "solana-sdk-ids", +] + +[[package]] +name = "solana-loader-v4-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c948b33ff81fa89699911b207059e493defdba9647eaf18f23abdf3674e0fb" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "solana-loader-v4-program" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4495b9ef97f369302d882f752465c563ac2aaf7f52cd1a9cf15891a90f986f5f" +dependencies = [ + "log", + "solana-account", + "solana-bincode", + "solana-bpf-loader-program", + "solana-instruction", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-transaction-context", +] + +[[package]] +name = "solana-message" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" +dependencies = [ + "bincode", + "blake3", + "lazy_static", + "serde", + "serde_derive", + "solana-address 2.6.1", + "solana-hash 4.4.0", + "solana-instruction", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-transaction-error", +] + [[package]] name = "solana-msg" version = "3.1.0" @@ -1112,34 +2738,80 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d95dbc9f2e33b6c10e231df15cb2a3bff9ea7eab6347f9e316fe75c97fd67bbb" dependencies = [ + "serde", + "serde_derive", "solana-fee-calculator", - "solana-hash", - "solana-pubkey", + "solana-hash 4.4.0", + "solana-pubkey 4.2.0", "solana-sha256-hasher", ] [[package]] -name = "solana-program" -version = "4.0.0" +name = "solana-nonce-account" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778f08fb0eaf52c9a3bef2978247f7fab0ccfddc44cfddb936d5ad9f98ede886" +checksum = "805fd25b29e5a1a0e6c3dd6320c9da80f275fbe4ff6e392617c303a2085c435e" dependencies = [ - "memoffset", - "solana-account-info", - "solana-big-mod-exp", - "solana-blake3-hasher", - "solana-borsh", - "solana-clock", - "solana-cpi", - "solana-define-syscall 5.1.0", - "solana-epoch-rewards", - "solana-epoch-schedule", - "solana-epoch-stake", - "solana-example-mocks", - "solana-fee-calculator", - "solana-hash", - "solana-instruction", - "solana-instruction-error", + "solana-account", + "solana-hash 3.1.0", + "solana-nonce", + "solana-sdk-ids", +] + +[[package]] +name = "solana-packet" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edf2f25743c95229ac0fdc32f8f5893ef738dbf332c669e9861d33ddb0f469d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "solana-poseidon" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13ac13134287d7af80717353a8136e3c515d7f34d88e6f116b47350bd623e338" +dependencies = [ + "ark-bn254 0.4.0", + "ark-bn254 0.5.0", + "light-poseidon 0.2.0", + "light-poseidon 0.4.0", + "solana-define-syscall 3.0.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-precompile-error" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cafcd950de74c6c39d55dc8ca108bbb007799842ab370ef26cf45a34453c31e1" +dependencies = [ + "num-traits", +] + +[[package]] +name = "solana-program" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778f08fb0eaf52c9a3bef2978247f7fab0ccfddc44cfddb936d5ad9f98ede886" +dependencies = [ + "memoffset", + "solana-account-info", + "solana-big-mod-exp", + "solana-blake3-hasher", + "solana-borsh", + "solana-clock", + "solana-cpi", + "solana-define-syscall 5.1.0", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-epoch-stake", + "solana-example-mocks", + "solana-fee-calculator", + "solana-hash 4.4.0", + "solana-instruction", + "solana-instruction-error", "solana-instructions-sysvar", "solana-keccak-hasher", "solana-last-restart-slot", @@ -1150,8 +2822,8 @@ dependencies = [ "solana-program-memory", "solana-program-option", "solana-program-pack", - "solana-pubkey", - "solana-rent", + "solana-pubkey 4.2.0", + "solana-rent 4.2.0", "solana-sdk-ids", "solana-secp256k1-recover", "solana-serde-varint", @@ -1161,7 +2833,7 @@ dependencies = [ "solana-slot-hashes", "solana-slot-history", "solana-stable-layout", - "solana-sysvar", + "solana-sysvar 4.0.0", "solana-sysvar-id", ] @@ -1174,7 +2846,7 @@ dependencies = [ "solana-account-info", "solana-define-syscall 4.0.1", "solana-program-error", - "solana-pubkey", + "solana-pubkey 4.2.0", ] [[package]] @@ -1212,13 +2884,80 @@ dependencies = [ "solana-program-error", ] +[[package]] +name = "solana-program-runtime" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c03c5100c43bf28fd03a11b66345ccdc28c1b7e5a7d49dbcff64e6442595627" +dependencies = [ + "base64 0.22.1", + "bincode", + "itertools 0.12.1", + "log", + "percentage", + "rand 0.8.6", + "serde", + "solana-account", + "solana-account-info", + "solana-clock", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-loader-v3-interface", + "solana-program-entrypoint", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-slot-hashes", + "solana-stable-layout", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-transaction", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-sysvar 3.1.1", + "solana-sysvar-id", + "solana-transaction-context", + "thiserror 2.0.18", +] + +[[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", + "solana-address 2.6.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", + "solana-sdk-macro", + "solana-sysvar-id", ] [[package]] @@ -1240,13 +2979,30 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" +[[package]] +name = "solana-sbpf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15b079e08471a9dbfe1e48b2c7439c85aa2a055cbd54eddd8bd257b0a7dbb29" +dependencies = [ + "byteorder", + "combine", + "hash32", + "libc", + "log", + "rand 0.8.6", + "rustc-demangle", + "thiserror 2.0.18", + "winapi", +] + [[package]] name = "solana-sdk-ids" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" dependencies = [ - "solana-address", + "solana-address 2.6.1", ] [[package]] @@ -1267,141 +3023,563 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c5f18893d62e6c73117dcba48f8f5e3266d90e5ec3d0a0a90f9785adac36c1" dependencies = [ - "k256", + "k256", + "solana-define-syscall 5.1.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-seed-derivable" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff7bdb72758e3bec33ed0e2658a920f1f35dfb9ed576b951d20d63cb61ecd95c" +dependencies = [ + "solana-derivation-path", +] + +[[package]] +name = "solana-seed-phrase" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc905b200a95f2ea9146e43f2a7181e3aeb55de6bc12afb36462d00a3c7310de" +dependencies = [ + "hmac", + "pbkdf2", + "sha2 0.10.9", +] + +[[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 = "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", +] + +[[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.9", + "solana-define-syscall 4.0.1", + "solana-hash 4.4.0", +] + +[[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 = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0364c7577c3c82a693ce28a1febc8d1b5d1b0a175fdc2114ae6186b69effe1e" +dependencies = [ + "ed25519-dalek", + "five8", + "serde", + "serde-big-array", + "serde_derive", + "solana-sanitize", + "wincode", +] + +[[package]] +name = "solana-signer" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520bd6021163ee517f4bdc7ae03ded904f97e11320001ba0b3355f45eb14f558" +dependencies = [ + "solana-pubkey 4.2.0", + "solana-signature", + "solana-transaction-error", +] + +[[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.4.0", + "solana-sdk-ids", + "solana-sysvar-id", +] + +[[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", + "solana-sysvar-id", +] + +[[package]] +name = "solana-stable-layout" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9f6a291ba063a37780af29e7db14bdd3dc447584d8ba5b3fc4b88e2bbc982fa" +dependencies = [ + "solana-instruction", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-stake-interface" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9bc26191b533f9a6e5a14cca05174119819ced680a80febff2f5051a713f0db" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-clock", + "solana-cpi", + "solana-instruction", + "solana-program-error", + "solana-pubkey 3.0.0", + "solana-system-interface 2.0.0", + "solana-sysvar 3.1.1", + "solana-sysvar-id", +] + +[[package]] +name = "solana-svm-callback" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "012617d16d2994673d98792f7f6d93f612dea00b1b747a3c4aec24c12547875b" +dependencies = [ + "solana-account", + "solana-clock", + "solana-precompile-error", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-svm-feature-set" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cc2e2fdebd77159b7a14ee45c9dbb3f1d202e8e7ccc14e4cda78c006a7a78a9" + +[[package]] +name = "solana-svm-log-collector" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ce188c2c438ced63a975af79f06db2ff5accaf1a4027a26e35783be566f6070" +dependencies = [ + "log", +] + +[[package]] +name = "solana-svm-measure" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea64909ba06fa651c95c4db35614430b1a0bc722e51996e97b5b779e3528bad" + +[[package]] +name = "solana-svm-timings" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a05b09e2caac9b4d7c35c5997d754433e15ee5f506509117eb77032e1718ac" +dependencies = [ + "eager", + "enum-iterator", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-svm-transaction" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be3250a278a769ba59059e13d0f16c2aba0ca1de7595fb0e02556091751560c8" +dependencies = [ + "solana-hash 3.1.0", + "solana-message", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-signature", + "solana-transaction", +] + +[[package]] +name = "solana-svm-type-overrides" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b78cd0bfb102d4197ce8c590f800a119ba0d358369ca57b0f66e94d1317fd0e" +dependencies = [ + "rand 0.8.6", +] + +[[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", + "solana-msg", + "solana-program-error", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-system-interface" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55b54965bf0b76fa8e2b35376583efddd4d916618cfe595bf48c7d7b55a9e628" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-address 2.6.1", + "solana-instruction", + "solana-msg", + "solana-program-error", +] + +[[package]] +name = "solana-system-program" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4b6faeddf5a62c06991a9a077fd1097da6867060f884595a659b3b24dc3a4a" +dependencies = [ + "bincode", + "log", + "serde", + "solana-account", + "solana-bincode", + "solana-fee-calculator", + "solana-instruction", + "solana-nonce", + "solana-nonce-account", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-sysvar 3.1.1", + "solana-transaction-context", +] + +[[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", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-define-syscall 4.0.1", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash 4.4.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-pubkey 4.2.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-slot-hashes", + "solana-slot-history", + "solana-sysvar-id", +] + +[[package]] +name = "solana-sysvar" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1632b69b4f72489db5949a10e8308c229dfa003f99ecaa7477b376807c7b81f4" +dependencies = [ + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info", + "solana-clock", "solana-define-syscall 5.1.0", - "thiserror", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash 4.4.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-pubkey 4.2.0", + "solana-rent 4.2.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-slot-hashes", + "solana-slot-history", + "solana-sysvar-id", ] [[package]] -name = "solana-serde-varint" -version = "3.0.1" +name = "solana-sysvar-id" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "950e5b83e839dc0f92c66afc124bb8f40e89bc90f0579e8ec5499296d27f54e3" +checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" dependencies = [ - "serde", + "solana-address 2.6.1", + "solana-sdk-ids", ] [[package]] -name = "solana-serialize-utils" -version = "3.1.2" +name = "solana-transaction" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "761357b0853c9623bf12c1d2314b3d6160a85b087b84c45224fb85766d22616b" +checksum = "96697cff5075a028265324255efed226099f6d761ca67342b230d09f72cc48d2" dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-address 2.6.1", + "solana-hash 4.4.0", + "solana-instruction", "solana-instruction-error", - "solana-pubkey", + "solana-message", "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-signature", + "solana-signer", + "solana-transaction-error", ] [[package]] -name = "solana-sha256-hasher" -version = "3.1.0" +name = "solana-transaction-context" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db7dc3011ea4c0334aaaa7e7128cb390ecf546b28d412e9bf2064680f57f588f" +checksum = "b1a3c3a69688293a195b02c60a5384d855b8de19981f404c71ccb9e7f139b98f" dependencies = [ - "sha2", - "solana-define-syscall 4.0.1", - "solana-hash", + "bincode", + "serde", + "solana-account", + "solana-instruction", + "solana-instructions-sysvar", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sbpf", + "solana-sdk-ids", ] [[package]] -name = "solana-short-vec" +name = "solana-transaction-error" version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb8cc883fc7b8ce4a7814cb1441b48c06437049ec11847005cf63bcfa85c546" - -[[package]] -name = "solana-slot-hashes" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a57c158c35629f9e302ab385f16b15813f4927a31c27dda72f3df828bb08d93" +checksum = "2441d6dcd51100e7d97c3fb3b723e08aa701066ff7afc00026fd8d8e222cb95b" dependencies = [ "serde", "serde_derive", - "solana-hash", - "solana-sdk-ids", - "solana-sysvar-id", + "solana-instruction-error", + "solana-sanitize", ] [[package]] -name = "solana-slot-history" -version = "3.0.1" +name = "solana-vote-interface" +version = "4.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0622d03a823770f7763afd866e012b296d5a3cbbbe51e110b5bd9ab3441efdca" +checksum = "db6e123e16bfdd7a81d71b4c4699e0b29580b619f4cd2ef5b6aae1eb85e8979f" dependencies = [ - "bv", + "bincode", + "cfg_eval", + "num-derive", + "num-traits", "serde", "serde_derive", + "serde_with", + "solana-clock", + "solana-hash 3.1.0", + "solana-instruction", + "solana-instruction-error", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", "solana-sdk-ids", - "solana-sysvar-id", + "solana-serde-varint", + "solana-serialize-utils", + "solana-short-vec", + "solana-system-interface 2.0.0", ] [[package]] -name = "solana-stable-layout" -version = "3.0.1" +name = "solana-vote-program" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9f6a291ba063a37780af29e7db14bdd3dc447584d8ba5b3fc4b88e2bbc982fa" +checksum = "4164d0eb4760cbdb3dd46457999dba735079774381fe4042a70ec7484930a297" dependencies = [ + "agave-feature-set", + "bincode", + "log", + "num-derive", + "num-traits", + "serde", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-epoch-schedule", + "solana-hash 3.1.0", "solana-instruction", - "solana-pubkey", + "solana-keypair", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-signer", + "solana-slot-hashes", + "solana-transaction", + "solana-transaction-context", + "solana-vote-interface", + "thiserror 2.0.18", ] [[package]] -name = "solana-system-interface" -version = "3.2.0" +name = "solana-zk-elgamal-proof-program" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55b54965bf0b76fa8e2b35376583efddd4d916618cfe595bf48c7d7b55a9e628" +checksum = "14f30c80edc4aac841745f7e93bbf1afc27d2b496b8ae9fe9777935151cb9352" dependencies = [ + "agave-feature-set", + "bytemuck", + "num-derive", "num-traits", - "serde", - "serde_derive", - "solana-address", "solana-instruction", - "solana-msg", - "solana-program-error", + "solana-program-runtime", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-zk-sdk", ] [[package]] -name = "solana-sysvar" +name = "solana-zk-sdk" version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1632b69b4f72489db5949a10e8308c229dfa003f99ecaa7477b376807c7b81f4" +checksum = "9602bcb1f7af15caef92b91132ec2347e1c51a72ecdbefdaefa3eac4b8711475" dependencies = [ - "base64", + "aes-gcm-siv", + "base64 0.22.1", "bincode", "bytemuck", "bytemuck_derive", - "lazy_static", + "curve25519-dalek", + "getrandom 0.2.17", + "itertools 0.12.1", + "js-sys", + "merlin", + "num-derive", + "num-traits", + "rand 0.8.6", "serde", "serde_derive", - "solana-account-info", - "solana-clock", - "solana-define-syscall 5.1.0", - "solana-epoch-rewards", - "solana-epoch-schedule", - "solana-fee-calculator", - "solana-hash", + "serde_json", + "sha3", + "solana-derivation-path", "solana-instruction", - "solana-last-restart-slot", - "solana-program-entrypoint", - "solana-program-error", - "solana-program-memory", - "solana-pubkey", - "solana-rent", + "solana-pubkey 3.0.0", "solana-sdk-ids", - "solana-sdk-macro", - "solana-slot-hashes", - "solana-slot-history", - "solana-sysvar-id", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", + "subtle", + "thiserror 2.0.18", + "wasm-bindgen", + "zeroize", ] [[package]] -name = "solana-sysvar-id" -version = "3.1.0" +name = "solana-zk-token-proof-program" +version = "3.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" +checksum = "962938a9994cc6d54b46b5f0d6a978024f4847272f560f8f11edd1575a0d8e8f" +dependencies = [ + "agave-feature-set", + "bytemuck", + "num-derive", + "num-traits", + "solana-instruction", + "solana-program-runtime", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-zk-token-sdk", +] + +[[package]] +name = "solana-zk-token-sdk" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5fe47f0389206960e272a6f1af3b06c2b32551be77f9e4254564b6d1177b83" dependencies = [ - "solana-address", + "aes-gcm-siv", + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "itertools 0.12.1", + "merlin", + "num-derive", + "num-traits", + "rand 0.8.6", + "serde", + "serde_json", + "sha3", + "solana-curve25519", + "solana-derivation-path", + "solana-instruction", + "solana-pubkey 3.0.0", "solana-sdk-ids", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", + "subtle", + "thiserror 2.0.18", + "zeroize", ] [[package]] @@ -1448,13 +3626,33 @@ dependencies = [ "unicode-ident", ] +[[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", + "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]] @@ -1525,18 +3723,135 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[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.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasip2" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a254a4b10c19a76f09a27640e7ffbf9bc30bf67e16a3bf28aaefa4920fe81563" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24a40fc75b0ec6f3746ceb10d36f53a93dcd68a93b11b6445983945d79eba0dc" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "908f34bd9b9ce3d4caf07b72dfab63d61504d156856c6bd3cd87fa350cf3985b" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7acbf7616c27b194bbb550bf77ed0c2c3e5b7fd1260a93082b95fb7f47959b92" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "wincode" version = "0.5.5" @@ -1546,7 +3861,7 @@ dependencies = [ "pastey", "proc-macro2", "quote", - "thiserror", + "thiserror 2.0.18", "wincode-derive", ] @@ -1577,8 +3892,54 @@ dependencies = [ "memchr", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "zerocopy" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "zeroize" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/tools/shank-and-codama/native/program/Cargo.toml b/tools/shank-and-codama/native/program/Cargo.toml index 1e7dd9d9..1b58513f 100644 --- a/tools/shank-and-codama/native/program/Cargo.toml +++ b/tools/shank-and-codama/native/program/Cargo.toml @@ -10,6 +10,15 @@ shank = "0.4.8" solana-program = "4.0" solana-system-interface = { version = "3", features = ["bincode"] } +[dev-dependencies] +car-rental-service-client = { path = "../clients/rust" } +litesvm = "0.11.0" +solana-account = "3.0" +solana-instruction = "3.0" +solana-keypair = "3.0" +solana-pubkey = "3.0" +solana-transaction = "3.0" + # This example is intentionally standalone (not part of the root workspace), # so it pins its own dependency versions and has its own Cargo.lock. [workspace] diff --git a/tools/shank-and-codama/native/program/tests/test.rs b/tools/shank-and-codama/native/program/tests/test.rs new file mode 100644 index 00000000..b31c830c --- /dev/null +++ b/tools/shank-and-codama/native/program/tests/test.rs @@ -0,0 +1,329 @@ +// In-process integration test for the car rental service program. +// +// Runs entirely in CI with no network: the program .so is loaded into a +// LiteSVM instance and exercised through the Codama-generated Rust client +// (clients/rust). It walks the full rental lifecycle (add_car, book_rental, +// pick_up_car, return_car), asserting onchain account state after each step, +// and verifies the program's account validation: a non-signing payer, a +// rental account owned by the wrong program, and an invalid status transition +// are all rejected. + +use car_rental_service_client::generated::{ + accounts::{Car, RentalOrder}, + instructions::{ + AddCar, AddCarInstructionArgs, BookRental, BookRentalInstructionArgs, PickUpCar, ReturnCar, + }, + programs::CAR_RENTAL_SERVICE_ID, + types::RentalOrderStatus, +}; +use litesvm::LiteSVM; +use solana_account::Account; +use solana_instruction::{AccountMeta, Instruction}; +use solana_keypair::{Keypair, Signer}; +use solana_pubkey::Pubkey; +use solana_transaction::Transaction; + +// The .so is built into program/target/deploy by +// `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the +// project root; `pnpm build` runs the same command). Rebuild after every +// program change: the binary is embedded at test-compile time, so a stale +// .so silently tests old code. +const PROGRAM_SO: &[u8] = include_bytes!("../target/deploy/car_rental_service.so"); + +// Custom error codes from program/src/error.rs (CarRentalError). The enum +// starts at 6000, matching Anchor's custom-error offset. +const ERROR_PAYER_SIGNATURE_MISSING: u32 = 6002; +const ERROR_RENTAL_ACCOUNT_NOT_OWNED_BY_PROGRAM: u32 = 6003; +const ERROR_RENTAL_NOT_IN_PICKED_UP_STATUS: u32 = 6005; + +const SYSTEM_PROGRAM_ID: Pubkey = Pubkey::new_from_array([0u8; 32]); + +fn load_svm() -> LiteSVM { + let mut svm = LiteSVM::new(); + svm.add_program(CAR_RENTAL_SERVICE_ID, PROGRAM_SO).unwrap(); + svm +} + +fn funded_signer(svm: &mut LiteSVM) -> Keypair { + let signer = Keypair::new(); + svm.airdrop(&signer.pubkey(), 10_000_000_000).unwrap(); + signer +} + +fn car_pda(make: &str, model: &str) -> Pubkey { + Pubkey::find_program_address( + &[b"car", make.as_bytes(), model.as_bytes()], + &CAR_RENTAL_SERVICE_ID, + ) + .0 +} + +fn rental_pda(car: &Pubkey, payer: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[b"rental_order", car.as_ref(), payer.as_ref()], + &CAR_RENTAL_SERVICE_ID, + ) + .0 +} + +fn send_instruction(svm: &mut LiteSVM, payer: &Keypair, instruction: Instruction) { + let transaction = Transaction::new_signed_with_payer( + &[instruction], + Some(&payer.pubkey()), + &[payer], + svm.latest_blockhash(), + ); + if let Err(failure) = svm.send_transaction(transaction) { + panic!( + "transaction failed: {:?}\n{}", + failure.err, + failure.meta.logs.join("\n") + ); + } +} + +// Assert that sending `instruction` fails with the given custom error code. +// The runtime logs custom errors as hex, e.g. "custom program error: 0x1772". +fn send_expecting_custom_error( + svm: &mut LiteSVM, + payer: &Keypair, + instruction: Instruction, + error_code: u32, +) { + let transaction = Transaction::new_signed_with_payer( + &[instruction], + Some(&payer.pubkey()), + &[payer], + svm.latest_blockhash(), + ); + match svm.send_transaction(transaction) { + Ok(_) => panic!("expected custom program error {error_code}, transaction succeeded"), + Err(failure) => { + let error_code_hex = format!("0x{error_code:x}"); + let logs = failure.meta.logs.join("\n"); + assert!( + logs.contains(&error_code_hex), + "expected custom program error {error_code} ({error_code_hex}) in logs, got:\n{logs}" + ); + } + } +} + +fn fetch_rental_order(svm: &LiteSVM, rental_account: &Pubkey) -> RentalOrder { + let account = svm.get_account(rental_account).unwrap(); + RentalOrder::from_bytes(&account.data).unwrap() +} + +fn add_car_instruction(payer: &Keypair, make: &str, model: &str, year: u16) -> Instruction { + AddCar { + car_account: car_pda(make, model), + payer: payer.pubkey(), + system_program: SYSTEM_PROGRAM_ID, + } + .instruction(AddCarInstructionArgs { + year, + make: make.to_string(), + model: model.to_string(), + }) +} + +fn book_rental_instruction( + payer: &Keypair, + car_account: &Pubkey, + name: &str, + price: u64, +) -> Instruction { + BookRental { + rental_account: rental_pda(car_account, &payer.pubkey()), + car_account: *car_account, + payer: payer.pubkey(), + system_program: SYSTEM_PROGRAM_ID, + } + .instruction(BookRentalInstructionArgs { + name: name.to_string(), + pick_up_date: "01/28/2023 8:00 AM".to_string(), + return_date: "01/28/2023 10:00 PM".to_string(), + price, + }) +} + +#[test] +fn full_lifecycle_add_book_pick_up_return() { + let mut svm = load_svm(); + let payer = funded_signer(&mut svm); + + // 1. add_car + let make = "BMW"; + let model = "iX1"; + let car_account = car_pda(make, model); + send_instruction(&mut svm, &payer, add_car_instruction(&payer, make, model, 2020)); + + let car = Car::from_bytes(&svm.get_account(&car_account).unwrap().data).unwrap(); + assert_eq!(car.year, 2020); + assert_eq!(car.make, make); + assert_eq!(car.model, model); + + // 2. book_rental + let rental_account = rental_pda(&car_account, &payer.pubkey()); + send_instruction( + &mut svm, + &payer, + book_rental_instruction(&payer, &car_account, "Fred Flintstone", 300), + ); + let rental = fetch_rental_order(&svm, &rental_account); + assert_eq!(rental.name, "Fred Flintstone"); + assert_eq!(rental.car, car_account); + assert_eq!(rental.price, 300); + assert_eq!(rental.status, RentalOrderStatus::Created); + + // 3. pick_up_car + send_instruction( + &mut svm, + &payer, + PickUpCar { + rental_account, + car_account, + payer: payer.pubkey(), + } + .instruction(), + ); + assert_eq!( + fetch_rental_order(&svm, &rental_account).status, + RentalOrderStatus::PickedUp + ); + + // 4. return_car + send_instruction( + &mut svm, + &payer, + ReturnCar { + rental_account, + car_account, + payer: payer.pubkey(), + } + .instruction(), + ); + assert_eq!( + fetch_rental_order(&svm, &rental_account).status, + RentalOrderStatus::Returned + ); +} + +#[test] +fn pick_up_car_rejects_a_payer_that_did_not_sign() { + let mut svm = load_svm(); + let victim = funded_signer(&mut svm); + let attacker = funded_signer(&mut svm); + + let make = "Tesla"; + let model = "Model 3"; + let car_account = car_pda(make, model); + send_instruction(&mut svm, &victim, add_car_instruction(&victim, make, model, 2024)); + + let rental_account = rental_pda(&car_account, &victim.pubkey()); + send_instruction( + &mut svm, + &victim, + book_rental_instruction(&victim, &car_account, "Wilma Flintstone", 250), + ); + + // The attacker names the victim as `payer` but cannot produce the victim's + // signature, so the account meta is demoted to a plain writable account. + let mut instruction = PickUpCar { + rental_account, + car_account, + payer: victim.pubkey(), + } + .instruction(); + for account in &mut instruction.accounts { + if account.pubkey == victim.pubkey() { + *account = AccountMeta::new(account.pubkey, false); + } + } + send_expecting_custom_error( + &mut svm, + &attacker, + instruction, + ERROR_PAYER_SIGNATURE_MISSING, + ); + + // The rental is untouched. + assert_eq!( + fetch_rental_order(&svm, &rental_account).status, + RentalOrderStatus::Created + ); +} + +#[test] +fn pick_up_car_rejects_a_rental_account_not_owned_by_the_program() { + let mut svm = load_svm(); + let payer = funded_signer(&mut svm); + + let make = "Volvo"; + let model = "EX30"; + let car_account = car_pda(make, model); + send_instruction(&mut svm, &payer, add_car_instruction(&payer, make, model, 2025)); + + // Plant an account with plausible rental data at the correct PDA address, + // but owned by the system program instead of the rental program. + let rental_account = rental_pda(&car_account, &payer.pubkey()); + let planted_data_length = 165; + svm.set_account( + rental_account, + Account { + lamports: 10_000_000, + data: vec![0u8; planted_data_length], + owner: SYSTEM_PROGRAM_ID, + executable: false, + rent_epoch: 0, + }, + ) + .unwrap(); + + send_expecting_custom_error( + &mut svm, + &payer, + PickUpCar { + rental_account, + car_account, + payer: payer.pubkey(), + } + .instruction(), + ERROR_RENTAL_ACCOUNT_NOT_OWNED_BY_PROGRAM, + ); +} + +#[test] +fn return_car_rejects_a_rental_that_was_never_picked_up() { + let mut svm = load_svm(); + let payer = funded_signer(&mut svm); + + let make = "Kia"; + let model = "EV9"; + let car_account = car_pda(make, model); + send_instruction(&mut svm, &payer, add_car_instruction(&payer, make, model, 2023)); + + let rental_account = rental_pda(&car_account, &payer.pubkey()); + send_instruction( + &mut svm, + &payer, + book_rental_instruction(&payer, &car_account, "Barney Rubble", 400), + ); + + // Created -> Returned skips PickedUp and must be rejected. + send_expecting_custom_error( + &mut svm, + &payer, + ReturnCar { + rental_account, + car_account, + payer: payer.pubkey(), + } + .instruction(), + ERROR_RENTAL_NOT_IN_PICKED_UP_STATUS, + ); + assert_eq!( + fetch_rental_order(&svm, &rental_account).status, + RentalOrderStatus::Created + ); +} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts deleted file mode 100644 index 1da00ac7..00000000 --- a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/car.ts +++ /dev/null @@ -1,113 +0,0 @@ -/** - * This code was AUTOGENERATED using the Codama library. - * Please DO NOT EDIT THIS FILE, instead use visitors - * to add features, then rerun Codama to update it. - * - * @see https://github.com/codama-idl/codama - */ - -import { - type Account, - type Address, - addDecoderSizePrefix, - addEncoderSizePrefix, - assertAccountExists, - assertAccountsExist, - type Codec, - combineCodec, - type Decoder, - decodeAccount, - type EncodedAccount, - type Encoder, - type FetchAccountConfig, - type FetchAccountsConfig, - fetchEncodedAccount, - fetchEncodedAccounts, - getStructDecoder, - getStructEncoder, - getU16Decoder, - getU16Encoder, - getU32Decoder, - getU32Encoder, - getUtf8Decoder, - getUtf8Encoder, - type MaybeAccount, - type MaybeEncodedAccount, -} from "@solana/kit"; - -export type Car = { year: number; make: string; model: string }; - -export type CarArgs = Car; - -/** Gets the encoder for {@link CarArgs} account data. */ -export function getCarEncoder(): Encoder { - return getStructEncoder([ - ["year", getU16Encoder()], - ["make", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - ["model", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - ]); -} - -/** Gets the decoder for {@link Car} account data. */ -export function getCarDecoder(): Decoder { - return getStructDecoder([ - ["year", getU16Decoder()], - ["make", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], - ["model", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], - ]); -} - -/** Gets the codec for {@link Car} account data. */ -export function getCarCodec(): Codec { - return combineCodec(getCarEncoder(), getCarDecoder()); -} - -export function decodeCar( - encodedAccount: EncodedAccount, -): Account; -export function decodeCar( - encodedAccount: MaybeEncodedAccount, -): MaybeAccount; -export function decodeCar( - encodedAccount: EncodedAccount | MaybeEncodedAccount, -): Account | MaybeAccount { - return decodeAccount(encodedAccount as MaybeEncodedAccount, getCarDecoder()); -} - -export async function fetchCar( - rpc: Parameters[0], - address: Address, - config?: FetchAccountConfig, -): Promise> { - const maybeAccount = await fetchMaybeCar(rpc, address, config); - assertAccountExists(maybeAccount); - return maybeAccount; -} - -export async function fetchMaybeCar( - rpc: Parameters[0], - address: Address, - config?: FetchAccountConfig, -): Promise> { - const maybeAccount = await fetchEncodedAccount(rpc, address, config); - return decodeCar(maybeAccount); -} - -export async function fetchAllCar( - rpc: Parameters[0], - addresses: Array
, - config?: FetchAccountsConfig, -): Promise[]> { - const maybeAccounts = await fetchAllMaybeCar(rpc, addresses, config); - assertAccountsExist(maybeAccounts); - return maybeAccounts; -} - -export async function fetchAllMaybeCar( - rpc: Parameters[0], - addresses: Array
, - config?: FetchAccountsConfig, -): Promise[]> { - const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config); - return maybeAccounts.map((maybeAccount) => decodeCar(maybeAccount)); -} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/index.ts b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/index.ts deleted file mode 100644 index 7b2f3b87..00000000 --- a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * This code was AUTOGENERATED using the Codama library. - * Please DO NOT EDIT THIS FILE, instead use visitors - * to add features, then rerun Codama to update it. - * - * @see https://github.com/codama-idl/codama - */ - -export * from "./car"; -export * from "./rentalOrder"; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts b/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts deleted file mode 100644 index 668a53c9..00000000 --- a/tools/shank-and-codama/native/tests/generated/src/generated/accounts/rentalOrder.ts +++ /dev/null @@ -1,141 +0,0 @@ -/** - * This code was AUTOGENERATED using the Codama library. - * Please DO NOT EDIT THIS FILE, instead use visitors - * to add features, then rerun Codama to update it. - * - * @see https://github.com/codama-idl/codama - */ - -import { - type Account, - type Address, - addDecoderSizePrefix, - addEncoderSizePrefix, - assertAccountExists, - assertAccountsExist, - type Codec, - combineCodec, - type Decoder, - decodeAccount, - type EncodedAccount, - type Encoder, - type FetchAccountConfig, - type FetchAccountsConfig, - fetchEncodedAccount, - fetchEncodedAccounts, - getAddressDecoder, - getAddressEncoder, - getStructDecoder, - getStructEncoder, - getU32Decoder, - getU32Encoder, - getU64Decoder, - getU64Encoder, - getUtf8Decoder, - getUtf8Encoder, - type MaybeAccount, - type MaybeEncodedAccount, -} from "@solana/kit"; -import { - getRentalOrderStatusDecoder, - getRentalOrderStatusEncoder, - type RentalOrderStatus, - type RentalOrderStatusArgs, -} from "../types"; - -export type RentalOrder = { - car: Address; - name: string; - pickUpDate: string; - returnDate: string; - price: bigint; - status: RentalOrderStatus; -}; - -export type RentalOrderArgs = { - car: Address; - name: string; - pickUpDate: string; - returnDate: string; - price: number | bigint; - status: RentalOrderStatusArgs; -}; - -/** Gets the encoder for {@link RentalOrderArgs} account data. */ -export function getRentalOrderEncoder(): Encoder { - return getStructEncoder([ - ["car", getAddressEncoder()], - ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - ["pickUpDate", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - ["returnDate", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - ["price", getU64Encoder()], - ["status", getRentalOrderStatusEncoder()], - ]); -} - -/** Gets the decoder for {@link RentalOrder} account data. */ -export function getRentalOrderDecoder(): Decoder { - return getStructDecoder([ - ["car", getAddressDecoder()], - ["name", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], - ["pickUpDate", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], - ["returnDate", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], - ["price", getU64Decoder()], - ["status", getRentalOrderStatusDecoder()], - ]); -} - -/** Gets the codec for {@link RentalOrder} account data. */ -export function getRentalOrderCodec(): Codec { - return combineCodec(getRentalOrderEncoder(), getRentalOrderDecoder()); -} - -export function decodeRentalOrder( - encodedAccount: EncodedAccount, -): Account; -export function decodeRentalOrder( - encodedAccount: MaybeEncodedAccount, -): MaybeAccount; -export function decodeRentalOrder( - encodedAccount: EncodedAccount | MaybeEncodedAccount, -): Account | MaybeAccount { - return decodeAccount(encodedAccount as MaybeEncodedAccount, getRentalOrderDecoder()); -} - -export async function fetchRentalOrder( - rpc: Parameters[0], - address: Address, - config?: FetchAccountConfig, -): Promise> { - const maybeAccount = await fetchMaybeRentalOrder(rpc, address, config); - assertAccountExists(maybeAccount); - return maybeAccount; -} - -export async function fetchMaybeRentalOrder( - rpc: Parameters[0], - address: Address, - config?: FetchAccountConfig, -): Promise> { - const maybeAccount = await fetchEncodedAccount(rpc, address, config); - return decodeRentalOrder(maybeAccount); -} - -export async function fetchAllRentalOrder( - rpc: Parameters[0], - addresses: Array
, - config?: FetchAccountsConfig, -): Promise[]> { - const maybeAccounts = await fetchAllMaybeRentalOrder(rpc, addresses, config); - assertAccountsExist(maybeAccounts); - return maybeAccounts; -} - -export async function fetchAllMaybeRentalOrder( - rpc: Parameters[0], - addresses: Array
, - config?: FetchAccountsConfig, -): Promise[]> { - const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config); - return maybeAccounts.map((maybeAccount) => decodeRentalOrder(maybeAccount)); -} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/index.ts b/tools/shank-and-codama/native/tests/generated/src/generated/index.ts deleted file mode 100644 index f4b543bb..00000000 --- a/tools/shank-and-codama/native/tests/generated/src/generated/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * This code was AUTOGENERATED using the Codama library. - * Please DO NOT EDIT THIS FILE, instead use visitors - * to add features, then rerun Codama to update it. - * - * @see https://github.com/codama-idl/codama - */ - -export * from "./accounts"; -export * from "./instructions"; -export * from "./programs"; -export * from "./types"; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts deleted file mode 100644 index cac5ff9a..00000000 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/addCar.ts +++ /dev/null @@ -1,203 +0,0 @@ -/** - * This code was AUTOGENERATED using the Codama library. - * Please DO NOT EDIT THIS FILE, instead use visitors - * to add features, then rerun Codama to update it. - * - * @see https://github.com/codama-idl/codama - */ - -import { - type AccountMeta, - type AccountSignerMeta, - type Address, - addDecoderSizePrefix, - addEncoderSizePrefix, - type Codec, - combineCodec, - type Decoder, - type Encoder, - getStructDecoder, - getStructEncoder, - getU8Decoder, - getU8Encoder, - getU16Decoder, - getU16Encoder, - getU32Decoder, - getU32Encoder, - getUtf8Decoder, - getUtf8Encoder, - type Instruction, - type InstructionWithAccounts, - type InstructionWithData, - type ReadonlyAccount, - type ReadonlyUint8Array, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - type TransactionSigner, - transformEncoder, - type WritableAccount, - type WritableSignerAccount, -} from "@solana/kit"; -import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; -import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; - -export const ADD_CAR_DISCRIMINATOR = 0; - -export function getAddCarDiscriminatorBytes(): ReadonlyUint8Array { - return getU8Encoder().encode(ADD_CAR_DISCRIMINATOR); -} - -export type AddCarInstruction< - TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, - TAccountCarAccount extends string | AccountMeta = string, - TAccountPayer extends string | AccountMeta = string, - TAccountSystemProgram extends string | AccountMeta = "11111111111111111111111111111111", - TRemainingAccounts extends readonly AccountMeta[] = [], -> = Instruction & - InstructionWithData & - InstructionWithAccounts< - [ - TAccountCarAccount extends string ? WritableAccount : TAccountCarAccount, - TAccountPayer extends string - ? WritableSignerAccount & AccountSignerMeta - : TAccountPayer, - TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, - ...TRemainingAccounts, - ] - >; - -export type AddCarInstructionData = { - discriminator: number; - year: number; - make: string; - model: string; -}; - -export type AddCarInstructionDataArgs = { - year: number; - make: string; - model: string; -}; - -export function getAddCarInstructionDataEncoder(): Encoder { - return transformEncoder( - getStructEncoder([ - ["discriminator", getU8Encoder()], - ["year", getU16Encoder()], - ["make", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - ["model", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - ]), - (value) => ({ ...value, discriminator: ADD_CAR_DISCRIMINATOR }), - ); -} - -export function getAddCarInstructionDataDecoder(): Decoder { - return getStructDecoder([ - ["discriminator", getU8Decoder()], - ["year", getU16Decoder()], - ["make", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], - ["model", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], - ]); -} - -export function getAddCarInstructionDataCodec(): Codec { - return combineCodec(getAddCarInstructionDataEncoder(), getAddCarInstructionDataDecoder()); -} - -export type AddCarInput< - TAccountCarAccount extends string = string, - TAccountPayer extends string = string, - TAccountSystemProgram extends string = string, -> = { - /** The account that will represent the Car being created */ - carAccount: Address; - /** Fee payer */ - payer: TransactionSigner; - /** The System Program */ - systemProgram?: Address; - year: AddCarInstructionDataArgs["year"]; - make: AddCarInstructionDataArgs["make"]; - model: AddCarInstructionDataArgs["model"]; -}; - -export function getAddCarInstruction< - TAccountCarAccount extends string, - TAccountPayer extends string, - TAccountSystemProgram extends string, - TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, ->( - input: AddCarInput, - config?: { programAddress?: TProgramAddress }, -): AddCarInstruction { - // Program address. - const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; - - // Original accounts. - const originalAccounts = { - carAccount: { value: input.carAccount ?? null, isWritable: true }, - payer: { value: input.payer ?? null, isWritable: true }, - systemProgram: { value: input.systemProgram ?? null, isWritable: false }, - }; - const accounts = originalAccounts as Record; - - // Original args. - const args = { ...input }; - - // Resolve default values. - if (!accounts.systemProgram.value) { - accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; - } - - const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); - return Object.freeze({ - accounts: [ - getAccountMeta("carAccount", accounts.carAccount), - getAccountMeta("payer", accounts.payer), - getAccountMeta("systemProgram", accounts.systemProgram), - ], - data: getAddCarInstructionDataEncoder().encode(args as AddCarInstructionDataArgs), - programAddress, - } as AddCarInstruction); -} - -export type ParsedAddCarInstruction< - TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, - TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], -> = { - programAddress: Address; - accounts: { - /** The account that will represent the Car being created */ - carAccount: TAccountMetas[0]; - /** Fee payer */ - payer: TAccountMetas[1]; - /** The System Program */ - systemProgram: TAccountMetas[2]; - }; - data: AddCarInstructionData; -}; - -export function parseAddCarInstruction( - instruction: Instruction & InstructionWithAccounts & InstructionWithData, -): ParsedAddCarInstruction { - if (instruction.accounts.length < 3) { - throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 3, - }); - } - let accountIndex = 0; - const getNextAccount = () => { - const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; - accountIndex += 1; - return accountMeta; - }; - return { - programAddress: instruction.programAddress, - accounts: { - carAccount: getNextAccount(), - payer: getNextAccount(), - systemProgram: getNextAccount(), - }, - data: getAddCarInstructionDataDecoder().decode(instruction.data), - }; -} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts deleted file mode 100644 index 520382c8..00000000 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/bookRental.ts +++ /dev/null @@ -1,231 +0,0 @@ -/** - * This code was AUTOGENERATED using the Codama library. - * Please DO NOT EDIT THIS FILE, instead use visitors - * to add features, then rerun Codama to update it. - * - * @see https://github.com/codama-idl/codama - */ - -import { - type AccountMeta, - type AccountSignerMeta, - type Address, - addDecoderSizePrefix, - addEncoderSizePrefix, - type Codec, - combineCodec, - type Decoder, - type Encoder, - getStructDecoder, - getStructEncoder, - getU8Decoder, - getU8Encoder, - getU32Decoder, - getU32Encoder, - getU64Decoder, - getU64Encoder, - getUtf8Decoder, - getUtf8Encoder, - type Instruction, - type InstructionWithAccounts, - type InstructionWithData, - type ReadonlyAccount, - type ReadonlyUint8Array, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - type TransactionSigner, - transformEncoder, - type WritableAccount, - type WritableSignerAccount, -} from "@solana/kit"; -import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; -import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; - -export const BOOK_RENTAL_DISCRIMINATOR = 1; - -export function getBookRentalDiscriminatorBytes(): ReadonlyUint8Array { - return getU8Encoder().encode(BOOK_RENTAL_DISCRIMINATOR); -} - -export type BookRentalInstruction< - TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, - TAccountRentalAccount extends string | AccountMeta = string, - TAccountCarAccount extends string | AccountMeta = string, - TAccountPayer extends string | AccountMeta = string, - TAccountSystemProgram extends string | AccountMeta = "11111111111111111111111111111111", - TRemainingAccounts extends readonly AccountMeta[] = [], -> = Instruction & - InstructionWithData & - InstructionWithAccounts< - [ - TAccountRentalAccount extends string ? WritableAccount : TAccountRentalAccount, - TAccountCarAccount extends string ? ReadonlyAccount : TAccountCarAccount, - TAccountPayer extends string - ? WritableSignerAccount & AccountSignerMeta - : TAccountPayer, - TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, - ...TRemainingAccounts, - ] - >; - -export type BookRentalInstructionData = { - discriminator: number; - name: string; - pickUpDate: string; - returnDate: string; - price: bigint; -}; - -export type BookRentalInstructionDataArgs = { - name: string; - pickUpDate: string; - returnDate: string; - price: number | bigint; -}; - -export function getBookRentalInstructionDataEncoder(): Encoder { - return transformEncoder( - getStructEncoder([ - ["discriminator", getU8Encoder()], - ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - ["pickUpDate", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - ["returnDate", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], - ["price", getU64Encoder()], - ]), - (value) => ({ ...value, discriminator: BOOK_RENTAL_DISCRIMINATOR }), - ); -} - -export function getBookRentalInstructionDataDecoder(): Decoder { - return getStructDecoder([ - ["discriminator", getU8Decoder()], - ["name", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], - ["pickUpDate", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], - ["returnDate", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], - ["price", getU64Decoder()], - ]); -} - -export function getBookRentalInstructionDataCodec(): Codec { - return combineCodec(getBookRentalInstructionDataEncoder(), getBookRentalInstructionDataDecoder()); -} - -export type BookRentalInput< - TAccountRentalAccount extends string = string, - TAccountCarAccount extends string = string, - TAccountPayer extends string = string, - TAccountSystemProgram extends string = string, -> = { - /** The account that will represent the actual order for the rental */ - rentalAccount: Address; - /** The account representing the Car being rented in this order */ - carAccount: Address; - /** Fee payer */ - payer: TransactionSigner; - /** The System Program */ - systemProgram?: Address; - name: BookRentalInstructionDataArgs["name"]; - pickUpDate: BookRentalInstructionDataArgs["pickUpDate"]; - returnDate: BookRentalInstructionDataArgs["returnDate"]; - price: BookRentalInstructionDataArgs["price"]; -}; - -export function getBookRentalInstruction< - TAccountRentalAccount extends string, - TAccountCarAccount extends string, - TAccountPayer extends string, - TAccountSystemProgram extends string, - TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, ->( - input: BookRentalInput, - config?: { programAddress?: TProgramAddress }, -): BookRentalInstruction< - TProgramAddress, - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer, - TAccountSystemProgram -> { - // Program address. - const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; - - // Original accounts. - const originalAccounts = { - rentalAccount: { value: input.rentalAccount ?? null, isWritable: true }, - carAccount: { value: input.carAccount ?? null, isWritable: false }, - payer: { value: input.payer ?? null, isWritable: true }, - systemProgram: { value: input.systemProgram ?? null, isWritable: false }, - }; - const accounts = originalAccounts as Record; - - // Original args. - const args = { ...input }; - - // Resolve default values. - if (!accounts.systemProgram.value) { - accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; - } - - const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); - return Object.freeze({ - accounts: [ - getAccountMeta("rentalAccount", accounts.rentalAccount), - getAccountMeta("carAccount", accounts.carAccount), - getAccountMeta("payer", accounts.payer), - getAccountMeta("systemProgram", accounts.systemProgram), - ], - data: getBookRentalInstructionDataEncoder().encode(args as BookRentalInstructionDataArgs), - programAddress, - } as BookRentalInstruction< - TProgramAddress, - TAccountRentalAccount, - TAccountCarAccount, - TAccountPayer, - TAccountSystemProgram - >); -} - -export type ParsedBookRentalInstruction< - TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, - TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], -> = { - programAddress: Address; - accounts: { - /** The account that will represent the actual order for the rental */ - rentalAccount: TAccountMetas[0]; - /** The account representing the Car being rented in this order */ - carAccount: TAccountMetas[1]; - /** Fee payer */ - payer: TAccountMetas[2]; - /** The System Program */ - systemProgram: TAccountMetas[3]; - }; - data: BookRentalInstructionData; -}; - -export function parseBookRentalInstruction( - instruction: Instruction & InstructionWithAccounts & InstructionWithData, -): ParsedBookRentalInstruction { - if (instruction.accounts.length < 4) { - throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 4, - }); - } - let accountIndex = 0; - const getNextAccount = () => { - const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; - accountIndex += 1; - return accountMeta; - }; - return { - programAddress: instruction.programAddress, - accounts: { - rentalAccount: getNextAccount(), - carAccount: getNextAccount(), - payer: getNextAccount(), - systemProgram: getNextAccount(), - }, - data: getBookRentalInstructionDataDecoder().decode(instruction.data), - }; -} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/index.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/index.ts deleted file mode 100644 index 818ee3c2..00000000 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * This code was AUTOGENERATED using the Codama library. - * Please DO NOT EDIT THIS FILE, instead use visitors - * to add features, then rerun Codama to update it. - * - * @see https://github.com/codama-idl/codama - */ - -export * from "./addCar"; -export * from "./bookRental"; -export * from "./pickUpCar"; -export * from "./returnCar"; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts deleted file mode 100644 index 0915df46..00000000 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/pickUpCar.ts +++ /dev/null @@ -1,168 +0,0 @@ -/** - * This code was AUTOGENERATED using the Codama library. - * Please DO NOT EDIT THIS FILE, instead use visitors - * to add features, then rerun Codama to update it. - * - * @see https://github.com/codama-idl/codama - */ - -import { - type AccountMeta, - type AccountSignerMeta, - type Address, - combineCodec, - type FixedSizeCodec, - type FixedSizeDecoder, - type FixedSizeEncoder, - getStructDecoder, - getStructEncoder, - getU8Decoder, - getU8Encoder, - type Instruction, - type InstructionWithAccounts, - type InstructionWithData, - type ReadonlyAccount, - type ReadonlyUint8Array, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - type TransactionSigner, - transformEncoder, - type WritableAccount, - type WritableSignerAccount, -} from "@solana/kit"; -import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; -import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; - -export const PICK_UP_CAR_DISCRIMINATOR = 2; - -export function getPickUpCarDiscriminatorBytes(): ReadonlyUint8Array { - return getU8Encoder().encode(PICK_UP_CAR_DISCRIMINATOR); -} - -export type PickUpCarInstruction< - TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, - TAccountRentalAccount extends string | AccountMeta = string, - TAccountCarAccount extends string | AccountMeta = string, - TAccountPayer extends string | AccountMeta = string, - TRemainingAccounts extends readonly AccountMeta[] = [], -> = Instruction & - InstructionWithData & - InstructionWithAccounts< - [ - TAccountRentalAccount extends string ? WritableAccount : TAccountRentalAccount, - TAccountCarAccount extends string ? ReadonlyAccount : TAccountCarAccount, - TAccountPayer extends string - ? WritableSignerAccount & AccountSignerMeta - : TAccountPayer, - ...TRemainingAccounts, - ] - >; - -export type PickUpCarInstructionData = { discriminator: number }; - -export type PickUpCarInstructionDataArgs = {}; - -export function getPickUpCarInstructionDataEncoder(): FixedSizeEncoder { - return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ - ...value, - discriminator: PICK_UP_CAR_DISCRIMINATOR, - })); -} - -export function getPickUpCarInstructionDataDecoder(): FixedSizeDecoder { - return getStructDecoder([["discriminator", getU8Decoder()]]); -} - -export function getPickUpCarInstructionDataCodec(): FixedSizeCodec< - PickUpCarInstructionDataArgs, - PickUpCarInstructionData -> { - return combineCodec(getPickUpCarInstructionDataEncoder(), getPickUpCarInstructionDataDecoder()); -} - -export type PickUpCarInput< - TAccountRentalAccount extends string = string, - TAccountCarAccount extends string = string, - TAccountPayer extends string = string, -> = { - /** The account representing the active rental */ - rentalAccount: Address; - /** The account representing the Car being rented in this order */ - carAccount: Address; - /** Fee payer */ - payer: TransactionSigner; -}; - -export function getPickUpCarInstruction< - TAccountRentalAccount extends string, - TAccountCarAccount extends string, - TAccountPayer extends string, - TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, ->( - input: PickUpCarInput, - config?: { programAddress?: TProgramAddress }, -): PickUpCarInstruction { - // Program address. - const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; - - // Original accounts. - const originalAccounts = { - rentalAccount: { value: input.rentalAccount ?? null, isWritable: true }, - carAccount: { value: input.carAccount ?? null, isWritable: false }, - payer: { value: input.payer ?? null, isWritable: true }, - }; - const accounts = originalAccounts as Record; - - const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); - return Object.freeze({ - accounts: [ - getAccountMeta("rentalAccount", accounts.rentalAccount), - getAccountMeta("carAccount", accounts.carAccount), - getAccountMeta("payer", accounts.payer), - ], - data: getPickUpCarInstructionDataEncoder().encode({}), - programAddress, - } as PickUpCarInstruction); -} - -export type ParsedPickUpCarInstruction< - TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, - TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], -> = { - programAddress: Address; - accounts: { - /** The account representing the active rental */ - rentalAccount: TAccountMetas[0]; - /** The account representing the Car being rented in this order */ - carAccount: TAccountMetas[1]; - /** Fee payer */ - payer: TAccountMetas[2]; - }; - data: PickUpCarInstructionData; -}; - -export function parsePickUpCarInstruction( - instruction: Instruction & InstructionWithAccounts & InstructionWithData, -): ParsedPickUpCarInstruction { - if (instruction.accounts.length < 3) { - throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 3, - }); - } - let accountIndex = 0; - const getNextAccount = () => { - const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; - accountIndex += 1; - return accountMeta; - }; - return { - programAddress: instruction.programAddress, - accounts: { - rentalAccount: getNextAccount(), - carAccount: getNextAccount(), - payer: getNextAccount(), - }, - data: getPickUpCarInstructionDataDecoder().decode(instruction.data), - }; -} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts b/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts deleted file mode 100644 index a6a1c90e..00000000 --- a/tools/shank-and-codama/native/tests/generated/src/generated/instructions/returnCar.ts +++ /dev/null @@ -1,168 +0,0 @@ -/** - * This code was AUTOGENERATED using the Codama library. - * Please DO NOT EDIT THIS FILE, instead use visitors - * to add features, then rerun Codama to update it. - * - * @see https://github.com/codama-idl/codama - */ - -import { - type AccountMeta, - type AccountSignerMeta, - type Address, - combineCodec, - type FixedSizeCodec, - type FixedSizeDecoder, - type FixedSizeEncoder, - getStructDecoder, - getStructEncoder, - getU8Decoder, - getU8Encoder, - type Instruction, - type InstructionWithAccounts, - type InstructionWithData, - type ReadonlyAccount, - type ReadonlyUint8Array, - SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, - SolanaError, - type TransactionSigner, - transformEncoder, - type WritableAccount, - type WritableSignerAccount, -} from "@solana/kit"; -import { getAccountMetaFactory, type ResolvedInstructionAccount } from "@solana/program-client-core"; -import { CAR_RENTAL_SERVICE_PROGRAM_ADDRESS } from "../programs"; - -export const RETURN_CAR_DISCRIMINATOR = 3; - -export function getReturnCarDiscriminatorBytes(): ReadonlyUint8Array { - return getU8Encoder().encode(RETURN_CAR_DISCRIMINATOR); -} - -export type ReturnCarInstruction< - TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, - TAccountRentalAccount extends string | AccountMeta = string, - TAccountCarAccount extends string | AccountMeta = string, - TAccountPayer extends string | AccountMeta = string, - TRemainingAccounts extends readonly AccountMeta[] = [], -> = Instruction & - InstructionWithData & - InstructionWithAccounts< - [ - TAccountRentalAccount extends string ? WritableAccount : TAccountRentalAccount, - TAccountCarAccount extends string ? ReadonlyAccount : TAccountCarAccount, - TAccountPayer extends string - ? WritableSignerAccount & AccountSignerMeta - : TAccountPayer, - ...TRemainingAccounts, - ] - >; - -export type ReturnCarInstructionData = { discriminator: number }; - -export type ReturnCarInstructionDataArgs = {}; - -export function getReturnCarInstructionDataEncoder(): FixedSizeEncoder { - return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ - ...value, - discriminator: RETURN_CAR_DISCRIMINATOR, - })); -} - -export function getReturnCarInstructionDataDecoder(): FixedSizeDecoder { - return getStructDecoder([["discriminator", getU8Decoder()]]); -} - -export function getReturnCarInstructionDataCodec(): FixedSizeCodec< - ReturnCarInstructionDataArgs, - ReturnCarInstructionData -> { - return combineCodec(getReturnCarInstructionDataEncoder(), getReturnCarInstructionDataDecoder()); -} - -export type ReturnCarInput< - TAccountRentalAccount extends string = string, - TAccountCarAccount extends string = string, - TAccountPayer extends string = string, -> = { - /** The account representing the active rental */ - rentalAccount: Address; - /** The account representing the Car being rented in this order */ - carAccount: Address; - /** Fee payer */ - payer: TransactionSigner; -}; - -export function getReturnCarInstruction< - TAccountRentalAccount extends string, - TAccountCarAccount extends string, - TAccountPayer extends string, - TProgramAddress extends Address = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, ->( - input: ReturnCarInput, - config?: { programAddress?: TProgramAddress }, -): ReturnCarInstruction { - // Program address. - const programAddress = config?.programAddress ?? CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; - - // Original accounts. - const originalAccounts = { - rentalAccount: { value: input.rentalAccount ?? null, isWritable: true }, - carAccount: { value: input.carAccount ?? null, isWritable: false }, - payer: { value: input.payer ?? null, isWritable: true }, - }; - const accounts = originalAccounts as Record; - - const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); - return Object.freeze({ - accounts: [ - getAccountMeta("rentalAccount", accounts.rentalAccount), - getAccountMeta("carAccount", accounts.carAccount), - getAccountMeta("payer", accounts.payer), - ], - data: getReturnCarInstructionDataEncoder().encode({}), - programAddress, - } as ReturnCarInstruction); -} - -export type ParsedReturnCarInstruction< - TProgram extends string = typeof CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, - TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], -> = { - programAddress: Address; - accounts: { - /** The account representing the active rental */ - rentalAccount: TAccountMetas[0]; - /** The account representing the Car being rented in this order */ - carAccount: TAccountMetas[1]; - /** Fee payer */ - payer: TAccountMetas[2]; - }; - data: ReturnCarInstructionData; -}; - -export function parseReturnCarInstruction( - instruction: Instruction & InstructionWithAccounts & InstructionWithData, -): ParsedReturnCarInstruction { - if (instruction.accounts.length < 3) { - throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { - actualAccountMetas: instruction.accounts.length, - expectedAccountMetas: 3, - }); - } - let accountIndex = 0; - const getNextAccount = () => { - const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; - accountIndex += 1; - return accountMeta; - }; - return { - programAddress: instruction.programAddress, - accounts: { - rentalAccount: getNextAccount(), - carAccount: getNextAccount(), - payer: getNextAccount(), - }, - data: getReturnCarInstructionDataDecoder().decode(instruction.data), - }; -} diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts b/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts deleted file mode 100644 index 1dbc4e71..00000000 --- a/tools/shank-and-codama/native/tests/generated/src/generated/programs/carRentalService.ts +++ /dev/null @@ -1,236 +0,0 @@ -/** - * This code was AUTOGENERATED using the Codama library. - * Please DO NOT EDIT THIS FILE, instead use visitors - * to add features, then rerun Codama to update it. - * - * @see https://github.com/codama-idl/codama - */ - -import { - type Address, - assertIsInstructionWithAccounts, - type ClientWithPayer, - type ClientWithRpc, - type ClientWithTransactionPlanning, - type ClientWithTransactionSending, - containsBytes, - extendClient, - type GetAccountInfoApi, - type GetMultipleAccountsApi, - getU8Encoder, - type Instruction, - type InstructionWithData, - type ReadonlyUint8Array, - SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, - SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, - SolanaError, -} from "@solana/kit"; -import { - addSelfFetchFunctions, - addSelfPlanAndSendFunctions, - type SelfFetchFunctions, - type SelfPlanAndSendFunctions, -} from "@solana/program-client-core"; -import { - type Car, - type CarArgs, - getCarCodec, - getRentalOrderCodec, - type RentalOrder, - type RentalOrderArgs, -} from "../accounts"; -import { - type AddCarInput, - type BookRentalInput, - getAddCarInstruction, - getBookRentalInstruction, - getPickUpCarInstruction, - getReturnCarInstruction, - type ParsedAddCarInstruction, - type ParsedBookRentalInstruction, - type ParsedPickUpCarInstruction, - type ParsedReturnCarInstruction, - type PickUpCarInput, - parseAddCarInstruction, - parseBookRentalInstruction, - parsePickUpCarInstruction, - parseReturnCarInstruction, - type ReturnCarInput, -} from "../instructions"; - -export const CAR_RENTAL_SERVICE_PROGRAM_ADDRESS = - "8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ" as Address<"8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ">; - -export enum CarRentalServiceAccount { - Car, - RentalOrder, -} - -export enum CarRentalServiceInstruction { - AddCar, - BookRental, - PickUpCar, - ReturnCar, -} - -export function identifyCarRentalServiceInstruction( - instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array, -): CarRentalServiceInstruction { - const data = "data" in instruction ? instruction.data : instruction; - if (containsBytes(data, getU8Encoder().encode(0), 0)) { - return CarRentalServiceInstruction.AddCar; - } - if (containsBytes(data, getU8Encoder().encode(1), 0)) { - return CarRentalServiceInstruction.BookRental; - } - if (containsBytes(data, getU8Encoder().encode(2), 0)) { - return CarRentalServiceInstruction.PickUpCar; - } - if (containsBytes(data, getU8Encoder().encode(3), 0)) { - return CarRentalServiceInstruction.ReturnCar; - } - throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__FAILED_TO_IDENTIFY_INSTRUCTION, { - instructionData: data, - programName: "carRentalService", - }); -} - -export type ParsedCarRentalServiceInstruction< - TProgram extends string = "8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ", -> = - | ({ - instructionType: CarRentalServiceInstruction.AddCar; - } & ParsedAddCarInstruction) - | ({ - instructionType: CarRentalServiceInstruction.BookRental; - } & ParsedBookRentalInstruction) - | ({ - instructionType: CarRentalServiceInstruction.PickUpCar; - } & ParsedPickUpCarInstruction) - | ({ - instructionType: CarRentalServiceInstruction.ReturnCar; - } & ParsedReturnCarInstruction); - -export function parseCarRentalServiceInstruction( - instruction: Instruction & InstructionWithData, -): ParsedCarRentalServiceInstruction { - const instructionType = identifyCarRentalServiceInstruction(instruction); - switch (instructionType) { - case CarRentalServiceInstruction.AddCar: { - assertIsInstructionWithAccounts(instruction); - return { - instructionType: CarRentalServiceInstruction.AddCar, - ...parseAddCarInstruction(instruction), - }; - } - case CarRentalServiceInstruction.BookRental: { - assertIsInstructionWithAccounts(instruction); - return { - instructionType: CarRentalServiceInstruction.BookRental, - ...parseBookRentalInstruction(instruction), - }; - } - case CarRentalServiceInstruction.PickUpCar: { - assertIsInstructionWithAccounts(instruction); - return { - instructionType: CarRentalServiceInstruction.PickUpCar, - ...parsePickUpCarInstruction(instruction), - }; - } - case CarRentalServiceInstruction.ReturnCar: { - assertIsInstructionWithAccounts(instruction); - return { - instructionType: CarRentalServiceInstruction.ReturnCar, - ...parseReturnCarInstruction(instruction), - }; - } - default: - throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__UNRECOGNIZED_INSTRUCTION_TYPE, { - instructionType: instructionType as string, - programName: "carRentalService", - }); - } -} - -export type CarRentalServicePlugin = { - accounts: CarRentalServicePluginAccounts; - instructions: CarRentalServicePluginInstructions; -}; - -export type CarRentalServicePluginAccounts = { - car: ReturnType & SelfFetchFunctions; - rentalOrder: ReturnType & SelfFetchFunctions; -}; - -export type CarRentalServicePluginInstructions = { - addCar: ( - input: MakeOptional, - ) => ReturnType & SelfPlanAndSendFunctions; - bookRental: ( - input: MakeOptional, - ) => ReturnType & SelfPlanAndSendFunctions; - pickUpCar: ( - input: MakeOptional, - ) => ReturnType & SelfPlanAndSendFunctions; - returnCar: ( - input: MakeOptional, - ) => ReturnType & SelfPlanAndSendFunctions; -}; - -export type CarRentalServicePluginRequirements = ClientWithRpc & - ClientWithPayer & - ClientWithTransactionPlanning & - ClientWithTransactionSending; - -export function carRentalServiceProgram() { - return ( - client: T, - ): Omit & { - carRentalService: CarRentalServicePlugin; - } => { - return extendClient(client, { - carRentalService: { - accounts: { - car: addSelfFetchFunctions(client, getCarCodec()), - rentalOrder: addSelfFetchFunctions(client, getRentalOrderCodec()), - }, - instructions: { - addCar: (input) => - addSelfPlanAndSendFunctions( - client, - getAddCarInstruction({ - ...input, - payer: input.payer ?? client.payer, - }), - ), - bookRental: (input) => - addSelfPlanAndSendFunctions( - client, - getBookRentalInstruction({ - ...input, - payer: input.payer ?? client.payer, - }), - ), - pickUpCar: (input) => - addSelfPlanAndSendFunctions( - client, - getPickUpCarInstruction({ - ...input, - payer: input.payer ?? client.payer, - }), - ), - returnCar: (input) => - addSelfPlanAndSendFunctions( - client, - getReturnCarInstruction({ - ...input, - payer: input.payer ?? client.payer, - }), - ), - }, - }, - }); - }; -} - -type MakeOptional = Omit & Partial>; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/programs/index.ts b/tools/shank-and-codama/native/tests/generated/src/generated/programs/index.ts deleted file mode 100644 index 06d01a8d..00000000 --- a/tools/shank-and-codama/native/tests/generated/src/generated/programs/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * This code was AUTOGENERATED using the Codama library. - * Please DO NOT EDIT THIS FILE, instead use visitors - * to add features, then rerun Codama to update it. - * - * @see https://github.com/codama-idl/codama - */ - -export * from "./carRentalService"; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/types/index.ts b/tools/shank-and-codama/native/tests/generated/src/generated/types/index.ts deleted file mode 100644 index df062dd9..00000000 --- a/tools/shank-and-codama/native/tests/generated/src/generated/types/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * This code was AUTOGENERATED using the Codama library. - * Please DO NOT EDIT THIS FILE, instead use visitors - * to add features, then rerun Codama to update it. - * - * @see https://github.com/codama-idl/codama - */ - -export * from "./rentalOrderStatus"; diff --git a/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts b/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts deleted file mode 100644 index 6034aec0..00000000 --- a/tools/shank-and-codama/native/tests/generated/src/generated/types/rentalOrderStatus.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * This code was AUTOGENERATED using the Codama library. - * Please DO NOT EDIT THIS FILE, instead use visitors - * to add features, then rerun Codama to update it. - * - * @see https://github.com/codama-idl/codama - */ - -import { - combineCodec, - type FixedSizeCodec, - type FixedSizeDecoder, - type FixedSizeEncoder, - getEnumDecoder, - getEnumEncoder, -} from "@solana/kit"; - -export enum RentalOrderStatus { - Created, - PickedUp, - Returned, -} - -export type RentalOrderStatusArgs = RentalOrderStatus; - -export function getRentalOrderStatusEncoder(): FixedSizeEncoder { - return getEnumEncoder(RentalOrderStatus); -} - -export function getRentalOrderStatusDecoder(): FixedSizeDecoder { - return getEnumDecoder(RentalOrderStatus); -} - -export function getRentalOrderStatusCodec(): FixedSizeCodec { - return combineCodec(getRentalOrderStatusEncoder(), getRentalOrderStatusDecoder()); -} diff --git a/tools/shank-and-codama/native/tests/test.ts b/tools/shank-and-codama/native/tests/test.ts deleted file mode 100644 index 1cbe6e75..00000000 --- a/tools/shank-and-codama/native/tests/test.ts +++ /dev/null @@ -1,291 +0,0 @@ -// In-process integration test for the car rental service program. -// -// Runs entirely in CI with no network: the program `.so` is loaded into a -// LiteSVM instance and exercised through the Codama-generated client -// (tests/generated). It walks the full rental lifecycle (add_car, -// book_rental, pick_up_car, return_car), asserting onchain account state -// after each step, and verifies the program's account validation: a -// non-signing payer, a rental account owned by the wrong program, and an -// invalid status transition are all rejected. - -import assert from "node:assert/strict"; -import { readFileSync } from "node:fs"; -import { dirname, join } from "node:path"; -import { test } from "node:test"; -import { fileURLToPath } from "node:url"; - -import { - AccountRole, - type Address, - appendTransactionMessageInstruction, - createNoopSigner, - createTransactionMessage, - generateKeyPairSigner, - getAddressEncoder, - getProgramDerivedAddress, - getUtf8Encoder, - type Instruction, - lamports, - pipe, - setTransactionMessageFeePayerSigner, - signTransactionMessageWithSigners, -} from "@solana/kit"; -import { FailedTransactionMetadata, LiteSVM } from "litesvm"; - -import { - CAR_RENTAL_SERVICE_PROGRAM_ADDRESS, - decodeCar, - decodeRentalOrder, - getAddCarInstruction, - getBookRentalInstruction, - getPickUpCarInstruction, - getReturnCarInstruction, - RentalOrderStatus, -} from "./generated/src/generated/index.ts"; - -// Custom error codes from program/src/error.rs (CarRentalError). The enum -// starts at 6000, matching Anchor's custom-error offset. -const ERROR_PAYER_SIGNATURE_MISSING = 6002; -const ERROR_RENTAL_ACCOUNT_NOT_OWNED_BY_PROGRAM = 6003; -const ERROR_RENTAL_NOT_IN_PICKED_UP_STATUS = 6005; - -const here = dirname(fileURLToPath(import.meta.url)); -const programSoPath = join(here, "..", "program", "target", "so", "car_rental_service.so"); - -const utf8 = getUtf8Encoder(); -const addressEncoder = getAddressEncoder(); - -function loadSvm(): { svm: LiteSVM; programId: Address } { - const svm = new LiteSVM(); - const programId = CAR_RENTAL_SERVICE_PROGRAM_ADDRESS; - svm.addProgram(programId, readFileSync(programSoPath)); - return { svm, programId }; -} - -async function carPda(programId: Address, make: string, model: string): Promise
{ - const [pda] = await getProgramDerivedAddress({ - programAddress: programId, - seeds: [utf8.encode("car"), utf8.encode(make), utf8.encode(model)], - }); - return pda; -} - -async function rentalPda(programId: Address, car: Address, payer: Address): Promise
{ - const [pda] = await getProgramDerivedAddress({ - programAddress: programId, - seeds: [utf8.encode("rental_order"), addressEncoder.encode(car), addressEncoder.encode(payer)], - }); - return pda; -} - -async function sendIx( - svm: LiteSVM, - payer: Awaited>, - instruction: Instruction, -) { - const tx = await pipe( - createTransactionMessage({ version: 0 }), - (m) => setTransactionMessageFeePayerSigner(payer, m), - (m) => svm.setTransactionMessageLifetimeUsingLatestBlockhash(m), - (m) => appendTransactionMessageInstruction(instruction, m), - (m) => signTransactionMessageWithSigners(m), - ); - const result = svm.sendTransaction(tx); - if (result instanceof FailedTransactionMetadata) { - throw new Error(`Transaction failed: ${result.err()}\n${result.meta().logs().join("\n")}`); - } - return result; -} - -/** Assert that sending `instruction` fails with the given custom error code. */ -async function expectCustomError( - svm: LiteSVM, - payer: Awaited>, - instruction: Instruction, - errorCode: number, -) { - // The runtime logs custom errors as hex: "custom program error: 0x1772". - const errorCodeHex = `0x${errorCode.toString(16)}`; - await assert.rejects( - sendIx(svm, payer, instruction), - (thrownObject: Error) => thrownObject.message.includes(errorCodeHex), - `expected custom program error ${errorCode} (${errorCodeHex})`, - ); -} - -async function fundedSigner(svm: LiteSVM) { - const signer = await generateKeyPairSigner(); - svm.airdrop(signer.address, lamports(10_000_000_000n)); - return signer; -} - -test("car rental service: full lifecycle add_car -> book_rental -> pick_up_car -> return_car", async () => { - const { svm, programId } = loadSvm(); - const payer = await fundedSigner(svm); - - // 1. add_car - const make = "BMW"; - const model = "iX1"; - const carAccount = await carPda(programId, make, model); - - await sendIx(svm, payer, getAddCarInstruction({ carAccount, payer, year: 2020, make, model })); - - const carRaw = svm.getAccount(carAccount); - assert.ok(carRaw?.exists, "car account should exist"); - const car = decodeCar(carRaw); - assert.equal(car.data.year, 2020); - assert.equal(car.data.make, make); - assert.equal(car.data.model, model); - - // 2. book_rental - const rentalAccount = await rentalPda(programId, carAccount, payer.address); - await sendIx( - svm, - payer, - getBookRentalInstruction({ - rentalAccount, - carAccount, - payer, - name: "Fred Flintstone", - pickUpDate: "01/28/2023 8:00 AM", - returnDate: "01/28/2023 10:00 PM", - price: 300, - }), - ); - - let rentalRaw = svm.getAccount(rentalAccount); - assert.ok(rentalRaw?.exists, "rental account should exist"); - let rental = decodeRentalOrder(rentalRaw); - assert.equal(rental.data.name, "Fred Flintstone"); - assert.equal(rental.data.car, carAccount); - assert.equal(rental.data.price, 300n); - assert.equal(rental.data.status, RentalOrderStatus.Created); - - // 3. pick_up_car - await sendIx(svm, payer, getPickUpCarInstruction({ rentalAccount, carAccount, payer })); - - rentalRaw = svm.getAccount(rentalAccount); - assert.ok(rentalRaw?.exists, "rental account should still exist"); - rental = decodeRentalOrder(rentalRaw); - assert.equal(rental.data.status, RentalOrderStatus.PickedUp); - - // 4. return_car - await sendIx(svm, payer, getReturnCarInstruction({ rentalAccount, carAccount, payer })); - - rentalRaw = svm.getAccount(rentalAccount); - assert.ok(rentalRaw?.exists, "rental account should still exist"); - rental = decodeRentalOrder(rentalRaw); - assert.equal(rental.data.status, RentalOrderStatus.Returned); -}); - -test("pick_up_car rejects a payer that did not sign", async () => { - const { svm, programId } = loadSvm(); - const victim = await fundedSigner(svm); - const attacker = await fundedSigner(svm); - - const make = "Tesla"; - const model = "Model 3"; - const carAccount = await carPda(programId, make, model); - await sendIx(svm, victim, getAddCarInstruction({ carAccount, payer: victim, year: 2024, make, model })); - - const rentalAccount = await rentalPda(programId, carAccount, victim.address); - await sendIx( - svm, - victim, - getBookRentalInstruction({ - rentalAccount, - carAccount, - payer: victim, - name: "Wilma Flintstone", - pickUpDate: "02/01/2023 9:00 AM", - returnDate: "02/01/2023 5:00 PM", - price: 250, - }), - ); - - // The attacker names the victim as `payer` but cannot produce the victim's - // signature, so the account meta is demoted to a plain writable account. - const instruction = getPickUpCarInstruction({ - rentalAccount, - carAccount, - payer: createNoopSigner(victim.address), - }); - const instructionWithoutVictimSignature: Instruction = { - ...instruction, - accounts: instruction.accounts.map((account) => - account.address === victim.address ? { address: account.address, role: AccountRole.WRITABLE } : account, - ), - }; - - await expectCustomError(svm, attacker, instructionWithoutVictimSignature, ERROR_PAYER_SIGNATURE_MISSING); - - // The rental is untouched. - const rental = decodeRentalOrder(svm.getAccount(rentalAccount)!); - assert.equal(rental.data.status, RentalOrderStatus.Created); -}); - -test("pick_up_car rejects a rental account not owned by the program", async () => { - const { svm, programId } = loadSvm(); - const payer = await fundedSigner(svm); - - const make = "Volvo"; - const model = "EX30"; - const carAccount = await carPda(programId, make, model); - await sendIx(svm, payer, getAddCarInstruction({ carAccount, payer, year: 2025, make, model })); - - // Plant an account with plausible rental data at the correct PDA address, - // but owned by the system program instead of the rental program. - const rentalAccount = await rentalPda(programId, carAccount, payer.address); - const plantedDataLength = 165; - svm.setAccount({ - address: rentalAccount, - lamports: lamports(10_000_000n), - data: new Uint8Array(plantedDataLength), - programAddress: "11111111111111111111111111111111" as Address, - executable: false, - space: BigInt(plantedDataLength), - }); - - await expectCustomError( - svm, - payer, - getPickUpCarInstruction({ rentalAccount, carAccount, payer }), - ERROR_RENTAL_ACCOUNT_NOT_OWNED_BY_PROGRAM, - ); -}); - -test("return_car rejects a rental that was never picked up", async () => { - const { svm, programId } = loadSvm(); - const payer = await fundedSigner(svm); - - const make = "Kia"; - const model = "EV9"; - const carAccount = await carPda(programId, make, model); - await sendIx(svm, payer, getAddCarInstruction({ carAccount, payer, year: 2023, make, model })); - - const rentalAccount = await rentalPda(programId, carAccount, payer.address); - await sendIx( - svm, - payer, - getBookRentalInstruction({ - rentalAccount, - carAccount, - payer, - name: "Barney Rubble", - pickUpDate: "03/15/2023 10:00 AM", - returnDate: "03/16/2023 10:00 AM", - price: 400, - }), - ); - - // Created -> Returned skips PickedUp and must be rejected. - await expectCustomError( - svm, - payer, - getReturnCarInstruction({ rentalAccount, carAccount, payer }), - ERROR_RENTAL_NOT_IN_PICKED_UP_STATUS, - ); - - const rental = decodeRentalOrder(svm.getAccount(rentalAccount)!); - assert.equal(rental.data.status, RentalOrderStatus.Created); -}); diff --git a/tools/shank-and-codama/native/tests/tsconfig.test.json b/tools/shank-and-codama/native/tests/tsconfig.test.json deleted file mode 100644 index 22bb5919..00000000 --- a/tools/shank-and-codama/native/tests/tsconfig.test.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "module": "esnext", - "moduleResolution": "bundler", - "target": "es2022", - "lib": ["es2022"], - "types": ["node"], - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "noEmit": true - }, - "include": ["./**/*.ts", "../codama.ts"] -} From d089036ae145bcf94ed710afe989a86cf173f341 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Fri, 12 Jun 2026 11:02:13 -0400 Subject: [PATCH 079/138] fix: add title to next.svg for biome a11y check --- .../nft-meta-data-pointer/anchor-example/app/public/next.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/app/public/next.svg b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/app/public/next.svg index 5174b28c..52bb2bd4 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/app/public/next.svg +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/app/public/next.svg @@ -1 +1 @@ - \ No newline at end of file +Next.js logo \ No newline at end of file From 2a4fd2e61bb91b22cf0b11ad6dc7fa1fe38b4bc6 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Fri, 12 Jun 2026 11:02:19 -0400 Subject: [PATCH 080/138] fix: add title to vercel.svg for biome a11y check --- .../nft-meta-data-pointer/anchor-example/app/public/vercel.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/app/public/vercel.svg b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/app/public/vercel.svg index d2f84222..2aa4e88e 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/app/public/vercel.svg +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/app/public/vercel.svg @@ -1 +1 @@ - \ No newline at end of file +Vercel logo \ No newline at end of file From 99206d8b382ef6addfbb080cef14c1bdd3717a65 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Fri, 12 Jun 2026 11:02:33 -0400 Subject: [PATCH 081/138] ci: use biome 2.2+ folder-ignore syntax for generated exclude --- biome.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/biome.jsonc b/biome.jsonc index 7fcec1f2..ab43b524 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -3,7 +3,7 @@ "files": { // Generated code (e.g. Codama clients) is excluded - it's not // hand-maintained and gets overwritten on every regeneration. - "includes": ["**", "!**/Assets", "!**/generated/**"] + "includes": ["**", "!**/Assets", "!**/generated"] }, "formatter": { // Matches more existing code, From e386182ecd3ee6f7b61e26123e3ddfe2c2add687 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 12 Jun 2026 18:43:50 +0000 Subject: [PATCH 082/138] ci: fix rustfmt and Biome failures cargo fmt across the workspace and the standalone crates (the new include_bytes! lines exceeded rustfmt's line width). Pin Biome by switching the root package.json scripts from pnpx (which fetches the latest release and only passed before via a warm CI cache; deleting the per-project pnpm-lock.yaml files changed the cache key and pulled Biome 2.5.0, which fails on pre-existing app SVGs) to the locally installed binary, bumped to 2.4.12 to match the biome.jsonc schema. https://claude.ai/code/session_01GfHnheiE7VPmapt3v4c42p --- .../native/program/tests/tests.rs | 3 +- .../pinocchio/program/tests/tests.rs | 3 +- .../native/program/tests/test.rs | 5 +- .../pinocchio/program/tests/test.rs | 2 +- .../native/program/tests/test.rs | 3 +- .../pinocchio/program/tests/tests.rs | 3 +- basics/counter/native/program/tests/test.rs | 3 +- .../counter/pinocchio/program/tests/test.rs | 3 +- .../pinocchio/program/tests/test.rs | 3 +- .../pinocchio/program/tests/test.rs | 3 +- .../native/program/tests/test.rs | 3 +- .../pinocchio/program/tests/test.rs | 5 +- .../pinocchio/program/tests/test.rs | 3 +- .../program/src/instructions/cancel_offer.rs | 20 +- .../program/src/instructions/make_offer.rs | 15 +- .../program/src/instructions/take_offer.rs | 17 +- package.json | 12 +- pnpm-lock.yaml | 76 +- .../native/program/tests/test.rs | 5 +- .../native/program/tests/test.rs | 5 +- .../transfer-fee/native/program/tests/test.rs | 3 +- .../block-list/pinocchio/cli/src/main.rs | 171 ++-- .../block-list/pinocchio/program/src/error.rs | 3 +- .../program/src/instructions/block_wallet.rs | 43 +- .../program/src/instructions/init.rs | 24 +- .../pinocchio/program/src/instructions/mod.rs | 12 +- .../src/instructions/setup_extra_metas.rs | 65 +- .../program/src/instructions/tx_hook.rs | 32 +- .../src/instructions/unblock_wallet.rs | 20 +- .../block-list/pinocchio/program/src/lib.rs | 21 +- .../pinocchio/program/src/state/config.rs | 1 - .../pinocchio/program/src/state/mod.rs | 1 - .../program/src/token_extensions_utils.rs | 14 +- .../pinocchio/program/tests/test.rs | 21 +- .../rust/src/generated/accounts/car.rs | 139 ++-- .../rust/src/generated/accounts/mod.rs | 9 +- .../src/generated/accounts/rental_order.rs | 152 ++-- .../clients/rust/src/generated/errors/mod.rs | 3 - .../src/generated/instructions/add_car.rs | 658 +++++++-------- .../src/generated/instructions/book_rental.rs | 771 +++++++++--------- .../rust/src/generated/instructions/mod.rs | 17 +- .../src/generated/instructions/pick_up_car.rs | 544 ++++++------ .../src/generated/instructions/return_car.rs | 544 ++++++------ .../native/clients/rust/src/generated/mod.rs | 16 +- .../clients/rust/src/generated/programs.rs | 6 +- .../clients/rust/src/generated/shared.rs | 31 +- .../clients/rust/src/generated/types/mod.rs | 5 +- .../generated/types/rental_order_status.rs | 23 +- .../native/program/tests/test.rs | 24 +- 49 files changed, 1814 insertions(+), 1751 deletions(-) diff --git a/basics/account-data/native/program/tests/tests.rs b/basics/account-data/native/program/tests/tests.rs index c213fe66..7668aef8 100644 --- a/basics/account-data/native/program/tests/tests.rs +++ b/basics/account-data/native/program/tests/tests.rs @@ -23,7 +23,8 @@ fn test_account_data() { // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project // root). Rebuild after every program change: the binary is embedded at // test-compile time, so a stale .so silently tests old code. - let program_bytes = include_bytes!("../../../../../target/deploy/account_data_native_program.so"); + let program_bytes = + include_bytes!("../../../../../target/deploy/account_data_native_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/account-data/pinocchio/program/tests/tests.rs b/basics/account-data/pinocchio/program/tests/tests.rs index 847de80d..ca97bd66 100644 --- a/basics/account-data/pinocchio/program/tests/tests.rs +++ b/basics/account-data/pinocchio/program/tests/tests.rs @@ -22,7 +22,8 @@ fn test_account_data() { // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project // root). Rebuild after every program change: the binary is embedded at // test-compile time, so a stale .so silently tests old code. - let program_bytes = include_bytes!("../../../../../target/deploy/account_data_pinocchio_program.so"); + let program_bytes = + include_bytes!("../../../../../target/deploy/account_data_pinocchio_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/checking-accounts/native/program/tests/test.rs b/basics/checking-accounts/native/program/tests/test.rs index 4083bb20..bf61d7f3 100644 --- a/basics/checking-accounts/native/program/tests/test.rs +++ b/basics/checking-accounts/native/program/tests/test.rs @@ -1,9 +1,9 @@ use litesvm::LiteSVM; +use solana_instruction::{AccountMeta, Instruction}; use solana_keypair::{Keypair, Signer}; use solana_native_token::LAMPORTS_PER_SOL; use solana_pubkey::Pubkey; use solana_system_interface::instruction::create_account; -use solana_instruction::{AccountMeta, Instruction}; use solana_transaction::Transaction; #[test] @@ -21,7 +21,8 @@ fn test_checking_accounts() { // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project // root). Rebuild after every program change: the binary is embedded at // test-compile time, so a stale .so silently tests old code. - let program_bytes = include_bytes!("../../../../../target/deploy/checking_accounts_native_program.so"); + let program_bytes = + include_bytes!("../../../../../target/deploy/checking_accounts_native_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/checking-accounts/pinocchio/program/tests/test.rs b/basics/checking-accounts/pinocchio/program/tests/test.rs index cef61437..4be32993 100644 --- a/basics/checking-accounts/pinocchio/program/tests/test.rs +++ b/basics/checking-accounts/pinocchio/program/tests/test.rs @@ -1,9 +1,9 @@ use litesvm::LiteSVM; +use solana_instruction::{AccountMeta, Instruction}; use solana_keypair::{Keypair, Signer}; use solana_native_token::LAMPORTS_PER_SOL; use solana_pubkey::Pubkey; use solana_system_interface::instruction::create_account; -use solana_instruction::{AccountMeta, Instruction}; use solana_transaction::Transaction; #[test] diff --git a/basics/close-account/native/program/tests/test.rs b/basics/close-account/native/program/tests/test.rs index 7081894e..d0ef1dfc 100644 --- a/basics/close-account/native/program/tests/test.rs +++ b/basics/close-account/native/program/tests/test.rs @@ -19,7 +19,8 @@ fn setup() -> (LiteSVM, Pubkey) { // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project // root). Rebuild after every program change: the binary is embedded at // test-compile time, so a stale .so silently tests old code. - let program_bytes = include_bytes!("../../../../../target/deploy/close_account_native_program.so"); + let program_bytes = + include_bytes!("../../../../../target/deploy/close_account_native_program.so"); svm.add_program(program_id, program_bytes).unwrap(); (svm, program_id) } diff --git a/basics/close-account/pinocchio/program/tests/tests.rs b/basics/close-account/pinocchio/program/tests/tests.rs index 7fa1ce93..fbe66185 100644 --- a/basics/close-account/pinocchio/program/tests/tests.rs +++ b/basics/close-account/pinocchio/program/tests/tests.rs @@ -18,7 +18,8 @@ fn setup() -> (LiteSVM, Pubkey) { // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project // root). Rebuild after every program change: the binary is embedded at // test-compile time, so a stale .so silently tests old code. - let program_bytes = include_bytes!("../../../../../target/deploy/close_account_pinocchio_program.so"); + let program_bytes = + include_bytes!("../../../../../target/deploy/close_account_pinocchio_program.so"); svm.add_program(program_id, program_bytes).unwrap(); (svm, program_id) } diff --git a/basics/counter/native/program/tests/test.rs b/basics/counter/native/program/tests/test.rs index 8fe44523..927d1fcf 100644 --- a/basics/counter/native/program/tests/test.rs +++ b/basics/counter/native/program/tests/test.rs @@ -13,8 +13,7 @@ use solana_transaction::Transaction; // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project // root). Rebuild after every program change: the binary is embedded at // test-compile time, so a stale .so silently tests old code. -const PROGRAM_SO: &[u8] = - include_bytes!("../../../../../target/deploy/counter_solana_native.so"); +const PROGRAM_SO: &[u8] = include_bytes!("../../../../../target/deploy/counter_solana_native.so"); fn setup_with_counter() -> (LiteSVM, Pubkey, Keypair, Keypair) { let program_id = Pubkey::new_unique(); diff --git a/basics/counter/pinocchio/program/tests/test.rs b/basics/counter/pinocchio/program/tests/test.rs index 403bd78d..7a09bac4 100644 --- a/basics/counter/pinocchio/program/tests/test.rs +++ b/basics/counter/pinocchio/program/tests/test.rs @@ -12,7 +12,8 @@ use solana_transaction::Transaction; // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project // root). Rebuild after every program change: the binary is embedded at // test-compile time, so a stale .so silently tests old code. -const PROGRAM_SO: &[u8] = include_bytes!("../../../../../target/deploy/counter_solana_pinocchio.so"); +const PROGRAM_SO: &[u8] = + include_bytes!("../../../../../target/deploy/counter_solana_pinocchio.so"); #[test] fn test_counter() { diff --git a/basics/create-account/pinocchio/program/tests/test.rs b/basics/create-account/pinocchio/program/tests/test.rs index 1747ff6c..32895bbc 100644 --- a/basics/create-account/pinocchio/program/tests/test.rs +++ b/basics/create-account/pinocchio/program/tests/test.rs @@ -12,7 +12,8 @@ fn test_create_account() { // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project // root). Rebuild after every program change: the binary is embedded at // test-compile time, so a stale .so silently tests old code. - let program_bytes = include_bytes!("../../../../../target/deploy/create_account_pinocchio_program.so"); + let program_bytes = + include_bytes!("../../../../../target/deploy/create_account_pinocchio_program.so"); let payer = Keypair::new(); let new_keypair = Keypair::new(); diff --git a/basics/pda-rent-payer/pinocchio/program/tests/test.rs b/basics/pda-rent-payer/pinocchio/program/tests/test.rs index bbfc7eb4..fb9da83e 100644 --- a/basics/pda-rent-payer/pinocchio/program/tests/test.rs +++ b/basics/pda-rent-payer/pinocchio/program/tests/test.rs @@ -12,7 +12,8 @@ fn test_pda_rent_payer() { // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project // root). Rebuild after every program change: the binary is embedded at // test-compile time, so a stale .so silently tests old code. - let program_bytes = include_bytes!("../../../../../target/deploy/pda_rent_payer_pinocchio_program.so"); + let program_bytes = + include_bytes!("../../../../../target/deploy/pda_rent_payer_pinocchio_program.so"); let mut svm = LiteSVM::new(); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/processing-instructions/native/program/tests/test.rs b/basics/processing-instructions/native/program/tests/test.rs index 1cf61325..32fe5b7a 100644 --- a/basics/processing-instructions/native/program/tests/test.rs +++ b/basics/processing-instructions/native/program/tests/test.rs @@ -15,7 +15,8 @@ fn test_processing_ixs() { // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project // root). Rebuild after every program change: the binary is embedded at // test-compile time, so a stale .so silently tests old code. - let program_bytes = include_bytes!("../../../../../target/deploy/processing_instructions_program.so"); + let program_bytes = + include_bytes!("../../../../../target/deploy/processing_instructions_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/basics/program-derived-addresses/pinocchio/program/tests/test.rs b/basics/program-derived-addresses/pinocchio/program/tests/test.rs index 9964f89a..748f5cdc 100644 --- a/basics/program-derived-addresses/pinocchio/program/tests/test.rs +++ b/basics/program-derived-addresses/pinocchio/program/tests/test.rs @@ -16,8 +16,9 @@ fn test_pda() { // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project // root). Rebuild after every program change: the binary is embedded at // test-compile time, so a stale .so silently tests old code. - let program_bytes = - include_bytes!("../../../../../target/deploy/program_derived_addresses_pinocchio_program.so"); + let program_bytes = include_bytes!( + "../../../../../target/deploy/program_derived_addresses_pinocchio_program.so" + ); svm.add_program(program_id, program_bytes).unwrap(); let payer = Keypair::new(); diff --git a/basics/transfer-sol/pinocchio/program/tests/test.rs b/basics/transfer-sol/pinocchio/program/tests/test.rs index c7a80c92..2f5d7ac8 100644 --- a/basics/transfer-sol/pinocchio/program/tests/test.rs +++ b/basics/transfer-sol/pinocchio/program/tests/test.rs @@ -15,7 +15,8 @@ fn test_transfer_sol() { // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project // root). Rebuild after every program change: the binary is embedded at // test-compile time, so a stale .so silently tests old code. - let program_bytes = include_bytes!("../../../../../target/deploy/transfer_sol_pinocchio_program.so"); + let program_bytes = + include_bytes!("../../../../../target/deploy/transfer_sol_pinocchio_program.so"); svm.add_program(program_id, program_bytes).unwrap(); diff --git a/finance/escrow/native/program/src/instructions/cancel_offer.rs b/finance/escrow/native/program/src/instructions/cancel_offer.rs index d3a77f5f..760e66bc 100644 --- a/finance/escrow/native/program/src/instructions/cancel_offer.rs +++ b/finance/escrow/native/program/src/instructions/cancel_offer.rs @@ -2,12 +2,8 @@ use { crate::{error::*, state::*, utils::*}, borsh::{BorshDeserialize, BorshSerialize}, solana_program::{ - account_info::AccountInfo, - entrypoint::ProgramResult, - program::invoke_signed, - program_error::ProgramError, - program_pack::Pack, - pubkey::Pubkey, + account_info::AccountInfo, entrypoint::ProgramResult, program::invoke_signed, + program_error::ProgramError, program_pack::Pack, pubkey::Pubkey, }, spl_token_interface::{ instruction as token_instruction, @@ -25,15 +21,9 @@ pub struct CancelOffer {} impl CancelOffer { pub fn process(program_id: &Pubkey, accounts: &[AccountInfo<'_>]) -> ProgramResult { - let [ - offer_info, - token_mint_a, - maker_token_account_a, - vault, - maker, - token_program, - system_program - ] = accounts else { + let [offer_info, token_mint_a, maker_token_account_a, vault, maker, token_program, system_program] = + accounts + else { return Err(ProgramError::NotEnoughAccountKeys); }; diff --git a/finance/escrow/native/program/src/instructions/make_offer.rs b/finance/escrow/native/program/src/instructions/make_offer.rs index 173e35c0..5d1015d5 100644 --- a/finance/escrow/native/program/src/instructions/make_offer.rs +++ b/finance/escrow/native/program/src/instructions/make_offer.rs @@ -32,18 +32,9 @@ impl MakeOffer { accounts: &[AccountInfo<'_>], args: MakeOffer, ) -> ProgramResult { - let [ - offer_info, - token_mint_a, - token_mint_b, - maker_token_account_a, - maker_token_account_b, - vault, - maker, - token_program, - associated_token_program, - system_program - ] = accounts else { + let [offer_info, token_mint_a, token_mint_b, maker_token_account_a, maker_token_account_b, vault, maker, token_program, associated_token_program, system_program] = + accounts + else { return Err(ProgramError::NotEnoughAccountKeys); }; diff --git a/finance/escrow/native/program/src/instructions/take_offer.rs b/finance/escrow/native/program/src/instructions/take_offer.rs index c73bc7e0..fe42d101 100644 --- a/finance/escrow/native/program/src/instructions/take_offer.rs +++ b/finance/escrow/native/program/src/instructions/take_offer.rs @@ -21,20 +21,9 @@ pub struct TakeOffer {} impl TakeOffer { pub fn process(program_id: &Pubkey, accounts: &[AccountInfo<'_>]) -> ProgramResult { - let [ - offer_info, - token_mint_a, - token_mint_b, - maker_token_account_b, - taker_token_account_a, - taker_token_account_b, - vault, - maker, - taker, - token_program, - associated_token_program, - system_program - ] = accounts else { + let [offer_info, token_mint_a, token_mint_b, maker_token_account_b, taker_token_account_a, taker_token_account_b, vault, maker, taker, token_program, associated_token_program, system_program] = + accounts + else { return Err(ProgramError::NotEnoughAccountKeys); }; diff --git a/package.json b/package.json index 2fd29427..6d4b6b88 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,11 @@ "version": "1.0.0", "description": "Solana program examples for Anchor, Quasar, Pinocchio, Native Rust, and ASM.", "scripts": { - "format:fix": "pnpx @biomejs/biome format --write ./", - "lint:fix": "pnpx @biomejs/biome lint --write ./", - "lint": "pnpx @biomejs/biome lint ./", - "fix": "pnpx @biomejs/biome check --write ./", - "check": "pnpx @biomejs/biome check ./", + "format:fix": "biome format --write ./", + "lint:fix": "biome lint --write ./", + "lint": "biome lint ./", + "fix": "biome check --write ./", + "check": "biome check ./", "prepare": "husky" }, "lint-staged": { @@ -20,7 +20,7 @@ "author": "Quicknode", "license": "MIT", "devDependencies": { - "@biomejs/biome": "2.4.10", + "@biomejs/biome": "2.4.12", "@types/node": "^20.9.0", "husky": "^9.0.11", "lint-staged": "^15.4.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c73d748..b5a6bee8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: 2.4.10 - version: 2.4.10 + specifier: 2.4.12 + version: 2.4.12 '@types/node': specifier: ^20.9.0 version: 20.14.2 @@ -26,59 +26,59 @@ importers: packages: - '@biomejs/biome@2.4.10': - resolution: {integrity: sha512-xxA3AphFQ1geij4JTHXv4EeSTda1IFn22ye9LdyVPoJU19fNVl0uzfEuhsfQ4Yue/0FaLs2/ccVi4UDiE7R30w==} + '@biomejs/biome@2.4.12': + resolution: {integrity: sha512-Rro7adQl3NLq/zJCIL98eElXKI8eEiBtoeu5TbXF/U3qbjuSc7Jb5rjUbeHHcquDWeSf3HnGP7XI5qGrlRk/pA==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.4.10': - resolution: {integrity: sha512-vuzzI1cWqDVzOMIkYyHbKqp+AkQq4K7k+UCXWpkYcY/HDn1UxdsbsfgtVpa40shem8Kax4TLDLlx8kMAecgqiw==} + '@biomejs/cli-darwin-arm64@2.4.12': + resolution: {integrity: sha512-BnMU4Pc3ciEVteVpZ0BK33MLr7X57F5w1dwDLDn+/iy/yTrA4Q/N2yftidFtsA4vrDh0FMXDpacNV/Tl3fbmng==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.4.10': - resolution: {integrity: sha512-14fzASRo+BPotwp7nWULy2W5xeUyFnTaq1V13Etrrxkrih+ez/2QfgFm5Ehtf5vSjtgx/IJycMMpn5kPd5ZNaA==} + '@biomejs/cli-darwin-x64@2.4.12': + resolution: {integrity: sha512-x9uJ0bI1rJsWICp3VH8w/5PnAVD3A7SqzDpbrfoUQX1QyWrK5jSU4fRLo/wSgGeplCivbxBRKmt5Xq4/nWvq8A==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.4.10': - resolution: {integrity: sha512-WrJY6UuiSD/Dh+nwK2qOTu8kdMDlLV3dLMmychIghHPAysWFq1/DGC1pVZx8POE3ZkzKR3PUUnVrtZfMfaJjyQ==} + '@biomejs/cli-linux-arm64-musl@2.4.12': + resolution: {integrity: sha512-FhfpkAAlKL6kwvcVap0Hgp4AhZmtd3YImg0kK1jd7C/aSoh4SfsB2f++yG1rU0lr8Y5MCFJrcSkmssiL9Xnnig==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.4.10': - resolution: {integrity: sha512-7MH1CMW5uuxQ/s7FLST63qF8B3Hgu2HRdZ7tA1X1+mk+St4JOuIrqdhIBnnyqeyWJNI+Bww7Es5QZ0wIc1Cmkw==} + '@biomejs/cli-linux-arm64@2.4.12': + resolution: {integrity: sha512-tOwuCuZZtKi1jVzbk/5nXmIsziOB6yqN8c9r9QM0EJYPU6DpQWf11uBOSCfFKKM4H3d9ZoarvlgMfbcuD051Pw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.4.10': - resolution: {integrity: sha512-kDTi3pI6PBN6CiczsWYOyP2zk0IJI08EWEQyDMQWW221rPaaEz6FvjLhnU07KMzLv8q3qSuoB93ua6inSQ55Tw==} + '@biomejs/cli-linux-x64-musl@2.4.12': + resolution: {integrity: sha512-dwTIgZrGutzhkQCuvHynCkyW6hJxUuyZqKKO0YNfaS2GUoRO+tOvxXZqZB6SkWAOdfZTzwaw8IEdUnIkHKHoew==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.4.10': - resolution: {integrity: sha512-tZLvEEi2u9Xu1zAqRjTcpIDGVtldigVvzug2fTuPG0ME/g8/mXpRPcNgLB22bGn6FvLJpHHnqLnwliOu8xjYrg==} + '@biomejs/cli-linux-x64@2.4.12': + resolution: {integrity: sha512-8pFeAnLU9QdW9jCIslB/v82bI0lhBmz2ZAKc8pVMFPO0t0wAHsoEkrUQUbMkIorTRIjbqyNZHA3lEXavsPWYSw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.4.10': - resolution: {integrity: sha512-umwQU6qPzH+ISTf/eHyJ/QoQnJs3V9Vpjz2OjZXe9MVBZ7prgGafMy7yYeRGnlmDAn87AKTF3Q6weLoMGpeqdQ==} + '@biomejs/cli-win32-arm64@2.4.12': + resolution: {integrity: sha512-B0DLnx0vA9ya/3v7XyCaP+/lCpnbWbMOfUFFve+xb5OxyYvdHaS55YsSddr228Y+JAFk58agCuZTsqNiw2a6ig==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.4.10': - resolution: {integrity: sha512-aW/JU5GuyH4uxMrNYpoC2kjaHlyJGLgIa3XkhPEZI0uKhZhJZU8BuEyJmvgzSPQNGozBwWjC972RaNdcJ9KyJg==} + '@biomejs/cli-win32-x64@2.4.12': + resolution: {integrity: sha512-yMckRzTyZ83hkk8iDFWswqSdU8tvZxspJKnYNh7JZr/zhZNOlzH13k4ecboU6MurKExCe2HUkH75pGI/O2JwGA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -323,39 +323,39 @@ packages: snapshots: - '@biomejs/biome@2.4.10': + '@biomejs/biome@2.4.12': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.10 - '@biomejs/cli-darwin-x64': 2.4.10 - '@biomejs/cli-linux-arm64': 2.4.10 - '@biomejs/cli-linux-arm64-musl': 2.4.10 - '@biomejs/cli-linux-x64': 2.4.10 - '@biomejs/cli-linux-x64-musl': 2.4.10 - '@biomejs/cli-win32-arm64': 2.4.10 - '@biomejs/cli-win32-x64': 2.4.10 - - '@biomejs/cli-darwin-arm64@2.4.10': + '@biomejs/cli-darwin-arm64': 2.4.12 + '@biomejs/cli-darwin-x64': 2.4.12 + '@biomejs/cli-linux-arm64': 2.4.12 + '@biomejs/cli-linux-arm64-musl': 2.4.12 + '@biomejs/cli-linux-x64': 2.4.12 + '@biomejs/cli-linux-x64-musl': 2.4.12 + '@biomejs/cli-win32-arm64': 2.4.12 + '@biomejs/cli-win32-x64': 2.4.12 + + '@biomejs/cli-darwin-arm64@2.4.12': optional: true - '@biomejs/cli-darwin-x64@2.4.10': + '@biomejs/cli-darwin-x64@2.4.12': optional: true - '@biomejs/cli-linux-arm64-musl@2.4.10': + '@biomejs/cli-linux-arm64-musl@2.4.12': optional: true - '@biomejs/cli-linux-arm64@2.4.10': + '@biomejs/cli-linux-arm64@2.4.12': optional: true - '@biomejs/cli-linux-x64-musl@2.4.10': + '@biomejs/cli-linux-x64-musl@2.4.12': optional: true - '@biomejs/cli-linux-x64@2.4.10': + '@biomejs/cli-linux-x64@2.4.12': optional: true - '@biomejs/cli-win32-arm64@2.4.10': + '@biomejs/cli-win32-arm64@2.4.12': optional: true - '@biomejs/cli-win32-x64@2.4.10': + '@biomejs/cli-win32-x64@2.4.12': optional: true '@types/node@20.14.2': diff --git a/tokens/token-extensions/default-account-state/native/program/tests/test.rs b/tokens/token-extensions/default-account-state/native/program/tests/test.rs index 3223c098..053c11be 100644 --- a/tokens/token-extensions/default-account-state/native/program/tests/test.rs +++ b/tokens/token-extensions/default-account-state/native/program/tests/test.rs @@ -26,8 +26,9 @@ fn test_create_token_with_default_account_state() { // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the // project root). Rebuild after every program change: the binary is // embedded at test-compile time, so a stale .so silently tests old code. - let program_bytes = - include_bytes!("../../../../../../target/deploy/token_2022_default_account_state_program.so"); + let program_bytes = include_bytes!( + "../../../../../../target/deploy/token_2022_default_account_state_program.so" + ); svm.add_program(program_id, program_bytes).unwrap(); // litesvm bundles the Token Extensions program by default. diff --git a/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs b/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs index 206a03f3..dff4fc69 100644 --- a/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs +++ b/tokens/token-extensions/mint-close-authority/native/program/tests/test.rs @@ -25,8 +25,9 @@ fn test_create_token_with_mint_close_authority() { // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the // project root). Rebuild after every program change: the binary is // embedded at test-compile time, so a stale .so silently tests old code. - let program_bytes = - include_bytes!("../../../../../../target/deploy/token_2022_mint_close_authority_program.so"); + let program_bytes = include_bytes!( + "../../../../../../target/deploy/token_2022_mint_close_authority_program.so" + ); svm.add_program(program_id, program_bytes).unwrap(); // litesvm bundles the Token Extensions program by default. diff --git a/tokens/token-extensions/transfer-fee/native/program/tests/test.rs b/tokens/token-extensions/transfer-fee/native/program/tests/test.rs index db76dbc8..b2102dc8 100644 --- a/tokens/token-extensions/transfer-fee/native/program/tests/test.rs +++ b/tokens/token-extensions/transfer-fee/native/program/tests/test.rs @@ -25,7 +25,8 @@ fn test_create_token_with_transfer_fee() { // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the // project root). Rebuild after every program change: the binary is // embedded at test-compile time, so a stale .so silently tests old code. - let program_bytes = include_bytes!("../../../../../../target/deploy/token_2022_transfer_fees_program.so"); + let program_bytes = + include_bytes!("../../../../../../target/deploy/token_2022_transfer_fees_program.so"); svm.add_program(program_id, program_bytes).unwrap(); // litesvm bundles the Token Extensions program by default. diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/cli/src/main.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/cli/src/main.rs index 7c5d7cc5..27439973 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/cli/src/main.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/cli/src/main.rs @@ -1,18 +1,29 @@ use { - clap::{builder::BoolishValueParser, crate_description, crate_name, crate_version, Arg, Command}, solana_clap_v3_utils::{ + clap::{ + builder::BoolishValueParser, crate_description, crate_name, crate_version, Arg, Command, + }, + solana_clap_v3_utils::{ input_parsers::{ parse_url_or_moniker, signer::{SignerSource, SignerSourceParserBuilder}, }, input_validators::normalize_to_url_if_moniker, keypair::signer_from_path, - }, solana_client::nonblocking::rpc_client::RpcClient, solana_remote_wallet::remote_wallet::RemoteWalletManager, solana_sdk::{ + }, + solana_client::nonblocking::rpc_client::RpcClient, + solana_remote_wallet::remote_wallet::RemoteWalletManager, + solana_sdk::{ commitment_config::CommitmentConfig, message::Message, pubkey::Pubkey, signature::{Signature, Signer}, transaction::Transaction, - }, spl_tlv_account_resolution::{account::ExtraAccountMeta, seeds::Seed, state::ExtraAccountMetaList}, spl_transfer_hook_interface::instruction::ExecuteInstruction, std::{error::Error, process::exit, rc::Rc, sync::Arc} + }, + spl_tlv_account_resolution::{ + account::ExtraAccountMeta, seeds::Seed, state::ExtraAccountMetaList, + }, + spl_transfer_hook_interface::instruction::ExecuteInstruction, + std::{error::Error, process::exit, rc::Rc, sync::Arc}, }; struct Config { @@ -38,7 +49,8 @@ pub fn get_extra_account_metas_with_source_wallet_block() -> Vec Vec { @@ -57,7 +69,8 @@ pub fn get_extra_account_metas_with_both_wallet_blocks() -> Vec Vec Vec { let size = ExtraAccountMetaList::size_of(0).unwrap(); let metas: Vec = vec![]; @@ -123,7 +136,6 @@ async fn get_extra_metas(rpc_client: &Arc, mint_address: &Pubkey) { let extra_metas = block_list_client::accounts::ExtraMetas::find_pda(mint_address).0; let data = rpc_client.get_account_data(&extra_metas).await.unwrap(); println!("extra_metas: {:?}", data); - } async fn process_setup_extra_metas( @@ -141,7 +153,7 @@ async fn process_setup_extra_metas( .instruction(); let mut transaction = Transaction::new_unsigned(Message::new(&[ix], Some(&payer.pubkey()))); - + let blockhash = rpc_client .get_latest_blockhash() .await @@ -163,14 +175,13 @@ async fn process_init( rpc_client: &Arc, payer: &Arc, ) -> Result> { - let ix = block_list_client::instructions::InitBuilder::new() .authority(payer.pubkey()) .config(block_list_client::accounts::Config::find_pda().0) .instruction(); let mut transaction = Transaction::new_unsigned(Message::new(&[ix], Some(&payer.pubkey()))); - + let blockhash = rpc_client .get_latest_blockhash() .await @@ -193,7 +204,6 @@ async fn process_block_wallet( payer: &Arc, wallet_address: &Pubkey, ) -> Result> { - let ix = block_list_client::instructions::BlockWalletBuilder::new() .authority(payer.pubkey()) .config(block_list_client::accounts::Config::find_pda().0) @@ -202,7 +212,7 @@ async fn process_block_wallet( .instruction(); let mut transaction = Transaction::new_unsigned(Message::new(&[ix], Some(&payer.pubkey()))); - + let blockhash = rpc_client .get_latest_blockhash() .await @@ -232,7 +242,7 @@ async fn process_unblock_wallet( .instruction(); let mut transaction = Transaction::new_unsigned(Message::new(&[ix], Some(&payer.pubkey()))); - + let blockhash = rpc_client .get_latest_blockhash() .await @@ -250,7 +260,6 @@ async fn process_unblock_wallet( Ok(signature) } - #[tokio::main] async fn main() -> Result<(), Box> { let app_matches = Command::new(crate_name!()) @@ -299,64 +308,62 @@ async fn main() -> Result<(), Box> { .value_parser(parse_url_or_moniker) .help("JSON RPC URL for the cluster [default: value from configuration file]"), ) + .subcommand(Command::new("init").about("Initializes the blocklist")) .subcommand( - Command::new("init").about("Initializes the blocklist") - ) - .subcommand( - Command::new("block-wallet").about("Blocks a wallet") - .arg( + Command::new("block-wallet").about("Blocks a wallet").arg( Arg::new("wallet_address") .value_name("WALLET_ADDRESS") .value_parser(SignerSourceParserBuilder::default().allow_pubkey().build()) .takes_value(true) .index(1) .help("Specify the wallet address to block"), - ) - ) - .subcommand( - Command::new("unblock-wallet").about("Unblocks a wallet") - .arg( - Arg::new("wallet_address") - .value_name("WALLET_ADDRESS") - .value_parser(SignerSourceParserBuilder::default().allow_pubkey().build()) - .takes_value(true) - .index(1) - .help("Specify the wallet address to unblock"), - ) + ), ) .subcommand( - Command::new("get-extra-metas-account-data").about("Gets the extra metas account data") + Command::new("unblock-wallet") + .about("Unblocks a wallet") + .arg( + Arg::new("wallet_address") + .value_name("WALLET_ADDRESS") + .value_parser(SignerSourceParserBuilder::default().allow_pubkey().build()) + .takes_value(true) + .index(1) + .help("Specify the wallet address to unblock"), + ), ) .subcommand( - Command::new("get-config").about("Gets the config account data") + Command::new("get-extra-metas-account-data").about("Gets the extra metas account data"), ) + .subcommand(Command::new("get-config").about("Gets the config account data")) .subcommand( - Command::new("get-extra-metas").about("Gets the extra metas account data") - .arg( - Arg::new("mint_address") - .value_name("MINT_ADDRESS") - .value_parser(SignerSourceParserBuilder::default().allow_pubkey().build()) - .takes_value(true) - .index(1) - .help("Specify the mint address"), - ) + Command::new("get-extra-metas") + .about("Gets the extra metas account data") + .arg( + Arg::new("mint_address") + .value_name("MINT_ADDRESS") + .value_parser(SignerSourceParserBuilder::default().allow_pubkey().build()) + .takes_value(true) + .index(1) + .help("Specify the mint address"), + ), ) .subcommand( - Command::new("setup-extra-metas").about("Setup the extra metas account") - .arg( - Arg::new("mint_address") - .value_name("MINT_ADDRESS") - .value_parser(SignerSourceParserBuilder::default().allow_pubkey().build()) - .takes_value(true) - .index(1) - .help("Specify the mint address"), - ) - .arg( - Arg::new("check-both-wallets") - .long("check-both-wallets") - .short('b') - .help("Specify if both wallets should be checked"), - ) + Command::new("setup-extra-metas") + .about("Setup the extra metas account") + .arg( + Arg::new("mint_address") + .value_name("MINT_ADDRESS") + .value_parser(SignerSourceParserBuilder::default().allow_pubkey().build()) + .takes_value(true) + .index(1) + .help("Specify the mint address"), + ) + .arg( + Arg::new("check-both-wallets") + .long("check-both-wallets") + .short('b') + .help("Specify if both wallets should be checked"), + ), ) .get_matches(); @@ -408,15 +415,12 @@ async fn main() -> Result<(), Box> { match (command, matches) { ("init", _arg_matches) => { - let response = process_init( - &rpc_client, - &config.payer, - ) - .await - .unwrap_or_else(|err| { - eprintln!("error: init: {}", err); - exit(1); - }); + let response = process_init(&rpc_client, &config.payer) + .await + .unwrap_or_else(|err| { + eprintln!("error: init: {}", err); + exit(1); + }); println!("{}", response); } ("block-wallet", arg_matches) => { @@ -424,16 +428,12 @@ async fn main() -> Result<(), Box> { SignerSource::try_get_pubkey(arg_matches, "wallet_address", &mut wallet_manager) .unwrap() .unwrap(); - let response = process_block_wallet( - &rpc_client, - &config.payer, - &wallet_address, - ) - .await - .unwrap_or_else(|err| { - eprintln!("error: init: {}", err); - exit(1); - }); + let response = process_block_wallet(&rpc_client, &config.payer, &wallet_address) + .await + .unwrap_or_else(|err| { + eprintln!("error: init: {}", err); + exit(1); + }); println!("{}", response); } ("unblock-wallet", arg_matches) => { @@ -441,16 +441,12 @@ async fn main() -> Result<(), Box> { SignerSource::try_get_pubkey(arg_matches, "wallet_address", &mut wallet_manager) .unwrap() .unwrap(); - let response = process_unblock_wallet( - &rpc_client, - &config.payer, - &wallet_address, - ) - .await - .unwrap_or_else(|err| { - eprintln!("error: init: {}", err); - exit(1); - }); + let response = process_unblock_wallet(&rpc_client, &config.payer, &wallet_address) + .await + .unwrap_or_else(|err| { + eprintln!("error: init: {}", err); + exit(1); + }); println!("{}", response); } ("get-extra-metas-account-data", _arg_matches) => { @@ -490,4 +486,3 @@ async fn main() -> Result<(), Box> { Ok(()) } - \ No newline at end of file diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/error.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/error.rs index 1d8a7ab7..26bbf1d0 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/error.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/error.rs @@ -17,9 +17,8 @@ pub enum BlockListError { ImmutableOwnerExtensionMissing, } - impl From for ProgramError { fn from(e: BlockListError) -> Self { ProgramError::Custom(e as u32) } -} \ No newline at end of file +} diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/block_wallet.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/block_wallet.rs index 0cdea2d0..e265db9c 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/block_wallet.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/block_wallet.rs @@ -1,7 +1,16 @@ -use pinocchio::{account_info::AccountInfo, instruction::Signer, program_error::ProgramError, pubkey::find_program_address, seeds, sysvars::{rent::Rent, Sysvar}, ProgramResult}; - -use crate::{load, load_mut_unchecked, BlockListError, Config, Discriminator, Transmutable, WalletBlock}; - +use pinocchio::{ + account_info::AccountInfo, + instruction::Signer, + program_error::ProgramError, + pubkey::find_program_address, + seeds, + sysvars::{rent::Rent, Sysvar}, + ProgramResult, +}; + +use crate::{ + load, load_mut_unchecked, BlockListError, Config, Discriminator, Transmutable, WalletBlock, +}; pub struct BlockWallet<'a> { pub authority: &'a AccountInfo, @@ -19,25 +28,28 @@ impl<'a> BlockWallet<'a> { let bump_seed = [self.wallet_block_bump]; let seeds = seeds!(WalletBlock::SEED_PREFIX, self.wallet.key(), &bump_seed); let signer = Signer::from(&seeds); - + pinocchio_system::instructions::CreateAccount { from: self.authority, to: self.wallet_block, lamports, space: WalletBlock::LEN as u64, owner: &crate::ID, - }.invoke_signed(&[signer])?; + } + .invoke_signed(&[signer])?; let mut data = self.wallet_block.try_borrow_mut_data()?; - let wallet_block = unsafe { - load_mut_unchecked::(&mut data)? - }; + let wallet_block = unsafe { load_mut_unchecked::(&mut data)? }; wallet_block.discriminator = WalletBlock::DISCRIMINATOR; wallet_block.address = *self.wallet.key(); - let config = unsafe { load_mut_unchecked::(self.config.borrow_mut_data_unchecked())? }; - config.blocked_wallets_count = config.blocked_wallets_count.checked_add(1).ok_or(ProgramError::ArithmeticOverflow)?; - + let config = + unsafe { load_mut_unchecked::(self.config.borrow_mut_data_unchecked())? }; + config.blocked_wallets_count = config + .blocked_wallets_count + .checked_add(1) + .ok_or(ProgramError::ArithmeticOverflow)?; + Ok(()) } } @@ -55,7 +67,7 @@ impl<'a> TryFrom<&'a [AccountInfo]> for BlockWallet<'a> { }; let cfg = unsafe { load::(config.borrow_data_unchecked())? }; - + if !config.is_owned_by(&crate::ID) { return Err(BlockListError::InvalidConfigAccount); } @@ -68,7 +80,8 @@ impl<'a> TryFrom<&'a [AccountInfo]> for BlockWallet<'a> { return Err(BlockListError::AccountNotWritable); } - let (_, wallet_block_bump) = find_program_address(&[WalletBlock::SEED_PREFIX, wallet.key()], &crate::ID); + let (_, wallet_block_bump) = + find_program_address(&[WalletBlock::SEED_PREFIX, wallet.key()], &crate::ID); // check if system program is valid if system_program.key().ne(&pinocchio_system::ID) { @@ -84,4 +97,4 @@ impl<'a> TryFrom<&'a [AccountInfo]> for BlockWallet<'a> { wallet_block_bump, }) } -} \ No newline at end of file +} diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/init.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/init.rs index f186d8d4..c57a5da9 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/init.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/init.rs @@ -1,9 +1,14 @@ -use pinocchio::{account_info::AccountInfo, instruction::Signer, pubkey::find_program_address, seeds, sysvars::{rent::Rent, Sysvar}, ProgramResult}; +use pinocchio::{ + account_info::AccountInfo, + instruction::Signer, + pubkey::find_program_address, + seeds, + sysvars::{rent::Rent, Sysvar}, + ProgramResult, +}; use crate::{load_mut_unchecked, BlockListError, Config, Discriminator, Transmutable}; - - pub struct Init<'a> { pub authority: &'a AccountInfo, pub config: &'a AccountInfo, @@ -32,7 +37,6 @@ impl<'a> TryFrom<&'a [AccountInfo]> for Init<'a> { return Err(BlockListError::InvalidInstruction); }*/ - // derive config account let (_, config_bump) = find_program_address(&[Config::SEED_PREFIX], &crate::ID); // no need to check if address is valid @@ -47,7 +51,6 @@ impl<'a> TryFrom<&'a [AccountInfo]> for Init<'a> { return Err(BlockListError::InvalidSystemProgram); } - Ok(Self { authority, config, @@ -64,22 +67,21 @@ impl<'a> Init<'a> { let bump_seed = [self.config_bump]; let seeds = seeds!(Config::SEED_PREFIX, &bump_seed); let signer = Signer::from(&seeds); - + pinocchio_system::instructions::CreateAccount { from: self.authority, to: self.config, lamports, space: Config::LEN as u64, owner: &crate::ID, - }.invoke_signed(&[signer])?; + } + .invoke_signed(&[signer])?; let mut data = self.config.try_borrow_mut_data()?; - let config = unsafe { - load_mut_unchecked::(&mut data)? - }; + let config = unsafe { load_mut_unchecked::(&mut data)? }; config.discriminator = Config::DISCRIMINATOR; config.authority = *self.authority.key(); Ok(()) } -} \ No newline at end of file +} diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/mod.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/mod.rs index 1f2ea6b9..77770ff2 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/mod.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/mod.rs @@ -1,11 +1,11 @@ -pub mod tx_hook; -pub mod init; pub mod block_wallet; -pub mod unblock_wallet; +pub mod init; pub mod setup_extra_metas; +pub mod tx_hook; +pub mod unblock_wallet; -pub use tx_hook::*; -pub use init::*; pub use block_wallet::*; +pub use init::*; +pub use setup_extra_metas::*; +pub use tx_hook::*; pub use unblock_wallet::*; -pub use setup_extra_metas::*; \ No newline at end of file diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/setup_extra_metas.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/setup_extra_metas.rs index cf60c050..c3966ea7 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/setup_extra_metas.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/setup_extra_metas.rs @@ -1,7 +1,20 @@ -use pinocchio::{account_info::AccountInfo, instruction::Signer, memory::sol_memcpy, pubkey::find_program_address, seeds, sysvars::{rent::Rent, Sysvar}, ProgramResult}; - -use crate::{load, token_extensions_utils::{get_transfer_hook_authority, EXTRA_METAS_SEED, is_token_extensions_mint}, BlockListError, Config, Discriminator}; - +use pinocchio::{ + account_info::AccountInfo, + instruction::Signer, + memory::sol_memcpy, + pubkey::find_program_address, + seeds, + sysvars::{rent::Rent, Sysvar}, + ProgramResult, +}; + +use crate::{ + load, + token_extensions_utils::{ + get_transfer_hook_authority, is_token_extensions_mint, EXTRA_METAS_SEED, + }, + BlockListError, Config, Discriminator, +}; pub struct SetupExtraMetas<'a> { pub authority: &'a AccountInfo, @@ -32,13 +45,17 @@ impl<'a> TryFrom<&'a [AccountInfo]> for SetupExtraMetas<'a> { return Err(BlockListError::InvalidMint); } - let transfer_hook_authority = get_transfer_hook_authority(unsafe { mint.borrow_data_unchecked() }); - if transfer_hook_authority.is_none() || !transfer_hook_authority.unwrap().eq(authority.key()) { + let transfer_hook_authority = + get_transfer_hook_authority(unsafe { mint.borrow_data_unchecked() }); + if transfer_hook_authority.is_none() + || !transfer_hook_authority.unwrap().eq(authority.key()) + { return Err(BlockListError::InvalidAuthority); } // derive extra_metas account - let (extra_metas_address, extra_metas_bump) = find_program_address(&[EXTRA_METAS_SEED, mint.key()], &crate::ID); + let (extra_metas_address, extra_metas_bump) = + find_program_address(&[EXTRA_METAS_SEED, mint.key()], &crate::ID); if extra_metas_address.ne(extra_metas.key()) { return Err(BlockListError::InvalidExtraMetasAccount); @@ -63,7 +80,7 @@ impl<'a> TryFrom<&'a [AccountInfo]> for SetupExtraMetas<'a> { impl<'a> SetupExtraMetas<'a> { pub fn process(&self, remaining_data: &[u8]) -> ProgramResult { let config = unsafe { load::(&self.config.borrow_data_unchecked())? }; - + let data = if config.blocked_wallets_count == 0 { EXTRA_METAS_EMPTY_DEPENDENCIES } else if remaining_data.len() == 1 && remaining_data[0] == 1 { @@ -88,13 +105,15 @@ impl<'a> SetupExtraMetas<'a> { from: self.authority, to: self.extra_metas, lamports: diff, - }.invoke()?; + } + .invoke()?; } else if current_lamports > min_lamports { // transfer from extra let diff = current_lamports - min_lamports; unsafe { *self.extra_metas.borrow_mut_lamports_unchecked() = min_lamports; - *self.authority.borrow_mut_lamports_unchecked() = auth_lamports.checked_add(diff).unwrap(); + *self.authority.borrow_mut_lamports_unchecked() = + auth_lamports.checked_add(diff).unwrap(); } } } else { @@ -103,31 +122,41 @@ impl<'a> SetupExtraMetas<'a> { let bump_seed = [self.extra_metas_bump]; let seeds = seeds!(EXTRA_METAS_SEED, self.mint.key(), &bump_seed); let signer = Signer::from(&seeds); - + pinocchio_system::instructions::CreateAccount { from: self.authority, to: self.extra_metas, lamports: min_lamports, space: data.len() as u64, owner: &crate::ID, - }.invoke_signed(&[signer])?; + } + .invoke_signed(&[signer])?; } // overwrite state depending on config let extra_metas_data = unsafe { self.extra_metas.borrow_mut_data_unchecked() }; - unsafe { sol_memcpy(extra_metas_data, data, data.len()); } + unsafe { + sol_memcpy(extra_metas_data, data, data.len()); + } Ok(()) } } - /// HOW TO GET THESE MAGIC VALUES /// run the CLI using `block-list-cli get-extra-metas-account-data` /// it will generate the 3 arrays without needing to add more dependencies (bloat) to the program -pub const EXTRA_METAS_EMPTY_DEPENDENCIES: &[u8] = &[105, 37, 101, 197, 75, 251, 102, 26, 4, 0, 0, 0, 0, 0, 0, 0]; -pub const EXTRA_METAS_SOURCE_DEPENDENCY: &[u8] = &[105, 37, 101, 197, 75, 251, 102, 26, 39, 0, 0, 0, 1, 0, 0, 0, 1, 1, 12, 119, 97, 108, 108, 101, 116, 95, 98, 108, 111, 99, 107, 4, 0, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; -pub const EXTRA_METAS_BOTH_DEPENDENCIES: &[u8] = &[105, 37, 101, 197, 75, 251, 102, 26, 74, 0, 0, 0, 2, 0, 0, 0, 1, 1, 12, 119, 97, 108, 108, 101, 116, 95, 98, 108, 111, 99, 107, 4, 0, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 12, 119, 97, 108, 108, 101, 116, 95, 98, 108, 111, 99, 107, 4, 2, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - +pub const EXTRA_METAS_EMPTY_DEPENDENCIES: &[u8] = + &[105, 37, 101, 197, 75, 251, 102, 26, 4, 0, 0, 0, 0, 0, 0, 0]; +pub const EXTRA_METAS_SOURCE_DEPENDENCY: &[u8] = &[ + 105, 37, 101, 197, 75, 251, 102, 26, 39, 0, 0, 0, 1, 0, 0, 0, 1, 1, 12, 119, 97, 108, 108, 101, + 116, 95, 98, 108, 111, 99, 107, 4, 0, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +]; +pub const EXTRA_METAS_BOTH_DEPENDENCIES: &[u8] = &[ + 105, 37, 101, 197, 75, 251, 102, 26, 74, 0, 0, 0, 2, 0, 0, 0, 1, 1, 12, 119, 97, 108, 108, 101, + 116, 95, 98, 108, 111, 99, 107, 4, 0, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 12, 119, 97, 108, 108, 101, 116, 95, 98, 108, 111, 99, 107, 4, 2, 32, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +]; diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/tx_hook.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/tx_hook.rs index 1456e74e..92b833ae 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/tx_hook.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/tx_hook.rs @@ -1,10 +1,12 @@ use pinocchio::{account_info::AccountInfo, pubkey::Pubkey, ProgramResult}; -use crate::{load, token_extensions_utils::has_immutable_owner_extension, BlockListError, WalletBlock}; +use crate::{ + load, token_extensions_utils::has_immutable_owner_extension, BlockListError, WalletBlock, +}; /// /// SECURITY ASSUMPTIONS OVER TX-HOOK -/// +/// /// 1- its called by the token-2022 program /// 2- if some other program is calling it, we don't care as we don't write state here /// 2- its inputs are already sanitized by the token-2022 program @@ -31,7 +33,7 @@ impl<'a> TxHook<'a> { pub fn process(&self) -> ProgramResult { // check if there is a wallet block for the source account if let Some(source_wallet_block) = self.source_wallet_block { - let source_data = unsafe {self.source.borrow_data_unchecked()}; + let source_data = unsafe { self.source.borrow_data_unchecked() }; // without the immutable owner extension, TA owners could bypass wallet blocks // by changing the owner to a different wallet controlled by the same entity if !has_immutable_owner_extension(source_data) { @@ -39,8 +41,8 @@ impl<'a> TxHook<'a> { } if !source_wallet_block.data_is_empty() { - - let _ = unsafe { load::(source_wallet_block.borrow_data_unchecked())? }; + let _ = + unsafe { load::(source_wallet_block.borrow_data_unchecked())? }; // its a potential blocked wallet // lets check if authority is not the owner nor the delegate @@ -53,35 +55,31 @@ impl<'a> TxHook<'a> { if owner.eq(self.authority.key()) || delegate.eq(self.authority.key()) { return Err(BlockListError::AccountBlocked.into()); } - } - } // check if there is a wallet block for the destination account if let Some(destination_wallet_block) = self.destination_wallet_block { - - if !has_immutable_owner_extension(unsafe {self.destination.borrow_data_unchecked()}) { + if !has_immutable_owner_extension(unsafe { self.destination.borrow_data_unchecked() }) { return Err(BlockListError::ImmutableOwnerExtensionMissing.into()); } if !destination_wallet_block.data_is_empty() { - let _ = unsafe { load::(destination_wallet_block.borrow_data_unchecked())? }; + let _ = unsafe { + load::(destination_wallet_block.borrow_data_unchecked())? + }; return Err(BlockListError::AccountBlocked.into()); } - } Ok(()) } - } impl<'a> TryFrom<&'a [AccountInfo]> for TxHook<'a> { type Error = BlockListError; fn try_from(accounts: &'a [AccountInfo]) -> Result { - /* TX HOOK GETS CALLED WITH: 1- source TA @@ -89,8 +87,8 @@ impl<'a> TryFrom<&'a [AccountInfo]> for TxHook<'a> { 3- destination TA 4- authority (either src owner or src delegate) 5- extra account metas - 6- (optional) source wallet block - 7- (optional) destination wallet block + 6- (optional) source wallet block + 7- (optional) destination wallet block */ let [source, mint, destination, authority, remaining_accounts @ ..] = accounts else { @@ -105,8 +103,6 @@ impl<'a> TryFrom<&'a [AccountInfo]> for TxHook<'a> { (None, None) }; - - Ok(Self { source, destination, @@ -116,4 +112,4 @@ impl<'a> TryFrom<&'a [AccountInfo]> for TxHook<'a> { destination_wallet_block, }) } -} \ No newline at end of file +} diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/unblock_wallet.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/unblock_wallet.rs index c482dd5c..7f2d679f 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/unblock_wallet.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/instructions/unblock_wallet.rs @@ -2,7 +2,6 @@ use pinocchio::{account_info::AccountInfo, program_error::ProgramError, ProgramR use crate::{load, load_mut_unchecked, BlockListError, Config, Discriminator, WalletBlock}; - pub struct UnblockWallet<'a> { pub authority: &'a AccountInfo, pub config: &'a AccountInfo, @@ -12,7 +11,6 @@ pub struct UnblockWallet<'a> { impl<'a> UnblockWallet<'a> { pub fn process(&self) -> ProgramResult { - let destination_lamports = self.authority.lamports(); unsafe { @@ -21,9 +19,13 @@ impl<'a> UnblockWallet<'a> { .ok_or(ProgramError::ArithmeticOverflow)?; self.wallet_block.close_unchecked(); } - - let config = unsafe { load_mut_unchecked::(self.config.borrow_mut_data_unchecked())? }; - config.blocked_wallets_count = config.blocked_wallets_count.checked_sub(1).ok_or(ProgramError::ArithmeticOverflow)?; + + let config = + unsafe { load_mut_unchecked::(self.config.borrow_mut_data_unchecked())? }; + config.blocked_wallets_count = config + .blocked_wallets_count + .checked_sub(1) + .ok_or(ProgramError::ArithmeticOverflow)?; Ok(()) } @@ -42,7 +44,7 @@ impl<'a> TryFrom<&'a [AccountInfo]> for UnblockWallet<'a> { }; let cfg = unsafe { load::(config.borrow_data_unchecked())? }; - + if !config.is_owned_by(&crate::ID) { return Err(BlockListError::InvalidConfigAccount); } @@ -50,12 +52,12 @@ impl<'a> TryFrom<&'a [AccountInfo]> for UnblockWallet<'a> { if !authority.is_signer() || cfg.authority.ne(authority.key()) { return Err(BlockListError::InvalidAuthority); } - + if !config.is_writable() && !wallet_block.is_writable() { return Err(BlockListError::AccountNotWritable); } - if unsafe { load::(wallet_block.borrow_data_unchecked()).is_err() }{ + if unsafe { load::(wallet_block.borrow_data_unchecked()).is_err() } { return Err(BlockListError::InvalidAccountData); } @@ -66,4 +68,4 @@ impl<'a> TryFrom<&'a [AccountInfo]> for UnblockWallet<'a> { system_program, }) } -} \ No newline at end of file +} diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/lib.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/lib.rs index 78f78ebf..6b07f8fe 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/lib.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/lib.rs @@ -1,14 +1,17 @@ #![no_std] - -use pinocchio::{account_info::AccountInfo, no_allocator, nostd_panic_handler, program_entrypoint, program_error::ProgramError, pubkey::Pubkey, ProgramResult}; + +use pinocchio::{ + account_info::AccountInfo, no_allocator, nostd_panic_handler, program_entrypoint, + program_error::ProgramError, pubkey::Pubkey, ProgramResult, +}; use pinocchio_pubkey::declare_id; - + program_entrypoint!(process_instruction); // Do not allocate memory. no_allocator!(); // Use the no_std panic handler. nostd_panic_handler!(); - + pub mod instructions; pub use instructions::*; pub mod error; @@ -19,7 +22,6 @@ mod token_extensions_utils; declare_id!("BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf"); - #[inline(always)] fn process_instruction( _program_id: &Pubkey, @@ -29,14 +31,15 @@ fn process_instruction( let [disc, remaining_data @ ..] = instruction_data else { return Err(BlockListError::InvalidInstruction.into()); }; - - + match *disc { TxHook::DISCRIMINATOR => TxHook::try_from(accounts)?.process(), Init::DISCRIMINATOR => Init::try_from(accounts)?.process(), BlockWallet::DISCRIMINATOR => BlockWallet::try_from(accounts)?.process(), UnblockWallet::DISCRIMINATOR => UnblockWallet::try_from(accounts)?.process(), - SetupExtraMetas::DISCRIMINATOR => SetupExtraMetas::try_from(accounts)?.process(remaining_data), + SetupExtraMetas::DISCRIMINATOR => { + SetupExtraMetas::try_from(accounts)?.process(remaining_data) + } _ => Err(ProgramError::InvalidInstructionData), } -} \ No newline at end of file +} diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/state/config.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/state/config.rs index 16daa969..a9b44b0f 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/state/config.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/state/config.rs @@ -2,7 +2,6 @@ use pinocchio::pubkey::Pubkey; use super::{Discriminator, Transmutable}; - // `#[repr(C, packed)]` keeps the onchain layout exactly 41 bytes wide. // With plain `#[repr(C)]` the u64 field gets 7 bytes of alignment padding // inserted after the 33-byte (u8 + Pubkey) prefix, making the struct 48 bytes diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/state/mod.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/state/mod.rs index 55e17b93..0e75b4f4 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/state/mod.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/state/mod.rs @@ -61,4 +61,3 @@ pub unsafe fn load_mut_unchecked( } Ok(&mut *(bytes.as_mut_ptr() as *mut T)) } - diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/token_extensions_utils.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/token_extensions_utils.rs index f30b2c4a..aa3aedcb 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/token_extensions_utils.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/src/token_extensions_utils.rs @@ -1,7 +1,8 @@ use pinocchio::{account_info::AccountInfo, pubkey::Pubkey}; use pinocchio_pubkey::from_str; -pub const TOKEN_EXTENSIONS_PROGRAM_ID: Pubkey = from_str("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"); +pub const TOKEN_EXTENSIONS_PROGRAM_ID: Pubkey = + from_str("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"); pub const EXTRA_METAS_SEED: &[u8] = b"extra-account-metas"; @@ -47,14 +48,9 @@ fn get_extension_data_(acc_data_bytes: &[u8], extension_type: u16) -> Option<&[u // SBF (like x86_64) tolerates unaligned reads but doing it via a raw // `&*(ptr as *const u16)` is undefined behaviour and can produce // garbage when the optimiser folds the read with surrounding ops. - let ext_type = u16::from_le_bytes([ - ext_bytes[ext_type_idx], - ext_bytes[ext_type_idx + 1], - ]); - let ext_len = u16::from_le_bytes([ - ext_bytes[ext_len_idx], - ext_bytes[ext_len_idx + 1], - ]) as usize; + let ext_type = u16::from_le_bytes([ext_bytes[ext_type_idx], ext_bytes[ext_type_idx + 1]]); + let ext_len = + u16::from_le_bytes([ext_bytes[ext_len_idx], ext_bytes[ext_len_idx + 1]]) as usize; if ext_data_idx + ext_len > end { return None; diff --git a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/tests/test.rs b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/tests/test.rs index a8227ea1..010abf5f 100644 --- a/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/tests/test.rs +++ b/tokens/token-extensions/transfer-hook/block-list/pinocchio/program/tests/test.rs @@ -80,10 +80,9 @@ fn build_transfer_with_hook_accounts( // The hook program id is appended last so the Token Extensions transfer // instruction handler can CPI into it (it strips that entry from the hook // accounts list). - instruction.accounts.push(AccountMeta::new_readonly( - find_extra_metas_pda(mint), - false, - )); + instruction + .accounts + .push(AccountMeta::new_readonly(find_extra_metas_pda(mint), false)); if let ExtraMode::SourceOnly = extra_mode { instruction.accounts.push(AccountMeta::new_readonly( find_wallet_block_pda(source_owner), @@ -114,7 +113,11 @@ fn send_expecting_success( svm.latest_blockhash(), ); if let Err(failure) = svm.send_transaction(transaction) { - panic!("{label} failed: {:?}\nlogs:\n{}", failure.err, failure.meta.logs.join("\n")); + panic!( + "{label} failed: {:?}\nlogs:\n{}", + failure.err, + failure.meta.logs.join("\n") + ); } } @@ -312,7 +315,13 @@ fn block_list_transfer_hook_lifecycle() { system_program: solana_sdk::system_program::id(), } .instruction(); - send_expecting_success(&mut svm, &[block_instruction], &payer, &[&payer], "block_wallet A"); + send_expecting_success( + &mut svm, + &[block_instruction], + &payer, + &[&payer], + "block_wallet A", + ); let wallet_block = svm .get_account(&find_wallet_block_pda(&wallet_a.pubkey())) .unwrap(); diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/accounts/car.rs b/tools/shank-and-codama/native/clients/rust/src/generated/accounts/car.rs index 255751e0..1c6e5023 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/accounts/car.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/accounts/car.rs @@ -5,72 +5,72 @@ //! //! -use borsh::BorshSerialize; use borsh::BorshDeserialize; - +use borsh::BorshSerialize; #[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct Car { -pub year: u16, -pub make: String, -pub model: String, + pub year: u16, + pub make: String, + pub model: String, } - - - impl Car { - - - - #[inline(always)] - pub fn from_bytes(data: &[u8]) -> Result { - let mut data = data; - Self::deserialize(&mut data) - } + #[inline(always)] + pub fn from_bytes(data: &[u8]) -> Result { + let mut data = data; + Self::deserialize(&mut data) + } } impl<'a> TryFrom<&solana_account_info::AccountInfo<'a>> for Car { - type Error = std::io::Error; + type Error = std::io::Error; - fn try_from(account_info: &solana_account_info::AccountInfo<'a>) -> Result { - let mut data: &[u8] = &(*account_info.data).borrow(); - Self::deserialize(&mut data) - } + fn try_from(account_info: &solana_account_info::AccountInfo<'a>) -> Result { + let mut data: &[u8] = &(*account_info.data).borrow(); + Self::deserialize(&mut data) + } } #[cfg(feature = "fetch")] pub fn fetch_car( - rpc: &solana_client::rpc_client::RpcClient, - address: &solana_pubkey::Pubkey, + rpc: &solana_client::rpc_client::RpcClient, + address: &solana_pubkey::Pubkey, ) -> Result, std::io::Error> { - let accounts = fetch_all_car(rpc, &[*address])?; - Ok(accounts[0].clone()) + let accounts = fetch_all_car(rpc, &[*address])?; + Ok(accounts[0].clone()) } #[cfg(feature = "fetch")] pub fn fetch_all_car( - rpc: &solana_client::rpc_client::RpcClient, - addresses: &[solana_pubkey::Pubkey], + rpc: &solana_client::rpc_client::RpcClient, + addresses: &[solana_pubkey::Pubkey], ) -> Result>, std::io::Error> { - let accounts = rpc.get_multiple_accounts(addresses) - .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; + let accounts = rpc + .get_multiple_accounts(addresses) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; let mut decoded_accounts: Vec> = Vec::new(); for i in 0..addresses.len() { - let address = addresses[i]; - let account = accounts[i].as_ref() - .ok_or(std::io::Error::new(std::io::ErrorKind::Other, format!("Account not found: {}", address)))?; - let data = Car::from_bytes(&account.data)?; - decoded_accounts.push(crate::shared::DecodedAccount { address, account: account.clone(), data }); + let address = addresses[i]; + let account = accounts[i].as_ref().ok_or(std::io::Error::new( + std::io::ErrorKind::Other, + format!("Account not found: {}", address), + ))?; + let data = Car::from_bytes(&account.data)?; + decoded_accounts.push(crate::shared::DecodedAccount { + address, + account: account.clone(), + data, + }); } Ok(decoded_accounts) } #[cfg(feature = "fetch")] pub fn fetch_maybe_car( - rpc: &solana_client::rpc_client::RpcClient, - address: &solana_pubkey::Pubkey, + rpc: &solana_client::rpc_client::RpcClient, + address: &solana_pubkey::Pubkey, ) -> Result, std::io::Error> { let accounts = fetch_all_maybe_car(rpc, &[*address])?; Ok(accounts[0].clone()) @@ -78,47 +78,52 @@ pub fn fetch_maybe_car( #[cfg(feature = "fetch")] pub fn fetch_all_maybe_car( - rpc: &solana_client::rpc_client::RpcClient, - addresses: &[solana_pubkey::Pubkey], + rpc: &solana_client::rpc_client::RpcClient, + addresses: &[solana_pubkey::Pubkey], ) -> Result>, std::io::Error> { - let accounts = rpc.get_multiple_accounts(addresses) - .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; + let accounts = rpc + .get_multiple_accounts(addresses) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; let mut decoded_accounts: Vec> = Vec::new(); for i in 0..addresses.len() { - let address = addresses[i]; - if let Some(account) = accounts[i].as_ref() { - let data = Car::from_bytes(&account.data)?; - decoded_accounts.push(crate::shared::MaybeAccount::Exists(crate::shared::DecodedAccount { address, account: account.clone(), data })); - } else { - decoded_accounts.push(crate::shared::MaybeAccount::NotFound(address)); - } + let address = addresses[i]; + if let Some(account) = accounts[i].as_ref() { + let data = Car::from_bytes(&account.data)?; + decoded_accounts.push(crate::shared::MaybeAccount::Exists( + crate::shared::DecodedAccount { + address, + account: account.clone(), + data, + }, + )); + } else { + decoded_accounts.push(crate::shared::MaybeAccount::NotFound(address)); + } } - Ok(decoded_accounts) + Ok(decoded_accounts) } - #[cfg(feature = "anchor")] - impl anchor_lang::AccountDeserialize for Car { - fn try_deserialize_unchecked(buf: &mut &[u8]) -> anchor_lang::Result { +#[cfg(feature = "anchor")] +impl anchor_lang::AccountDeserialize for Car { + fn try_deserialize_unchecked(buf: &mut &[u8]) -> anchor_lang::Result { Ok(Self::deserialize(buf)?) - } - } + } +} - #[cfg(feature = "anchor")] - impl anchor_lang::AccountSerialize for Car {} +#[cfg(feature = "anchor")] +impl anchor_lang::AccountSerialize for Car {} - #[cfg(feature = "anchor")] - impl anchor_lang::Owner for Car { - fn owner() -> Pubkey { +#[cfg(feature = "anchor")] +impl anchor_lang::Owner for Car { + fn owner() -> Pubkey { crate::CAR_RENTAL_SERVICE_ID - } - } + } +} - #[cfg(feature = "anchor-idl-build")] - impl anchor_lang::IdlBuild for Car {} +#[cfg(feature = "anchor-idl-build")] +impl anchor_lang::IdlBuild for Car {} - - #[cfg(feature = "anchor-idl-build")] - impl anchor_lang::Discriminator for Car { +#[cfg(feature = "anchor-idl-build")] +impl anchor_lang::Discriminator for Car { const DISCRIMINATOR: &[u8] = &[0; 8]; - } - +} diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/accounts/mod.rs b/tools/shank-and-codama/native/clients/rust/src/generated/accounts/mod.rs index 261eb7b2..e32a4248 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/accounts/mod.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/accounts/mod.rs @@ -5,9 +5,8 @@ //! //! - pub(crate) mod r#car; - pub(crate) mod r#rental_order; - - pub use self::r#car::*; - pub use self::r#rental_order::*; +pub(crate) mod r#car; +pub(crate) mod r#rental_order; +pub use self::r#car::*; +pub use self::r#rental_order::*; diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/accounts/rental_order.rs b/tools/shank-and-codama/native/clients/rust/src/generated/accounts/rental_order.rs index faec0c4d..479a8ad3 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/accounts/rental_order.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/accounts/rental_order.rs @@ -5,78 +5,81 @@ //! //! -use solana_pubkey::Pubkey; use crate::generated::types::RentalOrderStatus; -use borsh::BorshSerialize; use borsh::BorshDeserialize; - +use borsh::BorshSerialize; +use solana_pubkey::Pubkey; #[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct RentalOrder { -#[cfg_attr(feature = "serde", serde(with = "serde_with::As::"))] -pub car: Pubkey, -pub name: String, -pub pick_up_date: String, -pub return_date: String, -pub price: u64, -pub status: RentalOrderStatus, + #[cfg_attr( + feature = "serde", + serde(with = "serde_with::As::") + )] + pub car: Pubkey, + pub name: String, + pub pick_up_date: String, + pub return_date: String, + pub price: u64, + pub status: RentalOrderStatus, } - - - impl RentalOrder { - - - - #[inline(always)] - pub fn from_bytes(data: &[u8]) -> Result { - let mut data = data; - Self::deserialize(&mut data) - } + #[inline(always)] + pub fn from_bytes(data: &[u8]) -> Result { + let mut data = data; + Self::deserialize(&mut data) + } } impl<'a> TryFrom<&solana_account_info::AccountInfo<'a>> for RentalOrder { - type Error = std::io::Error; + type Error = std::io::Error; - fn try_from(account_info: &solana_account_info::AccountInfo<'a>) -> Result { - let mut data: &[u8] = &(*account_info.data).borrow(); - Self::deserialize(&mut data) - } + fn try_from(account_info: &solana_account_info::AccountInfo<'a>) -> Result { + let mut data: &[u8] = &(*account_info.data).borrow(); + Self::deserialize(&mut data) + } } #[cfg(feature = "fetch")] pub fn fetch_rental_order( - rpc: &solana_client::rpc_client::RpcClient, - address: &solana_pubkey::Pubkey, + rpc: &solana_client::rpc_client::RpcClient, + address: &solana_pubkey::Pubkey, ) -> Result, std::io::Error> { - let accounts = fetch_all_rental_order(rpc, &[*address])?; - Ok(accounts[0].clone()) + let accounts = fetch_all_rental_order(rpc, &[*address])?; + Ok(accounts[0].clone()) } #[cfg(feature = "fetch")] pub fn fetch_all_rental_order( - rpc: &solana_client::rpc_client::RpcClient, - addresses: &[solana_pubkey::Pubkey], + rpc: &solana_client::rpc_client::RpcClient, + addresses: &[solana_pubkey::Pubkey], ) -> Result>, std::io::Error> { - let accounts = rpc.get_multiple_accounts(addresses) - .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; + let accounts = rpc + .get_multiple_accounts(addresses) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; let mut decoded_accounts: Vec> = Vec::new(); for i in 0..addresses.len() { - let address = addresses[i]; - let account = accounts[i].as_ref() - .ok_or(std::io::Error::new(std::io::ErrorKind::Other, format!("Account not found: {}", address)))?; - let data = RentalOrder::from_bytes(&account.data)?; - decoded_accounts.push(crate::shared::DecodedAccount { address, account: account.clone(), data }); + let address = addresses[i]; + let account = accounts[i].as_ref().ok_or(std::io::Error::new( + std::io::ErrorKind::Other, + format!("Account not found: {}", address), + ))?; + let data = RentalOrder::from_bytes(&account.data)?; + decoded_accounts.push(crate::shared::DecodedAccount { + address, + account: account.clone(), + data, + }); } Ok(decoded_accounts) } #[cfg(feature = "fetch")] pub fn fetch_maybe_rental_order( - rpc: &solana_client::rpc_client::RpcClient, - address: &solana_pubkey::Pubkey, + rpc: &solana_client::rpc_client::RpcClient, + address: &solana_pubkey::Pubkey, ) -> Result, std::io::Error> { let accounts = fetch_all_maybe_rental_order(rpc, &[*address])?; Ok(accounts[0].clone()) @@ -84,47 +87,52 @@ pub fn fetch_maybe_rental_order( #[cfg(feature = "fetch")] pub fn fetch_all_maybe_rental_order( - rpc: &solana_client::rpc_client::RpcClient, - addresses: &[solana_pubkey::Pubkey], + rpc: &solana_client::rpc_client::RpcClient, + addresses: &[solana_pubkey::Pubkey], ) -> Result>, std::io::Error> { - let accounts = rpc.get_multiple_accounts(addresses) - .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; + let accounts = rpc + .get_multiple_accounts(addresses) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; let mut decoded_accounts: Vec> = Vec::new(); for i in 0..addresses.len() { - let address = addresses[i]; - if let Some(account) = accounts[i].as_ref() { - let data = RentalOrder::from_bytes(&account.data)?; - decoded_accounts.push(crate::shared::MaybeAccount::Exists(crate::shared::DecodedAccount { address, account: account.clone(), data })); - } else { - decoded_accounts.push(crate::shared::MaybeAccount::NotFound(address)); - } + let address = addresses[i]; + if let Some(account) = accounts[i].as_ref() { + let data = RentalOrder::from_bytes(&account.data)?; + decoded_accounts.push(crate::shared::MaybeAccount::Exists( + crate::shared::DecodedAccount { + address, + account: account.clone(), + data, + }, + )); + } else { + decoded_accounts.push(crate::shared::MaybeAccount::NotFound(address)); + } } - Ok(decoded_accounts) + Ok(decoded_accounts) } - #[cfg(feature = "anchor")] - impl anchor_lang::AccountDeserialize for RentalOrder { - fn try_deserialize_unchecked(buf: &mut &[u8]) -> anchor_lang::Result { +#[cfg(feature = "anchor")] +impl anchor_lang::AccountDeserialize for RentalOrder { + fn try_deserialize_unchecked(buf: &mut &[u8]) -> anchor_lang::Result { Ok(Self::deserialize(buf)?) - } - } + } +} - #[cfg(feature = "anchor")] - impl anchor_lang::AccountSerialize for RentalOrder {} +#[cfg(feature = "anchor")] +impl anchor_lang::AccountSerialize for RentalOrder {} - #[cfg(feature = "anchor")] - impl anchor_lang::Owner for RentalOrder { - fn owner() -> Pubkey { +#[cfg(feature = "anchor")] +impl anchor_lang::Owner for RentalOrder { + fn owner() -> Pubkey { crate::CAR_RENTAL_SERVICE_ID - } - } + } +} - #[cfg(feature = "anchor-idl-build")] - impl anchor_lang::IdlBuild for RentalOrder {} +#[cfg(feature = "anchor-idl-build")] +impl anchor_lang::IdlBuild for RentalOrder {} - - #[cfg(feature = "anchor-idl-build")] - impl anchor_lang::Discriminator for RentalOrder { +#[cfg(feature = "anchor-idl-build")] +impl anchor_lang::Discriminator for RentalOrder { const DISCRIMINATOR: &[u8] = &[0; 8]; - } - +} diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/errors/mod.rs b/tools/shank-and-codama/native/clients/rust/src/generated/errors/mod.rs index 8d9ee9d2..6172ba60 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/errors/mod.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/errors/mod.rs @@ -4,6 +4,3 @@ //! //! //! - - - diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/add_car.rs b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/add_car.rs index 093bad16..d23cc168 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/add_car.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/add_car.rs @@ -5,418 +5,422 @@ //! //! -use borsh::BorshSerialize; use borsh::BorshDeserialize; +use borsh::BorshSerialize; pub const ADD_CAR_DISCRIMINATOR: u8 = 0; /// Accounts. #[derive(Debug)] pub struct AddCar { - /// The account that will represent the Car being created - - - - pub car_account: solana_pubkey::Pubkey, - /// Fee payer - - - - pub payer: solana_pubkey::Pubkey, - /// The System Program - - - - pub system_program: solana_pubkey::Pubkey, - } + /// The account that will represent the Car being created + pub car_account: solana_pubkey::Pubkey, + /// Fee payer + pub payer: solana_pubkey::Pubkey, + /// The System Program + pub system_program: solana_pubkey::Pubkey, +} impl AddCar { - pub fn instruction(&self, args: AddCarInstructionArgs) -> solana_instruction::Instruction { - self.instruction_with_remaining_accounts(args, &[]) - } - #[allow(clippy::arithmetic_side_effects)] - #[allow(clippy::vec_init_then_push)] - pub fn instruction_with_remaining_accounts(&self, args: AddCarInstructionArgs, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction { - let mut accounts = Vec::with_capacity(3+ remaining_accounts.len()); - accounts.push(solana_instruction::AccountMeta::new( + pub fn instruction(&self, args: AddCarInstructionArgs) -> solana_instruction::Instruction { + self.instruction_with_remaining_accounts(args, &[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::vec_init_then_push)] + pub fn instruction_with_remaining_accounts( + &self, + args: AddCarInstructionArgs, + remaining_accounts: &[solana_instruction::AccountMeta], + ) -> solana_instruction::Instruction { + let mut accounts = Vec::with_capacity(3 + remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( self.car_account, - false - )); - accounts.push(solana_instruction::AccountMeta::new( - self.payer, - true - )); - accounts.push(solana_instruction::AccountMeta::new_readonly( + false, + )); + accounts.push(solana_instruction::AccountMeta::new(self.payer, true)); + accounts.push(solana_instruction::AccountMeta::new_readonly( self.system_program, - false - )); - accounts.extend_from_slice(remaining_accounts); - let mut data = AddCarInstructionData::new().try_to_vec().unwrap(); - let mut args = args.try_to_vec().unwrap(); - data.append(&mut args); - - solana_instruction::Instruction { - program_id: crate::CAR_RENTAL_SERVICE_ID, - accounts, - data, - } - } + false, + )); + accounts.extend_from_slice(remaining_accounts); + let mut data = AddCarInstructionData::new().try_to_vec().unwrap(); + let mut args = args.try_to_vec().unwrap(); + data.append(&mut args); + + solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + } + } } #[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] - pub struct AddCarInstructionData { - discriminator: u8, - } +pub struct AddCarInstructionData { + discriminator: u8, +} impl AddCarInstructionData { - pub fn new() -> Self { - Self { - discriminator: 0, - } - } + pub fn new() -> Self { + Self { discriminator: 0 } + } pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { - borsh::to_vec(self) - } - } + borsh::to_vec(self) + } +} impl Default for AddCarInstructionData { - fn default() -> Self { - Self::new() - } + fn default() -> Self { + Self::new() + } } #[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] - pub struct AddCarInstructionArgs { - pub year: u16, - pub make: String, - pub model: String, - } +pub struct AddCarInstructionArgs { + pub year: u16, + pub make: String, + pub model: String, +} impl AddCarInstructionArgs { - pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { - borsh::to_vec(self) - } + pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { + borsh::to_vec(self) + } } - /// Instruction builder for `AddCar`. /// /// ### Accounts: /// - /// 0. `[writable]` car_account - /// 1. `[writable, signer]` payer - /// 2. `[optional]` system_program (default to `11111111111111111111111111111111`) +/// 0. `[writable]` car_account +/// 1. `[writable, signer]` payer +/// 2. `[optional]` system_program (default to `11111111111111111111111111111111`) #[derive(Clone, Debug, Default)] pub struct AddCarBuilder { - car_account: Option, - payer: Option, - system_program: Option, - year: Option, - make: Option, - model: Option, - __remaining_accounts: Vec, + car_account: Option, + payer: Option, + system_program: Option, + year: Option, + make: Option, + model: Option, + __remaining_accounts: Vec, } impl AddCarBuilder { - pub fn new() -> Self { - Self::default() - } - /// The account that will represent the Car being created -#[inline(always)] + pub fn new() -> Self { + Self::default() + } + /// The account that will represent the Car being created + #[inline(always)] pub fn car_account(&mut self, car_account: solana_pubkey::Pubkey) -> &mut Self { - self.car_account = Some(car_account); - self + self.car_account = Some(car_account); + self } - /// Fee payer -#[inline(always)] + /// Fee payer + #[inline(always)] pub fn payer(&mut self, payer: solana_pubkey::Pubkey) -> &mut Self { - self.payer = Some(payer); - self + self.payer = Some(payer); + self } - /// `[optional account, default to '11111111111111111111111111111111']` -/// The System Program -#[inline(always)] + /// `[optional account, default to '11111111111111111111111111111111']` + /// The System Program + #[inline(always)] pub fn system_program(&mut self, system_program: solana_pubkey::Pubkey) -> &mut Self { - self.system_program = Some(system_program); - self + self.system_program = Some(system_program); + self } - #[inline(always)] - pub fn year(&mut self, year: u16) -> &mut Self { + #[inline(always)] + pub fn year(&mut self, year: u16) -> &mut Self { self.year = Some(year); self - } - #[inline(always)] - pub fn make(&mut self, make: String) -> &mut Self { + } + #[inline(always)] + pub fn make(&mut self, make: String) -> &mut Self { self.make = Some(make); self - } - #[inline(always)] - pub fn model(&mut self, model: String) -> &mut Self { + } + #[inline(always)] + pub fn model(&mut self, model: String) -> &mut Self { self.model = Some(model); self - } - /// Add an additional account to the instruction. - #[inline(always)] - pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self { - self.__remaining_accounts.push(account); - self - } - /// Add additional accounts to the instruction. - #[inline(always)] - pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self { - self.__remaining_accounts.extend_from_slice(accounts); - self - } - #[allow(clippy::clone_on_copy)] - pub fn instruction(&self) -> solana_instruction::Instruction { - let accounts = AddCar { - car_account: self.car_account.expect("car_account is not set"), - payer: self.payer.expect("payer is not set"), - system_program: self.system_program.unwrap_or(solana_pubkey::pubkey!("11111111111111111111111111111111")), - }; - let args = AddCarInstructionArgs { - year: self.year.clone().expect("year is not set"), - make: self.make.clone().expect("make is not set"), - model: self.model.clone().expect("model is not set"), - }; - - accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts) - } -} - - /// `add_car` CPI accounts. - pub struct AddCarCpiAccounts<'a, 'b> { - /// The account that will represent the Car being created - - - - pub car_account: &'b solana_account_info::AccountInfo<'a>, - /// Fee payer + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self { + self.__remaining_accounts.push(account); + self + } + /// Add additional accounts to the instruction. + #[inline(always)] + pub fn add_remaining_accounts( + &mut self, + accounts: &[solana_instruction::AccountMeta], + ) -> &mut Self { + self.__remaining_accounts.extend_from_slice(accounts); + self + } + #[allow(clippy::clone_on_copy)] + pub fn instruction(&self) -> solana_instruction::Instruction { + let accounts = AddCar { + car_account: self.car_account.expect("car_account is not set"), + payer: self.payer.expect("payer is not set"), + system_program: self + .system_program + .unwrap_or(solana_pubkey::pubkey!("11111111111111111111111111111111")), + }; + let args = AddCarInstructionArgs { + year: self.year.clone().expect("year is not set"), + make: self.make.clone().expect("make is not set"), + model: self.model.clone().expect("model is not set"), + }; - - - pub payer: &'b solana_account_info::AccountInfo<'a>, - /// The System Program + accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts) + } +} - - - pub system_program: &'b solana_account_info::AccountInfo<'a>, - } +/// `add_car` CPI accounts. +pub struct AddCarCpiAccounts<'a, 'b> { + /// The account that will represent the Car being created + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + pub payer: &'b solana_account_info::AccountInfo<'a>, + /// The System Program + pub system_program: &'b solana_account_info::AccountInfo<'a>, +} /// `add_car` CPI instruction. pub struct AddCarCpi<'a, 'b> { - /// The program to invoke. - pub __program: &'b solana_account_info::AccountInfo<'a>, - /// The account that will represent the Car being created - - - - pub car_account: &'b solana_account_info::AccountInfo<'a>, - /// Fee payer - - - - pub payer: &'b solana_account_info::AccountInfo<'a>, - /// The System Program - - - - pub system_program: &'b solana_account_info::AccountInfo<'a>, - /// The arguments for the instruction. + /// The program to invoke. + pub __program: &'b solana_account_info::AccountInfo<'a>, + /// The account that will represent the Car being created + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + pub payer: &'b solana_account_info::AccountInfo<'a>, + /// The System Program + pub system_program: &'b solana_account_info::AccountInfo<'a>, + /// The arguments for the instruction. pub __args: AddCarInstructionArgs, - } +} impl<'a, 'b> AddCarCpi<'a, 'b> { - pub fn new( - program: &'b solana_account_info::AccountInfo<'a>, - accounts: AddCarCpiAccounts<'a, 'b>, - args: AddCarInstructionArgs, - ) -> Self { - Self { - __program: program, - car_account: accounts.car_account, - payer: accounts.payer, - system_program: accounts.system_program, - __args: args, - } - } - #[inline(always)] - pub fn invoke(&self) -> solana_program_error::ProgramResult { - self.invoke_signed_with_remaining_accounts(&[], &[]) - } - #[inline(always)] - pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult { - self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) - } - #[inline(always)] - pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { - self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) - } - #[allow(clippy::arithmetic_side_effects)] - #[allow(clippy::clone_on_copy)] - #[allow(clippy::vec_init_then_push)] - pub fn invoke_signed_with_remaining_accounts( - &self, - signers_seeds: &[&[&[u8]]], - remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)] - ) -> solana_program_error::ProgramResult { - let mut accounts = Vec::with_capacity(3+ remaining_accounts.len()); - accounts.push(solana_instruction::AccountMeta::new( + pub fn new( + program: &'b solana_account_info::AccountInfo<'a>, + accounts: AddCarCpiAccounts<'a, 'b>, + args: AddCarInstructionArgs, + ) -> Self { + Self { + __program: program, + car_account: accounts.car_account, + payer: accounts.payer, + system_program: accounts.system_program, + __args: args, + } + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], &[]) + } + #[inline(always)] + pub fn invoke_with_remaining_accounts( + &self, + remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)], + ) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) + } + #[inline(always)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed_with_remaining_accounts( + &self, + signers_seeds: &[&[&[u8]]], + remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)], + ) -> solana_program_error::ProgramResult { + let mut accounts = Vec::with_capacity(3 + remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( *self.car_account.key, - false - )); - accounts.push(solana_instruction::AccountMeta::new( - *self.payer.key, - true - )); - accounts.push(solana_instruction::AccountMeta::new_readonly( + false, + )); + accounts.push(solana_instruction::AccountMeta::new(*self.payer.key, true)); + accounts.push(solana_instruction::AccountMeta::new_readonly( *self.system_program.key, - false - )); - remaining_accounts.iter().for_each(|remaining_account| { - accounts.push(solana_instruction::AccountMeta { - pubkey: *remaining_account.0.key, - is_signer: remaining_account.1, - is_writable: remaining_account.2, - }) - }); - let mut data = AddCarInstructionData::new().try_to_vec().unwrap(); - let mut args = self.__args.try_to_vec().unwrap(); - data.append(&mut args); - - let instruction = solana_instruction::Instruction { - program_id: crate::CAR_RENTAL_SERVICE_ID, - accounts, - data, - }; - let mut account_infos = Vec::with_capacity(4 + remaining_accounts.len()); - account_infos.push(self.__program.clone()); - account_infos.push(self.car_account.clone()); - account_infos.push(self.payer.clone()); - account_infos.push(self.system_program.clone()); - remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); + false, + )); + remaining_accounts.iter().for_each(|remaining_account| { + accounts.push(solana_instruction::AccountMeta { + pubkey: *remaining_account.0.key, + is_signer: remaining_account.1, + is_writable: remaining_account.2, + }) + }); + let mut data = AddCarInstructionData::new().try_to_vec().unwrap(); + let mut args = self.__args.try_to_vec().unwrap(); + data.append(&mut args); - if signers_seeds.is_empty() { - solana_cpi::invoke(&instruction, &account_infos) - } else { - solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds) + let instruction = solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + }; + let mut account_infos = Vec::with_capacity(4 + remaining_accounts.len()); + account_infos.push(self.__program.clone()); + account_infos.push(self.car_account.clone()); + account_infos.push(self.payer.clone()); + account_infos.push(self.system_program.clone()); + remaining_accounts + .iter() + .for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); + + if signers_seeds.is_empty() { + solana_cpi::invoke(&instruction, &account_infos) + } else { + solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds) + } } - } } /// Instruction builder for `AddCar` via CPI. /// /// ### Accounts: /// - /// 0. `[writable]` car_account - /// 1. `[writable, signer]` payer - /// 2. `[]` system_program +/// 0. `[writable]` car_account +/// 1. `[writable, signer]` payer +/// 2. `[]` system_program #[derive(Clone, Debug)] pub struct AddCarCpiBuilder<'a, 'b> { - instruction: Box>, + instruction: Box>, } impl<'a, 'b> AddCarCpiBuilder<'a, 'b> { - pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self { - let instruction = Box::new(AddCarCpiBuilderInstruction { - __program: program, - car_account: None, - payer: None, - system_program: None, - year: None, - make: None, - model: None, - __remaining_accounts: Vec::new(), - }); - Self { instruction } - } - /// The account that will represent the Car being created -#[inline(always)] - pub fn car_account(&mut self, car_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { - self.instruction.car_account = Some(car_account); - self - } - /// Fee payer -#[inline(always)] + pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self { + let instruction = Box::new(AddCarCpiBuilderInstruction { + __program: program, + car_account: None, + payer: None, + system_program: None, + year: None, + make: None, + model: None, + __remaining_accounts: Vec::new(), + }); + Self { instruction } + } + /// The account that will represent the Car being created + #[inline(always)] + pub fn car_account( + &mut self, + car_account: &'b solana_account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.car_account = Some(car_account); + self + } + /// Fee payer + #[inline(always)] pub fn payer(&mut self, payer: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { - self.instruction.payer = Some(payer); - self + self.instruction.payer = Some(payer); + self } - /// The System Program -#[inline(always)] - pub fn system_program(&mut self, system_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { - self.instruction.system_program = Some(system_program); - self + /// The System Program + #[inline(always)] + pub fn system_program( + &mut self, + system_program: &'b solana_account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.system_program = Some(system_program); + self } - #[inline(always)] - pub fn year(&mut self, year: u16) -> &mut Self { + #[inline(always)] + pub fn year(&mut self, year: u16) -> &mut Self { self.instruction.year = Some(year); self - } - #[inline(always)] - pub fn make(&mut self, make: String) -> &mut Self { + } + #[inline(always)] + pub fn make(&mut self, make: String) -> &mut Self { self.instruction.make = Some(make); self - } - #[inline(always)] - pub fn model(&mut self, model: String) -> &mut Self { + } + #[inline(always)] + pub fn model(&mut self, model: String) -> &mut Self { self.instruction.model = Some(model); self - } - /// Add an additional account to the instruction. - #[inline(always)] - pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self { - self.instruction.__remaining_accounts.push((account, is_writable, is_signer)); - self - } - /// Add additional accounts to the instruction. - /// - /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, - /// and a `bool` indicating whether the account is a signer or not. - #[inline(always)] - pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self { - self.instruction.__remaining_accounts.extend_from_slice(accounts); - self - } - #[inline(always)] - pub fn invoke(&self) -> solana_program_error::ProgramResult { - self.invoke_signed(&[]) - } - #[allow(clippy::clone_on_copy)] - #[allow(clippy::vec_init_then_push)] - pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { - let args = AddCarInstructionArgs { - year: self.instruction.year.clone().expect("year is not set"), - make: self.instruction.make.clone().expect("make is not set"), - model: self.instruction.model.clone().expect("model is not set"), - }; + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account( + &mut self, + account: &'b solana_account_info::AccountInfo<'a>, + is_writable: bool, + is_signer: bool, + ) -> &mut Self { + self.instruction + .__remaining_accounts + .push((account, is_writable, is_signer)); + self + } + /// Add additional accounts to the instruction. + /// + /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, + /// and a `bool` indicating whether the account is a signer or not. + #[inline(always)] + pub fn add_remaining_accounts( + &mut self, + accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)], + ) -> &mut Self { + self.instruction + .__remaining_accounts + .extend_from_slice(accounts); + self + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed(&[]) + } + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + let args = AddCarInstructionArgs { + year: self.instruction.year.clone().expect("year is not set"), + make: self.instruction.make.clone().expect("make is not set"), + model: self.instruction.model.clone().expect("model is not set"), + }; let instruction = AddCarCpi { - __program: self.instruction.__program, - - car_account: self.instruction.car_account.expect("car_account is not set"), - - payer: self.instruction.payer.expect("payer is not set"), - - system_program: self.instruction.system_program.expect("system_program is not set"), - __args: args, - }; - instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts) - } + __program: self.instruction.__program, + + car_account: self + .instruction + .car_account + .expect("car_account is not set"), + + payer: self.instruction.payer.expect("payer is not set"), + + system_program: self + .instruction + .system_program + .expect("system_program is not set"), + __args: args, + }; + instruction.invoke_signed_with_remaining_accounts( + signers_seeds, + &self.instruction.__remaining_accounts, + ) + } } #[derive(Clone, Debug)] struct AddCarCpiBuilderInstruction<'a, 'b> { - __program: &'b solana_account_info::AccountInfo<'a>, - car_account: Option<&'b solana_account_info::AccountInfo<'a>>, - payer: Option<&'b solana_account_info::AccountInfo<'a>>, - system_program: Option<&'b solana_account_info::AccountInfo<'a>>, - year: Option, - make: Option, - model: Option, - /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. - __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>, + __program: &'b solana_account_info::AccountInfo<'a>, + car_account: Option<&'b solana_account_info::AccountInfo<'a>>, + payer: Option<&'b solana_account_info::AccountInfo<'a>>, + system_program: Option<&'b solana_account_info::AccountInfo<'a>>, + year: Option, + make: Option, + model: Option, + /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. + __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>, } - diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/book_rental.rs b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/book_rental.rs index ff49ad27..063d2148 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/book_rental.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/book_rental.rs @@ -5,479 +5,488 @@ //! //! -use borsh::BorshSerialize; use borsh::BorshDeserialize; +use borsh::BorshSerialize; pub const BOOK_RENTAL_DISCRIMINATOR: u8 = 1; /// Accounts. #[derive(Debug)] pub struct BookRental { - /// The account that will represent the actual order for the rental - - - - pub rental_account: solana_pubkey::Pubkey, - /// The account representing the Car being rented in this order - - - - pub car_account: solana_pubkey::Pubkey, - /// Fee payer - - - - pub payer: solana_pubkey::Pubkey, - /// The System Program - - - - pub system_program: solana_pubkey::Pubkey, - } + /// The account that will represent the actual order for the rental + pub rental_account: solana_pubkey::Pubkey, + /// The account representing the Car being rented in this order + pub car_account: solana_pubkey::Pubkey, + /// Fee payer + pub payer: solana_pubkey::Pubkey, + /// The System Program + pub system_program: solana_pubkey::Pubkey, +} impl BookRental { - pub fn instruction(&self, args: BookRentalInstructionArgs) -> solana_instruction::Instruction { - self.instruction_with_remaining_accounts(args, &[]) - } - #[allow(clippy::arithmetic_side_effects)] - #[allow(clippy::vec_init_then_push)] - pub fn instruction_with_remaining_accounts(&self, args: BookRentalInstructionArgs, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction { - let mut accounts = Vec::with_capacity(4+ remaining_accounts.len()); - accounts.push(solana_instruction::AccountMeta::new( + pub fn instruction(&self, args: BookRentalInstructionArgs) -> solana_instruction::Instruction { + self.instruction_with_remaining_accounts(args, &[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::vec_init_then_push)] + pub fn instruction_with_remaining_accounts( + &self, + args: BookRentalInstructionArgs, + remaining_accounts: &[solana_instruction::AccountMeta], + ) -> solana_instruction::Instruction { + let mut accounts = Vec::with_capacity(4 + remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( self.rental_account, - false - )); - accounts.push(solana_instruction::AccountMeta::new_readonly( + false, + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( self.car_account, - false - )); - accounts.push(solana_instruction::AccountMeta::new( - self.payer, - true - )); - accounts.push(solana_instruction::AccountMeta::new_readonly( + false, + )); + accounts.push(solana_instruction::AccountMeta::new(self.payer, true)); + accounts.push(solana_instruction::AccountMeta::new_readonly( self.system_program, - false - )); - accounts.extend_from_slice(remaining_accounts); - let mut data = BookRentalInstructionData::new().try_to_vec().unwrap(); - let mut args = args.try_to_vec().unwrap(); - data.append(&mut args); - - solana_instruction::Instruction { - program_id: crate::CAR_RENTAL_SERVICE_ID, - accounts, - data, - } - } + false, + )); + accounts.extend_from_slice(remaining_accounts); + let mut data = BookRentalInstructionData::new().try_to_vec().unwrap(); + let mut args = args.try_to_vec().unwrap(); + data.append(&mut args); + + solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + } + } } #[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] - pub struct BookRentalInstructionData { - discriminator: u8, - } +pub struct BookRentalInstructionData { + discriminator: u8, +} impl BookRentalInstructionData { - pub fn new() -> Self { - Self { - discriminator: 1, - } - } + pub fn new() -> Self { + Self { discriminator: 1 } + } pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { - borsh::to_vec(self) - } - } + borsh::to_vec(self) + } +} impl Default for BookRentalInstructionData { - fn default() -> Self { - Self::new() - } + fn default() -> Self { + Self::new() + } } #[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] - pub struct BookRentalInstructionArgs { - pub name: String, - pub pick_up_date: String, - pub return_date: String, - pub price: u64, - } +pub struct BookRentalInstructionArgs { + pub name: String, + pub pick_up_date: String, + pub return_date: String, + pub price: u64, +} impl BookRentalInstructionArgs { - pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { - borsh::to_vec(self) - } + pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { + borsh::to_vec(self) + } } - /// Instruction builder for `BookRental`. /// /// ### Accounts: /// - /// 0. `[writable]` rental_account - /// 1. `[]` car_account - /// 2. `[writable, signer]` payer - /// 3. `[optional]` system_program (default to `11111111111111111111111111111111`) +/// 0. `[writable]` rental_account +/// 1. `[]` car_account +/// 2. `[writable, signer]` payer +/// 3. `[optional]` system_program (default to `11111111111111111111111111111111`) #[derive(Clone, Debug, Default)] pub struct BookRentalBuilder { - rental_account: Option, - car_account: Option, - payer: Option, - system_program: Option, - name: Option, - pick_up_date: Option, - return_date: Option, - price: Option, - __remaining_accounts: Vec, + rental_account: Option, + car_account: Option, + payer: Option, + system_program: Option, + name: Option, + pick_up_date: Option, + return_date: Option, + price: Option, + __remaining_accounts: Vec, } impl BookRentalBuilder { - pub fn new() -> Self { - Self::default() - } - /// The account that will represent the actual order for the rental -#[inline(always)] + pub fn new() -> Self { + Self::default() + } + /// The account that will represent the actual order for the rental + #[inline(always)] pub fn rental_account(&mut self, rental_account: solana_pubkey::Pubkey) -> &mut Self { - self.rental_account = Some(rental_account); - self + self.rental_account = Some(rental_account); + self } - /// The account representing the Car being rented in this order -#[inline(always)] + /// The account representing the Car being rented in this order + #[inline(always)] pub fn car_account(&mut self, car_account: solana_pubkey::Pubkey) -> &mut Self { - self.car_account = Some(car_account); - self + self.car_account = Some(car_account); + self } - /// Fee payer -#[inline(always)] + /// Fee payer + #[inline(always)] pub fn payer(&mut self, payer: solana_pubkey::Pubkey) -> &mut Self { - self.payer = Some(payer); - self + self.payer = Some(payer); + self } - /// `[optional account, default to '11111111111111111111111111111111']` -/// The System Program -#[inline(always)] + /// `[optional account, default to '11111111111111111111111111111111']` + /// The System Program + #[inline(always)] pub fn system_program(&mut self, system_program: solana_pubkey::Pubkey) -> &mut Self { - self.system_program = Some(system_program); - self + self.system_program = Some(system_program); + self } - #[inline(always)] - pub fn name(&mut self, name: String) -> &mut Self { + #[inline(always)] + pub fn name(&mut self, name: String) -> &mut Self { self.name = Some(name); self - } - #[inline(always)] - pub fn pick_up_date(&mut self, pick_up_date: String) -> &mut Self { + } + #[inline(always)] + pub fn pick_up_date(&mut self, pick_up_date: String) -> &mut Self { self.pick_up_date = Some(pick_up_date); self - } - #[inline(always)] - pub fn return_date(&mut self, return_date: String) -> &mut Self { + } + #[inline(always)] + pub fn return_date(&mut self, return_date: String) -> &mut Self { self.return_date = Some(return_date); self - } - #[inline(always)] - pub fn price(&mut self, price: u64) -> &mut Self { + } + #[inline(always)] + pub fn price(&mut self, price: u64) -> &mut Self { self.price = Some(price); self - } - /// Add an additional account to the instruction. - #[inline(always)] - pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self { - self.__remaining_accounts.push(account); - self - } - /// Add additional accounts to the instruction. - #[inline(always)] - pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self { - self.__remaining_accounts.extend_from_slice(accounts); - self - } - #[allow(clippy::clone_on_copy)] - pub fn instruction(&self) -> solana_instruction::Instruction { - let accounts = BookRental { - rental_account: self.rental_account.expect("rental_account is not set"), - car_account: self.car_account.expect("car_account is not set"), - payer: self.payer.expect("payer is not set"), - system_program: self.system_program.unwrap_or(solana_pubkey::pubkey!("11111111111111111111111111111111")), - }; - let args = BookRentalInstructionArgs { - name: self.name.clone().expect("name is not set"), - pick_up_date: self.pick_up_date.clone().expect("pick_up_date is not set"), - return_date: self.return_date.clone().expect("return_date is not set"), - price: self.price.clone().expect("price is not set"), - }; - - accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts) - } + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self { + self.__remaining_accounts.push(account); + self + } + /// Add additional accounts to the instruction. + #[inline(always)] + pub fn add_remaining_accounts( + &mut self, + accounts: &[solana_instruction::AccountMeta], + ) -> &mut Self { + self.__remaining_accounts.extend_from_slice(accounts); + self + } + #[allow(clippy::clone_on_copy)] + pub fn instruction(&self) -> solana_instruction::Instruction { + let accounts = BookRental { + rental_account: self.rental_account.expect("rental_account is not set"), + car_account: self.car_account.expect("car_account is not set"), + payer: self.payer.expect("payer is not set"), + system_program: self + .system_program + .unwrap_or(solana_pubkey::pubkey!("11111111111111111111111111111111")), + }; + let args = BookRentalInstructionArgs { + name: self.name.clone().expect("name is not set"), + pick_up_date: self.pick_up_date.clone().expect("pick_up_date is not set"), + return_date: self.return_date.clone().expect("return_date is not set"), + price: self.price.clone().expect("price is not set"), + }; + + accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts) + } } - /// `book_rental` CPI accounts. - pub struct BookRentalCpiAccounts<'a, 'b> { - /// The account that will represent the actual order for the rental - - - - pub rental_account: &'b solana_account_info::AccountInfo<'a>, - /// The account representing the Car being rented in this order - - - - pub car_account: &'b solana_account_info::AccountInfo<'a>, - /// Fee payer - - - - pub payer: &'b solana_account_info::AccountInfo<'a>, - /// The System Program - - - - pub system_program: &'b solana_account_info::AccountInfo<'a>, - } +/// `book_rental` CPI accounts. +pub struct BookRentalCpiAccounts<'a, 'b> { + /// The account that will represent the actual order for the rental + pub rental_account: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the Car being rented in this order + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + pub payer: &'b solana_account_info::AccountInfo<'a>, + /// The System Program + pub system_program: &'b solana_account_info::AccountInfo<'a>, +} /// `book_rental` CPI instruction. pub struct BookRentalCpi<'a, 'b> { - /// The program to invoke. - pub __program: &'b solana_account_info::AccountInfo<'a>, - /// The account that will represent the actual order for the rental - - - - pub rental_account: &'b solana_account_info::AccountInfo<'a>, - /// The account representing the Car being rented in this order - - - - pub car_account: &'b solana_account_info::AccountInfo<'a>, - /// Fee payer - - - - pub payer: &'b solana_account_info::AccountInfo<'a>, - /// The System Program - - - - pub system_program: &'b solana_account_info::AccountInfo<'a>, - /// The arguments for the instruction. + /// The program to invoke. + pub __program: &'b solana_account_info::AccountInfo<'a>, + /// The account that will represent the actual order for the rental + pub rental_account: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the Car being rented in this order + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + pub payer: &'b solana_account_info::AccountInfo<'a>, + /// The System Program + pub system_program: &'b solana_account_info::AccountInfo<'a>, + /// The arguments for the instruction. pub __args: BookRentalInstructionArgs, - } +} impl<'a, 'b> BookRentalCpi<'a, 'b> { - pub fn new( - program: &'b solana_account_info::AccountInfo<'a>, - accounts: BookRentalCpiAccounts<'a, 'b>, - args: BookRentalInstructionArgs, - ) -> Self { - Self { - __program: program, - rental_account: accounts.rental_account, - car_account: accounts.car_account, - payer: accounts.payer, - system_program: accounts.system_program, - __args: args, - } - } - #[inline(always)] - pub fn invoke(&self) -> solana_program_error::ProgramResult { - self.invoke_signed_with_remaining_accounts(&[], &[]) - } - #[inline(always)] - pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult { - self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) - } - #[inline(always)] - pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { - self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) - } - #[allow(clippy::arithmetic_side_effects)] - #[allow(clippy::clone_on_copy)] - #[allow(clippy::vec_init_then_push)] - pub fn invoke_signed_with_remaining_accounts( - &self, - signers_seeds: &[&[&[u8]]], - remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)] - ) -> solana_program_error::ProgramResult { - let mut accounts = Vec::with_capacity(4+ remaining_accounts.len()); - accounts.push(solana_instruction::AccountMeta::new( + pub fn new( + program: &'b solana_account_info::AccountInfo<'a>, + accounts: BookRentalCpiAccounts<'a, 'b>, + args: BookRentalInstructionArgs, + ) -> Self { + Self { + __program: program, + rental_account: accounts.rental_account, + car_account: accounts.car_account, + payer: accounts.payer, + system_program: accounts.system_program, + __args: args, + } + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], &[]) + } + #[inline(always)] + pub fn invoke_with_remaining_accounts( + &self, + remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)], + ) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) + } + #[inline(always)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed_with_remaining_accounts( + &self, + signers_seeds: &[&[&[u8]]], + remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)], + ) -> solana_program_error::ProgramResult { + let mut accounts = Vec::with_capacity(4 + remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( *self.rental_account.key, - false - )); - accounts.push(solana_instruction::AccountMeta::new_readonly( + false, + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( *self.car_account.key, - false - )); - accounts.push(solana_instruction::AccountMeta::new( - *self.payer.key, - true - )); - accounts.push(solana_instruction::AccountMeta::new_readonly( + false, + )); + accounts.push(solana_instruction::AccountMeta::new(*self.payer.key, true)); + accounts.push(solana_instruction::AccountMeta::new_readonly( *self.system_program.key, - false - )); - remaining_accounts.iter().for_each(|remaining_account| { - accounts.push(solana_instruction::AccountMeta { - pubkey: *remaining_account.0.key, - is_signer: remaining_account.1, - is_writable: remaining_account.2, - }) - }); - let mut data = BookRentalInstructionData::new().try_to_vec().unwrap(); - let mut args = self.__args.try_to_vec().unwrap(); - data.append(&mut args); - - let instruction = solana_instruction::Instruction { - program_id: crate::CAR_RENTAL_SERVICE_ID, - accounts, - data, - }; - let mut account_infos = Vec::with_capacity(5 + remaining_accounts.len()); - account_infos.push(self.__program.clone()); - account_infos.push(self.rental_account.clone()); - account_infos.push(self.car_account.clone()); - account_infos.push(self.payer.clone()); - account_infos.push(self.system_program.clone()); - remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); - - if signers_seeds.is_empty() { - solana_cpi::invoke(&instruction, &account_infos) - } else { - solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds) + false, + )); + remaining_accounts.iter().for_each(|remaining_account| { + accounts.push(solana_instruction::AccountMeta { + pubkey: *remaining_account.0.key, + is_signer: remaining_account.1, + is_writable: remaining_account.2, + }) + }); + let mut data = BookRentalInstructionData::new().try_to_vec().unwrap(); + let mut args = self.__args.try_to_vec().unwrap(); + data.append(&mut args); + + let instruction = solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + }; + let mut account_infos = Vec::with_capacity(5 + remaining_accounts.len()); + account_infos.push(self.__program.clone()); + account_infos.push(self.rental_account.clone()); + account_infos.push(self.car_account.clone()); + account_infos.push(self.payer.clone()); + account_infos.push(self.system_program.clone()); + remaining_accounts + .iter() + .for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); + + if signers_seeds.is_empty() { + solana_cpi::invoke(&instruction, &account_infos) + } else { + solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds) + } } - } } /// Instruction builder for `BookRental` via CPI. /// /// ### Accounts: /// - /// 0. `[writable]` rental_account - /// 1. `[]` car_account - /// 2. `[writable, signer]` payer - /// 3. `[]` system_program +/// 0. `[writable]` rental_account +/// 1. `[]` car_account +/// 2. `[writable, signer]` payer +/// 3. `[]` system_program #[derive(Clone, Debug)] pub struct BookRentalCpiBuilder<'a, 'b> { - instruction: Box>, + instruction: Box>, } impl<'a, 'b> BookRentalCpiBuilder<'a, 'b> { - pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self { - let instruction = Box::new(BookRentalCpiBuilderInstruction { - __program: program, - rental_account: None, - car_account: None, - payer: None, - system_program: None, - name: None, - pick_up_date: None, - return_date: None, - price: None, - __remaining_accounts: Vec::new(), - }); - Self { instruction } - } - /// The account that will represent the actual order for the rental -#[inline(always)] - pub fn rental_account(&mut self, rental_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { - self.instruction.rental_account = Some(rental_account); - self - } - /// The account representing the Car being rented in this order -#[inline(always)] - pub fn car_account(&mut self, car_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { - self.instruction.car_account = Some(car_account); - self - } - /// Fee payer -#[inline(always)] + pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self { + let instruction = Box::new(BookRentalCpiBuilderInstruction { + __program: program, + rental_account: None, + car_account: None, + payer: None, + system_program: None, + name: None, + pick_up_date: None, + return_date: None, + price: None, + __remaining_accounts: Vec::new(), + }); + Self { instruction } + } + /// The account that will represent the actual order for the rental + #[inline(always)] + pub fn rental_account( + &mut self, + rental_account: &'b solana_account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.rental_account = Some(rental_account); + self + } + /// The account representing the Car being rented in this order + #[inline(always)] + pub fn car_account( + &mut self, + car_account: &'b solana_account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.car_account = Some(car_account); + self + } + /// Fee payer + #[inline(always)] pub fn payer(&mut self, payer: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { - self.instruction.payer = Some(payer); - self + self.instruction.payer = Some(payer); + self } - /// The System Program -#[inline(always)] - pub fn system_program(&mut self, system_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { - self.instruction.system_program = Some(system_program); - self + /// The System Program + #[inline(always)] + pub fn system_program( + &mut self, + system_program: &'b solana_account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.system_program = Some(system_program); + self } - #[inline(always)] - pub fn name(&mut self, name: String) -> &mut Self { + #[inline(always)] + pub fn name(&mut self, name: String) -> &mut Self { self.instruction.name = Some(name); self - } - #[inline(always)] - pub fn pick_up_date(&mut self, pick_up_date: String) -> &mut Self { + } + #[inline(always)] + pub fn pick_up_date(&mut self, pick_up_date: String) -> &mut Self { self.instruction.pick_up_date = Some(pick_up_date); self - } - #[inline(always)] - pub fn return_date(&mut self, return_date: String) -> &mut Self { + } + #[inline(always)] + pub fn return_date(&mut self, return_date: String) -> &mut Self { self.instruction.return_date = Some(return_date); self - } - #[inline(always)] - pub fn price(&mut self, price: u64) -> &mut Self { + } + #[inline(always)] + pub fn price(&mut self, price: u64) -> &mut Self { self.instruction.price = Some(price); self - } - /// Add an additional account to the instruction. - #[inline(always)] - pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self { - self.instruction.__remaining_accounts.push((account, is_writable, is_signer)); - self - } - /// Add additional accounts to the instruction. - /// - /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, - /// and a `bool` indicating whether the account is a signer or not. - #[inline(always)] - pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self { - self.instruction.__remaining_accounts.extend_from_slice(accounts); - self - } - #[inline(always)] - pub fn invoke(&self) -> solana_program_error::ProgramResult { - self.invoke_signed(&[]) - } - #[allow(clippy::clone_on_copy)] - #[allow(clippy::vec_init_then_push)] - pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { - let args = BookRentalInstructionArgs { - name: self.instruction.name.clone().expect("name is not set"), - pick_up_date: self.instruction.pick_up_date.clone().expect("pick_up_date is not set"), - return_date: self.instruction.return_date.clone().expect("return_date is not set"), - price: self.instruction.price.clone().expect("price is not set"), - }; + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account( + &mut self, + account: &'b solana_account_info::AccountInfo<'a>, + is_writable: bool, + is_signer: bool, + ) -> &mut Self { + self.instruction + .__remaining_accounts + .push((account, is_writable, is_signer)); + self + } + /// Add additional accounts to the instruction. + /// + /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, + /// and a `bool` indicating whether the account is a signer or not. + #[inline(always)] + pub fn add_remaining_accounts( + &mut self, + accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)], + ) -> &mut Self { + self.instruction + .__remaining_accounts + .extend_from_slice(accounts); + self + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed(&[]) + } + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + let args = BookRentalInstructionArgs { + name: self.instruction.name.clone().expect("name is not set"), + pick_up_date: self + .instruction + .pick_up_date + .clone() + .expect("pick_up_date is not set"), + return_date: self + .instruction + .return_date + .clone() + .expect("return_date is not set"), + price: self.instruction.price.clone().expect("price is not set"), + }; let instruction = BookRentalCpi { - __program: self.instruction.__program, - - rental_account: self.instruction.rental_account.expect("rental_account is not set"), - - car_account: self.instruction.car_account.expect("car_account is not set"), - - payer: self.instruction.payer.expect("payer is not set"), - - system_program: self.instruction.system_program.expect("system_program is not set"), - __args: args, - }; - instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts) - } + __program: self.instruction.__program, + + rental_account: self + .instruction + .rental_account + .expect("rental_account is not set"), + + car_account: self + .instruction + .car_account + .expect("car_account is not set"), + + payer: self.instruction.payer.expect("payer is not set"), + + system_program: self + .instruction + .system_program + .expect("system_program is not set"), + __args: args, + }; + instruction.invoke_signed_with_remaining_accounts( + signers_seeds, + &self.instruction.__remaining_accounts, + ) + } } #[derive(Clone, Debug)] struct BookRentalCpiBuilderInstruction<'a, 'b> { - __program: &'b solana_account_info::AccountInfo<'a>, - rental_account: Option<&'b solana_account_info::AccountInfo<'a>>, - car_account: Option<&'b solana_account_info::AccountInfo<'a>>, - payer: Option<&'b solana_account_info::AccountInfo<'a>>, - system_program: Option<&'b solana_account_info::AccountInfo<'a>>, - name: Option, - pick_up_date: Option, - return_date: Option, - price: Option, - /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. - __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>, + __program: &'b solana_account_info::AccountInfo<'a>, + rental_account: Option<&'b solana_account_info::AccountInfo<'a>>, + car_account: Option<&'b solana_account_info::AccountInfo<'a>>, + payer: Option<&'b solana_account_info::AccountInfo<'a>>, + system_program: Option<&'b solana_account_info::AccountInfo<'a>>, + name: Option, + pick_up_date: Option, + return_date: Option, + price: Option, + /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. + __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>, } - diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/mod.rs b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/mod.rs index 8e13c5d2..b2bc79a2 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/mod.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/mod.rs @@ -5,13 +5,12 @@ //! //! - pub(crate) mod r#add_car; - pub(crate) mod r#book_rental; - pub(crate) mod r#pick_up_car; - pub(crate) mod r#return_car; - - pub use self::r#add_car::*; - pub use self::r#book_rental::*; - pub use self::r#pick_up_car::*; - pub use self::r#return_car::*; +pub(crate) mod r#add_car; +pub(crate) mod r#book_rental; +pub(crate) mod r#pick_up_car; +pub(crate) mod r#return_car; +pub use self::r#add_car::*; +pub use self::r#book_rental::*; +pub use self::r#pick_up_car::*; +pub use self::r#return_car::*; diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/pick_up_car.rs b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/pick_up_car.rs index 04357606..8074544b 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/pick_up_car.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/pick_up_car.rs @@ -5,346 +5,346 @@ //! //! -use borsh::BorshSerialize; use borsh::BorshDeserialize; +use borsh::BorshSerialize; pub const PICK_UP_CAR_DISCRIMINATOR: u8 = 2; /// Accounts. #[derive(Debug)] pub struct PickUpCar { - /// The account representing the active rental - - - - pub rental_account: solana_pubkey::Pubkey, - /// The account representing the Car being rented in this order - - - - pub car_account: solana_pubkey::Pubkey, - /// Fee payer - - - - pub payer: solana_pubkey::Pubkey, - } + /// The account representing the active rental + pub rental_account: solana_pubkey::Pubkey, + /// The account representing the Car being rented in this order + pub car_account: solana_pubkey::Pubkey, + /// Fee payer + pub payer: solana_pubkey::Pubkey, +} impl PickUpCar { - pub fn instruction(&self) -> solana_instruction::Instruction { - self.instruction_with_remaining_accounts(&[]) - } - #[allow(clippy::arithmetic_side_effects)] - #[allow(clippy::vec_init_then_push)] - pub fn instruction_with_remaining_accounts(&self, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction { - let mut accounts = Vec::with_capacity(3+ remaining_accounts.len()); - accounts.push(solana_instruction::AccountMeta::new( + pub fn instruction(&self) -> solana_instruction::Instruction { + self.instruction_with_remaining_accounts(&[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::vec_init_then_push)] + pub fn instruction_with_remaining_accounts( + &self, + remaining_accounts: &[solana_instruction::AccountMeta], + ) -> solana_instruction::Instruction { + let mut accounts = Vec::with_capacity(3 + remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( self.rental_account, - false - )); - accounts.push(solana_instruction::AccountMeta::new_readonly( + false, + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( self.car_account, - false - )); - accounts.push(solana_instruction::AccountMeta::new( - self.payer, - true - )); - accounts.extend_from_slice(remaining_accounts); - let data = PickUpCarInstructionData::new().try_to_vec().unwrap(); - - solana_instruction::Instruction { - program_id: crate::CAR_RENTAL_SERVICE_ID, - accounts, - data, + false, + )); + accounts.push(solana_instruction::AccountMeta::new(self.payer, true)); + accounts.extend_from_slice(remaining_accounts); + let data = PickUpCarInstructionData::new().try_to_vec().unwrap(); + + solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + } } - } } #[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] - pub struct PickUpCarInstructionData { - discriminator: u8, - } +pub struct PickUpCarInstructionData { + discriminator: u8, +} impl PickUpCarInstructionData { - pub fn new() -> Self { - Self { - discriminator: 2, - } - } + pub fn new() -> Self { + Self { discriminator: 2 } + } pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { - borsh::to_vec(self) - } - } + borsh::to_vec(self) + } +} impl Default for PickUpCarInstructionData { - fn default() -> Self { - Self::new() - } + fn default() -> Self { + Self::new() + } } - - /// Instruction builder for `PickUpCar`. /// /// ### Accounts: /// - /// 0. `[writable]` rental_account - /// 1. `[]` car_account - /// 2. `[writable, signer]` payer +/// 0. `[writable]` rental_account +/// 1. `[]` car_account +/// 2. `[writable, signer]` payer #[derive(Clone, Debug, Default)] pub struct PickUpCarBuilder { - rental_account: Option, - car_account: Option, - payer: Option, - __remaining_accounts: Vec, + rental_account: Option, + car_account: Option, + payer: Option, + __remaining_accounts: Vec, } impl PickUpCarBuilder { - pub fn new() -> Self { - Self::default() - } - /// The account representing the active rental -#[inline(always)] + pub fn new() -> Self { + Self::default() + } + /// The account representing the active rental + #[inline(always)] pub fn rental_account(&mut self, rental_account: solana_pubkey::Pubkey) -> &mut Self { - self.rental_account = Some(rental_account); - self + self.rental_account = Some(rental_account); + self } - /// The account representing the Car being rented in this order -#[inline(always)] + /// The account representing the Car being rented in this order + #[inline(always)] pub fn car_account(&mut self, car_account: solana_pubkey::Pubkey) -> &mut Self { - self.car_account = Some(car_account); - self + self.car_account = Some(car_account); + self } - /// Fee payer -#[inline(always)] + /// Fee payer + #[inline(always)] pub fn payer(&mut self, payer: solana_pubkey::Pubkey) -> &mut Self { - self.payer = Some(payer); - self + self.payer = Some(payer); + self } - /// Add an additional account to the instruction. - #[inline(always)] - pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self { - self.__remaining_accounts.push(account); - self - } - /// Add additional accounts to the instruction. - #[inline(always)] - pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self { - self.__remaining_accounts.extend_from_slice(accounts); - self - } - #[allow(clippy::clone_on_copy)] - pub fn instruction(&self) -> solana_instruction::Instruction { - let accounts = PickUpCar { - rental_account: self.rental_account.expect("rental_account is not set"), - car_account: self.car_account.expect("car_account is not set"), - payer: self.payer.expect("payer is not set"), - }; - - accounts.instruction_with_remaining_accounts(&self.__remaining_accounts) - } -} - - /// `pick_up_car` CPI accounts. - pub struct PickUpCarCpiAccounts<'a, 'b> { - /// The account representing the active rental - - - - pub rental_account: &'b solana_account_info::AccountInfo<'a>, - /// The account representing the Car being rented in this order + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self { + self.__remaining_accounts.push(account); + self + } + /// Add additional accounts to the instruction. + #[inline(always)] + pub fn add_remaining_accounts( + &mut self, + accounts: &[solana_instruction::AccountMeta], + ) -> &mut Self { + self.__remaining_accounts.extend_from_slice(accounts); + self + } + #[allow(clippy::clone_on_copy)] + pub fn instruction(&self) -> solana_instruction::Instruction { + let accounts = PickUpCar { + rental_account: self.rental_account.expect("rental_account is not set"), + car_account: self.car_account.expect("car_account is not set"), + payer: self.payer.expect("payer is not set"), + }; - - - pub car_account: &'b solana_account_info::AccountInfo<'a>, - /// Fee payer + accounts.instruction_with_remaining_accounts(&self.__remaining_accounts) + } +} - - - pub payer: &'b solana_account_info::AccountInfo<'a>, - } +/// `pick_up_car` CPI accounts. +pub struct PickUpCarCpiAccounts<'a, 'b> { + /// The account representing the active rental + pub rental_account: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the Car being rented in this order + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + pub payer: &'b solana_account_info::AccountInfo<'a>, +} /// `pick_up_car` CPI instruction. pub struct PickUpCarCpi<'a, 'b> { - /// The program to invoke. - pub __program: &'b solana_account_info::AccountInfo<'a>, - /// The account representing the active rental - - - - pub rental_account: &'b solana_account_info::AccountInfo<'a>, - /// The account representing the Car being rented in this order - - - - pub car_account: &'b solana_account_info::AccountInfo<'a>, - /// Fee payer - - - - pub payer: &'b solana_account_info::AccountInfo<'a>, - } + /// The program to invoke. + pub __program: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the active rental + pub rental_account: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the Car being rented in this order + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + pub payer: &'b solana_account_info::AccountInfo<'a>, +} impl<'a, 'b> PickUpCarCpi<'a, 'b> { - pub fn new( - program: &'b solana_account_info::AccountInfo<'a>, - accounts: PickUpCarCpiAccounts<'a, 'b>, - ) -> Self { - Self { - __program: program, - rental_account: accounts.rental_account, - car_account: accounts.car_account, - payer: accounts.payer, - } - } - #[inline(always)] - pub fn invoke(&self) -> solana_program_error::ProgramResult { - self.invoke_signed_with_remaining_accounts(&[], &[]) - } - #[inline(always)] - pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult { - self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) - } - #[inline(always)] - pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { - self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) - } - #[allow(clippy::arithmetic_side_effects)] - #[allow(clippy::clone_on_copy)] - #[allow(clippy::vec_init_then_push)] - pub fn invoke_signed_with_remaining_accounts( - &self, - signers_seeds: &[&[&[u8]]], - remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)] - ) -> solana_program_error::ProgramResult { - let mut accounts = Vec::with_capacity(3+ remaining_accounts.len()); - accounts.push(solana_instruction::AccountMeta::new( + pub fn new( + program: &'b solana_account_info::AccountInfo<'a>, + accounts: PickUpCarCpiAccounts<'a, 'b>, + ) -> Self { + Self { + __program: program, + rental_account: accounts.rental_account, + car_account: accounts.car_account, + payer: accounts.payer, + } + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], &[]) + } + #[inline(always)] + pub fn invoke_with_remaining_accounts( + &self, + remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)], + ) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) + } + #[inline(always)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed_with_remaining_accounts( + &self, + signers_seeds: &[&[&[u8]]], + remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)], + ) -> solana_program_error::ProgramResult { + let mut accounts = Vec::with_capacity(3 + remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( *self.rental_account.key, - false - )); - accounts.push(solana_instruction::AccountMeta::new_readonly( + false, + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( *self.car_account.key, - false - )); - accounts.push(solana_instruction::AccountMeta::new( - *self.payer.key, - true - )); - remaining_accounts.iter().for_each(|remaining_account| { - accounts.push(solana_instruction::AccountMeta { - pubkey: *remaining_account.0.key, - is_signer: remaining_account.1, - is_writable: remaining_account.2, - }) - }); - let data = PickUpCarInstructionData::new().try_to_vec().unwrap(); - - let instruction = solana_instruction::Instruction { - program_id: crate::CAR_RENTAL_SERVICE_ID, - accounts, - data, - }; - let mut account_infos = Vec::with_capacity(4 + remaining_accounts.len()); - account_infos.push(self.__program.clone()); - account_infos.push(self.rental_account.clone()); - account_infos.push(self.car_account.clone()); - account_infos.push(self.payer.clone()); - remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); + false, + )); + accounts.push(solana_instruction::AccountMeta::new(*self.payer.key, true)); + remaining_accounts.iter().for_each(|remaining_account| { + accounts.push(solana_instruction::AccountMeta { + pubkey: *remaining_account.0.key, + is_signer: remaining_account.1, + is_writable: remaining_account.2, + }) + }); + let data = PickUpCarInstructionData::new().try_to_vec().unwrap(); - if signers_seeds.is_empty() { - solana_cpi::invoke(&instruction, &account_infos) - } else { - solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds) + let instruction = solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + }; + let mut account_infos = Vec::with_capacity(4 + remaining_accounts.len()); + account_infos.push(self.__program.clone()); + account_infos.push(self.rental_account.clone()); + account_infos.push(self.car_account.clone()); + account_infos.push(self.payer.clone()); + remaining_accounts + .iter() + .for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); + + if signers_seeds.is_empty() { + solana_cpi::invoke(&instruction, &account_infos) + } else { + solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds) + } } - } } /// Instruction builder for `PickUpCar` via CPI. /// /// ### Accounts: /// - /// 0. `[writable]` rental_account - /// 1. `[]` car_account - /// 2. `[writable, signer]` payer +/// 0. `[writable]` rental_account +/// 1. `[]` car_account +/// 2. `[writable, signer]` payer #[derive(Clone, Debug)] pub struct PickUpCarCpiBuilder<'a, 'b> { - instruction: Box>, + instruction: Box>, } impl<'a, 'b> PickUpCarCpiBuilder<'a, 'b> { - pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self { - let instruction = Box::new(PickUpCarCpiBuilderInstruction { - __program: program, - rental_account: None, - car_account: None, - payer: None, - __remaining_accounts: Vec::new(), - }); - Self { instruction } - } - /// The account representing the active rental -#[inline(always)] - pub fn rental_account(&mut self, rental_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { - self.instruction.rental_account = Some(rental_account); - self + pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self { + let instruction = Box::new(PickUpCarCpiBuilderInstruction { + __program: program, + rental_account: None, + car_account: None, + payer: None, + __remaining_accounts: Vec::new(), + }); + Self { instruction } + } + /// The account representing the active rental + #[inline(always)] + pub fn rental_account( + &mut self, + rental_account: &'b solana_account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.rental_account = Some(rental_account); + self } - /// The account representing the Car being rented in this order -#[inline(always)] - pub fn car_account(&mut self, car_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { - self.instruction.car_account = Some(car_account); - self + /// The account representing the Car being rented in this order + #[inline(always)] + pub fn car_account( + &mut self, + car_account: &'b solana_account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.car_account = Some(car_account); + self } - /// Fee payer -#[inline(always)] + /// Fee payer + #[inline(always)] pub fn payer(&mut self, payer: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { - self.instruction.payer = Some(payer); - self + self.instruction.payer = Some(payer); + self + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account( + &mut self, + account: &'b solana_account_info::AccountInfo<'a>, + is_writable: bool, + is_signer: bool, + ) -> &mut Self { + self.instruction + .__remaining_accounts + .push((account, is_writable, is_signer)); + self + } + /// Add additional accounts to the instruction. + /// + /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, + /// and a `bool` indicating whether the account is a signer or not. + #[inline(always)] + pub fn add_remaining_accounts( + &mut self, + accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)], + ) -> &mut Self { + self.instruction + .__remaining_accounts + .extend_from_slice(accounts); + self + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed(&[]) } - /// Add an additional account to the instruction. - #[inline(always)] - pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self { - self.instruction.__remaining_accounts.push((account, is_writable, is_signer)); - self - } - /// Add additional accounts to the instruction. - /// - /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, - /// and a `bool` indicating whether the account is a signer or not. - #[inline(always)] - pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self { - self.instruction.__remaining_accounts.extend_from_slice(accounts); - self - } - #[inline(always)] - pub fn invoke(&self) -> solana_program_error::ProgramResult { - self.invoke_signed(&[]) - } - #[allow(clippy::clone_on_copy)] - #[allow(clippy::vec_init_then_push)] - pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { let instruction = PickUpCarCpi { - __program: self.instruction.__program, - - rental_account: self.instruction.rental_account.expect("rental_account is not set"), - - car_account: self.instruction.car_account.expect("car_account is not set"), - - payer: self.instruction.payer.expect("payer is not set"), - }; - instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts) - } + __program: self.instruction.__program, + + rental_account: self + .instruction + .rental_account + .expect("rental_account is not set"), + + car_account: self + .instruction + .car_account + .expect("car_account is not set"), + + payer: self.instruction.payer.expect("payer is not set"), + }; + instruction.invoke_signed_with_remaining_accounts( + signers_seeds, + &self.instruction.__remaining_accounts, + ) + } } #[derive(Clone, Debug)] struct PickUpCarCpiBuilderInstruction<'a, 'b> { - __program: &'b solana_account_info::AccountInfo<'a>, - rental_account: Option<&'b solana_account_info::AccountInfo<'a>>, - car_account: Option<&'b solana_account_info::AccountInfo<'a>>, - payer: Option<&'b solana_account_info::AccountInfo<'a>>, - /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. - __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>, + __program: &'b solana_account_info::AccountInfo<'a>, + rental_account: Option<&'b solana_account_info::AccountInfo<'a>>, + car_account: Option<&'b solana_account_info::AccountInfo<'a>>, + payer: Option<&'b solana_account_info::AccountInfo<'a>>, + /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. + __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>, } - diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/return_car.rs b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/return_car.rs index c937df64..6c4881a2 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/instructions/return_car.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/instructions/return_car.rs @@ -5,346 +5,346 @@ //! //! -use borsh::BorshSerialize; use borsh::BorshDeserialize; +use borsh::BorshSerialize; pub const RETURN_CAR_DISCRIMINATOR: u8 = 3; /// Accounts. #[derive(Debug)] pub struct ReturnCar { - /// The account representing the active rental - - - - pub rental_account: solana_pubkey::Pubkey, - /// The account representing the Car being rented in this order - - - - pub car_account: solana_pubkey::Pubkey, - /// Fee payer - - - - pub payer: solana_pubkey::Pubkey, - } + /// The account representing the active rental + pub rental_account: solana_pubkey::Pubkey, + /// The account representing the Car being rented in this order + pub car_account: solana_pubkey::Pubkey, + /// Fee payer + pub payer: solana_pubkey::Pubkey, +} impl ReturnCar { - pub fn instruction(&self) -> solana_instruction::Instruction { - self.instruction_with_remaining_accounts(&[]) - } - #[allow(clippy::arithmetic_side_effects)] - #[allow(clippy::vec_init_then_push)] - pub fn instruction_with_remaining_accounts(&self, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction { - let mut accounts = Vec::with_capacity(3+ remaining_accounts.len()); - accounts.push(solana_instruction::AccountMeta::new( + pub fn instruction(&self) -> solana_instruction::Instruction { + self.instruction_with_remaining_accounts(&[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::vec_init_then_push)] + pub fn instruction_with_remaining_accounts( + &self, + remaining_accounts: &[solana_instruction::AccountMeta], + ) -> solana_instruction::Instruction { + let mut accounts = Vec::with_capacity(3 + remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( self.rental_account, - false - )); - accounts.push(solana_instruction::AccountMeta::new_readonly( + false, + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( self.car_account, - false - )); - accounts.push(solana_instruction::AccountMeta::new( - self.payer, - true - )); - accounts.extend_from_slice(remaining_accounts); - let data = ReturnCarInstructionData::new().try_to_vec().unwrap(); - - solana_instruction::Instruction { - program_id: crate::CAR_RENTAL_SERVICE_ID, - accounts, - data, + false, + )); + accounts.push(solana_instruction::AccountMeta::new(self.payer, true)); + accounts.extend_from_slice(remaining_accounts); + let data = ReturnCarInstructionData::new().try_to_vec().unwrap(); + + solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + } } - } } #[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] - pub struct ReturnCarInstructionData { - discriminator: u8, - } +pub struct ReturnCarInstructionData { + discriminator: u8, +} impl ReturnCarInstructionData { - pub fn new() -> Self { - Self { - discriminator: 3, - } - } + pub fn new() -> Self { + Self { discriminator: 3 } + } pub(crate) fn try_to_vec(&self) -> Result, std::io::Error> { - borsh::to_vec(self) - } - } + borsh::to_vec(self) + } +} impl Default for ReturnCarInstructionData { - fn default() -> Self { - Self::new() - } + fn default() -> Self { + Self::new() + } } - - /// Instruction builder for `ReturnCar`. /// /// ### Accounts: /// - /// 0. `[writable]` rental_account - /// 1. `[]` car_account - /// 2. `[writable, signer]` payer +/// 0. `[writable]` rental_account +/// 1. `[]` car_account +/// 2. `[writable, signer]` payer #[derive(Clone, Debug, Default)] pub struct ReturnCarBuilder { - rental_account: Option, - car_account: Option, - payer: Option, - __remaining_accounts: Vec, + rental_account: Option, + car_account: Option, + payer: Option, + __remaining_accounts: Vec, } impl ReturnCarBuilder { - pub fn new() -> Self { - Self::default() - } - /// The account representing the active rental -#[inline(always)] + pub fn new() -> Self { + Self::default() + } + /// The account representing the active rental + #[inline(always)] pub fn rental_account(&mut self, rental_account: solana_pubkey::Pubkey) -> &mut Self { - self.rental_account = Some(rental_account); - self + self.rental_account = Some(rental_account); + self } - /// The account representing the Car being rented in this order -#[inline(always)] + /// The account representing the Car being rented in this order + #[inline(always)] pub fn car_account(&mut self, car_account: solana_pubkey::Pubkey) -> &mut Self { - self.car_account = Some(car_account); - self + self.car_account = Some(car_account); + self } - /// Fee payer -#[inline(always)] + /// Fee payer + #[inline(always)] pub fn payer(&mut self, payer: solana_pubkey::Pubkey) -> &mut Self { - self.payer = Some(payer); - self + self.payer = Some(payer); + self } - /// Add an additional account to the instruction. - #[inline(always)] - pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self { - self.__remaining_accounts.push(account); - self - } - /// Add additional accounts to the instruction. - #[inline(always)] - pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self { - self.__remaining_accounts.extend_from_slice(accounts); - self - } - #[allow(clippy::clone_on_copy)] - pub fn instruction(&self) -> solana_instruction::Instruction { - let accounts = ReturnCar { - rental_account: self.rental_account.expect("rental_account is not set"), - car_account: self.car_account.expect("car_account is not set"), - payer: self.payer.expect("payer is not set"), - }; - - accounts.instruction_with_remaining_accounts(&self.__remaining_accounts) - } -} - - /// `return_car` CPI accounts. - pub struct ReturnCarCpiAccounts<'a, 'b> { - /// The account representing the active rental - - - - pub rental_account: &'b solana_account_info::AccountInfo<'a>, - /// The account representing the Car being rented in this order + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self { + self.__remaining_accounts.push(account); + self + } + /// Add additional accounts to the instruction. + #[inline(always)] + pub fn add_remaining_accounts( + &mut self, + accounts: &[solana_instruction::AccountMeta], + ) -> &mut Self { + self.__remaining_accounts.extend_from_slice(accounts); + self + } + #[allow(clippy::clone_on_copy)] + pub fn instruction(&self) -> solana_instruction::Instruction { + let accounts = ReturnCar { + rental_account: self.rental_account.expect("rental_account is not set"), + car_account: self.car_account.expect("car_account is not set"), + payer: self.payer.expect("payer is not set"), + }; - - - pub car_account: &'b solana_account_info::AccountInfo<'a>, - /// Fee payer + accounts.instruction_with_remaining_accounts(&self.__remaining_accounts) + } +} - - - pub payer: &'b solana_account_info::AccountInfo<'a>, - } +/// `return_car` CPI accounts. +pub struct ReturnCarCpiAccounts<'a, 'b> { + /// The account representing the active rental + pub rental_account: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the Car being rented in this order + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + pub payer: &'b solana_account_info::AccountInfo<'a>, +} /// `return_car` CPI instruction. pub struct ReturnCarCpi<'a, 'b> { - /// The program to invoke. - pub __program: &'b solana_account_info::AccountInfo<'a>, - /// The account representing the active rental - - - - pub rental_account: &'b solana_account_info::AccountInfo<'a>, - /// The account representing the Car being rented in this order - - - - pub car_account: &'b solana_account_info::AccountInfo<'a>, - /// Fee payer - - - - pub payer: &'b solana_account_info::AccountInfo<'a>, - } + /// The program to invoke. + pub __program: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the active rental + pub rental_account: &'b solana_account_info::AccountInfo<'a>, + /// The account representing the Car being rented in this order + pub car_account: &'b solana_account_info::AccountInfo<'a>, + /// Fee payer + pub payer: &'b solana_account_info::AccountInfo<'a>, +} impl<'a, 'b> ReturnCarCpi<'a, 'b> { - pub fn new( - program: &'b solana_account_info::AccountInfo<'a>, - accounts: ReturnCarCpiAccounts<'a, 'b>, - ) -> Self { - Self { - __program: program, - rental_account: accounts.rental_account, - car_account: accounts.car_account, - payer: accounts.payer, - } - } - #[inline(always)] - pub fn invoke(&self) -> solana_program_error::ProgramResult { - self.invoke_signed_with_remaining_accounts(&[], &[]) - } - #[inline(always)] - pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult { - self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) - } - #[inline(always)] - pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { - self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) - } - #[allow(clippy::arithmetic_side_effects)] - #[allow(clippy::clone_on_copy)] - #[allow(clippy::vec_init_then_push)] - pub fn invoke_signed_with_remaining_accounts( - &self, - signers_seeds: &[&[&[u8]]], - remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)] - ) -> solana_program_error::ProgramResult { - let mut accounts = Vec::with_capacity(3+ remaining_accounts.len()); - accounts.push(solana_instruction::AccountMeta::new( + pub fn new( + program: &'b solana_account_info::AccountInfo<'a>, + accounts: ReturnCarCpiAccounts<'a, 'b>, + ) -> Self { + Self { + __program: program, + rental_account: accounts.rental_account, + car_account: accounts.car_account, + payer: accounts.payer, + } + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], &[]) + } + #[inline(always)] + pub fn invoke_with_remaining_accounts( + &self, + remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)], + ) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) + } + #[inline(always)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) + } + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed_with_remaining_accounts( + &self, + signers_seeds: &[&[&[u8]]], + remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)], + ) -> solana_program_error::ProgramResult { + let mut accounts = Vec::with_capacity(3 + remaining_accounts.len()); + accounts.push(solana_instruction::AccountMeta::new( *self.rental_account.key, - false - )); - accounts.push(solana_instruction::AccountMeta::new_readonly( + false, + )); + accounts.push(solana_instruction::AccountMeta::new_readonly( *self.car_account.key, - false - )); - accounts.push(solana_instruction::AccountMeta::new( - *self.payer.key, - true - )); - remaining_accounts.iter().for_each(|remaining_account| { - accounts.push(solana_instruction::AccountMeta { - pubkey: *remaining_account.0.key, - is_signer: remaining_account.1, - is_writable: remaining_account.2, - }) - }); - let data = ReturnCarInstructionData::new().try_to_vec().unwrap(); - - let instruction = solana_instruction::Instruction { - program_id: crate::CAR_RENTAL_SERVICE_ID, - accounts, - data, - }; - let mut account_infos = Vec::with_capacity(4 + remaining_accounts.len()); - account_infos.push(self.__program.clone()); - account_infos.push(self.rental_account.clone()); - account_infos.push(self.car_account.clone()); - account_infos.push(self.payer.clone()); - remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); + false, + )); + accounts.push(solana_instruction::AccountMeta::new(*self.payer.key, true)); + remaining_accounts.iter().for_each(|remaining_account| { + accounts.push(solana_instruction::AccountMeta { + pubkey: *remaining_account.0.key, + is_signer: remaining_account.1, + is_writable: remaining_account.2, + }) + }); + let data = ReturnCarInstructionData::new().try_to_vec().unwrap(); - if signers_seeds.is_empty() { - solana_cpi::invoke(&instruction, &account_infos) - } else { - solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds) + let instruction = solana_instruction::Instruction { + program_id: crate::CAR_RENTAL_SERVICE_ID, + accounts, + data, + }; + let mut account_infos = Vec::with_capacity(4 + remaining_accounts.len()); + account_infos.push(self.__program.clone()); + account_infos.push(self.rental_account.clone()); + account_infos.push(self.car_account.clone()); + account_infos.push(self.payer.clone()); + remaining_accounts + .iter() + .for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); + + if signers_seeds.is_empty() { + solana_cpi::invoke(&instruction, &account_infos) + } else { + solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds) + } } - } } /// Instruction builder for `ReturnCar` via CPI. /// /// ### Accounts: /// - /// 0. `[writable]` rental_account - /// 1. `[]` car_account - /// 2. `[writable, signer]` payer +/// 0. `[writable]` rental_account +/// 1. `[]` car_account +/// 2. `[writable, signer]` payer #[derive(Clone, Debug)] pub struct ReturnCarCpiBuilder<'a, 'b> { - instruction: Box>, + instruction: Box>, } impl<'a, 'b> ReturnCarCpiBuilder<'a, 'b> { - pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self { - let instruction = Box::new(ReturnCarCpiBuilderInstruction { - __program: program, - rental_account: None, - car_account: None, - payer: None, - __remaining_accounts: Vec::new(), - }); - Self { instruction } - } - /// The account representing the active rental -#[inline(always)] - pub fn rental_account(&mut self, rental_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { - self.instruction.rental_account = Some(rental_account); - self + pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self { + let instruction = Box::new(ReturnCarCpiBuilderInstruction { + __program: program, + rental_account: None, + car_account: None, + payer: None, + __remaining_accounts: Vec::new(), + }); + Self { instruction } + } + /// The account representing the active rental + #[inline(always)] + pub fn rental_account( + &mut self, + rental_account: &'b solana_account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.rental_account = Some(rental_account); + self } - /// The account representing the Car being rented in this order -#[inline(always)] - pub fn car_account(&mut self, car_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { - self.instruction.car_account = Some(car_account); - self + /// The account representing the Car being rented in this order + #[inline(always)] + pub fn car_account( + &mut self, + car_account: &'b solana_account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.car_account = Some(car_account); + self } - /// Fee payer -#[inline(always)] + /// Fee payer + #[inline(always)] pub fn payer(&mut self, payer: &'b solana_account_info::AccountInfo<'a>) -> &mut Self { - self.instruction.payer = Some(payer); - self + self.instruction.payer = Some(payer); + self + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account( + &mut self, + account: &'b solana_account_info::AccountInfo<'a>, + is_writable: bool, + is_signer: bool, + ) -> &mut Self { + self.instruction + .__remaining_accounts + .push((account, is_writable, is_signer)); + self + } + /// Add additional accounts to the instruction. + /// + /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, + /// and a `bool` indicating whether the account is a signer or not. + #[inline(always)] + pub fn add_remaining_accounts( + &mut self, + accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)], + ) -> &mut Self { + self.instruction + .__remaining_accounts + .extend_from_slice(accounts); + self + } + #[inline(always)] + pub fn invoke(&self) -> solana_program_error::ProgramResult { + self.invoke_signed(&[]) } - /// Add an additional account to the instruction. - #[inline(always)] - pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self { - self.instruction.__remaining_accounts.push((account, is_writable, is_signer)); - self - } - /// Add additional accounts to the instruction. - /// - /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, - /// and a `bool` indicating whether the account is a signer or not. - #[inline(always)] - pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self { - self.instruction.__remaining_accounts.extend_from_slice(accounts); - self - } - #[inline(always)] - pub fn invoke(&self) -> solana_program_error::ProgramResult { - self.invoke_signed(&[]) - } - #[allow(clippy::clone_on_copy)] - #[allow(clippy::vec_init_then_push)] - pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult { let instruction = ReturnCarCpi { - __program: self.instruction.__program, - - rental_account: self.instruction.rental_account.expect("rental_account is not set"), - - car_account: self.instruction.car_account.expect("car_account is not set"), - - payer: self.instruction.payer.expect("payer is not set"), - }; - instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts) - } + __program: self.instruction.__program, + + rental_account: self + .instruction + .rental_account + .expect("rental_account is not set"), + + car_account: self + .instruction + .car_account + .expect("car_account is not set"), + + payer: self.instruction.payer.expect("payer is not set"), + }; + instruction.invoke_signed_with_remaining_accounts( + signers_seeds, + &self.instruction.__remaining_accounts, + ) + } } #[derive(Clone, Debug)] struct ReturnCarCpiBuilderInstruction<'a, 'b> { - __program: &'b solana_account_info::AccountInfo<'a>, - rental_account: Option<&'b solana_account_info::AccountInfo<'a>>, - car_account: Option<&'b solana_account_info::AccountInfo<'a>>, - payer: Option<&'b solana_account_info::AccountInfo<'a>>, - /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. - __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>, + __program: &'b solana_account_info::AccountInfo<'a>, + rental_account: Option<&'b solana_account_info::AccountInfo<'a>>, + car_account: Option<&'b solana_account_info::AccountInfo<'a>>, + payer: Option<&'b solana_account_info::AccountInfo<'a>>, + /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. + __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>, } - diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/mod.rs b/tools/shank-and-codama/native/clients/rust/src/generated/mod.rs index fb2c5f72..e0d740ad 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/mod.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/mod.rs @@ -5,11 +5,11 @@ //! //! - pub mod accounts; - pub mod errors; - pub mod instructions; - pub mod programs; - pub mod shared; - pub mod types; - - pub(crate) use programs::*; +pub mod accounts; +pub mod errors; +pub mod instructions; +pub mod programs; +pub mod shared; +pub mod types; + +pub(crate) use programs::*; diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/programs.rs b/tools/shank-and-codama/native/clients/rust/src/generated/programs.rs index a18a3ad6..3a2cdd69 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/programs.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/programs.rs @@ -7,7 +7,5 @@ use solana_pubkey::{pubkey, Pubkey}; - - /// `car_rental_service` program ID. - pub const CAR_RENTAL_SERVICE_ID: Pubkey = pubkey!("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"); - +/// `car_rental_service` program ID. +pub const CAR_RENTAL_SERVICE_ID: Pubkey = pubkey!("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"); diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/shared.rs b/tools/shank-and-codama/native/clients/rust/src/generated/shared.rs index 76fa92ec..71b906d0 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/shared.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/shared.rs @@ -5,22 +5,17 @@ //! //! +#[cfg(feature = "fetch")] +#[derive(Debug, Clone)] +pub struct DecodedAccount { + pub address: solana_pubkey::Pubkey, + pub account: solana_account::Account, + pub data: T, +} - - - #[cfg(feature = "fetch")] - #[derive(Debug, Clone)] - pub struct DecodedAccount { - pub address: solana_pubkey::Pubkey, - pub account: solana_account::Account, - pub data: T, - } - - #[cfg(feature = "fetch")] - #[derive(Debug, Clone)] - pub enum MaybeAccount { - Exists(DecodedAccount), - NotFound(solana_pubkey::Pubkey), - } - - +#[cfg(feature = "fetch")] +#[derive(Debug, Clone)] +pub enum MaybeAccount { + Exists(DecodedAccount), + NotFound(solana_pubkey::Pubkey), +} diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/types/mod.rs b/tools/shank-and-codama/native/clients/rust/src/generated/types/mod.rs index 1bd40ad1..935f84e1 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/types/mod.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/types/mod.rs @@ -5,7 +5,6 @@ //! //! - pub(crate) mod r#rental_order_status; - - pub use self::r#rental_order_status::*; +pub(crate) mod r#rental_order_status; +pub use self::r#rental_order_status::*; diff --git a/tools/shank-and-codama/native/clients/rust/src/generated/types/rental_order_status.rs b/tools/shank-and-codama/native/clients/rust/src/generated/types/rental_order_status.rs index 42ebc44e..f2401993 100644 --- a/tools/shank-and-codama/native/clients/rust/src/generated/types/rental_order_status.rs +++ b/tools/shank-and-codama/native/clients/rust/src/generated/types/rental_order_status.rs @@ -5,16 +5,25 @@ //! //! -use borsh::BorshSerialize; use borsh::BorshDeserialize; +use borsh::BorshSerialize; use num_derive::FromPrimitive; -#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq, Copy, PartialOrd, Hash, FromPrimitive)] +#[derive( + BorshSerialize, + BorshDeserialize, + Clone, + Debug, + Eq, + PartialEq, + Copy, + PartialOrd, + Hash, + FromPrimitive, +)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum RentalOrderStatus { -Created, -PickedUp, -Returned, + Created, + PickedUp, + Returned, } - - diff --git a/tools/shank-and-codama/native/program/tests/test.rs b/tools/shank-and-codama/native/program/tests/test.rs index b31c830c..d8cbfe37 100644 --- a/tools/shank-and-codama/native/program/tests/test.rs +++ b/tools/shank-and-codama/native/program/tests/test.rs @@ -156,7 +156,11 @@ fn full_lifecycle_add_book_pick_up_return() { let make = "BMW"; let model = "iX1"; let car_account = car_pda(make, model); - send_instruction(&mut svm, &payer, add_car_instruction(&payer, make, model, 2020)); + send_instruction( + &mut svm, + &payer, + add_car_instruction(&payer, make, model, 2020), + ); let car = Car::from_bytes(&svm.get_account(&car_account).unwrap().data).unwrap(); assert_eq!(car.year, 2020); @@ -218,7 +222,11 @@ fn pick_up_car_rejects_a_payer_that_did_not_sign() { let make = "Tesla"; let model = "Model 3"; let car_account = car_pda(make, model); - send_instruction(&mut svm, &victim, add_car_instruction(&victim, make, model, 2024)); + send_instruction( + &mut svm, + &victim, + add_car_instruction(&victim, make, model, 2024), + ); let rental_account = rental_pda(&car_account, &victim.pubkey()); send_instruction( @@ -262,7 +270,11 @@ fn pick_up_car_rejects_a_rental_account_not_owned_by_the_program() { let make = "Volvo"; let model = "EX30"; let car_account = car_pda(make, model); - send_instruction(&mut svm, &payer, add_car_instruction(&payer, make, model, 2025)); + send_instruction( + &mut svm, + &payer, + add_car_instruction(&payer, make, model, 2025), + ); // Plant an account with plausible rental data at the correct PDA address, // but owned by the system program instead of the rental program. @@ -301,7 +313,11 @@ fn return_car_rejects_a_rental_that_was_never_picked_up() { let make = "Kia"; let model = "EV9"; let car_account = car_pda(make, model); - send_instruction(&mut svm, &payer, add_car_instruction(&payer, make, model, 2023)); + send_instruction( + &mut svm, + &payer, + add_car_instruction(&payer, make, model, 2023), + ); let rental_account = rental_pda(&car_account, &payer.pubkey()); send_instruction( From 8a3618157453a71f03327d5bc36967900961a6be Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 12 Jun 2026 18:47:14 +0000 Subject: [PATCH 083/138] ci: run the build matrix when .ghaignore is empty; convert realloc/native The changes job built its ignore pattern from .github/.ghaignore, and with that file empty 'grep -vE ""' matched every line, silently emptying the project list - the build-and-test matrix has been skipping every project. Only apply the grep filter when a pattern exists (native, pinocchio, and solana-asm workflows). basics/realloc/native was missed in the test conversion: remove its package.json and pnpm-lock.yaml and point its Rust LiteSVM test at the workspace target/deploy like the other examples. https://claude.ai/code/session_01GfHnheiE7VPmapt3v4c42p --- .github/workflows/native.yml | 9 ++++++++- .github/workflows/pinocchio.yml | 9 ++++++++- .github/workflows/solana-asm.yml | 9 ++++++++- basics/realloc/native/package.json | 8 -------- basics/realloc/native/pnpm-lock.yaml | 9 --------- basics/realloc/native/program/tests/test.rs | 6 +++++- 6 files changed, 29 insertions(+), 21 deletions(-) delete mode 100644 basics/realloc/native/package.json delete mode 100644 basics/realloc/native/pnpm-lock.yaml diff --git a/.github/workflows/native.yml b/.github/workflows/native.yml index d96bff72..9639bc38 100644 --- a/.github/workflows/native.yml +++ b/.github/workflows/native.yml @@ -55,7 +55,14 @@ jobs: # that by construction โ€” no substring matching, no path-segment trickery, # so siblings like "alternative/" can never enter the build list. function get_projects() { - find . -type d -name "native" | grep -vE "$ignore_pattern" | sort + # An empty .ghaignore makes ignore_pattern empty, and `grep -vE ""` + # matches everything, silently emptying the project list - only + # filter when there is actually a pattern. + if [[ -n "$ignore_pattern" ]]; then + find . -type d -name "native" | grep -vE "$ignore_pattern" | sort + else + find . -type d -name "native" | sort + fi } # Filter the full project list down to projects touched by the given diff --git a/.github/workflows/pinocchio.yml b/.github/workflows/pinocchio.yml index 6d521c25..450c8a93 100644 --- a/.github/workflows/pinocchio.yml +++ b/.github/workflows/pinocchio.yml @@ -56,7 +56,14 @@ jobs: # trickery, so siblings like "pinocchio-example/" can never enter the # build list. function get_projects() { - find . -type d -name "pinocchio" | grep -vE "$ignore_pattern" | sort + # An empty .ghaignore makes ignore_pattern empty, and `grep -vE ""` + # matches everything, silently emptying the project list - only + # filter when there is actually a pattern. + if [[ -n "$ignore_pattern" ]]; then + find . -type d -name "pinocchio" | grep -vE "$ignore_pattern" | sort + else + find . -type d -name "pinocchio" | sort + fi } # Filter the full project list down to projects touched by the given diff --git a/.github/workflows/solana-asm.yml b/.github/workflows/solana-asm.yml index 2cf2b104..64acfc3b 100644 --- a/.github/workflows/solana-asm.yml +++ b/.github/workflows/solana-asm.yml @@ -50,7 +50,14 @@ jobs: # anything containing the substring "asm" (e.g. "wasm/", "plasma/") can # never enter the build list. function get_projects() { - find . -type d -name "asm" | grep -vE "$ignore_pattern" | sort + # An empty .ghaignore makes ignore_pattern empty, and `grep -vE ""` + # matches everything, silently emptying the project list - only + # filter when there is actually a pattern. + if [[ -n "$ignore_pattern" ]]; then + find . -type d -name "asm" | grep -vE "$ignore_pattern" | sort + else + find . -type d -name "asm" | sort + fi } # Filter the full project list down to projects touched by the given diff --git a/basics/realloc/native/package.json b/basics/realloc/native/package.json deleted file mode 100644 index 8419fce3..00000000 --- a/basics/realloc/native/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "module", - "scripts": { - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/realloc_program.so" - } -} diff --git a/basics/realloc/native/pnpm-lock.yaml b/basics/realloc/native/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/basics/realloc/native/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/basics/realloc/native/program/tests/test.rs b/basics/realloc/native/program/tests/test.rs index 6ee052a8..6b428a6e 100644 --- a/basics/realloc/native/program/tests/test.rs +++ b/basics/realloc/native/program/tests/test.rs @@ -12,7 +12,11 @@ fn test_realloc() { let mut svm = LiteSVM::new(); let program_id = Pubkey::new_unique(); - let program_bytes = include_bytes!("../../tests/fixtures/realloc_program.so"); + // The .so is built into the workspace target/deploy by + // `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project + // root). Rebuild after every program change: the binary is embedded at + // test-compile time, so a stale .so silently tests old code. + let program_bytes = include_bytes!("../../../../../target/deploy/realloc_program.so"); svm.add_program(program_id, program_bytes).unwrap(); From a6628c438a084637d750418de390d3f5ec18b7ec Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 12 Jun 2026 18:40:42 +0000 Subject: [PATCH 084/138] feat(basics): add Pinocchio cross-program-invocation and repository-layout examples Port the two newest Pinocchio basics examples contributed to solana-developers/program-examples (upstream #582 and #584) into the Quicknode example set, which already carries Pinocchio variants for every other basics example. - cross-program-invocation/pinocchio: hand + lever two-program CPI demo - repository-layout/pinocchio: recommended multi-file program layout Both register in the workspace and follow the repo's pnpm build/build-and-test convention. Tests are written in Rust against LiteSVM (no JavaScript tests): repository-layout in program/tests/test.rs, cross-program-invocation in programs/lever/tests/test.rs. Original Pinocchio examples authored by @MarkFeder. Co-authored-by: Marco A. --- Cargo.lock | 37 +++++ Cargo.toml | 3 + .../pinocchio/README.md | 21 +++ .../pinocchio/package.json | 8 ++ .../pinocchio/pnpm-lock.yaml | 9 ++ .../pinocchio/programs/hand/Cargo.toml | 18 +++ .../pinocchio/programs/hand/src/lib.rs | 48 +++++++ .../pinocchio/programs/lever/Cargo.toml | 29 ++++ .../pinocchio/programs/lever/src/lib.rs | 76 ++++++++++ .../pinocchio/programs/lever/tests/test.rs | 136 ++++++++++++++++++ basics/repository-layout/pinocchio/README.md | 26 ++++ .../repository-layout/pinocchio/package.json | 9 ++ .../pinocchio/pnpm-lock.yaml | 9 ++ .../pinocchio/program/Cargo.toml | 26 ++++ .../pinocchio/program/src/error.rs | 1 + .../program/src/instructions/eat_food.rs | 35 +++++ .../program/src/instructions/get_on_ride.rs | 51 +++++++ .../pinocchio/program/src/instructions/mod.rs | 3 + .../program/src/instructions/play_game.rs | 40 ++++++ .../pinocchio/program/src/lib.rs | 13 ++ .../pinocchio/program/src/processor.rs | 76 ++++++++++ .../pinocchio/program/src/state/food.rs | 25 ++++ .../pinocchio/program/src/state/game.rs | 31 ++++ .../pinocchio/program/src/state/mod.rs | 3 + .../pinocchio/program/src/state/ride.rs | 35 +++++ .../pinocchio/program/tests/test.rs | 122 ++++++++++++++++ 26 files changed, 890 insertions(+) create mode 100644 basics/cross-program-invocation/pinocchio/README.md create mode 100644 basics/cross-program-invocation/pinocchio/package.json create mode 100644 basics/cross-program-invocation/pinocchio/pnpm-lock.yaml create mode 100644 basics/cross-program-invocation/pinocchio/programs/hand/Cargo.toml create mode 100644 basics/cross-program-invocation/pinocchio/programs/hand/src/lib.rs create mode 100644 basics/cross-program-invocation/pinocchio/programs/lever/Cargo.toml create mode 100644 basics/cross-program-invocation/pinocchio/programs/lever/src/lib.rs create mode 100644 basics/cross-program-invocation/pinocchio/programs/lever/tests/test.rs create mode 100644 basics/repository-layout/pinocchio/README.md create mode 100644 basics/repository-layout/pinocchio/package.json create mode 100644 basics/repository-layout/pinocchio/pnpm-lock.yaml create mode 100644 basics/repository-layout/pinocchio/program/Cargo.toml create mode 100644 basics/repository-layout/pinocchio/program/src/error.rs create mode 100644 basics/repository-layout/pinocchio/program/src/instructions/eat_food.rs create mode 100644 basics/repository-layout/pinocchio/program/src/instructions/get_on_ride.rs create mode 100644 basics/repository-layout/pinocchio/program/src/instructions/mod.rs create mode 100644 basics/repository-layout/pinocchio/program/src/instructions/play_game.rs create mode 100644 basics/repository-layout/pinocchio/program/src/lib.rs create mode 100644 basics/repository-layout/pinocchio/program/src/processor.rs create mode 100644 basics/repository-layout/pinocchio/program/src/state/food.rs create mode 100644 basics/repository-layout/pinocchio/program/src/state/game.rs create mode 100644 basics/repository-layout/pinocchio/program/src/state/mod.rs create mode 100644 basics/repository-layout/pinocchio/program/src/state/ride.rs create mode 100644 basics/repository-layout/pinocchio/program/tests/test.rs diff --git a/Cargo.lock b/Cargo.lock index 2a68a992..082fad85 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1285,6 +1285,29 @@ dependencies = [ "spl-token-interface", ] +[[package]] +name = "cross-program-invocation-pinocchio-hand" +version = "0.1.0" +dependencies = [ + "pinocchio 0.10.2", +] + +[[package]] +name = "cross-program-invocation-pinocchio-lever" +version = "0.1.0" +dependencies = [ + "litesvm", + "pinocchio 0.10.2", + "pinocchio-log", + "pinocchio-system", + "solana-instruction 3.3.0", + "solana-keypair", + "solana-native-token 3.0.0", + "solana-pubkey 3.0.0", + "solana-system-interface 2.0.0", + "solana-transaction 3.1.0", +] + [[package]] name = "crunchy" version = "0.2.4" @@ -2958,6 +2981,20 @@ dependencies = [ "solana-transaction 3.1.0", ] +[[package]] +name = "repository-layout-pinocchio-program" +version = "0.1.0" +dependencies = [ + "litesvm", + "pinocchio 0.10.2", + "pinocchio-log", + "solana-instruction 3.3.0", + "solana-keypair", + "solana-native-token 3.0.0", + "solana-pubkey 3.0.0", + "solana-transaction 3.1.0", +] + [[package]] name = "repository-layout-program" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 81c2df58..fa1830f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,8 @@ members = [ "basics/create-account/anchor/programs/create-system-account", "basics/create-account/asm", "basics/cross-program-invocation/anchor/programs/*", + "basics/cross-program-invocation/pinocchio/programs/hand", + "basics/cross-program-invocation/pinocchio/programs/lever", "basics/hello-solana/native/program", "basics/hello-solana/anchor/programs/*", "basics/hello-solana/pinocchio/program", @@ -41,6 +43,7 @@ members = [ "basics/favorites/native/program", "basics/favorites/pinocchio/program", "basics/repository-layout/native/program", + "basics/repository-layout/pinocchio/program", "basics/repository-layout/anchor/programs/*", "basics/transfer-sol/native/program", "basics/transfer-sol/pinocchio/program", diff --git a/basics/cross-program-invocation/pinocchio/README.md b/basics/cross-program-invocation/pinocchio/README.md new file mode 100644 index 00000000..029912dc --- /dev/null +++ b/basics/cross-program-invocation/pinocchio/README.md @@ -0,0 +1,21 @@ +# Cross Program Invocation: Solana Pinocchio + +A [Cross Program Invocation (CPI)](https://solana.com/docs/core/cpi) example written using the [Pinocchio](https://github.com/anza-xyz/pinocchio) framework with only the Solana toolchain. + +Two programs work together: + +- `lever` - owns a `power` account that stores a single on/off byte. It exposes `initialize` (create the account) and `switch_power` (flip the byte and log who pulled it). +- `hand` - takes a name, then invokes `lever`'s `switch_power` instruction via CPI, forwarding the name. + +Because Pinocchio runs in `no_std` without an allocator, `hand` builds the CPI instruction buffer on the stack and caps the forwarded name length. + +## Setup + +1. Build both [programs](https://solana.com/docs/terminology#program): `pnpm build` +2. Build and test: `pnpm build-and-test` + +The tests live in `programs/lever/tests/test.rs` and run on-chain in [LiteSVM](https://github.com/LiteSVM/litesvm) - there are no JavaScript tests. They exercise the full `initialize -> pull -> pull-again` CPI flow plus an invalid-discriminator rejection case. `pnpm build` compiles both programs to `tests/fixtures` so the LiteSVM test can load them. + +## Credits + +Ported from the [Pinocchio cross-program-invocation example](https://github.com/solana-developers/program-examples/pull/584) contributed by [@MarkFeder](https://github.com/MarkFeder) to solana-developers/program-examples. diff --git a/basics/cross-program-invocation/pinocchio/package.json b/basics/cross-program-invocation/pinocchio/package.json new file mode 100644 index 00000000..077016f2 --- /dev/null +++ b/basics/cross-program-invocation/pinocchio/package.json @@ -0,0 +1,8 @@ +{ + "type": "module", + "scripts": { + "build": "cargo build-sbf --manifest-path=./programs/hand/Cargo.toml --sbf-out-dir=./tests/fixtures && cargo build-sbf --manifest-path=./programs/lever/Cargo.toml --sbf-out-dir=./tests/fixtures", + "build-and-test": "pnpm build && cargo test --manifest-path=./programs/lever/Cargo.toml", + "test": "cargo test --manifest-path=./programs/lever/Cargo.toml" + } +} diff --git a/basics/cross-program-invocation/pinocchio/pnpm-lock.yaml b/basics/cross-program-invocation/pinocchio/pnpm-lock.yaml new file mode 100644 index 00000000..9b60ae17 --- /dev/null +++ b/basics/cross-program-invocation/pinocchio/pnpm-lock.yaml @@ -0,0 +1,9 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: {} diff --git a/basics/cross-program-invocation/pinocchio/programs/hand/Cargo.toml b/basics/cross-program-invocation/pinocchio/programs/hand/Cargo.toml new file mode 100644 index 00000000..d4f80375 --- /dev/null +++ b/basics/cross-program-invocation/pinocchio/programs/hand/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "cross-program-invocation-pinocchio-hand" +version = "0.1.0" +edition = "2021" + +[dependencies] +pinocchio.workspace = true + +[lib] +name = "cross_program_invocation_pinocchio_hand" +crate-type = ["cdylib", "lib"] + +[features] +custom-heap = [] +custom-panic = [] + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/cross-program-invocation/pinocchio/programs/hand/src/lib.rs b/basics/cross-program-invocation/pinocchio/programs/hand/src/lib.rs new file mode 100644 index 00000000..23ece5e1 --- /dev/null +++ b/basics/cross-program-invocation/pinocchio/programs/hand/src/lib.rs @@ -0,0 +1,48 @@ +#![no_std] + +use pinocchio::{ + cpi::invoke, + entrypoint, + error::ProgramError, + instruction::{InstructionAccount, InstructionView}, + nostd_panic_handler, AccountView, Address, ProgramResult, +}; + +entrypoint!(process_instruction); +nostd_panic_handler!(); + +// Matches lever's switch_power discriminator. +const LEVER_IX_SWITCH_POWER: u8 = 1; + +// Cap the forwarded name length so we can build the CPI buffer on the stack +// (pinocchio runs in `no_std` without an allocator by default). +const MAX_NAME_LEN: usize = 128; +const CPI_DATA_BUF: usize = MAX_NAME_LEN + 1; + +fn process_instruction( + _program_id: &Address, + accounts: &[AccountView], + instruction_data: &[u8], +) -> ProgramResult { + let [power, lever_program] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + let name = instruction_data; + if name.len() > MAX_NAME_LEN { + return Err(ProgramError::InvalidInstructionData); + } + + let mut cpi_data = [0u8; CPI_DATA_BUF]; + cpi_data[0] = LEVER_IX_SWITCH_POWER; + cpi_data[1..1 + name.len()].copy_from_slice(name); + + let metas = [InstructionAccount::writable(power.address())]; + let ix = InstructionView { + program_id: lever_program.address(), + accounts: &metas, + data: &cpi_data[..1 + name.len()], + }; + + invoke::<1>(&ix, &[power]) +} diff --git a/basics/cross-program-invocation/pinocchio/programs/lever/Cargo.toml b/basics/cross-program-invocation/pinocchio/programs/lever/Cargo.toml new file mode 100644 index 00000000..a4e4a50d --- /dev/null +++ b/basics/cross-program-invocation/pinocchio/programs/lever/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "cross-program-invocation-pinocchio-lever" +version = "0.1.0" +edition = "2021" + +[dependencies] +pinocchio.workspace = true +pinocchio-log.workspace = true +pinocchio-system.workspace = true + +[lib] +name = "cross_program_invocation_pinocchio_lever" +crate-type = ["cdylib", "lib"] + +[features] +custom-heap = [] +custom-panic = [] + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-native-token = "3.0.0" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.1" +solana-system-interface.workspace = true diff --git a/basics/cross-program-invocation/pinocchio/programs/lever/src/lib.rs b/basics/cross-program-invocation/pinocchio/programs/lever/src/lib.rs new file mode 100644 index 00000000..08106035 --- /dev/null +++ b/basics/cross-program-invocation/pinocchio/programs/lever/src/lib.rs @@ -0,0 +1,76 @@ +#![no_std] + +use pinocchio::{ + entrypoint, + error::ProgramError, + nostd_panic_handler, + sysvars::{rent::Rent, Sysvar}, + AccountView, Address, ProgramResult, +}; +use pinocchio_log::log; +use pinocchio_system::instructions::CreateAccount; + +entrypoint!(process_instruction); +nostd_panic_handler!(); + +// Single-byte account: stores `is_on` as 0 or 1. +const POWER_ACCOUNT_SPACE: u64 = 1; + +// Instruction discriminators +const IX_INITIALIZE: u8 = 0; +const IX_SWITCH_POWER: u8 = 1; + +fn process_instruction( + program_id: &Address, + accounts: &[AccountView], + instruction_data: &[u8], +) -> ProgramResult { + match instruction_data.split_first() { + Some((&IX_INITIALIZE, _)) => initialize(program_id, accounts), + Some((&IX_SWITCH_POWER, name)) => switch_power(accounts, name), + _ => Err(ProgramError::InvalidInstructionData), + } +} + +fn initialize(program_id: &Address, accounts: &[AccountView]) -> ProgramResult { + let [power, user, _system_program] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + let lamports = Rent::get()?.try_minimum_balance(POWER_ACCOUNT_SPACE as usize)?; + + CreateAccount { + from: user, + to: power, + lamports, + space: POWER_ACCOUNT_SPACE, + owner: program_id, + } + .invoke()?; + + let mut data = power.try_borrow_mut()?; + data[0] = 0; + Ok(()) +} + +fn switch_power(accounts: &[AccountView], name: &[u8]) -> ProgramResult { + let [power] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + let mut data = power.try_borrow_mut()?; + data[0] = if data[0] == 0 { 1 } else { 0 }; + let is_on = data[0] == 1; + drop(data); + + let name_str = core::str::from_utf8(name).map_err(|_| ProgramError::InvalidInstructionData)?; + log!("{} is pulling the power switch!", name_str); + + if is_on { + log!("The power is now on."); + } else { + log!("The power is now off!"); + } + + Ok(()) +} diff --git a/basics/cross-program-invocation/pinocchio/programs/lever/tests/test.rs b/basics/cross-program-invocation/pinocchio/programs/lever/tests/test.rs new file mode 100644 index 00000000..ade87ac8 --- /dev/null +++ b/basics/cross-program-invocation/pinocchio/programs/lever/tests/test.rs @@ -0,0 +1,136 @@ +use litesvm::LiteSVM; +use solana_instruction::{AccountMeta, Instruction}; +use solana_keypair::{Keypair, Signer}; +use solana_native_token::LAMPORTS_PER_SOL; +use solana_pubkey::Pubkey; +use solana_transaction::Transaction; + +// Both .so files are built into ../../../tests/fixtures (the example root) by +// `pnpm build` / `pnpm build-and-test`, which run `cargo build-sbf` for each +// program with --sbf-out-dir set there. Run that before `cargo test`. +const HAND_SO: &[u8] = + include_bytes!("../../../tests/fixtures/cross_program_invocation_pinocchio_hand.so"); +const LEVER_SO: &[u8] = + include_bytes!("../../../tests/fixtures/cross_program_invocation_pinocchio_lever.so"); + +// Lever instruction discriminators. +const IX_INITIALIZE: u8 = 0; + +fn setup() -> (LiteSVM, Pubkey, Pubkey, Keypair) { + let hand_id = Pubkey::new_unique(); + let lever_id = Pubkey::new_unique(); + + let mut svm = LiteSVM::new(); + svm.add_program(hand_id, HAND_SO).unwrap(); + svm.add_program(lever_id, LEVER_SO).unwrap(); + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + (svm, hand_id, lever_id, payer) +} + +// Calls lever's `initialize`, which creates the single-byte power account under +// the lever program via a CPI to the System Program. +fn initialize(svm: &mut LiteSVM, lever_id: Pubkey, power: &Keypair, payer: &Keypair) { + let ix = Instruction { + program_id: lever_id, + accounts: vec![ + AccountMeta::new(power.pubkey(), true), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), + ], + data: vec![IX_INITIALIZE], + }; + let tx = Transaction::new_signed_with_payer( + &[ix], + Some(&payer.pubkey()), + &[payer, power], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); +} + +// Calls hand, which forwards `switch_power(name)` to lever over a CPI. +fn pull_lever( + svm: &mut LiteSVM, + hand_id: Pubkey, + lever_id: Pubkey, + power: Pubkey, + payer: &Keypair, + name: &str, +) { + let ix = Instruction { + program_id: hand_id, + accounts: vec![ + AccountMeta::new(power, false), + AccountMeta::new_readonly(lever_id, false), + ], + data: name.as_bytes().to_vec(), + }; + let tx = Transaction::new_signed_with_payer( + &[ix], + Some(&payer.pubkey()), + &[payer], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).unwrap(); +} + +fn power_byte(svm: &LiteSVM, power: Pubkey) -> u8 { + svm.get_account(&power).unwrap().data[0] +} + +#[test] +fn test_cpi_toggles_power() { + let (mut svm, hand_id, lever_id, payer) = setup(); + let power = Keypair::new(); + + initialize(&mut svm, lever_id, &power, &payer); + assert_eq!(power_byte(&svm, power.pubkey()), 0, "power starts off"); + + pull_lever(&mut svm, hand_id, lever_id, power.pubkey(), &payer, "Chris"); + assert_eq!( + power_byte(&svm, power.pubkey()), + 1, + "power on after first pull" + ); + + pull_lever( + &mut svm, + hand_id, + lever_id, + power.pubkey(), + &payer, + "Ashley", + ); + assert_eq!( + power_byte(&svm, power.pubkey()), + 0, + "power off after second pull" + ); +} + +#[test] +fn test_lever_rejects_unknown_discriminator() { + let (mut svm, _hand_id, lever_id, payer) = setup(); + let power = Keypair::new(); + + initialize(&mut svm, lever_id, &power, &payer); + + let ix = Instruction { + program_id: lever_id, + accounts: vec![AccountMeta::new(power.pubkey(), false)], + data: vec![42], + }; + let tx = Transaction::new_signed_with_payer( + &[ix], + Some(&payer.pubkey()), + &[&payer], + svm.latest_blockhash(), + ); + assert!( + svm.send_transaction(tx).is_err(), + "unknown discriminator must fail" + ); +} diff --git a/basics/repository-layout/pinocchio/README.md b/basics/repository-layout/pinocchio/README.md new file mode 100644 index 00000000..517c7c10 --- /dev/null +++ b/basics/repository-layout/pinocchio/README.md @@ -0,0 +1,26 @@ +# Recommended Program Layout: Solana Pinocchio + +The recommended multi-file layout for a Solana [program](https://solana.com/docs/terminology#program), written using the [Pinocchio](https://github.com/anza-xyz/pinocchio) framework with only the Solana toolchain. + +The `src` folder splits responsibilities the same way the `native` and `anchor` examples do: + +- `lib.rs` - module declarations and the program entrypoint +- `processor.rs` - decodes instruction data and dispatches to the right instruction +- `instructions/` - one file per instruction (`get_on_ride`, `play_game`, `eat_food`) +- `state/` - the program's data objects (`ride`, `game`, `food`) +- `error.rs` - custom errors + +## Setup + +1. Build the [program](https://solana.com/docs/terminology#program): `pnpm build` +2. Build and test: `pnpm build-and-test` then `pnpm test` + +The tests live in `program/tests/test.rs` and run on-chain in [LiteSVM](https://github.com/LiteSVM/litesvm) - there are no JavaScript tests. `pnpm build` / `pnpm build-and-test` compile the program to `tests/fixtures` so the LiteSVM test can load it. + +## Deploy + +`pnpm build` then `pnpm deploy` + +## Credits + +Ported from the [Pinocchio repository-layout example](https://github.com/solana-developers/program-examples/pull/582) contributed by [@MarkFeder](https://github.com/MarkFeder) to solana-developers/program-examples. diff --git a/basics/repository-layout/pinocchio/package.json b/basics/repository-layout/pinocchio/package.json new file mode 100644 index 00000000..e1d6f811 --- /dev/null +++ b/basics/repository-layout/pinocchio/package.json @@ -0,0 +1,9 @@ +{ + "type": "module", + "scripts": { + "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", + "test": "cargo test --manifest-path=./program/Cargo.toml", + "deploy": "solana program deploy ./tests/fixtures/repository_layout_pinocchio_program.so" + } +} diff --git a/basics/repository-layout/pinocchio/pnpm-lock.yaml b/basics/repository-layout/pinocchio/pnpm-lock.yaml new file mode 100644 index 00000000..9b60ae17 --- /dev/null +++ b/basics/repository-layout/pinocchio/pnpm-lock.yaml @@ -0,0 +1,9 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: {} diff --git a/basics/repository-layout/pinocchio/program/Cargo.toml b/basics/repository-layout/pinocchio/program/Cargo.toml new file mode 100644 index 00000000..2f6424aa --- /dev/null +++ b/basics/repository-layout/pinocchio/program/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "repository-layout-pinocchio-program" +version = "0.1.0" +edition = "2021" + +[dependencies] +pinocchio.workspace = true +pinocchio-log.workspace = true + +[lib] +crate-type = ["cdylib", "lib"] + +[features] +custom-heap = [] +custom-panic = [] + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.1" +solana-native-token = "3.0.0" diff --git a/basics/repository-layout/pinocchio/program/src/error.rs b/basics/repository-layout/pinocchio/program/src/error.rs new file mode 100644 index 00000000..9db2fad4 --- /dev/null +++ b/basics/repository-layout/pinocchio/program/src/error.rs @@ -0,0 +1 @@ +// For any custom errors diff --git a/basics/repository-layout/pinocchio/program/src/instructions/eat_food.rs b/basics/repository-layout/pinocchio/program/src/instructions/eat_food.rs new file mode 100644 index 00000000..f435e828 --- /dev/null +++ b/basics/repository-layout/pinocchio/program/src/instructions/eat_food.rs @@ -0,0 +1,35 @@ +use pinocchio::{error::ProgramError, ProgramResult}; +use pinocchio_log::log; + +use crate::state::food; + +// InstructionData Data + +pub struct EatFoodInstructionData<'a> { + pub eater_name: &'a str, + pub eater_ticket_count: u32, + pub food_stand: &'a str, +} + +pub fn eat_food(ix: EatFoodInstructionData) -> ProgramResult { + for food_stand in food::FOOD_STANDS.iter() { + if ix.food_stand == food_stand.name { + log!("Welcome to {}! What can I get you?", food_stand.name); + + if ix.eater_ticket_count < food_stand.tickets { + log!( + " Sorry {}, our {} is {} tickets!", + ix.eater_name, + food_stand.food_type, + food_stand.tickets + ); + } else { + log!(" Enjoy your {}!", food_stand.food_type); + }; + + return Ok(()); + } + } + + Err(ProgramError::InvalidInstructionData) +} diff --git a/basics/repository-layout/pinocchio/program/src/instructions/get_on_ride.rs b/basics/repository-layout/pinocchio/program/src/instructions/get_on_ride.rs new file mode 100644 index 00000000..a8946eab --- /dev/null +++ b/basics/repository-layout/pinocchio/program/src/instructions/get_on_ride.rs @@ -0,0 +1,51 @@ +use pinocchio::{error::ProgramError, ProgramResult}; +use pinocchio_log::log; + +use crate::state::ride; + +// InstructionData Data + +pub struct GetOnRideInstructionData<'a> { + pub rider_name: &'a str, + pub rider_height: u32, + pub rider_ticket_count: u32, + pub ride: &'a str, +} + +pub fn get_on_ride(ix: GetOnRideInstructionData) -> ProgramResult { + for ride in ride::RIDES.iter() { + if ix.ride == ride.name { + log!("You're about to ride the {}!", ride.name); + + if ix.rider_ticket_count < ride.tickets { + log!( + " Sorry {}, you need {} tickets to ride the {}!", + ix.rider_name, + ride.tickets, + ride.name + ); + return Ok(()); + }; + + if ix.rider_height < ride.min_height { + log!( + " Sorry {}, you need to be {} tall to ride the {}!", + ix.rider_name, + ride.min_height, + ride.name + ); + return Ok(()); + }; + + log!(" Welcome aboard the {}!", ride.name); + + if ride.upside_down { + log!(" Btw, this ride goes upside down. Hold on tight!"); + }; + + return Ok(()); + } + } + + Err(ProgramError::InvalidInstructionData) +} diff --git a/basics/repository-layout/pinocchio/program/src/instructions/mod.rs b/basics/repository-layout/pinocchio/program/src/instructions/mod.rs new file mode 100644 index 00000000..ee6ea6d1 --- /dev/null +++ b/basics/repository-layout/pinocchio/program/src/instructions/mod.rs @@ -0,0 +1,3 @@ +pub mod eat_food; +pub mod get_on_ride; +pub mod play_game; diff --git a/basics/repository-layout/pinocchio/program/src/instructions/play_game.rs b/basics/repository-layout/pinocchio/program/src/instructions/play_game.rs new file mode 100644 index 00000000..132fb09f --- /dev/null +++ b/basics/repository-layout/pinocchio/program/src/instructions/play_game.rs @@ -0,0 +1,40 @@ +use pinocchio::{error::ProgramError, ProgramResult}; +use pinocchio_log::log; + +use crate::state::game; + +// InstructionData Data + +pub struct PlayGameInstructionData<'a> { + pub gamer_name: &'a str, + pub gamer_ticket_count: u32, + pub game: &'a str, +} + +pub fn play_game(ix: PlayGameInstructionData) -> ProgramResult { + for game in game::GAMES.iter() { + if ix.game == game.name { + log!("You're about to play {}!", game.name); + + if ix.gamer_ticket_count < game.tickets { + log!( + " Sorry {}, you need {} tickets to play {}!", + ix.gamer_name, + game.tickets, + game.name + ); + } else { + log!(" Let's see what you got!"); + log!( + " You get {} attempts and the prize is a {}!", + game.tries, + game.prize + ); + }; + + return Ok(()); + } + } + + Err(ProgramError::InvalidInstructionData) +} diff --git a/basics/repository-layout/pinocchio/program/src/lib.rs b/basics/repository-layout/pinocchio/program/src/lib.rs new file mode 100644 index 00000000..adf936c0 --- /dev/null +++ b/basics/repository-layout/pinocchio/program/src/lib.rs @@ -0,0 +1,13 @@ +#![no_std] + +// For setting up modules & configs + +pub mod error; +pub mod instructions; +pub mod processor; +pub mod state; + +use pinocchio::{entrypoint, nostd_panic_handler}; + +entrypoint!(processor::process_instruction); +nostd_panic_handler!(); diff --git a/basics/repository-layout/pinocchio/program/src/processor.rs b/basics/repository-layout/pinocchio/program/src/processor.rs new file mode 100644 index 00000000..2529de20 --- /dev/null +++ b/basics/repository-layout/pinocchio/program/src/processor.rs @@ -0,0 +1,76 @@ +use pinocchio::{error::ProgramError, AccountView, Address, ProgramResult}; +use pinocchio_log::log; + +use crate::instructions::{eat_food, get_on_ride, play_game}; + +// For processing everything at the entrypoint +// +// Instruction data layout (matches the native borsh layout): +// - name: u32 LE length + utf-8 bytes +// - height: u32 LE +// - ticket_count: u32 LE +// - attraction: u32 LE length + utf-8 bytes ("ride" | "game" | "food") +// - attraction_name: u32 LE length + utf-8 bytes + +pub fn process_instruction( + _program_id: &Address, + _accounts: &[AccountView], + instruction_data: &[u8], +) -> ProgramResult { + let mut cursor = 0; + let name = read_str(instruction_data, &mut cursor)?; + let height = read_u32(instruction_data, &mut cursor)?; + let ticket_count = read_u32(instruction_data, &mut cursor)?; + let attraction = read_str(instruction_data, &mut cursor)?; + let attraction_name = read_str(instruction_data, &mut cursor)?; + + log!("Welcome to the carnival, {}!", name); + + match attraction { + "ride" => get_on_ride::get_on_ride(get_on_ride::GetOnRideInstructionData { + rider_name: name, + rider_height: height, + rider_ticket_count: ticket_count, + ride: attraction_name, + }), + "game" => play_game::play_game(play_game::PlayGameInstructionData { + gamer_name: name, + gamer_ticket_count: ticket_count, + game: attraction_name, + }), + "food" => eat_food::eat_food(eat_food::EatFoodInstructionData { + eater_name: name, + eater_ticket_count: ticket_count, + food_stand: attraction_name, + }), + _ => Err(ProgramError::InvalidInstructionData), + } +} + +fn read_u32(data: &[u8], cursor: &mut usize) -> Result { + let end = cursor + .checked_add(4) + .ok_or(ProgramError::InvalidInstructionData)?; + if end > data.len() { + return Err(ProgramError::InvalidInstructionData); + } + let bytes: [u8; 4] = data[*cursor..end] + .try_into() + .map_err(|_| ProgramError::InvalidInstructionData)?; + *cursor = end; + Ok(u32::from_le_bytes(bytes)) +} + +fn read_str<'a>(data: &'a [u8], cursor: &mut usize) -> Result<&'a str, ProgramError> { + let len = read_u32(data, cursor)? as usize; + let end = cursor + .checked_add(len) + .ok_or(ProgramError::InvalidInstructionData)?; + if end > data.len() { + return Err(ProgramError::InvalidInstructionData); + } + let s = core::str::from_utf8(&data[*cursor..end]) + .map_err(|_| ProgramError::InvalidInstructionData)?; + *cursor = end; + Ok(s) +} diff --git a/basics/repository-layout/pinocchio/program/src/state/food.rs b/basics/repository-layout/pinocchio/program/src/state/food.rs new file mode 100644 index 00000000..ecf1313f --- /dev/null +++ b/basics/repository-layout/pinocchio/program/src/state/food.rs @@ -0,0 +1,25 @@ +// Objects + +pub struct FoodStand { + pub name: &'static str, + pub food_type: &'static str, + pub tickets: u32, +} + +pub const FOOD_STANDS: &[FoodStand] = &[ + FoodStand { + name: "Larry's Pizza", + food_type: "pizza", + tickets: 3, + }, + FoodStand { + name: "Taco Shack", + food_type: "taco", + tickets: 2, + }, + FoodStand { + name: "Dough Boy's", + food_type: "fried dough", + tickets: 1, + }, +]; diff --git a/basics/repository-layout/pinocchio/program/src/state/game.rs b/basics/repository-layout/pinocchio/program/src/state/game.rs new file mode 100644 index 00000000..2f1e6423 --- /dev/null +++ b/basics/repository-layout/pinocchio/program/src/state/game.rs @@ -0,0 +1,31 @@ +// Objects + +pub struct Game { + pub name: &'static str, + pub tickets: u32, + pub tries: u32, + pub prize: &'static str, +} + +const DEFAULT_TICKETS_TO_PLAY: u32 = 3; + +pub const GAMES: &[Game] = &[ + Game { + name: "Ring Toss", + tickets: DEFAULT_TICKETS_TO_PLAY, + tries: 5, + prize: "teddy bear", + }, + Game { + name: "I Got It!", + tickets: DEFAULT_TICKETS_TO_PLAY, + tries: 12, + prize: "goldfish", + }, + Game { + name: "Ladder Climb", + tickets: DEFAULT_TICKETS_TO_PLAY, + tries: 1, + prize: "popcorn bucket", + }, +]; diff --git a/basics/repository-layout/pinocchio/program/src/state/mod.rs b/basics/repository-layout/pinocchio/program/src/state/mod.rs new file mode 100644 index 00000000..12a92a2c --- /dev/null +++ b/basics/repository-layout/pinocchio/program/src/state/mod.rs @@ -0,0 +1,3 @@ +pub mod food; +pub mod game; +pub mod ride; diff --git a/basics/repository-layout/pinocchio/program/src/state/ride.rs b/basics/repository-layout/pinocchio/program/src/state/ride.rs new file mode 100644 index 00000000..2746d80e --- /dev/null +++ b/basics/repository-layout/pinocchio/program/src/state/ride.rs @@ -0,0 +1,35 @@ +// Objects + +pub struct Ride { + pub name: &'static str, + pub upside_down: bool, + pub tickets: u32, + pub min_height: u32, +} + +pub const RIDES: &[Ride] = &[ + Ride { + name: "Tilt-a-Whirl", + upside_down: false, + tickets: 3, + min_height: 48, + }, + Ride { + name: "Scrambler", + upside_down: false, + tickets: 3, + min_height: 48, + }, + Ride { + name: "Ferris Wheel", + upside_down: false, + tickets: 5, + min_height: 55, + }, + Ride { + name: "Zero Gravity", + upside_down: true, + tickets: 5, + min_height: 60, + }, +]; diff --git a/basics/repository-layout/pinocchio/program/tests/test.rs b/basics/repository-layout/pinocchio/program/tests/test.rs new file mode 100644 index 00000000..d4a19613 --- /dev/null +++ b/basics/repository-layout/pinocchio/program/tests/test.rs @@ -0,0 +1,122 @@ +use litesvm::LiteSVM; +use solana_instruction::{AccountMeta, Instruction}; +use solana_keypair::{Keypair, Signer}; +use solana_native_token::LAMPORTS_PER_SOL; +use solana_pubkey::Pubkey; +use solana_transaction::Transaction; + +// The .so is built into ../../tests/fixtures by `pnpm build-and-test` (which runs +// `cargo build-sbf --sbf-out-dir=./tests/fixtures` from the package root). Run +// that script (or `cargo build-sbf` with --sbf-out-dir set accordingly) before +// `cargo test`. +const PROGRAM_SO: &[u8] = + include_bytes!("../../tests/fixtures/repository_layout_pinocchio_program.so"); + +// Builds the carnival instruction data in the wire format the program decodes: +// name (str), height (u32), ticket_count (u32), attraction (str), attraction_name (str) +// where each str is a u32 LE length followed by its utf-8 bytes. +fn carnival_ix_data( + name: &str, + height: u32, + ticket_count: u32, + attraction: &str, + attraction_name: &str, +) -> Vec { + fn push_str(buf: &mut Vec, s: &str) { + buf.extend_from_slice(&(s.len() as u32).to_le_bytes()); + buf.extend_from_slice(s.as_bytes()); + } + + let mut data = Vec::new(); + push_str(&mut data, name); + data.extend_from_slice(&height.to_le_bytes()); + data.extend_from_slice(&ticket_count.to_le_bytes()); + push_str(&mut data, attraction); + push_str(&mut data, attraction_name); + data +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = Pubkey::new_unique(); + + let mut svm = LiteSVM::new(); + svm.add_program(program_id, PROGRAM_SO).unwrap(); + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap(); + + (svm, program_id, payer) +} + +// The program ignores accounts entirely, so a single signer is all we need. +fn send_carnival(svm: &mut LiteSVM, program_id: Pubkey, payer: &Keypair, data: Vec) -> bool { + let ix = Instruction { + program_id, + accounts: vec![AccountMeta::new(payer.pubkey(), true)], + data, + }; + let tx = Transaction::new_signed_with_payer( + &[ix], + Some(&payer.pubkey()), + &[payer], + svm.latest_blockhash(), + ); + svm.send_transaction(tx).is_ok() +} + +#[test] +fn test_go_on_a_ride() { + let (mut svm, program_id, payer) = setup(); + assert!(send_carnival( + &mut svm, + program_id, + &payer, + carnival_ix_data("Alice", 56, 15, "ride", "Scrambler") + )); +} + +#[test] +fn test_play_a_game() { + let (mut svm, program_id, payer) = setup(); + assert!(send_carnival( + &mut svm, + program_id, + &payer, + carnival_ix_data("Bob", 49, 6, "game", "Ring Toss") + )); +} + +#[test] +fn test_eat_some_food() { + let (mut svm, program_id, payer) = setup(); + assert!(send_carnival( + &mut svm, + program_id, + &payer, + carnival_ix_data("Mary", 52, 3, "food", "Taco Shack") + )); +} + +#[test] +fn test_unknown_attraction_name_fails() { + let (mut svm, program_id, payer) = setup(); + // "ride" is a valid attraction type, but there is no ride by this name, so the + // program falls through its lookup table and returns InvalidInstructionData. + assert!(!send_carnival( + &mut svm, + program_id, + &payer, + carnival_ix_data("Jimmy", 40, 5, "ride", "Roller Coaster") + )); +} + +#[test] +fn test_unknown_attraction_type_fails() { + let (mut svm, program_id, payer) = setup(); + assert!(!send_carnival( + &mut svm, + program_id, + &payer, + carnival_ix_data("Jimmy", 40, 5, "spaceship", "Apollo") + )); +} From 079dc320f18cf98e608e88bc3b57f40f566c453d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 12 Jun 2026 19:33:15 +0000 Subject: [PATCH 085/138] test(basics): align Pinocchio examples with target/deploy LiteSVM convention Merge in main's Rust-only Pinocchio test convention (PR #69) and adopt it for the two new examples: - Drop package.json / pnpm-lock.yaml (no JS); examples build with `cargo build-sbf` and test with `cargo test`. - include_bytes! the program .so from the workspace target/deploy instead of tests/fixtures, matching the CI that builds with `cargo build-sbf --manifest-path=` (no --sbf-out-dir). - Update READMEs to the cargo build-sbf / cargo test workflow. --- Cargo.lock | 4 ++-- basics/cross-program-invocation/pinocchio/README.md | 8 +++++--- .../cross-program-invocation/pinocchio/package.json | 8 -------- .../cross-program-invocation/pinocchio/pnpm-lock.yaml | 9 --------- .../pinocchio/programs/lever/tests/test.rs | 11 ++++++----- basics/repository-layout/pinocchio/README.md | 10 +++------- basics/repository-layout/pinocchio/package.json | 9 --------- basics/repository-layout/pinocchio/pnpm-lock.yaml | 9 --------- .../repository-layout/pinocchio/program/tests/test.rs | 10 +++++----- 9 files changed, 21 insertions(+), 57 deletions(-) delete mode 100644 basics/cross-program-invocation/pinocchio/package.json delete mode 100644 basics/cross-program-invocation/pinocchio/pnpm-lock.yaml delete mode 100644 basics/repository-layout/pinocchio/package.json delete mode 100644 basics/repository-layout/pinocchio/pnpm-lock.yaml diff --git a/Cargo.lock b/Cargo.lock index cc22a5c7..11c8f40c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1305,7 +1305,7 @@ dependencies = [ "solana-native-token 3.0.0", "solana-pubkey 3.0.0", "solana-system-interface 2.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] @@ -2986,7 +2986,7 @@ dependencies = [ "solana-keypair", "solana-native-token 3.0.0", "solana-pubkey 3.0.0", - "solana-transaction 3.1.0", + "solana-transaction", ] [[package]] diff --git a/basics/cross-program-invocation/pinocchio/README.md b/basics/cross-program-invocation/pinocchio/README.md index 029912dc..a8b91013 100644 --- a/basics/cross-program-invocation/pinocchio/README.md +++ b/basics/cross-program-invocation/pinocchio/README.md @@ -11,10 +11,12 @@ Because Pinocchio runs in `no_std` without an allocator, `hand` builds the CPI i ## Setup -1. Build both [programs](https://solana.com/docs/terminology#program): `pnpm build` -2. Build and test: `pnpm build-and-test` +1. Build both [programs](https://solana.com/docs/terminology#program): + - `cargo build-sbf --manifest-path=./programs/hand/Cargo.toml` + - `cargo build-sbf --manifest-path=./programs/lever/Cargo.toml` +2. Run the Rust + LiteSVM tests: `cargo test --manifest-path=./programs/lever/Cargo.toml` -The tests live in `programs/lever/tests/test.rs` and run on-chain in [LiteSVM](https://github.com/LiteSVM/litesvm) - there are no JavaScript tests. They exercise the full `initialize -> pull -> pull-again` CPI flow plus an invalid-discriminator rejection case. `pnpm build` compiles both programs to `tests/fixtures` so the LiteSVM test can load them. +The tests exercise the full `initialize -> pull -> pull-again` CPI flow plus an invalid-discriminator rejection case. Rebuild the programs after every change before re-running the tests: the tests embed each `.so` at compile time, so a stale binary silently tests old code. ## Credits diff --git a/basics/cross-program-invocation/pinocchio/package.json b/basics/cross-program-invocation/pinocchio/package.json deleted file mode 100644 index 077016f2..00000000 --- a/basics/cross-program-invocation/pinocchio/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "module", - "scripts": { - "build": "cargo build-sbf --manifest-path=./programs/hand/Cargo.toml --sbf-out-dir=./tests/fixtures && cargo build-sbf --manifest-path=./programs/lever/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build-and-test": "pnpm build && cargo test --manifest-path=./programs/lever/Cargo.toml", - "test": "cargo test --manifest-path=./programs/lever/Cargo.toml" - } -} diff --git a/basics/cross-program-invocation/pinocchio/pnpm-lock.yaml b/basics/cross-program-invocation/pinocchio/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/basics/cross-program-invocation/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/basics/cross-program-invocation/pinocchio/programs/lever/tests/test.rs b/basics/cross-program-invocation/pinocchio/programs/lever/tests/test.rs index ade87ac8..7f7a4c34 100644 --- a/basics/cross-program-invocation/pinocchio/programs/lever/tests/test.rs +++ b/basics/cross-program-invocation/pinocchio/programs/lever/tests/test.rs @@ -5,13 +5,14 @@ use solana_native_token::LAMPORTS_PER_SOL; use solana_pubkey::Pubkey; use solana_transaction::Transaction; -// Both .so files are built into ../../../tests/fixtures (the example root) by -// `pnpm build` / `pnpm build-and-test`, which run `cargo build-sbf` for each -// program with --sbf-out-dir set there. Run that before `cargo test`. +// Both .so files are built into the workspace target/deploy by +// `cargo build-sbf` for each program (run from the project root). Rebuild after +// every program change: the binaries are embedded at test-compile time, so a +// stale .so silently tests old code. const HAND_SO: &[u8] = - include_bytes!("../../../tests/fixtures/cross_program_invocation_pinocchio_hand.so"); + include_bytes!("../../../../../../target/deploy/cross_program_invocation_pinocchio_hand.so"); const LEVER_SO: &[u8] = - include_bytes!("../../../tests/fixtures/cross_program_invocation_pinocchio_lever.so"); + include_bytes!("../../../../../../target/deploy/cross_program_invocation_pinocchio_lever.so"); // Lever instruction discriminators. const IX_INITIALIZE: u8 = 0; diff --git a/basics/repository-layout/pinocchio/README.md b/basics/repository-layout/pinocchio/README.md index 517c7c10..df9728ab 100644 --- a/basics/repository-layout/pinocchio/README.md +++ b/basics/repository-layout/pinocchio/README.md @@ -12,14 +12,10 @@ The `src` folder splits responsibilities the same way the `native` and `anchor` ## Setup -1. Build the [program](https://solana.com/docs/terminology#program): `pnpm build` -2. Build and test: `pnpm build-and-test` then `pnpm test` +1. Build the [program](https://solana.com/docs/terminology#program): `cargo build-sbf --manifest-path=./program/Cargo.toml` +2. Run the Rust + LiteSVM tests: `cargo test --manifest-path=./program/Cargo.toml` -The tests live in `program/tests/test.rs` and run on-chain in [LiteSVM](https://github.com/LiteSVM/litesvm) - there are no JavaScript tests. `pnpm build` / `pnpm build-and-test` compile the program to `tests/fixtures` so the LiteSVM test can load it. - -## Deploy - -`pnpm build` then `pnpm deploy` +Rebuild the program after every change before re-running the tests: the tests embed the `.so` at compile time, so a stale binary silently tests old code. ## Credits diff --git a/basics/repository-layout/pinocchio/package.json b/basics/repository-layout/pinocchio/package.json deleted file mode 100644 index e1d6f811..00000000 --- a/basics/repository-layout/pinocchio/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "module", - "scripts": { - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures", - "test": "cargo test --manifest-path=./program/Cargo.toml", - "deploy": "solana program deploy ./tests/fixtures/repository_layout_pinocchio_program.so" - } -} diff --git a/basics/repository-layout/pinocchio/pnpm-lock.yaml b/basics/repository-layout/pinocchio/pnpm-lock.yaml deleted file mode 100644 index 9b60ae17..00000000 --- a/basics/repository-layout/pinocchio/pnpm-lock.yaml +++ /dev/null @@ -1,9 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} diff --git a/basics/repository-layout/pinocchio/program/tests/test.rs b/basics/repository-layout/pinocchio/program/tests/test.rs index d4a19613..bf10fd80 100644 --- a/basics/repository-layout/pinocchio/program/tests/test.rs +++ b/basics/repository-layout/pinocchio/program/tests/test.rs @@ -5,12 +5,12 @@ use solana_native_token::LAMPORTS_PER_SOL; use solana_pubkey::Pubkey; use solana_transaction::Transaction; -// The .so is built into ../../tests/fixtures by `pnpm build-and-test` (which runs -// `cargo build-sbf --sbf-out-dir=./tests/fixtures` from the package root). Run -// that script (or `cargo build-sbf` with --sbf-out-dir set accordingly) before -// `cargo test`. +// The .so is built into the workspace target/deploy by +// `cargo build-sbf --manifest-path=./program/Cargo.toml` (run from the project +// root). Rebuild after every program change: the binary is embedded at +// test-compile time, so a stale .so silently tests old code. const PROGRAM_SO: &[u8] = - include_bytes!("../../tests/fixtures/repository_layout_pinocchio_program.so"); + include_bytes!("../../../../../target/deploy/repository_layout_pinocchio_program.so"); // Builds the carnival instruction data in the wire format the program decodes: // name (str), height (u32), ticket_count (u32), attraction (str), attraction_name (str) From 787a182614781a625e4f7275437e3372316a84e0 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 31 May 2026 14:19:45 +0000 Subject: [PATCH 086/138] feat(finance/perpetual-futures): add perpetual-futures example (Anchor + Quasar) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a perpetual-futures exchange example under finance/perpetual-futures/, modelled on the oracle-priced, pool-collateralized design used by Jupiter Perpetuals and GMX (and the open-source solana-labs/perpetuals reference that Adrena and Flash Trade fork). Liquidity providers fund a shared pool and are the counterparty to every trade; traders open leveraged long or short positions priced at a Switchboard oracle, pay open/close and funding fees, and are liquidated permissionlessly once their equity falls below the maintenance margin. Both framework implementations expose the same seven instruction handlers โ€” initialize_pool, add_liquidity, remove_liquidity, open_position, close_position, liquidate_position, collect_fees โ€” and share the same design: - Liquidity-provider shares priced against mark-to-market assets-under-management derived from per-side open-interest accumulators, so an exiting provider cannot dodge an in-flight trader profit. - Reserved-liquidity solvency model: each open position reserves its notional size, an open is allowed only while the reserve stays backed by liquidity (which also caps open interest), recoverable profit is capped at the reserve so a winner can always be paid, and liquidity-provider withdrawals can take only the unreserved remainder. - A cumulative funding index in which the heavier open-interest side pays the pool over time. - Oracle reads validated for staleness (by slot), positivity, scale, and a confidence band that must stay within a per-pool maximum. - Pool parameters cross-checked at initialization: the maintenance margin must exceed the close fee, so no position can be stranded too healthy to liquidate yet too poor to pay the fee to close. - All money math in u128 with checked arithmetic, multiply-before-divide, rounding toward the protocol; transfer_checked; checks-effects-interactions; slippage bounds on every state-changing handler. Anchor (finance/perpetual-futures/anchor): a perpetual-futures program plus a mock-switchboard companion program that supplies a deterministic price+confidence feed for tests and documents the swap-in point for a real Switchboard On-Demand feed. Covered by 23 LiteSVM integration tests. Quasar (finance/perpetual-futures/quasar): a port with 13 quasar-svm tests. It keeps one position per (pool, owner) because Quasar's address constraint can reference account inputs but not instruction arguments, so the side is stored in the position rather than used as a seed; the oracle feed is supplied directly in tests rather than via a companion program. Docs: a finance-oriented README following the repository's program-flow format (participants, sample USDC/NVDAx tokens, per-step instruction and account tables) with concept links, a terminology glossary, design notes relating the example to percolator and solana-labs/perpetuals, and a Financial Software entry in the root README. Also commits the QuickNode Solana coding skill under .claude/skills/ (with a tracked .gitignore exception) so it is available in Claude Code web sessions. https://claude.ai/code/session_01YNkQe8eneL4FxCu96kmjVr --- .../solana-anchor-claude-skill/LICENSE.md | 9 + .../skills/solana-anchor-claude-skill/RUST.md | 164 +++ .../solana-anchor-claude-skill/SKILL.md | 439 +++++++ .../solana-anchor-claude-skill/TYPESCRIPT.md | 91 ++ .gitignore | 2 +- README.md | 6 + finance/perpetual-futures/anchor/.gitignore | 6 + finance/perpetual-futures/anchor/Anchor.toml | 24 + finance/perpetual-futures/anchor/Cargo.toml | 14 + finance/perpetual-futures/anchor/README.md | 229 ++++ .../perpetual-futures/anchor/TERMINOLOGY.md | 36 + .../programs/mock-switchboard/Cargo.toml | 26 + .../programs/mock-switchboard/src/lib.rs | 105 ++ .../programs/perpetual-futures/Cargo.toml | 46 + .../perpetual-futures/src/constants.rs | 50 + .../programs/perpetual-futures/src/errors.rs | 58 + .../src/instructions/add_liquidity.rs | 144 +++ .../src/instructions/close_position.rs | 144 +++ .../src/instructions/collect_fees.rs | 82 ++ .../src/instructions/initialize_pool.rs | 162 +++ .../src/instructions/liquidate_position.rs | 172 +++ .../perpetual-futures/src/instructions/mod.rs | 16 + .../src/instructions/open_position.rs | 176 +++ .../src/instructions/remove_liquidity.rs | 148 +++ .../src/instructions/shared.rs | 224 ++++ .../programs/perpetual-futures/src/lib.rs | 82 ++ .../perpetual-futures/src/state/mod.rs | 6 + .../perpetual-futures/src/state/oracle.rs | 99 ++ .../perpetual-futures/src/state/pool.rs | 99 ++ .../perpetual-futures/src/state/position.rs | 52 + .../tests/test_perpetual_futures.rs | 1052 +++++++++++++++++ finance/perpetual-futures/quasar/.gitignore | 5 + finance/perpetual-futures/quasar/Cargo.toml | 37 + finance/perpetual-futures/quasar/Quasar.toml | 22 + finance/perpetual-futures/quasar/README.md | 36 + .../perpetual-futures/quasar/src/constants.rs | 26 + .../quasar/src/instructions/add_liquidity.rs | 129 ++ .../quasar/src/instructions/close_position.rs | 184 +++ .../quasar/src/instructions/collect_fees.rs | 68 ++ .../src/instructions/initialize_pool.rs | 119 ++ .../src/instructions/liquidate_position.rs | 164 +++ .../quasar/src/instructions/mod.rs | 16 + .../quasar/src/instructions/open_position.rs | 180 +++ .../src/instructions/remove_liquidity.rs | 132 +++ .../quasar/src/instructions/shared.rs | 268 +++++ finance/perpetual-futures/quasar/src/lib.rs | 129 ++ finance/perpetual-futures/quasar/src/state.rs | 59 + finance/perpetual-futures/quasar/src/tests.rs | 621 ++++++++++ 48 files changed, 6157 insertions(+), 1 deletion(-) create mode 100644 .claude/skills/solana-anchor-claude-skill/LICENSE.md create mode 100644 .claude/skills/solana-anchor-claude-skill/RUST.md create mode 100644 .claude/skills/solana-anchor-claude-skill/SKILL.md create mode 100644 .claude/skills/solana-anchor-claude-skill/TYPESCRIPT.md create mode 100644 finance/perpetual-futures/anchor/.gitignore create mode 100644 finance/perpetual-futures/anchor/Anchor.toml create mode 100644 finance/perpetual-futures/anchor/Cargo.toml create mode 100644 finance/perpetual-futures/anchor/README.md create mode 100644 finance/perpetual-futures/anchor/TERMINOLOGY.md create mode 100644 finance/perpetual-futures/anchor/programs/mock-switchboard/Cargo.toml create mode 100644 finance/perpetual-futures/anchor/programs/mock-switchboard/src/lib.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/Cargo.toml create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/constants.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/errors.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/add_liquidity.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/close_position.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/collect_fees.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/initialize_pool.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/liquidate_position.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/mod.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/open_position.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/remove_liquidity.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/shared.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/lib.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/mod.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/oracle.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/pool.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/position.rs create mode 100644 finance/perpetual-futures/anchor/programs/perpetual-futures/tests/test_perpetual_futures.rs create mode 100644 finance/perpetual-futures/quasar/.gitignore create mode 100644 finance/perpetual-futures/quasar/Cargo.toml create mode 100644 finance/perpetual-futures/quasar/Quasar.toml create mode 100644 finance/perpetual-futures/quasar/README.md create mode 100644 finance/perpetual-futures/quasar/src/constants.rs create mode 100644 finance/perpetual-futures/quasar/src/instructions/add_liquidity.rs create mode 100644 finance/perpetual-futures/quasar/src/instructions/close_position.rs create mode 100644 finance/perpetual-futures/quasar/src/instructions/collect_fees.rs create mode 100644 finance/perpetual-futures/quasar/src/instructions/initialize_pool.rs create mode 100644 finance/perpetual-futures/quasar/src/instructions/liquidate_position.rs create mode 100644 finance/perpetual-futures/quasar/src/instructions/mod.rs create mode 100644 finance/perpetual-futures/quasar/src/instructions/open_position.rs create mode 100644 finance/perpetual-futures/quasar/src/instructions/remove_liquidity.rs create mode 100644 finance/perpetual-futures/quasar/src/instructions/shared.rs create mode 100644 finance/perpetual-futures/quasar/src/lib.rs create mode 100644 finance/perpetual-futures/quasar/src/state.rs create mode 100644 finance/perpetual-futures/quasar/src/tests.rs diff --git a/.claude/skills/solana-anchor-claude-skill/LICENSE.md b/.claude/skills/solana-anchor-claude-skill/LICENSE.md new file mode 100644 index 00000000..f52a392f --- /dev/null +++ b/.claude/skills/solana-anchor-claude-skill/LICENSE.md @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2026 Quiknode Inc. + +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/.claude/skills/solana-anchor-claude-skill/RUST.md b/.claude/skills/solana-anchor-claude-skill/RUST.md new file mode 100644 index 00000000..6bd2bab9 --- /dev/null +++ b/.claude/skills/solana-anchor-claude-skill/RUST.md @@ -0,0 +1,164 @@ +# Rust Guidelines (Anchor Programs) + +These guidelines apply to Anchor programs and any Rust crates that use Solana dependencies. Read this alongside the general rules in [SKILL.md](SKILL.md). + +## Anchor Version + +- Write all code like the latest stable Anchor (currently 1.0.2 but there may be a newer version by the time you read this) +- Use LiteSVM and Rust tests for new Anchor programs. `anchor init` uses LiteSVM by default. +- Do not use unnecessary macros that are not needed in the latest stable Anchor +- Don't implement instruction handlers as methods on account structs. There's no reason to tie state to functions, the function is not modifying the state (if we did like OOP, which we don't), and the functions and structs work without doing this, so there's no reason to implement instruction handlers as methods on account structs. + +## Anchor has silly defaults + +Every project will need an IDL. + +```toml +[features] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +``` + +and if it uses Tokens (like almost every Anchor project) it will need this dependency (insert whatever version is applicable): + +```toml +[dependencies] +anchor-spl = "1.0.2" +``` + +## Project Structure + +- **Never modify the program ID** in `lib.rs` or `Anchor.toml` when making changes +- Create files inside the `state` folder for whatever state is needed +- Create files inside the `instructions` or `handlers` folders (whichever exists) for whatever instruction handlers are needed +- Put Account Constraints in instruction files, but ensure the names end with `AccountConstraints` rather than just naming them the same thing as the function +- Handlers that are only for the admin should be in a new folder called `admin` inside whichever parent folder exists (`instructions/admin/` or `handlers/admin/`) + +## Account Constraints + +- Use a newline after each key in the account constraints struct, so the macro and the matching key/value have some space from other macros and their matching key/value + +## Bumps + +- Use `context.bumps.foo` not `context.bumps.get("foo").unwrap()` - the latter is outdated + +## Data Structures + +- When making structs ensure strings and Vectors have a `max_len` attribute +- Vectors have two numbers for `max_len`: the first is the max length of the vector, the second is the max length of the items in the vector + +## Space Calculation (CRITICAL - NO MAGIC NUMBERS) + +- **Do not use magic numbers anywhere**. I don't want to see `8 + 32` or whatever. +- **Do not make constants for the sizes of various data structures** +- For `space`, use syntax like: `space = SomeStruct::DISCRIMINATOR.len() + SomeStruct::INIT_SPACE,` +- All structs should have `#[derive(InitSpace)]` added to them, to get the `INIT_SPACE` trait +- **DO NOT use magic numbers** + +**Example:** + +```rust +#[derive(InitSpace)] +#[account] +pub struct UserProfile { + pub authority: Pubkey, + + #[max_len(50)] + pub username: String, + + pub bump: u8, +} + +#[derive(Accounts)] +pub struct InitializeProfile<'info> { + #[account( + init, + payer = authority, + space = UserProfile::DISCRIMINATOR.len() + UserProfile::INIT_SPACE, + seeds = [b"profile", authority.key().as_ref()], + bump + )] + pub profile: Account<'info, UserProfile>, + + #[account(mut)] + pub authority: Signer<'info>, + + pub system_program: Program<'info, System>, +} +``` + +## Error Handling + +- Return useful error messages +- Write code to handle common errors like insufficient funds, bad values for parameters, and other obvious situations +- All arithmetic in onchain code is `checked_*` โ€” never raw `+ - * /`. Solana's BPF doesn't trap on overflow in release builds; silent wraps are how hacks happen. `checked_*` returns `Option`; force the error with `.ok_or(MyError::MathOverflow)?`. Reserve `saturating_*` for cosmetic/UX display values, never for balances. + +## Onchain Financial Math + +Applies to any code touching money, balances, prices, shares, fees, or token amounts. These rules are non-negotiable. + +- **Integers only โ€” no floats, no fixed-point libraries.** Floats are non-deterministic across platforms (different validators could disagree on state). `fixed::types::I64F64`, `rust_decimal`, `bnum`-fixed-point and similar are also out โ€” they add audit surface, burn compute, and hide the rounding/precision decisions you should be making explicitly. Token amounts are integers (base units), prices are ratios of integers. The system is discrete. Production Solana AMMs (Orca, Raydium, Meteora, Saber, Phoenix) all use raw `u128`. If you find yourself reaching for a decimal type, stop โ€” the right tool is `u128` with discipline. +- **Multiply before you divide.** `a * b / c`, not `(a / c) * b`. Division truncates; dividing first throws away precision permanently. +- **Use `u128` (or wider) for intermediate products.** `u64 * u64` overflows at ~1.8e19. Cast both operands to `u128` _before_ multiplying, then narrow the final result with `try_into().map_err(|_| MyError::MathOverflow)?`. +- **Round in the protocol's favour, never the user's.** Value-to-share and share-to-value conversions: user gets floor, protocol gets ceil. Otherwise you leak 1 base unit per transaction forever, and attackers will industrialise it. +- **Validate ranges before doing the math.** Reject zero inputs, `amount > balance`, ratios that would mint zero shares. Cheap, prevents the inflation/donation attack on empty pools and other whole bug classes. +- **Check invariants after the math, not just before.** "K must not decrease" on a swap, "total LP shares == sum of holdings", "reserves >= owed fees". Compute, then `require!()` the invariant. +- **Decimals are tracked, not assumed.** USDC=6, SOL=9, SPL tokens vary. Use `transfer_checked` (carries decimals in the CPI). Reserves hold raw base units; the UI does cosmetic conversion. Never hard-code `* 10^9`. +- **Oracle/price freshness is part of the math.** Check `last_updated_slot` and reject if older than N slots. A stale price means the calculation is wrong. +- **Oracle confidence is part of the math too.** Pull oracles (Pyth, Switchboard) report a price *and* a confidence/uncertainty band. Reject the update when the band is too wide relative to the price (e.g. `confidence * 10_000 / price > max_error_bps`); a wide band means the price is unreliable, and skipping this check is one of the most common oracle exploits. Where the feed offers it, prefer the EMA/TWAP price over the latest spot price for a mark that is harder to manipulate within a single block. (See `solana-labs/perpetuals` for a worked example.) +- **Checks-effects-interactions.** Update state before the token transfer CPI, not after. +- **Treat client-supplied values as adversarial.** If a handler takes `(amount_a, amount_b)`, verify each against onchain state, not against each other. +- **Test the branch the bug lives in.** Standard AMM/lending bugs sit in the _non-empty pool_, _post-swap_, _post-fee_, _rounding-edge_ branches. The happy path almost always works. Write the test that exercises the branch where the bug actually lives. +- **LP shares use different formulas for first deposit vs subsequent.** First deposit: shares = `sqrt(amount_a * amount_b)` (geometric mean bootstraps the pool). Subsequent deposits: shares = `min(amount_a * supply / reserve_a, amount_b * supply / reserve_b)` (proportional to share-of-pool). Using the geometric mean for every deposit is a real, repeated bug โ€” test both branches separately. +- **For integer sqrt, hand-code Newton's method on `u128`** (~15 lines, as Uniswap V2 in Solidity / Saber in Rust do). Don't reach for a fixed-point crate for one sqrt. +- **Slippage protection: accept a `min_output_*` from the user and verify before the CPI.** Swaps, deposits, and withdraws all need it. Without it, sandwich attackers steal value across the price gap they create. +- **Never silently clamp user input to balance.** If a user asks to swap 100 and you clamp to 80 because that's the balance, the user's slippage check passes against the wrong amount. Either fail the instruction or return the actual amount so the client can validate. +- **Use `transfer_checked`, never raw `transfer`.** `transfer_checked` carries the mint and decimals through the CPI, so a wrong-mint or wrong-decimals account causes a CPI failure instead of a silent miscalculation. +- **For token program compatibility, use `anchor_spl::token_interface`** (`InterfaceAccount`, `InterfaceAccount`, `Interface`). The same code then works against both the Classic Token Program and the Token Extensions Program. +- **Oracle freshness uses slots, not unix time.** Slot count is what the runtime guarantees; `Clock::get()?.unix_timestamp` is validator-influenced. Check `last_updated_slot` against `Clock::get()?.slot` and reject if older than N slots. If you must use a unix timestamp (because the oracle only exposes one), state why in a comment. +- **Canonical pubkey ordering for two-asset pools.** Order mints so `mint_a.key() < mint_b.key()` (lexicographic on the 32-byte key). Same pool whether the user passes `(USDC, SOL)` or `(SOL, USDC)`. Enforce in the constraint, don't rely on the client. + +### Escrows, Vaults, and Escape Hatches + +- **Every escrow needs a cancel/withdraw instruction.** An escrow with no cancel locks abandoned offers forever โ€” funds become unrecoverable when the counterparty disappears. The cancel must be callable by the maker (and only the maker) at any time before the trade settles. +- **Don't use `init_if_needed` for an account the wrong party would pay rent for.** Common bug: the taker's instruction lazily creates the maker's destination ATA via `init_if_needed`, so the taker pays the maker's rent. Either require the maker to pre-create their ATA or pass the rent payer explicitly. +- **Update state before the CPI.** Already in the list above, but worth repeating in the vault context: write the new balance/share count first, then transfer. A CPI that re-enters (rare on Solana but possible via callbacks) sees current state, not stale state. + +**Pattern to copy when ratio-clamping (Uniswap V2 style):** + +```rust +let pool_a = pool_a_amount as u128; +let pool_b = pool_b_amount as u128; +let amount_a_u128 = amount_a as u128; +let amount_b_u128 = amount_b as u128; + +// Multiply before divide; u128 prevents overflow. +let amount_b_required = amount_a_u128 + .checked_mul(pool_b).ok_or(ErrorCode::MathOverflow)? + .checked_div(pool_a).ok_or(ErrorCode::MathOverflow)?; + +let (final_a, final_b) = if amount_b_required <= amount_b_u128 { + (amount_a_u128, amount_b_required) +} else { + let amount_a_required = amount_b_u128 + .checked_mul(pool_a).ok_or(ErrorCode::MathOverflow)? + .checked_div(pool_b).ok_or(ErrorCode::MathOverflow)?; + (amount_a_required, amount_b_u128) +}; + +let final_a: u64 = final_a.try_into().map_err(|_| ErrorCode::MathOverflow)?; +let final_b: u64 = final_b.try_into().map_err(|_| ErrorCode::MathOverflow)?; +``` + +## Cargo hygiene + +- Run `cargo clean` after finishing with a Rust project. Anchor `target/` directories accumulate fast (multi-GiB per project). +- If disk usage hits 85%, clean before doing more work. + +## PDA Management + +- Add `pub bump: u8` to every struct stored in PDA +- Save the bumps inside each when the struct inside the PDA is created + +## System Functions + +- When you get the time via Clock, use `Clock::get()?;` rather than `anchor_lang::solana_program::clock` diff --git a/.claude/skills/solana-anchor-claude-skill/SKILL.md b/.claude/skills/solana-anchor-claude-skill/SKILL.md new file mode 100644 index 00000000..c4f237e6 --- /dev/null +++ b/.claude/skills/solana-anchor-claude-skill/SKILL.md @@ -0,0 +1,439 @@ +--- +name: solana-anchor-claude-skill +description: "Use when working on Solana software, including one or more of: Solana client code using TypeScript, Rust libraries that use Solana crates, Anchor programs, Quasar programs, LiteSVM tests, including Rust program files, TypeScript tests, and Anchor.toml configuration. Designed to create minimal, reusable code without unnecessary duplication." +--- + +# Coding Guidelines + +Apply these rules to ensure code quality, maintainability, and adherence to project standards. + +## Fight for Truth + +Don't write things that aren't currently true โ€” anywhere. Chat, code comments, variable names, PR titles, READMEs, commit messages. + +- Documentation and comments that do not match the code are considered untrue. +- Variable names that do not match the purpose of the variable are considered untrue. +- Temporary workarounds that aren't labelled as such are lying through omission - there is an issue you aren't telling the next programmer about. Mark them with a `TODO` comment with a link to a git issue (if it exists) and telling the next programmer when they can delete the workaround. +- If unsure of something, say so. Bluffing is lying. +- **Ambiguity is a soft lie:** if a phrase could be read two ways and only one is true, it's misleading. Disambiguate before sending โ€” pick the term that says exactly what's meant, name the antecedent of every "it"/"this"/"that". +- A wrong statement is worse than no statement. +- Separate scratch labels from real identifiers. + +Actively fix untrue things when you see them. Don't let "close enough" wording stand in for the truthful one. + +**Grep before naming.** Before sending any prose, walkthrough, README, comment, or commit message that names a specific identifier (function, struct, file, account, module, field, constant), grep the source for that exact identifier and confirm it exists. "I'm pretty sure that's the name" is not enough. If the identifier doesn't exist, either use the real name or apply the rename to the code first, then write the prose. + +**Describe what is, not what was removed.** READMEs, doc-comments, and code comments document current state โ€” not history. Lines like "no floats", "no longer uses X", "replaces the previous Y approach" belong in CHANGELOGs and PR descriptions, not source artefacts. A first-time reader has no history and "no longer uses I64F64" creates ambient confusion ("wait, should I be worried?"). Sweep before sending: grep for `no longer`, `removed`, `previously`, `used to`, `formerly`, `dropped`, `now uses`, `replaces the previous` โ€” each hit is a candidate for deletion. + +## Do the whole thing + +The marginal cost of completeness is near zero with AI. Do the whole thing. + +Do it right. Do it with tests. Do it with documentation. Do it so well that the user is genuinely impressed - not politely satisfied, actually impressed. Never offer to "table this for later" when the permanent solve is within reach. Never leave a dangling thread when tying it off takes five more minutes. Never present a workaround when the real fix exists. + +The standard isn't "good enough" - it's "holy shit, that's done." Search before building. Test before shipping. + +Ship the complete thing. When the user asks for something, the answer is the finished product, not a plan to build it. Time is not an excuse. Fatigue is not an excuse. Complexity is not an excuse. Boil the ocean. + +## Success Criteria + +- Before declaring success, declaring that work is complete, or celebrating, run the project's actual tests using the correct command for that project (for example: `anchor test` for Anchor workspaces, the project's TypeScript test command for TypeScript clients/tests, or `cargo test` for Rust crates). If the tests fail, there is more work to do. Don't stop until the relevant test command passes on the code you have made. +- Do not write placeholder tests. Placeholder tests don't count as tests, placeholder tests passing does not achieve your task. + - Tests that just do `assert.ok(true)` or similar are placeholder tests and do not count as tests + - Tests that do not call the program's instruction handlers are placeholder tests and do not count as tests + - Tests must: initialize accounts, send transactions, verify state changes, check balances + - If you find yourself writing placeholder tests, stop and write real integration tests instead + - DO NOT mark "Write tests" as complete until tests actually call the program instructions + - DO NOT ask "should I write real tests now?" - if the tests are placeholders, write real ones immediately + +- Do not stop until documentation like `README.md` and `CHANGELOG.md` are also updated with your changes. If you have made a feature, and it is not documented in the README or changelog, there is more work to do and you must continue working. + +- When summarizing your work, show the work items you have achieved with this symbol 'โœ…' and if there is any more work to do, add a 'โŒ' for each remaining work item. + +## Documentation Sources + +Use these official documentation sources: + +- **Anchor**: https://www.anchor-lang.com/docs +- **LiteSVM**: https://www.anchor-lang.com/docs/testing/litesvm +- **Anchor Error Codes**: https://raw.githubusercontent.com/coral-xyz/anchor/master/lang/src/error.rs +- **Solana Kite**: https://solanakite.org +- **Solana Kit**: https://solanakit.com +- **Agave (Solana CLI)**: https://docs.anza.xyz/ (Anza makes the Solana CLI and Agave). +- **Switchboard** (if used): https://docs.switchboard.xyz/docs-by-chain/solana-svm +- **Arcium** (if used): https://docs.arcium.com/developers + +## Terminology + +- Remember this is Solana not Ethereum. Ethereum is not relevant to any documentation you write. Do not assume people know or care about Ethereum. + - Don't tell me about 'smart contracts' or 'protocols' (use 'programs' instead) + - Don't tell me about 'gas' (use 'transaction fees' instead) + - There are no 'mempools'. + - Do not tell me about other things that are not relevant to Solana. + +- Token program terminology: + - Use 'Token Extensions Program' or 'Token extensions' for the newer token program (not 'Token 2022' which is just a code name) + - Use 'Classic Token Program' for the older token program + - Use 'Token' rather than 'SPL Token' unless you are specifically discussing the distinction between the native token (SOL) and all other tokens (SPL Tokens) + +- Onchain / offchain (one word, no hyphen) + - Always write 'onchain' and 'offchain' as single, unhyphenated words โ€” like 'online' and 'offline'. + - Never write 'on-chain' or 'off-chain'. The hyphenated forms are wrong. + - Apply the same rule to related terms: 'crosschain' (not 'cross-chain'), etc. + - Sources: + - [Solana Foundation style guide](https://solana.com/docs/references/terminology) + - [US Government usage](https://www.sec.gov/files/rules/interp/2026/33-11412.pdf) + - [Cat (catmcgee) will make fun of you if you write 'on-chain'](https://x.com/catmcgee/status/2028153588715761825) + +- Some tools in Solana unfortunately use the same word 'instructions' for both the input and the functions. To avoid confusion, use 'instruction handlers' for the functions that handle instructions, and 'instructions' for the input to those functions. + +## Do not use + +- Do not use 'Solana Labs' documentation. The company has been replaced by Anza. + +- Do not use 'Coral XYZ' documentation. Coral used to maintain Anchor, but Anchor is now maintained by the Solana Foundation (solana.org) + +- Do not use any documentaton or tools from Project Serum, which collapsed many years ago. + +- Do not use yarn. Yarn has no reason to exist and only adds unnecessary dependencies and is not commonly used for new JS/TS projects in 2026. Replace Yarn with npm everywhere you see it. Use npm for new projects as it does not require additional dependencies. Keep using pnpm if the project already uses pnpm. + +- Do not use **Switchboard Functions** - this product is dead and no longer maintained. (Note: Switchboard oracles are still active and usable.) + +- Do not use **Clockwork** - this product is dead. For scheduled instruction handler invocation, use [TukTuk](https://github.com/helium/tuktuk/tree/main/typescript-examples) instead. + +## Library versions + +Use the latest stable Anchor, Rust, TypeScript, Solana Kit, and Kite you can. If a bug occurs, favor updating rather than rolling back. + +## Project Documentation + +Every project must have a `README.md` file in the project root that includes: + +- **Purpose**: Why the project exists and what problem it solves +- **Major Concepts**: Key architectural concepts, important PDAs, state structures, and program logic +- **Testing**: How to run the tests (e.g., `anchor test`) +- **Setup**: Any prerequisites or setup steps needed to work with the project +- **Usage**: Basic usage examples or deployment instructions if applicable + +Keep the README focused and practical. Avoid generic boilerplate - write documentation that would actually help someone understand and work with this specific project. + +## Writing About Financial Software + +These apply to READMEs, docs, blog posts, and PR descriptions for finance-related projects (AMMs, escrows, lending, leasing, CLOBs, prediction markets, stablecoins). + +- **"Non-custodial" is a loaded word.** If the program locks funds in vaults during its lifecycle (every escrow, lending, AMM, leasing program does), don't claim "non-custodial" โ€” it contradicts itself. What you usually mean is "no admin override, the rules are the deployed bytecode". Say that directly, or just describe the custody arrangement (program-owned vault, PDA signers, no admin escape hatch). +- **Upgrade authority is normal on Solana** โ€” programs are usually upgradable so authors can ship security fixes. Don't apologise for it or treat it as disqualifying for "trustless" claims. Trust in the author/multisig is baseline; "trustless" means the documented rules can't be bypassed, not "bytecode frozen forever". +- **"Token" not "mint" in economic prose.** A mint is the onchain account that controls supply; a token is the asset. In economic descriptions ("post token A as collateral, borrow token B"), say "token A" and "token B". Reserve "mint account" for technical descriptions of what gets passed to instructions. +- **Tokens are fungible by default โ€” don't say so.** Don't write "fungible token" or sentences explaining that tokens are fungible. The reader knows. Only qualify when contrasting ("non-fungible token" / NFT). Same rule as not explaining what an integer is. +- **One name per role/concept, enforced everywhere.** Pick a single term for each party (lessor/lessee, maker/taker, long/short, borrower/lender) and use ONLY that term throughout. Mixing terminology mid-document is how readers lose track of who owes what to whom. +- **Don't conflate "long the collateral" with "long the trade".** Anyone who posts collateral wants it to hold value (otherwise margin call), so every borrower is long their collateral. The directional bet is on the _borrowed_ asset, separately. Be precise about which "long" you mean. +- **Be careful with the word "securities".** It's a legal term. SOL is not a security. Asset-leasing is not "securities lending" even when the mechanics are analogous. Prefer "asset lending", "token lending", or "directional token lending" โ€” and ask before picking one. +- **Spell out two-asset flows with concrete examples.** "Posts collateral and takes delivery of borrowed tokens" reads circular. "Posts USDC as collateral, borrows NVDAx" makes the asymmetry obvious. Don't make the reader infer that mints A and B are different things. +- **Name the instruction handlers in lifecycle prose.** When walking through "what the user does" (open position, close position, liquidate), name the actual handler (`take_lease`, `return_lease`, `liquidate`). Plain-English mechanics without handler names leave the reader unable to connect the narrative to the code. + +## General Coding Guidelines + +### You are a deletionist + +Your golden rule is "perfection isn't achieved when there's nothing more to add, rather perfection is achieved when there is nothing more to be taken away". + +Remove: + +- Comments that simply repeat what the code is doing, or the name of a variable, and do not add further insight. +- Repeated code that should be turned into a named function. +- Unused imports, unused constants, unused files, and comments that no longer apply. +- Doc-comments whose first line just paraphrases the identifier. `/// Pool authority PDA.` above `pub pool_authority` is noise. Either explain something the name doesn't (seed derivation, mutability rationale, type-choice reason, an invariant the reader can't see from the type) or delete the line. + +Don't remove existing comments unless they are no longer useful or accurate. + +### Communication Style + +- Do not make disclaimers about being a "complete project" or state what works +- It is expected that work is complete and functional - no need to state this explicitly +- Avoid phrases like "This is a complete implementation" or "All features are working" +- Just deliver the work without meta-commentary about its completeness + +### Config files: leave a comment explaining WHY + +When you change a configuration value, or pin a version in any config file (`Anchor.toml`, `Cargo.toml`, `package.json`, CI workflows, `.gitignore`, `rust-toolchain.toml`), leave a comment explaining _why_. The next reader needs the rationale, not just the value. + +- **Pinned versions:** what breaks without the pin? when can it be unpinned? +- **Non-default timeouts / limits:** why this number? +- **Removed sections:** what was it doing? why was it removed? +- **`.gitignore` exceptions:** why is this file tracked despite the rule? +- **Workarounds:** what's the proper fix? when can this be replaced? (mark with `TODO`) + +Example: + +```toml +# Pinned: 0.8.7 conflicts with litesvm's dep tree. +# Unpin when litesvm upgrades its ahash requirement. +ahash = "=0.8.6" +``` + +When you remove a section, only add why to the git commit, so the file is free of information that does not apply to its existing state. + +### Working with Generated or Unfamiliar Code + +**CRITICAL - Verify Before Use:** + +- Before calling ANY function whose signature you don't know with certainty, read the actual source code/type definitions first +- NEVER guess or assume what parameters a function accepts based on what seems logical +- Don't invent convenience parameters that don't exist +- Generated code, third-party libraries, and unfamiliar codebases often have different APIs than you expect +- Common mistake: Assuming a function accepts high-level parameters โ†’ WRONG. Check the actual signature in the source files first + +### Variable Naming + +Ensure good variable naming. Rather than add comments to explain what things are, give them useful names. + +**Don't do this:** + +```typescript +// Foo +const shlerg = getFoo(); +``` + +**Do this instead:** + +```typescript +const foo = getFoo(); +``` + +**Naming conventions:** + +- Arrays should be plurals (`shoes`), items within arrays should be the singular (`shoes.forEach((shoe) => {...})`) +- Functions should be verby, like `calculateFoo` or `getBar` +- Avoid abbreviations, use full words (e.g., use `context` rather than `ctx`). Never use `e` for something thrown, use `thrownObject`, never use `v` when you mean `value`. There is almost no case where a single character variable is a good idea outside maths (eg `p` and `q` for cryptography). +- Name a transaction some variant of `transaction`. Name instructions some variant of `instruction`. Name signatures some variant of `signature`. Do not confuse them - eg if the type looks like an instruction, you should not call it a 'transaction' because that is deceptive. + +You can still add comments for additional context, just be careful to avoid comments that are explaining things that would be better conveyed by good variable naming. + +### Code Quality + +- Avoid 'magic numbers'. Make numbers either have a good variable name, a comment explaining why they are that value, or a reference to the URL you got the value from. If the values come from an IDL, download the IDL, import it, and make a function that gets the value from the IDL rather than copying the value into the source code + +This is a magic number. Don't do this: + +```ts +const FINALIZE_EVENT_DISCRIMINATOR = new Uint8Array([ + 27, 75, 117, 221, 191, 213, 253, 249, +]); +``` + +Instead do this: + +```ts +const FINALIZE_EVENT_DISCRIMINATOR = getEventDiscriminator( + arciumIdl, + "FinalizeComputationEvent", +); +``` + +- The code you are making is for production. You shouldn't have comments like `// In production we'd do this differently` or `**Implementation incomplete** - Needs program config handling and proper PDA derivations` or `**WORK IN PROGRESS**` in the final code you produce, or functions that return placeholder data. Instead: do the fucking work. + +## Language-Specific Guidelines + +The rules above apply to every file in the project. In addition, read the file that matches the language you are editing: + +- **TypeScript** (Solana Kit clients, Solana Kit tests, browser code, anything `.ts`): see [TYPESCRIPT.md](TYPESCRIPT.md) +- **Rust** (Anchor programs, LiteSVM tests, Solana crates, anything `.rs`): see [RUST.md](RUST.md) + +If a task touches both sides, read both. + +### Testing (Rust + LiteSVM) + +Anchor 1.0+ ships Rust + LiteSVM tests by default โ€” `anchor init` now scaffolds a Rust integration test under `programs//tests/`, and `Anchor.toml` sets `test = "cargo test"`. Use this as the sole test pattern for Anchor programs. Do not write TypeScript tests for Anchor programs. + +#### How to initialise a new project + +Always initialise new Anchor projects with both flags pinned explicitly: + +```sh +anchor init --package-manager npm --test-template litesvm +``` + +- `--package-manager npm` โ€” `anchor init`'s default is `yarn`, which this skill bans. Pin npm at init time so you don't have to fix `Anchor.toml` afterwards. +- `--test-template litesvm` โ€” currently the default in `anchor-cli`, but pin it explicitly so the project doesn't break if the default changes. The other templates (`mocha`, `jest`, `rust`, `mollusk`) are not used for new Anchor programs in this skill. + +The `--template` flag defaults to `multiple` (multi-file program layout with `instructions/`, `state.rs`, `error.rs`); keep that default. `--template single` is a single `lib.rs` and Anchor itself flags it as "not recommended for production". + +#### What `anchor init` gives you + +A fresh `anchor init` produces these test-related defaults: + +`Anchor.toml`: + +```toml +[toolchain] +package_manager = "yarn" + +[features] +resolution = true +skip-lint = false + +[scripts] +test = "cargo test" + +[hooks] +``` + +`programs//Cargo.toml` `[dev-dependencies]`: + +```toml +[dev-dependencies] +litesvm = "0.10.0" +solana-message = "3.0.1" +solana-transaction = "3.0.2" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +``` + +`programs//tests/test_initialize.rs`: + +```rust +use { + anchor_lang::{solana_program::instruction::Instruction, InstructionData, ToAccountMetas}, + litesvm::LiteSVM, + solana_message::{Message, VersionedMessage}, + solana_signer::Signer, + solana_keypair::Keypair, + solana_transaction::versioned::VersionedTransaction, +}; + +#[test] +fn test_initialize() { + let program_id = anchor_scaffold_probe::id(); + let payer = Keypair::new(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/anchor_scaffold_probe.so"); + svm.add_program(program_id, bytes).unwrap(); + svm.airdrop(&payer.pubkey(), 1_000_000_000).unwrap(); + + let instruction = Instruction::new_with_bytes( + program_id, + &anchor_scaffold_probe::instruction::Initialize {}.data(), + anchor_scaffold_probe::accounts::Initialize {}.to_account_metas(None), + ); + + let blockhash = svm.latest_blockhash(); + let msg = Message::new_with_blockhash(&[instruction], Some(&payer.pubkey()), &blockhash); + let tx = VersionedTransaction::try_new(VersionedMessage::Legacy(msg), &[payer]).unwrap(); + + let res = svm.send_transaction(tx); + assert!(res.is_ok()); +} +``` + +Before the program binary exists, run `anchor build` so `target/deploy/.so` is on disk; the test loads it via `include_bytes!`. + +#### Two scaffold fixes to apply immediately after `anchor init` + +`anchor init`'s defaults conflict with this skill's rules. Fix them straight away: + +1. **Set `package_manager = "npm"` in `Anchor.toml`** โ€” `anchor init` defaults to yarn, but yarn is banned in this skill. If you used `--package-manager npm` at init time you can skip this step. + + ```toml + [toolchain] + package_manager = "npm" + ``` + +2. **Delete `ts-mocha`, `mocha`, `chai` (and their `@types`) from `package.json`** โ€” `--package-manager npm` does not remove the JS test dev-dependencies; you still need this step. The default JS test scaffold is stale. Anchor programs (since 1.0.0) use Rust + LiteSVM instead of TypeScript, not Mocha. If you keep a `package.json` at all (for offchain client code or scripts), it should not pull in Mocha-era dependencies. + +#### Minimal bare-bones test + +The `anchor init` scaffold above is already the minimal pattern โ€” `litesvm` plus the `solana-*` primitives, no extra dependencies. Use this when you want zero indirection and complete control over the transaction. New tests can follow the same shape: build an `Instruction`, wrap in a `Message` with the latest blockhash, sign as a `VersionedTransaction`, and call `svm.send_transaction(tx)`. + +#### Optional ergonomic helpers via solana-kite + +[`solana-kite`](https://crates.io/crates/solana-kite) is an optional thin layer on top of `litesvm` that removes most of the manual transaction wiring. Used in the wild by [`quiknode-labs/solana-program-examples/basics/counter/anchor`](https://github.com/quiknode-labs/solana-program-examples/tree/main/basics/counter/anchor). + +Add to `[dev-dependencies]`: + +```toml +[dev-dependencies] +litesvm = "0.10.0" +solana-kite = "0.3.0" +borsh = "1.6.1" +``` + +The same test, rewritten with kite: + +```rust +use { + anchor_lang::{solana_program::instruction::Instruction, InstructionData, ToAccountMetas}, + litesvm::LiteSVM, + solana_kite::{create_wallet, send_transaction_from_instructions}, +}; + +#[test] +fn test_initialize() { + let program_id = anchor_scaffold_probe::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/anchor_scaffold_probe.so"); + svm.add_program(program_id, bytes).unwrap(); + + let payer = create_wallet(&mut svm, 1_000_000_000).unwrap(); + + let instruction = Instruction::new_with_bytes( + program_id, + &anchor_scaffold_probe::instruction::Initialize {}.data(), + anchor_scaffold_probe::accounts::Initialize {}.to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, &[instruction], &payer, &[&payer]).unwrap(); +} +``` + +`create_wallet` replaces the `Keypair::new()` + `svm.airdrop(...)` pair, and `send_transaction_from_instructions` replaces the `Message` / `VersionedMessage` / `VersionedTransaction` construction. Bare `litesvm` is still the baseline โ€” reach for kite when you have repeated boilerplate worth removing. + +#### Account deserialisation + +Anchor account data is `[8-byte discriminator][borsh-serialised struct]`. To read state from a LiteSVM test, fetch the account, skip the first 8 bytes, and `borsh`-decode the rest. Define a mirror struct (or import the program's own) that derives `BorshDeserialize`. + +```rust +use borsh::BorshDeserialize; + +#[derive(BorshDeserialize)] +struct CounterAccount { + pub count: u64, +} + +let account = svm.get_account(&counter_pda).unwrap(); +let counter = CounterAccount::try_from_slice(&account.data[8..]).unwrap(); +assert_eq!(counter.count, 1); +``` + +`8` here is the Anchor account discriminator length, not a magic number โ€” it is fixed by Anchor's account layout. + +#### Re-expiring blockhash between repeated identical transactions + +LiteSVM, like a real validator, will reject a second transaction with the same blockhash + signer + message because the signature is identical to one it has already processed. If a test sends the *same* instruction twice (for example, calling `increment` in a loop), call `svm.expire_blockhash()` between sends so the next transaction picks up a fresh blockhash and is treated as new: + +```rust +send_transaction_from_instructions(&mut svm, &[increment.clone()], &payer, &[&payer]).unwrap(); +svm.expire_blockhash(); +send_transaction_from_instructions(&mut svm, &[increment], &payer, &[&payer]).unwrap(); +``` + +This is only needed when the message bytes would otherwise be byte-identical. Different instructions, different accounts, or different signers do not need it. + +#### Do not use + +- `solana-test-validator` โ€” slow, stateful, replaced by LiteSVM for tests. +- `anchor test --validator legacy` โ€” same reason; the default `anchor test` runs `cargo test` against LiteSVM. +- `anchor.setProvider`, `anchor.AnchorProvider.env()` โ€” TS Anchor client wiring, no longer used for tests. +- `program.methods.X().rpc()`, `program.methods.X().sendAndConfirm()` โ€” the TS `@coral-xyz/anchor` client; do not use it for tests. +- `ts-mocha`, `mocha`, `chai` โ€” the stale `anchor init` JS test scaffold. +- `tsx`-based `node:test` for Anchor program tests โ€” fine for offchain scripts, not for testing programs. +- `@solana/web3.js` v1 โ€” legacy in any context. +- `@coral-xyz/anchor` โ€” Anchor's old TS client; not used in this test pattern. +- `kit-plugin-litesvm` (the TypeScript LiteSVM plugin) โ€” superseded by using the `litesvm` Rust crate directly. + +## Git commits + +Do not add "Co-Authored-By: Claude" or similar attribution when creating git commits. + +## Acknowledgment + +- Acknowledge these guidelines have been applied when working on this project to indicate you have read these rules and found that they do apply to this project. diff --git a/.claude/skills/solana-anchor-claude-skill/TYPESCRIPT.md b/.claude/skills/solana-anchor-claude-skill/TYPESCRIPT.md new file mode 100644 index 00000000..c58f32ce --- /dev/null +++ b/.claude/skills/solana-anchor-claude-skill/TYPESCRIPT.md @@ -0,0 +1,91 @@ +# TypeScript Guidelines + +These guidelines apply to TypeScript unit tests, browser code, Solana Kit clients, and any other places where TypeScript is used in the project. Read this alongside the general rules in [SKILL.md](SKILL.md). + +## General TypeScript + +Use `"type": "module"` in `package.json` files. + +Avoid using a `tsconfig.json` unless it's needed, as we use `tsx` to run most typescript and it doesn't usually need one. If you do need a `tsconfig.json`, state why at the top of the file, and you can use the most modern version of ECMAScript/JavaScript you want - up to say 2023. + +## Async/await + +Favor `async`/`await` and `try/catch` over `.then()` or `.catch()` or using callbacks for flow control. `tsx` has top level `await` so you don't need to wrap top level `await` in IIFEs. + +## Type System + +- **Always use `Array`**, never use `item[]` for consistency with other generic syntax like `Promise`, `Map`, and `Set` +- **Don't use `any`** + +## Comments + +- Most comments should use `//` and be above (not beside) the code +- The only exception is JSDoc/TSDoc comments which MUST use `/* */` syntax + +## Solana-Specific TypeScript + +- Don't make new `@solana/web3.js` version 1 code. Do not make new code using `@coral-xyz/anchor` package. Don't replace Solana Kit with web3.js version 1 code. web3.js version 1 is legacy and should be eventually removed. Solana Kit used to be called web3.js version 2. Use Solana Kit, preferably via Solana Kite. +- Use Kite's `connection.getPDAAndBump()` to turn seeds into PDAs and bumps +- There is no need to use offsets that you set to decode Solana account data - either download an npm package for the program like `@solana-program/token` for the token program or make one using Codama. +- In Solana Kit, you make instructions by making TS clients from IDLs using Codama. You can easily make Codama clients for installed IDLs using: + +`npx create-codama-clients` + +- Do not use the `bs58` npm package. + +Don't do this: + +```typescript +import bs58 from "bs58"; +const signature = bs58.encode(signatureBytes); +``` + +Do this instead: + +```typescript +import { getBase58Decoder } from "@solana/codecs"; +const signature = getBase58Decoder().decode(signatureBytes); +``` + +Yes, `bs58` and `@solana/codecs` packages have different concepts of 'encode' and 'decode'. + +## Unit Tests + +- Create unit tests in TS in the `tests` directory +- Use the Node.js inbuilt test and assertion libraries (then start the tests using `tsx` instead of `ts-mocha`) + +**Unit testing imports:** + +```typescript +import { before, describe, test } from "node:test"; +import assert from "node:assert"; +``` + +- Use `test` rather than `it` + +## Thrown object handling + +- JavaScript allows arbitrary items - strings, array, numbers etc to be 'thrown'. However you can assume that any non-Error item that is thrown is a programmer error. Handle it like this (including the comment since most TypeScript developers don't know this): + +```ts +// In JS it's possible to throw *anything*. A sensible programmer +// will only throw Errors but we must still check to satisfy +// TypeScript (and flag any craziness) +const ensureError = function (thrownObject: unknown): Error { + if (thrownObject instanceof Error) { + return thrownObject; + } + return new Error(`Non-Error thrown: ${String(thrownObject)}`); +}; +``` + +and + +```ts +try { + // some code that might throw +} catch (thrownObject) { + const error = ensureError(thrownObject); + throw error; +} +``` diff --git a/.gitignore b/.gitignore index 94ff54c0..4f211c70 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,4 @@ node_modules/ /target deploy .claude/* -!.claude/skills/ \ No newline at end of file +!.claude/skills/ diff --git a/README.md b/README.md index 5a3c0869..d8ea7f50 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,12 @@ A managed investment fund onchain. Investors deposit USDC and receive shares rep [โš“ Anchor](./finance/vault-strategy/anchor) +### Perpetual Futures + +A perpetual futures exchange โ€” a venue for making leveraged bets on an asset's price without ever owning the asset. Traders post collateral and open a **long** (betting the price rises) or **short** (betting it falls) sized up to several times their collateral; their profit or loss tracks the price move and is paid in the collateral token. Rather than matching buyers to sellers, every trade is against a shared **liquidity pool** that other users fund and that is the counterparty to all of it โ€” the pool pays winners and keeps losers' collateral, and its providers earn the trading and funding fees in return. The price comes from an oracle, positions accrue a funding fee over time, and anyone can **liquidate** a position whose collateral can no longer cover its loss. This is the design behind venues like Jupiter Perpetuals and GMX. + +[โš“ Anchor](./finance/perpetual-futures/anchor) [๐Ÿ’ซ Quasar](./finance/perpetual-futures/quasar) + ## Single concept examples ### Hello Solana diff --git a/finance/perpetual-futures/anchor/.gitignore b/finance/perpetual-futures/anchor/.gitignore new file mode 100644 index 00000000..be06d3aa --- /dev/null +++ b/finance/perpetual-futures/anchor/.gitignore @@ -0,0 +1,6 @@ +.anchor +target +**/*.rs.bk +node_modules +test-ledger +.DS_Store diff --git a/finance/perpetual-futures/anchor/Anchor.toml b/finance/perpetual-futures/anchor/Anchor.toml new file mode 100644 index 00000000..a9609192 --- /dev/null +++ b/finance/perpetual-futures/anchor/Anchor.toml @@ -0,0 +1,24 @@ +[toolchain] +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +perpetual_futures = "3uCm8Jep469pHUpYQCh6eA6dpYV3ogvTvaRDZBPtw5So" +mock_switchboard = "FnisQqhF56BxVYh5Wt8xW8wuTVN6STAGnk13MM5SRM7b" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" + +# Non-default: the LiteSVM Rust tests load both programs' .so files via +# include_bytes!, so they must be built before `cargo test` runs. CI calls +# `anchor build` first; these waits only matter for the legacy validator path. +[test] +startup_wait = 5000 +shutdown_wait = 2000 diff --git a/finance/perpetual-futures/anchor/Cargo.toml b/finance/perpetual-futures/anchor/Cargo.toml new file mode 100644 index 00000000..f3977048 --- /dev/null +++ b/finance/perpetual-futures/anchor/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/finance/perpetual-futures/anchor/README.md b/finance/perpetual-futures/anchor/README.md new file mode 100644 index 00000000..25b4a3fe --- /dev/null +++ b/finance/perpetual-futures/anchor/README.md @@ -0,0 +1,229 @@ +# Perpetual Futures + +A perpetual futures exchange โ€” a venue for making leveraged bets on an asset's price without ever owning the asset. It is modelled on the oracle-priced, pool-collateralized design used by [Jupiter Perpetuals](https://station.jup.ag/guides/perpetual-exchange/overview) and GMX (and the open-source [`solana-labs/perpetuals`](https://github.com/solana-labs/perpetuals) reference that [Adrena](https://github.com/AdrenaFoundation/adrena-program) and [Flash Trade](https://github.com/flash-trade/flash-perpetuals) fork), rather than the order-book design used by [Drift](https://docs.drift.trade/). + +The collateral is **USDC** (a dollar stablecoin), and the market tracks the price of **NVDAx**, a tokenised Nvidia share whose [oracle](#oracle) price follows the real stock. A second market could track **TSLAx** (Tesla); each market is one collateral token plus one price feed. In the tests these are mock [SPL tokens](https://solana.com/docs/terminology#token). + +A [perpetual future](https://www.investopedia.com/terms/f/futurescontract.asp) ("perp") is a [derivative](https://www.investopedia.com/terms/d/derivative.asp) with no expiry: profit and loss is paid in the collateral token as the price moves, and no stock or coin ever changes hands. + +[โš“ Anchor](.) ยท [๐Ÿ’ซ Quasar](../quasar) + +--- + +## Programs + +| Program | Description | +|---------|-------------| +| `perpetual-futures` | The exchange: pool creation, liquidity provision, opening/closing leveraged positions, funding, liquidation, and fee collection. | +| `mock-switchboard` | Test-only price feed. Stores a price, scale, last-update slot, and confidence band that tests write directly. Replaced by a real [Switchboard](https://docs.switchboard.xyz/) On-Demand feed in production. | + +All money math is integer `u128` with `checked_*` operations, multiplying before dividing and rounding in the pool's favour โ€” no floats, no fixed-point library. + +--- + +## Key Financial Concepts + +### Long and short, leverage, collateral + +A trader goes [long](https://www.investopedia.com/terms/l/long.asp) if they think the price will rise or [short](https://www.investopedia.com/terms/s/short.asp) if they think it will fall. They post [collateral](https://www.investopedia.com/terms/c/collateral.asp) and choose a position size up to the pool's maximum [leverage](https://www.investopedia.com/terms/l/leverage.asp) (borrowing power). The [notional size](https://www.investopedia.com/terms/n/notionalvalue.asp) is the full exposure โ€” e.g. $5,000 even if only $1,000 of collateral was posted โ€” and profit or loss is the notional times the percentage change in price: + +``` +long profit/loss = size * (price - entry_price) / entry_price +short profit/loss = size * (entry_price - price) / entry_price +``` + +### The liquidity pool and provider shares + +There is no order book. Every trade is against one shared [liquidity pool](https://www.investopedia.com/terms/l/liquidity.asp) that other users fund; the pool is the counterparty to all of them โ€” it pays trader profits and keeps trader losses. Providers receive shares priced against [mark-to-market](https://www.investopedia.com/terms/m/marktomarket.asp) assets-under-management (the pool's value if every open position were settled now), derived from running per-side accumulators rather than by iterating positions. Pricing against the marked value stops a provider exiting just before an in-flight trader profit is realized. The first deposit mints `deposit - MINIMUM_LIQUIDITY` shares (the Uniswap V2 convention) so the share supply never starts at a dust amount. + +### Reserved liquidity + +So a winning trader can always be paid, the pool **reserves** liquidity to back each open position's maximum recoverable profit (its notional `size`). An open is allowed only while `reserved + size <= liquidity`, which doubles as an open-interest cap. `close_position` caps a winner's payout at the reserved `size` (for a long, profit is capped on a more-than-doubling move; a short's profit is naturally within `size`), and provider withdrawals can take only the *free* remainder (`liquidity - reserved`). This is the simplified, single-collateral form of the reserve accounting in `solana-labs/perpetuals`. The reserve covers price profit only โ€” funding owed *to* a position (the lighter side receives funding) is not reserved, so in the extreme a payout the pool cannot cover makes the close fail closed (revert) rather than leave the pool insolvent. + +### Funding + +[Funding](https://www.investopedia.com/terms/f/futurescontract.asp) anchors the pool's risk: the heavier side of [open interest](https://www.investopedia.com/terms/o/openinterest.asp) pays the pool over time. A cumulative funding index rises while longs are the larger side and falls while shorts are, advancing by `funding_rate_per_slot` each [slot](https://solana.com/docs/terminology#slot); a position records the index at open and settles the change when it closes. In a pool-based perp this is the equivalent of the borrow fee Jupiter Perpetuals charges. + +### Maintenance margin and liquidation + +A position's *equity* is its net collateral plus profit/loss minus funding. Once equity falls to or below the [maintenance margin](https://www.investopedia.com/terms/m/maintenancemargin.asp) (`maintenance_margin_bps` of notional), the position can be [liquidated](https://www.investopedia.com/terms/l/liquidation.asp). Liquidation is permissionless โ€” anyone can crank it and earn the liquidation fee. + +### Oracle + +The mark price comes from an oracle feed. This example validates the price for staleness (by slot), positivity, scale, and a [confidence band](https://docs.pyth.network/price-feeds/best-practices#confidence-intervals) that must stay within `max_confidence_bps` of the price โ€” rejecting an uncertain price is one of the most common oracle-safety checks. + +### Fees and slippage + +Open and close fees are charged in [basis points](https://www.investopedia.com/terms/b/basispoint.asp) (1 bp = 0.01%) of notional and accrue to the protocol. Every state-changing handler takes a `minimum_*` / acceptable-price bound โ€” protection against [slippage](https://www.investopedia.com/terms/s/slippage.asp), the gap between the expected and actual fill โ€” and reverts if the bound is breached. Pass `0` to opt out. + +--- + +## Program Flow + +### Participants + +| Person | Role | Motivation | +|--------|------|-----------| +| **Admin** | Pool authority | Operate the market and collect the protocol's slice of trading fees. | +| **Carol** | Liquidity provider | Earn fees by funding the pool and being the counterparty to traders. | +| **Alice** | Long trader | She has a thesis that NVDA will rise and wants leveraged upside without buying the stock. | +| **Bob** | Short trader | He thinks NVDA will fall and wants to profit from the downside. | +| **Dave** | Liquidator | Runs a bot that closes under-margined positions to earn the liquidation fee. | + +Amounts below are shown in whole USDC; on-chain they are base units (ร— 10โถ). The pool is configured with 10ร— max leverage, 0.1% open/close fees, a 5% maintenance margin, a 1% liquidation fee, and a 1% maximum oracle confidence band. + +--- + +### Step 1 โ€” Admin opens the market + +**Instruction:** `initialize_pool(parameters)` + +**Accounts created:** + +| Account | Seeds / Derivation | What it stores | +|---------|--------------------|----------------| +| `Pool` [PDA](https://solana.com/docs/terminology#program-derived-address-pda) | `["pool", collateral_mint, oracle_feed]` | parameters, liquidity, reserved liquidity, collateral total, per-side open-interest accumulators, funding index, protocol fees | +| `pool_authority` PDA | `["authority", pool]` | nothing; signs vault and mint CPIs | +| `custody_vault` [token account](https://solana.com/docs/terminology#token-account) PDA | `["vault", pool]` | all USDC โ€” both provider liquidity and trader collateral | +| `lp_mint` PDA | `["lp_mint", pool]` | the share [mint](https://solana.com/docs/terminology#mint-account); `pool_authority` is the mint authority | + +--- + +### Step 2 โ€” Carol provides liquidity + +**Instruction:** `add_liquidity(amount = 100_000 USDC, minimum_shares_out)` + +**Accounts modified:** + +| Account | Change | +|---------|--------| +| `carol_usdc` | โˆ’100,000 USDC | +| `custody_vault` | +100,000 USDC | +| `lp_mint` โ†’ `carol_lp` (created) | mints โ‰ˆ100,000 shares to Carol | +| `Pool.liquidity` | 0 โ†’ 100,000 | + +The pool can now pay trader winnings, and Carol holds shares representing her slice of it. + +--- + +### Step 3 โ€” Alice opens a 5ร— long + +**Instruction:** `open_position(side = Long, collateral_amount = 1,000 USDC, size = 5,000 USDC, acceptable_price)` + +NVDAx is at $100. The 0.1% open fee ($5) comes out of her collateral, leaving $995 of net collateral backing the position. + +**Accounts modified:** + +| Account | Change | +|---------|--------| +| `Position` PDA `["position", pool, alice, Long]` (created) | side Long, collateral $995, size $5,000, entry price $100 | +| `alice_usdc` | โˆ’1,000 USDC | +| `custody_vault` | +1,000 USDC | +| `Pool.total_collateral` | +$995 | +| `Pool.protocol_fees` | +$5 | +| `Pool.reserved_liquidity` | +$5,000 (must stay โ‰ค liquidity) | +| `Pool` long open-interest accumulators | += this position | + +--- + +### Step 4 โ€” Bob opens a 5ร— short + +**Instruction:** `open_position(side = Short, collateral_amount = 1,000 USDC, size = 5,000 USDC, acceptable_price)` + +**Accounts modified:** a `Position` PDA `["position", pool, bob, Short]` is created; `custody_vault` +1,000 USDC; `Pool.total_collateral` +$995; `Pool.protocol_fees` +$5; `Pool.reserved_liquidity` +$5,000 (now $10,000 of the $100,000 reserved); short open-interest accumulators rise. + +While both are open, **funding** accrues to the pool from the heavier side; it is settled when each position closes. + +--- + +### Step 5 โ€” NVDA rises to $116. Alice closes in profit + +**Instruction:** `close_position(minimum_payout)` + +Her profit is `5,000 ร— (116 โˆ’ 100) / 100 = $800` (well under the $5,000 reserve cap), minus the $5 close fee. + +**Accounts modified:** + +| Account | Change | +|---------|--------| +| `Pool.liquidity` | โˆ’$800 (providers pay her profit) | +| `Pool.reserved_liquidity` | โˆ’$5,000 (reserve released) | +| `Pool.total_collateral` | โˆ’$995 | +| `Pool.protocol_fees` | +$5 | +| long open-interest accumulators | โˆ’= this position | +| `custody_vault` โ†’ `alice_usdc` | pays out $1,790 (net collateral + profit โˆ’ close fee) | +| `Position` (Alice) | closed; rent returned to Alice | + +--- + +### Step 6 โ€” Bob's short is underwater. Dave liquidates it + +**Instruction:** `liquidate_position()` + +At $116 Bob's short has lost $800; his equity ($995 โˆ’ $800 = $195) has fallen below the 5% maintenance margin ($250), so anyone may close it. + +**Accounts modified:** + +| Account | Change | +|---------|--------| +| short open-interest accumulators | โˆ’= Bob's position | +| `Pool.reserved_liquidity` | โˆ’$5,000 (reserve released) | +| `Pool.total_collateral` | โˆ’$995 | +| `Pool.liquidity` | +$800 (the loss accrues to providers) | +| `custody_vault` โ†’ `dave_usdc` (created) | $50 liquidation fee | +| `custody_vault` โ†’ `bob_usdc` | $145 remaining equity refunded | +| `Position` (Bob) | closed; rent returned to Bob | + +--- + +### Step 7 โ€” Admin collects the protocol's fees + +**Instruction:** `collect_fees()` + +**Accounts modified:** `Pool.protocol_fees` โ†’ 0; `custody_vault` pays that amount to `admin_usdc`. + +--- + +### Step 8 โ€” Carol withdraws + +**Instruction:** `remove_liquidity(shares, minimum_amount_out)` + +Carol burns her shares and redeems USDC. Her balance now reflects the fees the pool earned plus the net of traders' wins and losses while she was in. She can withdraw only the *free* liquidity โ€” while a position is open, the part backing it is reserved and cannot be pulled out. + +**Accounts modified:** `lp_mint` burns Carol's shares; `Pool.liquidity` falls; `custody_vault` pays out USDC to `carol_usdc`. + +--- + +## Design notes and further reading + +The genuinely hard part of a perpetual-futures venue is keeping it solvent and permissionless *without* re-evaluating the entire market on every action. For a rigorous, formally-verified (Kani) treatment, see Anatoly Yakovenko's [percolator](https://github.com/aeyakovenko/percolator), an educational perp risk engine. It states three invariants this example also leans on, in simplified form: + +- **Realizable credit** โ€” "protected principal is senior, positive PnL is junior, and source-domain positive credit cannot exceed realizable backing reserved for that domain." Here, provider capital is senior and trader profit is a junior claim against it: shares are priced against marked assets-under-management, and the pool reserves each position's payout up front (capping recoverable profit at the reserve) so a winner's price profit can always be paid. +- **Account-local safety** โ€” "every favorable action refreshes the account's full active portfolio first; โ€ฆ stale โ€ฆ legs fail closed." Here, every position and liquidity action reads a fresh oracle (stale or wide-confidence prices are rejected) and recomputes pool exposure before any payout. +- **Bounded progress** โ€” "no public instruction needs to evaluate the whole market." Here, assets-under-management comes from running per-side accumulators, and liquidation acts on one position at a time, so no handler's cost grows with the number of open positions. + +What production pool-perps (`solana-labs/perpetuals`) add that this example still leaves out: multi-asset custody with reserves in the payout token, utilization-based borrow fees, auto-deleveraging (ADL) and an insurance fund for the bad-debt tail, and using the oracle's EMA for a less manipulable mark. + +--- + +## Limitations + +This is a teaching example, not an audited exchange. Notably: + +- A single position per side per trader, and one collateral token per pool. +- Recoverable profit is capped at the reserved notional, so the cap binds on a more-than-doubling move; a production venue would let profit run and absorb extreme moves with ADL, an insurance fund, and bankruptcy-residual accounting. +- The liquidation reward is paid from the position's remaining equity, so a position that gaps straight through zero equity pays the liquidator nothing โ€” production venues fund the reward from collateral or an insurance fund so the worst positions are still worth liquidating. +- Funding is a single time-decay index on the heavier side rather than a skew-weighted rate. + +--- + +## Testing + +The tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) and [solana-kite](https://solanakite.org); no local validator is needed. They deploy both programs, drive the mock oracle, and cover liquidity round-trips, opening and closing longs and shorts in profit and loss, leverage and slippage rejection, stale-price and wide-confidence rejection, funding accrual, liquidation (and the refusal to liquidate a healthy position), reserved-liquidity behaviour (profit capped at the reserve, opens rejected when the pool can't back them, withdrawals blocked by reserved liquidity), and fee collection. + +```bash +anchor build +cargo test --manifest-path programs/perpetual-futures/Cargo.toml +``` + +`anchor build` first, so the LiteSVM tests can load each program's compiled `.so` via `include_bytes!`. diff --git a/finance/perpetual-futures/anchor/TERMINOLOGY.md b/finance/perpetual-futures/anchor/TERMINOLOGY.md new file mode 100644 index 00000000..9ef81ba1 --- /dev/null +++ b/finance/perpetual-futures/anchor/TERMINOLOGY.md @@ -0,0 +1,36 @@ +# Perpetual Futures Terminology + +Terms used in this example, in the sense they carry here. + +- **Perpetual future (perp)** โ€” a leveraged derivative position with no expiry + and no settlement date. Profit and loss is paid in the collateral token as the + oracle price moves. +- **Long / short** โ€” a long profits when the price rises, a short when it falls. + Each is the opposite side of the pool's exposure. +- **Collateral** โ€” the token a trader posts to back a position, and the token + liquidity providers deposit. One pool uses one collateral token. +- **Notional size** โ€” the position's exposure in collateral units. Profit and + loss scales with the notional, not with the collateral posted. +- **Leverage** โ€” notional size divided by collateral. A pool caps it at + `max_leverage`. +- **Equity** โ€” a position's current worth: net collateral plus unrealized profit + and loss, minus accrued funding. When equity falls to the maintenance margin, + the position is liquidatable. +- **Maintenance margin** โ€” the minimum equity, as a fraction of notional size, + a position must keep to avoid liquidation. +- **Liquidation** โ€” closing an under-margined position. Permissionless here: any + caller can trigger it and earns the liquidation fee. +- **Funding** โ€” a periodic payment that anchors the pool's risk. The heavier + side of open interest pays funding to the pool over time. +- **Open interest** โ€” the total notional size currently open on a side. +- **Liquidity provider** โ€” a depositor who funds the pool and is the counterparty + to every trade, earning fees in exchange for taking the other side of trader + profit and loss. +- **Assets-under-management** โ€” the marked value of liquidity-provider holdings: + pool liquidity minus the aggregate unrealized profit traders are owed. +- **Liquidity-provider share** โ€” a token representing a pro-rata claim on + assets-under-management. +- **Oracle feed** โ€” the account the pool reads its price from. This example uses + a mock Switchboard On-Demand feed; production points at a real one. +- **Mark price** โ€” the price positions are valued at. Here it is the oracle + price directly, with no separate mark/index distinction. diff --git a/finance/perpetual-futures/anchor/programs/mock-switchboard/Cargo.toml b/finance/perpetual-futures/anchor/programs/mock-switchboard/Cargo.toml new file mode 100644 index 00000000..6c23f709 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/mock-switchboard/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "mock_switchboard" +version = "0.1.0" +description = "Mock Switchboard On-Demand feed for testing the perpetual-futures program" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "mock_switchboard" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.0.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/perpetual-futures/anchor/programs/mock-switchboard/src/lib.rs b/finance/perpetual-futures/anchor/programs/mock-switchboard/src/lib.rs new file mode 100644 index 00000000..2a3f7923 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/mock-switchboard/src/lib.rs @@ -0,0 +1,105 @@ +//! Mock Switchboard On-Demand feed for testing the perpetual-futures program. +//! +//! Real Switchboard On-Demand feeds are program-owned accounts whose data is +//! produced by an offchain oracle network and verified onchain via Ed25519 +//! signatures over the latest price update. That verification path is +//! out-of-scope for this teaching example, so this mock stores a single price +//! the test harness writes directly, plus the slot the update happened in. +//! +//! The perpetual-futures program reads this feed the same way it would read a +//! real feed: load the account, decode the layout, read `price`, `scale`, and +//! `last_update_slot` (see `perpetual_futures::state::oracle`). Swap this +//! program ID for `SBondMDrcV3K4kxZR1HNVT7osZxAHVHgYXL5Ze1oMUv` (Switchboard +//! On-Demand) and adapt the layout to consume real feeds in production. +//! +//! NOT FOR PRODUCTION. +use anchor_lang::prelude::*; + +declare_id!("FnisQqhF56BxVYh5Wt8xW8wuTVN6STAGnk13MM5SRM7b"); + +#[program] +pub mod mock_switchboard { + use super::*; + + /// Initialize the mock feed with an initial price. The signer becomes the + /// authority allowed to push later price updates. + pub fn initialize_feed( + context: Context, + price: i128, + scale: u32, + confidence: u64, + ) -> Result<()> { + let feed = &mut context.accounts.feed; + feed.authority = context.accounts.authority.key(); + feed.price = price; + feed.scale = scale; + feed.last_update_slot = Clock::get()?.slot; + feed.confidence = confidence; + Ok(()) + } + + /// Push a new price (and confidence band) to the mock feed. In real + /// Switchboard this would be a signed update from the oracle network; here it + /// is an authority-gated write, because the goal is to drive deterministic + /// test scenarios. + pub fn set_price( + context: Context, + price: i128, + confidence: u64, + ) -> Result<()> { + let feed = &mut context.accounts.feed; + feed.price = price; + feed.last_update_slot = Clock::get()?.slot; + feed.confidence = confidence; + Ok(()) + } +} + +#[derive(Accounts)] +pub struct InitializeFeedAccountConstraints<'info> { + #[account( + init, + payer = authority, + space = MockFeed::DISCRIMINATOR.len() + MockFeed::INIT_SPACE, + )] + pub feed: Account<'info, MockFeed>, + + #[account(mut)] + pub authority: Signer<'info>, + + pub system_program: Program<'info, System>, +} + +#[derive(Accounts)] +pub struct SetPriceAccountConstraints<'info> { + #[account( + mut, + has_one = authority, + )] + pub feed: Account<'info, MockFeed>, + + pub authority: Signer<'info>, +} + +/// Mock of a Switchboard On-Demand feed. Real feeds carry many more fields +/// (median, range, sample window, signatures) โ€” this is the bare minimum the +/// perpetual-futures program needs to do a price comparison. +#[derive(InitSpace)] +#[account] +pub struct MockFeed { + pub authority: Pubkey, + + /// Signed 128-bit fixed-point price. Real Switchboard prices are also i128. + pub price: i128, + + /// Number of decimal places implied by `price`. E.g. `scale = 8` means + /// `price = 200 * 10^8` represents $200.00000000. + pub scale: u32, + + pub last_update_slot: u64, + + /// Uncertainty band around `price`, in the same fixed point. Real feeds + /// report a standard-deviation-like confidence; consumers reject the price + /// when this is too wide relative to `price`. + pub confidence: u64, +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/Cargo.toml b/finance/perpetual-futures/anchor/programs/perpetual-futures/Cargo.toml new file mode 100644 index 00000000..0e134c18 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "perpetual_futures" +version = "0.1.0" +description = "Oracle-priced, LP-pool perpetual futures example (Jupiter Perps / GMX-style)" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "perpetual_futures" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +# init-if-needed lets add_liquidity create the provider's liquidity-provider +# token account on their first deposit. The provider is the payer, so this does +# not let one party fund another's rent. +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = "1.0.0" +# Not used directly. Declared so Cargo feature unification turns on +# `no-entrypoint` for the spl-token that anchor-spl pulls in; without it the +# integration-test binary links two `entrypoint` symbols (this program's and +# spl-token's) and fails. +spl-token = { version = "9.0.0", features = ["no-entrypoint"] } +spl-associated-token-account = { version = "8.0.0", features = ["no-entrypoint"] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" +borsh = "1.6.1" +# The LiteSVM tests load the compiled mock oracle program; depending on the +# crate here lets the tests reuse its instruction-argument types and program ID. +mock_switchboard = { path = "../mock-switchboard", features = ["no-entrypoint"] } + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/constants.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/constants.rs new file mode 100644 index 00000000..3bf65d18 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/constants.rs @@ -0,0 +1,50 @@ +use anchor_lang::prelude::*; + +/// Basis-point denominator: 100% = 10_000 bps. All fee and margin parameters are +/// expressed in basis points and divided by this. +#[constant] +pub const BASIS_POINTS_DENOMINATOR: u64 = 10_000; + +/// Fixed-point precision for the cumulative funding index. The index is carried +/// as `i128` scaled by this factor so per-slot funding (a tiny ratio) keeps its +/// precision when integrated over many slots. +pub const FUNDING_PRECISION: i128 = 1_000_000_000; + +/// Fixed-point precision for the aggregate `size / entry_price` accumulators the +/// pool keeps per side. Lets mark-to-market assets-under-management be computed +/// from two running sums instead of iterating every open position. +pub const SIZE_PRECISION: u128 = 1_000_000_000; + +/// Liquidity-provider shares withheld from the first deposit. The first +/// depositor receives `deposit - MINIMUM_LIQUIDITY` shares rather than the full +/// amount, the same convention Uniswap V2 uses, so the share supply can never be +/// driven to a dust amount that rounding could exploit. (Share value here is +/// priced off tracked liquidity, not the vault token balance, so a direct +/// donation to the vault cannot move it.) +#[constant] +pub const MINIMUM_LIQUIDITY: u64 = 1_000; + +/// Reject an oracle price older than this many slots. Slot count is what the +/// runtime guarantees; unix timestamps are validator-influenced. ~150 slots is +/// roughly one minute at 400ms/slot. +pub const MAX_PRICE_STALENESS_SLOTS: u64 = 150; + +/// Upper bound on the per-pool `max_leverage` parameter, so a pool cannot be +/// configured with an absurd leverage that makes every position instantly +/// liquidatable on the smallest price move. +pub const MAX_LEVERAGE_CEILING: u16 = 100; + +#[constant] +pub const POOL_SEED: &[u8] = b"pool"; + +#[constant] +pub const AUTHORITY_SEED: &[u8] = b"authority"; + +#[constant] +pub const LP_MINT_SEED: &[u8] = b"lp_mint"; + +#[constant] +pub const VAULT_SEED: &[u8] = b"vault"; + +#[constant] +pub const POSITION_SEED: &[u8] = b"position"; diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/errors.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/errors.rs new file mode 100644 index 00000000..442e93f8 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/errors.rs @@ -0,0 +1,58 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum PerpError { + #[msg("Amount must be greater than zero")] + ZeroAmount, + + #[msg("First deposit must exceed the locked minimum liquidity")] + DepositTooSmall, + + #[msg("Computed share or token amount rounded down to zero")] + AmountRoundsToZero, + + #[msg("Arithmetic overflow")] + MathOverflow, + + #[msg("Requested leverage exceeds the pool maximum")] + LeverageTooHigh, + + #[msg("Pool parameter is outside the allowed range")] + InvalidParameter, + + #[msg("Oracle price has not been updated recently enough")] + StalePrice, + + #[msg("Oracle price must be positive")] + NonPositivePrice, + + #[msg("Oracle feed scale does not match the pool configuration")] + OracleScaleMismatch, + + #[msg("Oracle feed account data is too short to decode")] + OracleDataTooShort, + + #[msg("Oracle price confidence band is too wide to trust")] + OracleConfidenceTooWide, + + #[msg("Fill price is worse than the caller's acceptable price")] + SlippageExceeded, + + #[msg("Pool does not have enough free liquidity to satisfy this request")] + InsufficientLiquidity, + + #[msg("Posted collateral does not cover the open fee")] + InsufficientCollateral, + + #[msg("Pool is insolvent: liabilities exceed assets")] + PoolInsolvent, + + #[msg("Position is still healthy and cannot be liquidated")] + PositionHealthy, + + #[msg("Position equity is below maintenance margin; it must be liquidated, not closed")] + PositionNotHealthy, + + #[msg("No protocol fees are available to collect")] + NothingToClaim, +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/add_liquidity.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/add_liquidity.rs new file mode 100644 index 00000000..5b174f7e --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/add_liquidity.rs @@ -0,0 +1,144 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{ + mint_to, transfer_checked, Mint, MintTo, TokenAccount, TokenInterface, TransferChecked, + }, +}; + +use crate::constants::{AUTHORITY_SEED, MINIMUM_LIQUIDITY, POOL_SEED, VAULT_SEED}; +use crate::errors::PerpError; +use crate::instructions::shared::{liquidity_provider_aum, refresh_price_and_funding}; +use crate::state::Pool; + +pub fn handle_add_liquidity( + context: Context, + amount: u64, + minimum_shares_out: u64, +) -> Result<()> { + require!(amount > 0, PerpError::ZeroAmount); + + let pool = &mut context.accounts.pool; + let price = refresh_price_and_funding(pool, &context.accounts.oracle_feed)?; + + let lp_supply = context.accounts.lp_mint.supply; + let shares: u64 = if lp_supply == 0 { + // Bootstrap: shares track collateral one-for-one, less the withheld + // minimum, so the share supply can never start at a dust amount. + amount + .checked_sub(MINIMUM_LIQUIDITY) + .ok_or(PerpError::DepositTooSmall)? + } else { + // shares = amount * supply / assets-under-management, floored so the + // depositor never receives more than their pro-rata claim. + let aum = liquidity_provider_aum(pool, price)?; + require!(aum > 0, PerpError::PoolInsolvent); + (amount as u128) + .checked_mul(lp_supply as u128) + .ok_or(PerpError::MathOverflow)? + .checked_div(aum as u128) + .ok_or(PerpError::MathOverflow)? + .try_into() + .map_err(|_| PerpError::MathOverflow)? + }; + + require!(shares > 0, PerpError::AmountRoundsToZero); + require!(shares >= minimum_shares_out, PerpError::SlippageExceeded); + + // Effects before interactions: record the new liquidity, then move tokens. + pool.liquidity = pool + .liquidity + .checked_add(amount) + .ok_or(PerpError::MathOverflow)?; + + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.provider_collateral.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.custody_vault.to_account_info(), + authority: context.accounts.provider.to_account_info(), + }, + ), + amount, + context.accounts.collateral_mint.decimals, + )?; + + let pool_key = pool.key(); + let authority_seeds: &[&[u8]] = &[AUTHORITY_SEED, pool_key.as_ref(), &[pool.authority_bump]]; + mint_to( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + MintTo { + mint: context.accounts.lp_mint.to_account_info(), + to: context.accounts.provider_lp.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + &[authority_seeds], + ), + shares, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct AddLiquidityAccountConstraints<'info> { + #[account(mut)] + pub provider: Signer<'info>, + + #[account( + mut, + seeds = [POOL_SEED, pool.collateral_mint.as_ref(), pool.oracle_feed.as_ref()], + bump = pool.bump, + has_one = collateral_mint, + has_one = lp_mint, + has_one = custody_vault, + has_one = oracle_feed, + )] + pub pool: Box>, + + /// CHECK: PDA authority over the vault and liquidity-provider mint. + #[account( + seeds = [AUTHORITY_SEED, pool.key().as_ref()], + bump = pool.authority_bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + /// CHECK: validated by the `has_one = oracle_feed` constraint on the pool. + pub oracle_feed: UncheckedAccount<'info>, + + pub collateral_mint: Box>, + + #[account(mut)] + pub lp_mint: Box>, + + #[account( + mut, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + )] + pub custody_vault: Box>, + + #[account( + mut, + associated_token::mint = collateral_mint, + associated_token::authority = provider, + associated_token::token_program = token_program, + )] + pub provider_collateral: Box>, + + #[account( + init_if_needed, + payer = provider, + associated_token::mint = lp_mint, + associated_token::authority = provider, + associated_token::token_program = token_program, + )] + pub provider_lp: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/close_position.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/close_position.rs new file mode 100644 index 00000000..fd50ea00 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/close_position.rs @@ -0,0 +1,144 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked}, +}; + +use crate::constants::{AUTHORITY_SEED, POOL_SEED, POSITION_SEED, VAULT_SEED}; +use crate::errors::PerpError; +use crate::instructions::shared::{basis_points_of, refresh_price_and_funding, settle_position}; +use crate::state::{Pool, Position}; + +pub fn handle_close_position( + context: Context, + minimum_payout: u64, +) -> Result<()> { + let pool = &mut context.accounts.pool; + let price = refresh_price_and_funding(pool, &context.accounts.oracle_feed)?; + + let position = &context.accounts.position; + let position_size = position.size; + let settlement = settle_position(pool, position, price)?; + let close_fee = basis_points_of(position_size, pool.close_fee_bps)?; + + // Recoverable profit is capped at the reserved amount (the position's + // notional `size`), so the pool can always cover a winner. Losses are not + // capped. + let realized_pnl = settlement.profit_and_loss.min(position_size as i128); + let equity = settlement + .equity + .checked_sub(settlement.profit_and_loss) + .ok_or(PerpError::MathOverflow)? + .checked_add(realized_pnl) + .ok_or(PerpError::MathOverflow)?; + + // The trader receives their equity minus the close fee. A non-positive + // payout means the position is underwater and must go through liquidation, + // not a voluntary close. + let payout = equity + .checked_sub(close_fee as i128) + .ok_or(PerpError::MathOverflow)?; + require!(payout > 0, PerpError::PositionNotHealthy); + let payout: u64 = payout.try_into().map_err(|_| PerpError::MathOverflow)?; + require!(payout >= minimum_payout, PerpError::SlippageExceeded); + + // Release the position's reserved liquidity now that it is closing. + pool.reserved_liquidity = pool + .reserved_liquidity + .checked_sub(position_size) + .ok_or(PerpError::MathOverflow)?; + + // Liquidity providers are the counterparty: they pay the trader's (capped) + // profit and receive their loss, and collect the funding the trader owed. + let liquidity_delta = settlement + .funding + .checked_sub(realized_pnl) + .ok_or(PerpError::MathOverflow)?; + let new_liquidity = (pool.liquidity as i128) + .checked_add(liquidity_delta) + .ok_or(PerpError::MathOverflow)?; + require!(new_liquidity >= 0, PerpError::PoolInsolvent); + pool.liquidity = new_liquidity + .try_into() + .map_err(|_| PerpError::MathOverflow)?; + pool.protocol_fees = pool + .protocol_fees + .checked_add(close_fee) + .ok_or(PerpError::MathOverflow)?; + + let pool_key = pool.key(); + let authority_seeds: &[&[u8]] = &[AUTHORITY_SEED, pool_key.as_ref(), &[pool.authority_bump]]; + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.custody_vault.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.trader_collateral.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + &[authority_seeds], + ), + payout, + context.accounts.collateral_mint.decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct ClosePositionAccountConstraints<'info> { + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + mut, + seeds = [POOL_SEED, pool.collateral_mint.as_ref(), pool.oracle_feed.as_ref()], + bump = pool.bump, + has_one = collateral_mint, + has_one = custody_vault, + has_one = oracle_feed, + )] + pub pool: Box>, + + #[account( + mut, + close = owner, + seeds = [POSITION_SEED, pool.key().as_ref(), owner.key().as_ref(), position.side.as_seed()], + bump = position.bump, + has_one = owner, + has_one = pool, + )] + pub position: Box>, + + /// CHECK: PDA authority over the vault. + #[account( + seeds = [AUTHORITY_SEED, pool.key().as_ref()], + bump = pool.authority_bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + /// CHECK: validated by the `has_one = oracle_feed` constraint on the pool. + pub oracle_feed: UncheckedAccount<'info>, + + pub collateral_mint: Box>, + + #[account( + mut, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + )] + pub custody_vault: Box>, + + #[account( + mut, + associated_token::mint = collateral_mint, + associated_token::authority = owner, + associated_token::token_program = token_program, + )] + pub trader_collateral: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/collect_fees.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/collect_fees.rs new file mode 100644 index 00000000..e97c6885 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/collect_fees.rs @@ -0,0 +1,82 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked}, +}; + +use crate::constants::{AUTHORITY_SEED, POOL_SEED, VAULT_SEED}; +use crate::errors::PerpError; +use crate::state::Pool; + +pub fn handle_collect_fees(context: Context) -> Result<()> { + let pool = &mut context.accounts.pool; + let amount = pool.protocol_fees; + require!(amount > 0, PerpError::NothingToClaim); + + // Effects before interaction: zero the balance, then transfer. + pool.protocol_fees = 0; + + let pool_key = pool.key(); + let authority_seeds: &[&[u8]] = &[AUTHORITY_SEED, pool_key.as_ref(), &[pool.authority_bump]]; + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.custody_vault.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.authority_collateral.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + &[authority_seeds], + ), + amount, + context.accounts.collateral_mint.decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct CollectFeesAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + mut, + seeds = [POOL_SEED, pool.collateral_mint.as_ref(), pool.oracle_feed.as_ref()], + bump = pool.bump, + has_one = authority, + has_one = collateral_mint, + has_one = custody_vault, + )] + pub pool: Box>, + + /// CHECK: PDA authority over the vault. + #[account( + seeds = [AUTHORITY_SEED, pool.key().as_ref()], + bump = pool.authority_bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + pub collateral_mint: Box>, + + #[account( + mut, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + )] + pub custody_vault: Box>, + + #[account( + init_if_needed, + payer = authority, + associated_token::mint = collateral_mint, + associated_token::authority = authority, + associated_token::token_program = token_program, + )] + pub authority_collateral: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/initialize_pool.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/initialize_pool.rs new file mode 100644 index 00000000..3699414c --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/initialize_pool.rs @@ -0,0 +1,162 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::constants::{ + AUTHORITY_SEED, BASIS_POINTS_DENOMINATOR, LP_MINT_SEED, MAX_LEVERAGE_CEILING, POOL_SEED, + VAULT_SEED, +}; +use crate::errors::PerpError; +use crate::state::Pool; + +/// Trading parameters set once at pool creation. Bundled into one struct so the +/// instruction signature stays readable. +#[derive(AnchorSerialize, AnchorDeserialize, Clone)] +pub struct PoolParameters { + /// Decimal places the oracle quotes its price in (e.g. 8). + pub oracle_scale: u32, + + /// Funding accrued per slot, in `FUNDING_PRECISION` units, charged to the + /// heavier side. + pub funding_rate_per_slot: u64, + + pub open_fee_bps: u16, + pub close_fee_bps: u16, + pub max_leverage: u16, + pub maintenance_margin_bps: u16, + pub liquidation_fee_bps: u16, + + /// Maximum oracle confidence band tolerated, in basis points of the price. + pub max_confidence_bps: u16, +} + +pub fn handle_initialize_pool( + context: Context, + parameters: PoolParameters, +) -> Result<()> { + let denominator = BASIS_POINTS_DENOMINATOR as u16; + require!( + parameters.max_leverage >= 1 && parameters.max_leverage <= MAX_LEVERAGE_CEILING, + PerpError::InvalidParameter + ); + require!( + parameters.open_fee_bps < denominator, + PerpError::InvalidParameter + ); + require!( + parameters.close_fee_bps < denominator, + PerpError::InvalidParameter + ); + require!( + parameters.liquidation_fee_bps < denominator, + PerpError::InvalidParameter + ); + // Maintenance margin must leave room above zero and below full notional; + // a position is liquidatable once equity drops to this fraction of size. + require!( + parameters.maintenance_margin_bps > 0 && parameters.maintenance_margin_bps < denominator, + PerpError::InvalidParameter + ); + // close_position deducts the close fee from equity and refuses a + // non-positive payout, while liquidation only acts at or below the + // maintenance margin. The margin must therefore exceed the close fee, or a + // position could be stranded in between: too healthy to liquidate, too poor + // to pay the fee to close. + require!( + parameters.maintenance_margin_bps > parameters.close_fee_bps, + PerpError::InvalidParameter + ); + // Zero would reject every real feed (which always reports some uncertainty); + // above 100% is meaningless. Anything in between is a valid risk choice. + require!( + parameters.max_confidence_bps > 0 && parameters.max_confidence_bps < denominator, + PerpError::InvalidParameter + ); + + let pool = &mut context.accounts.pool; + pool.authority = context.accounts.authority.key(); + pool.collateral_mint = context.accounts.collateral_mint.key(); + pool.oracle_feed = context.accounts.oracle_feed.key(); + pool.oracle_scale = parameters.oracle_scale; + pool.custody_vault = context.accounts.custody_vault.key(); + pool.lp_mint = context.accounts.lp_mint.key(); + pool.liquidity = 0; + pool.reserved_liquidity = 0; + pool.total_collateral = 0; + pool.protocol_fees = 0; + pool.long_size = 0; + pool.short_size = 0; + pool.long_size_scaled = 0; + pool.short_size_scaled = 0; + pool.cumulative_funding = 0; + pool.last_funding_slot = Clock::get()?.slot; + pool.funding_rate_per_slot = parameters.funding_rate_per_slot; + pool.open_fee_bps = parameters.open_fee_bps; + pool.close_fee_bps = parameters.close_fee_bps; + pool.max_leverage = parameters.max_leverage; + pool.maintenance_margin_bps = parameters.maintenance_margin_bps; + pool.liquidation_fee_bps = parameters.liquidation_fee_bps; + pool.max_confidence_bps = parameters.max_confidence_bps; + pool.bump = context.bumps.pool; + pool.authority_bump = context.bumps.pool_authority; + + Ok(()) +} + +#[derive(Accounts)] +pub struct InitializePoolAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + init, + payer = authority, + space = Pool::DISCRIMINATOR.len() + Pool::INIT_SPACE, + seeds = [POOL_SEED, collateral_mint.key().as_ref(), oracle_feed.key().as_ref()], + bump, + )] + pub pool: Box>, + + pub collateral_mint: Box>, + + /// CHECK: The oracle feed account. Its key is stored on the pool and every + /// read validates the layout, scale, and freshness; it is never trusted by + /// type. Swap for a real Switchboard feed in production. + pub oracle_feed: UncheckedAccount<'info>, + + /// CHECK: PDA that owns the vault and the liquidity-provider mint. Holds no + /// data; used only to sign vault and mint CPIs. + #[account( + seeds = [AUTHORITY_SEED, pool.key().as_ref()], + bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + #[account( + init, + payer = authority, + seeds = [LP_MINT_SEED, pool.key().as_ref()], + bump, + mint::decimals = collateral_mint.decimals, + mint::authority = pool_authority, + mint::token_program = token_program, + )] + pub lp_mint: Box>, + + #[account( + init, + payer = authority, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + token::mint = collateral_mint, + token::authority = pool_authority, + token::token_program = token_program, + )] + pub custody_vault: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/liquidate_position.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/liquidate_position.rs new file mode 100644 index 00000000..26c87d25 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/liquidate_position.rs @@ -0,0 +1,172 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked}, +}; + +use crate::constants::{AUTHORITY_SEED, POOL_SEED, POSITION_SEED, VAULT_SEED}; +use crate::errors::PerpError; +use crate::instructions::shared::{basis_points_of, refresh_price_and_funding, settle_position}; +use crate::state::{Pool, Position}; + +pub fn handle_liquidate_position( + context: Context, +) -> Result<()> { + let pool = &mut context.accounts.pool; + let price = refresh_price_and_funding(pool, &context.accounts.oracle_feed)?; + + let position = &context.accounts.position; + let position_size = position.size; + let settlement = settle_position(pool, position, price)?; + + // Release the position's reserved liquidity now that it is closing. + pool.reserved_liquidity = pool + .reserved_liquidity + .checked_sub(position_size) + .ok_or(PerpError::MathOverflow)?; + + // Liquidatable only once equity has fallen to or below the maintenance + // margin. A healthy position can only be closed by its owner. + let maintenance = basis_points_of(position_size, pool.maintenance_margin_bps)?; + require!( + settlement.equity <= maintenance as i128, + PerpError::PositionHealthy + ); + + // The liquidator's reward comes out of whatever equity remains, capped so a + // position already past zero equity cannot pay out more than it has. + let remaining_equity: u64 = settlement + .equity + .max(0) + .try_into() + .map_err(|_| PerpError::MathOverflow)?; + let liquidation_fee = basis_points_of(position.size, pool.liquidation_fee_bps)?; + let liquidator_payout = liquidation_fee.min(remaining_equity); + let trader_refund = remaining_equity + .checked_sub(liquidator_payout) + .ok_or(PerpError::MathOverflow)?; + + // Everything the trader does not get back stays with the liquidity + // providers. Derived from vault conservation: the pool keeps the position's + // collateral minus whatever is paid out as equity. + let liquidity_delta = (position.collateral as i128) + .checked_sub(remaining_equity as i128) + .ok_or(PerpError::MathOverflow)?; + let new_liquidity = (pool.liquidity as i128) + .checked_add(liquidity_delta) + .ok_or(PerpError::MathOverflow)?; + require!(new_liquidity >= 0, PerpError::PoolInsolvent); + pool.liquidity = new_liquidity + .try_into() + .map_err(|_| PerpError::MathOverflow)?; + + let pool_key = pool.key(); + let authority_seeds: &[&[u8]] = &[AUTHORITY_SEED, pool_key.as_ref(), &[pool.authority_bump]]; + + if liquidator_payout > 0 { + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.custody_vault.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.liquidator_collateral.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + &[authority_seeds], + ), + liquidator_payout, + context.accounts.collateral_mint.decimals, + )?; + } + + if trader_refund > 0 { + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.custody_vault.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.trader_collateral.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + &[authority_seeds], + ), + trader_refund, + context.accounts.collateral_mint.decimals, + )?; + } + + Ok(()) +} + +#[derive(Accounts)] +pub struct LiquidatePositionAccountConstraints<'info> { + #[account(mut)] + pub liquidator: Signer<'info>, + + /// CHECK: the position owner, validated by the position's `has_one = owner`. + /// Receives the position account's rent and any equity refund. + #[account(mut)] + pub owner: UncheckedAccount<'info>, + + #[account( + mut, + seeds = [POOL_SEED, pool.collateral_mint.as_ref(), pool.oracle_feed.as_ref()], + bump = pool.bump, + has_one = collateral_mint, + has_one = custody_vault, + has_one = oracle_feed, + )] + pub pool: Box>, + + #[account( + mut, + close = owner, + seeds = [POSITION_SEED, pool.key().as_ref(), owner.key().as_ref(), position.side.as_seed()], + bump = position.bump, + has_one = owner, + has_one = pool, + )] + pub position: Box>, + + /// CHECK: PDA authority over the vault. + #[account( + seeds = [AUTHORITY_SEED, pool.key().as_ref()], + bump = pool.authority_bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + /// CHECK: validated by the `has_one = oracle_feed` constraint on the pool. + pub oracle_feed: UncheckedAccount<'info>, + + pub collateral_mint: Box>, + + #[account( + mut, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + )] + pub custody_vault: Box>, + + #[account( + mut, + associated_token::mint = collateral_mint, + associated_token::authority = owner, + associated_token::token_program = token_program, + )] + pub trader_collateral: Box>, + + #[account( + init_if_needed, + payer = liquidator, + associated_token::mint = collateral_mint, + associated_token::authority = liquidator, + associated_token::token_program = token_program, + )] + pub liquidator_collateral: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/mod.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/mod.rs new file mode 100644 index 00000000..88337e1d --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/mod.rs @@ -0,0 +1,16 @@ +pub mod add_liquidity; +pub mod close_position; +pub mod collect_fees; +pub mod initialize_pool; +pub mod liquidate_position; +pub mod open_position; +pub mod remove_liquidity; +pub mod shared; + +pub use add_liquidity::*; +pub use close_position::*; +pub use collect_fees::*; +pub use initialize_pool::*; +pub use liquidate_position::*; +pub use open_position::*; +pub use remove_liquidity::*; diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/open_position.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/open_position.rs new file mode 100644 index 00000000..8c3ec8dc --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/open_position.rs @@ -0,0 +1,176 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked}, +}; + +use crate::constants::{POOL_SEED, POSITION_SEED, VAULT_SEED}; +use crate::errors::PerpError; +use crate::instructions::shared::{basis_points_of, refresh_price_and_funding, scale_size}; +use crate::state::{Pool, Position, Side}; + +pub fn handle_open_position( + context: Context, + side: Side, + collateral_amount: u64, + size: u64, + acceptable_price: u64, +) -> Result<()> { + require!(collateral_amount > 0 && size > 0, PerpError::ZeroAmount); + + let pool = &mut context.accounts.pool; + let price = refresh_price_and_funding(pool, &context.accounts.oracle_feed)?; + + // Slippage: a long must not fill above the caller's limit, a short not + // below it. `0` opts out. + if acceptable_price != 0 { + let acceptable = match side { + Side::Long => price <= acceptable_price, + Side::Short => price >= acceptable_price, + }; + require!(acceptable, PerpError::SlippageExceeded); + } + + // The open fee is taken out of the posted collateral; the rest backs the + // position. Leverage and margin are measured against this net collateral. + let open_fee = basis_points_of(size, pool.open_fee_bps)?; + let net_collateral = collateral_amount + .checked_sub(open_fee) + .ok_or(PerpError::InsufficientCollateral)?; + require!(net_collateral > 0, PerpError::ZeroAmount); + + let max_notional = (net_collateral as u128) + .checked_mul(pool.max_leverage as u128) + .ok_or(PerpError::MathOverflow)?; + require!(size as u128 <= max_notional, PerpError::LeverageTooHigh); + + // Refuse a position that would open already inside the liquidation band. + let maintenance = basis_points_of(size, pool.maintenance_margin_bps)?; + require!(net_collateral > maintenance, PerpError::PositionNotHealthy); + + // Reserve liquidity to cover this position's maximum recoverable profit + // (its notional `size`). The reserve must be backed by liquidity-provider + // capital, which also caps total open interest at the pool's liquidity. + let new_reserved = pool + .reserved_liquidity + .checked_add(size) + .ok_or(PerpError::MathOverflow)?; + require!( + new_reserved <= pool.liquidity, + PerpError::InsufficientLiquidity + ); + pool.reserved_liquidity = new_reserved; + + let size_scaled = scale_size(size, price)?; + + // Effects: record the position and the pool's new aggregates before moving + // any tokens. + let position = &mut context.accounts.position; + position.owner = context.accounts.owner.key(); + position.pool = pool.key(); + position.side = side; + position.collateral = net_collateral; + position.size = size; + position.entry_price = price; + position.size_scaled = size_scaled; + position.entry_funding = pool.cumulative_funding; + position.bump = context.bumps.position; + + pool.total_collateral = pool + .total_collateral + .checked_add(net_collateral) + .ok_or(PerpError::MathOverflow)?; + pool.protocol_fees = pool + .protocol_fees + .checked_add(open_fee) + .ok_or(PerpError::MathOverflow)?; + + match side { + Side::Long => { + pool.long_size = pool + .long_size + .checked_add(size as u128) + .ok_or(PerpError::MathOverflow)?; + pool.long_size_scaled = pool + .long_size_scaled + .checked_add(size_scaled) + .ok_or(PerpError::MathOverflow)?; + } + Side::Short => { + pool.short_size = pool + .short_size + .checked_add(size as u128) + .ok_or(PerpError::MathOverflow)?; + pool.short_size_scaled = pool + .short_size_scaled + .checked_add(size_scaled) + .ok_or(PerpError::MathOverflow)?; + } + } + + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.trader_collateral.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.custody_vault.to_account_info(), + authority: context.accounts.owner.to_account_info(), + }, + ), + collateral_amount, + context.accounts.collateral_mint.decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +#[instruction(side: Side)] +pub struct OpenPositionAccountConstraints<'info> { + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + mut, + seeds = [POOL_SEED, pool.collateral_mint.as_ref(), pool.oracle_feed.as_ref()], + bump = pool.bump, + has_one = collateral_mint, + has_one = custody_vault, + has_one = oracle_feed, + )] + pub pool: Box>, + + #[account( + init, + payer = owner, + space = Position::DISCRIMINATOR.len() + Position::INIT_SPACE, + seeds = [POSITION_SEED, pool.key().as_ref(), owner.key().as_ref(), side.as_seed()], + bump, + )] + pub position: Box>, + + /// CHECK: validated by the `has_one = oracle_feed` constraint on the pool. + pub oracle_feed: UncheckedAccount<'info>, + + pub collateral_mint: Box>, + + #[account( + mut, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + )] + pub custody_vault: Box>, + + #[account( + mut, + associated_token::mint = collateral_mint, + associated_token::authority = owner, + associated_token::token_program = token_program, + )] + pub trader_collateral: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/remove_liquidity.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/remove_liquidity.rs new file mode 100644 index 00000000..2426c556 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/remove_liquidity.rs @@ -0,0 +1,148 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{ + burn, transfer_checked, Burn, Mint, TokenAccount, TokenInterface, TransferChecked, + }, +}; + +use crate::constants::{AUTHORITY_SEED, POOL_SEED, VAULT_SEED}; +use crate::errors::PerpError; +use crate::instructions::shared::{liquidity_provider_aum, refresh_price_and_funding}; +use crate::state::Pool; + +pub fn handle_remove_liquidity( + context: Context, + shares: u64, + minimum_amount_out: u64, +) -> Result<()> { + require!(shares > 0, PerpError::ZeroAmount); + + let pool = &mut context.accounts.pool; + let price = refresh_price_and_funding(pool, &context.accounts.oracle_feed)?; + + let lp_supply = context.accounts.lp_mint.supply; + let aum = liquidity_provider_aum(pool, price)?; + require!(aum > 0, PerpError::PoolInsolvent); + + // amount_out = shares * assets-under-management / supply, floored. + let amount_out: u64 = (shares as u128) + .checked_mul(aum as u128) + .ok_or(PerpError::MathOverflow)? + .checked_div(lp_supply as u128) + .ok_or(PerpError::MathOverflow)? + .try_into() + .map_err(|_| PerpError::MathOverflow)?; + + require!(amount_out > 0, PerpError::AmountRoundsToZero); + // Only free liquidity can leave: the portion reserved to cover open + // positions' payouts stays put, so a winning trader can always be paid. A + // provider wanting more must wait for positions to close. + let free_liquidity = pool + .liquidity + .checked_sub(pool.reserved_liquidity) + .ok_or(PerpError::MathOverflow)?; + require!( + amount_out <= free_liquidity, + PerpError::InsufficientLiquidity + ); + require!( + amount_out >= minimum_amount_out, + PerpError::SlippageExceeded + ); + + pool.liquidity = pool + .liquidity + .checked_sub(amount_out) + .ok_or(PerpError::MathOverflow)?; + + burn( + CpiContext::new( + context.accounts.token_program.key(), + Burn { + mint: context.accounts.lp_mint.to_account_info(), + from: context.accounts.provider_lp.to_account_info(), + authority: context.accounts.provider.to_account_info(), + }, + ), + shares, + )?; + + let pool_key = pool.key(); + let authority_seeds: &[&[u8]] = &[AUTHORITY_SEED, pool_key.as_ref(), &[pool.authority_bump]]; + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.custody_vault.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.provider_collateral.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + &[authority_seeds], + ), + amount_out, + context.accounts.collateral_mint.decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct RemoveLiquidityAccountConstraints<'info> { + #[account(mut)] + pub provider: Signer<'info>, + + #[account( + mut, + seeds = [POOL_SEED, pool.collateral_mint.as_ref(), pool.oracle_feed.as_ref()], + bump = pool.bump, + has_one = collateral_mint, + has_one = lp_mint, + has_one = custody_vault, + has_one = oracle_feed, + )] + pub pool: Box>, + + /// CHECK: PDA authority over the vault and liquidity-provider mint. + #[account( + seeds = [AUTHORITY_SEED, pool.key().as_ref()], + bump = pool.authority_bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + /// CHECK: validated by the `has_one = oracle_feed` constraint on the pool. + pub oracle_feed: UncheckedAccount<'info>, + + pub collateral_mint: Box>, + + #[account(mut)] + pub lp_mint: Box>, + + #[account( + mut, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + )] + pub custody_vault: Box>, + + #[account( + mut, + associated_token::mint = collateral_mint, + associated_token::authority = provider, + associated_token::token_program = token_program, + )] + pub provider_collateral: Box>, + + #[account( + mut, + associated_token::mint = lp_mint, + associated_token::authority = provider, + associated_token::token_program = token_program, + )] + pub provider_lp: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/shared.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/shared.rs new file mode 100644 index 00000000..e8e32209 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/instructions/shared.rs @@ -0,0 +1,224 @@ +use anchor_lang::prelude::*; + +use crate::constants::{BASIS_POINTS_DENOMINATOR, FUNDING_PRECISION, SIZE_PRECISION}; +use crate::errors::PerpError; +use crate::state::{Pool, Position, Side}; + +/// Result of removing a position from the pool's aggregates. All figures are in +/// collateral base units; `equity` is what the trader's position is worth +/// before any close or liquidation fee. +pub struct Settlement { + pub profit_and_loss: i128, + pub funding: i128, + pub equity: i128, +} + +/// Settle a position against the current `price`: compute its profit/loss, +/// funding owed, and equity, then remove its open interest and collateral from +/// the pool's aggregates. Does not touch `pool.liquidity` or move tokens โ€” the +/// caller applies the side that differs between closing and liquidating. +pub fn settle_position(pool: &mut Pool, position: &Position, price: u64) -> Result { + let profit_and_loss = position_pnl(position.side, position.size, position.entry_price, price)?; + let funding = position_funding( + position.side, + position.size, + position.entry_funding, + pool.cumulative_funding, + )?; + + let equity = (position.collateral as i128) + .checked_add(profit_and_loss) + .ok_or(PerpError::MathOverflow)? + .checked_sub(funding) + .ok_or(PerpError::MathOverflow)?; + + match position.side { + Side::Long => { + pool.long_size = pool + .long_size + .checked_sub(position.size as u128) + .ok_or(PerpError::MathOverflow)?; + pool.long_size_scaled = pool + .long_size_scaled + .checked_sub(position.size_scaled) + .ok_or(PerpError::MathOverflow)?; + } + Side::Short => { + pool.short_size = pool + .short_size + .checked_sub(position.size as u128) + .ok_or(PerpError::MathOverflow)?; + pool.short_size_scaled = pool + .short_size_scaled + .checked_sub(position.size_scaled) + .ok_or(PerpError::MathOverflow)?; + } + } + + pool.total_collateral = pool + .total_collateral + .checked_sub(position.collateral) + .ok_or(PerpError::MathOverflow)?; + + Ok(Settlement { + profit_and_loss, + funding, + equity, + }) +} + +/// Advance the pool's cumulative funding index to `current_slot`. +/// +/// The heavier open-interest side pays funding to the pool: while longs are +/// larger the index rises (longs owe), while shorts are larger it falls (shorts +/// owe). No positions means no one to charge, so the index is left untouched and +/// only the timestamp moves forward. +pub fn accrue_funding(pool: &mut Pool, current_slot: u64) -> Result<()> { + let elapsed = current_slot.saturating_sub(pool.last_funding_slot); + if elapsed == 0 { + return Ok(()); + } + + if pool.long_size != 0 || pool.short_size != 0 { + let magnitude = (pool.funding_rate_per_slot as i128) + .checked_mul(elapsed as i128) + .ok_or(PerpError::MathOverflow)?; + let delta = if pool.long_size >= pool.short_size { + magnitude + } else { + -magnitude + }; + pool.cumulative_funding = pool + .cumulative_funding + .checked_add(delta) + .ok_or(PerpError::MathOverflow)?; + } + + pool.last_funding_slot = current_slot; + Ok(()) +} + +/// A position's contribution to the pool's `*_size_scaled` accumulator. +/// `entry_price` is always positive (oracle prices are validated `> 0`). +pub fn scale_size(size: u64, entry_price: u64) -> Result { + (size as u128) + .checked_mul(SIZE_PRECISION) + .ok_or(PerpError::MathOverflow)? + .checked_div(entry_price as u128) + .ok_or(PerpError::MathOverflow.into()) +} + +/// Signed profit/loss of one position at `price`, in collateral base units. +/// Longs profit when price rises, shorts when it falls. +pub fn position_pnl(side: Side, size: u64, entry_price: u64, price: u64) -> Result { + let size = size as i128; + let entry = entry_price as i128; + let price = price as i128; + + let price_change = match side { + Side::Long => price.checked_sub(entry), + Side::Short => entry.checked_sub(price), + } + .ok_or(PerpError::MathOverflow)?; + + // Multiply before dividing to keep precision; `entry > 0` is guaranteed. + size.checked_mul(price_change) + .ok_or(PerpError::MathOverflow)? + .checked_div(entry) + .ok_or(PerpError::MathOverflow.into()) +} + +/// Aggregate unrealized profit/loss of every open trader at `price`, derived +/// from the pool's running accumulators rather than iterating positions. +/// Positive means traders are collectively up (and the pool is down). +/// +/// Profit is marked uncapped here: a position already past the reserved-profit +/// cap is carried at more than the pool will actually pay out, so +/// assets-under-management reads slightly low until that position closes. +pub fn traders_unrealized_pnl(pool: &Pool, price: u64) -> Result { + let price = price as i128; + let size_precision = SIZE_PRECISION as i128; + + let long_value = price + .checked_mul(pool.long_size_scaled as i128) + .ok_or(PerpError::MathOverflow)? + .checked_div(size_precision) + .ok_or(PerpError::MathOverflow)?; + let long_pnl = long_value + .checked_sub(pool.long_size as i128) + .ok_or(PerpError::MathOverflow)?; + + let short_value = price + .checked_mul(pool.short_size_scaled as i128) + .ok_or(PerpError::MathOverflow)? + .checked_div(size_precision) + .ok_or(PerpError::MathOverflow)?; + let short_pnl = (pool.short_size as i128) + .checked_sub(short_value) + .ok_or(PerpError::MathOverflow)?; + + long_pnl + .checked_add(short_pnl) + .ok_or(PerpError::MathOverflow.into()) +} + +/// Liquidity-provider assets-under-management at `price`: pool liquidity minus +/// what traders are collectively owed. This is what liquidity-provider shares +/// are priced against, so it marks open positions to the current price and an +/// exiting provider cannot dodge an in-progress trader profit. +pub fn liquidity_provider_aum(pool: &Pool, price: u64) -> Result { + let traders = traders_unrealized_pnl(pool, price)?; + (pool.liquidity as i128) + .checked_sub(traders) + .ok_or(PerpError::MathOverflow.into()) +} + +/// Funding a position owes since it opened, in collateral base units. Positive +/// means the trader pays the pool; negative means the pool pays the trader. +pub fn position_funding( + side: Side, + size: u64, + entry_funding: i128, + pool_funding: i128, +) -> Result { + let funding_change = pool_funding + .checked_sub(entry_funding) + .ok_or(PerpError::MathOverflow)?; + let long_owed = (size as i128) + .checked_mul(funding_change) + .ok_or(PerpError::MathOverflow)? + .checked_div(FUNDING_PRECISION) + .ok_or(PerpError::MathOverflow)?; + + Ok(match side { + Side::Long => long_owed, + Side::Short => -long_owed, + }) +} + +/// `basis_points` of `amount`, rounded down โ€” used for fees and for the +/// maintenance-margin threshold alike. Widened to `u128` so a large amount +/// cannot overflow the intermediate product. +pub fn basis_points_of(amount: u64, basis_points: u16) -> Result { + (amount as u128) + .checked_mul(basis_points as u128) + .ok_or(PerpError::MathOverflow)? + .checked_div(BASIS_POINTS_DENOMINATOR as u128) + .ok_or(PerpError::MathOverflow)? + .try_into() + .map_err(|_| PerpError::MathOverflow.into()) +} + +/// The preamble every price-sensitive handler runs: read a validated oracle +/// price, then bring the pool's funding index up to the current slot, so the +/// settlement that follows uses fresh numbers for both. Centralized so no +/// handler can settle a position against a stale funding index. +pub fn refresh_price_and_funding(pool: &mut Pool, oracle_feed: &AccountInfo) -> Result { + let price = crate::state::oracle::read_oracle_price( + oracle_feed, + pool.oracle_scale, + pool.max_confidence_bps, + )?; + accrue_funding(pool, Clock::get()?.slot)?; + Ok(price) +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/lib.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/lib.rs new file mode 100644 index 00000000..31e19e4c --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/lib.rs @@ -0,0 +1,82 @@ +use anchor_lang::prelude::*; + +mod constants; +mod errors; +// Public so the LiteSVM integration tests can build instruction arguments +// (`PoolParameters`, `Side`) against the program's own types. +pub mod instructions; +pub mod state; + +use instructions::*; +use state::Side; + +declare_id!("3uCm8Jep469pHUpYQCh6eA6dpYV3ogvTvaRDZBPtw5So"); + +#[program] +pub mod perpetual_futures { + use super::*; + + /// Create a perpetual-futures pool for one collateral token, priced by one + /// oracle feed. Sets the trading parameters and creates the custody vault + /// and liquidity-provider mint. + pub fn initialize_pool( + context: Context, + parameters: PoolParameters, + ) -> Result<()> { + instructions::handle_initialize_pool(context, parameters) + } + + /// Deposit collateral into the pool and receive liquidity-provider shares. + /// `minimum_shares_out` is slippage protection; pass `0` to opt out. + pub fn add_liquidity( + context: Context, + amount: u64, + minimum_shares_out: u64, + ) -> Result<()> { + instructions::handle_add_liquidity(context, amount, minimum_shares_out) + } + + /// Burn liquidity-provider shares and withdraw the matching collateral. + /// `minimum_amount_out` is slippage protection; pass `0` to opt out. + pub fn remove_liquidity( + context: Context, + shares: u64, + minimum_amount_out: u64, + ) -> Result<()> { + instructions::handle_remove_liquidity(context, shares, minimum_amount_out) + } + + /// Open a leveraged long or short position against the pool at the current + /// oracle price. `acceptable_price` bounds the fill (longs reject above it, + /// shorts reject below it); pass `0` to opt out. + pub fn open_position( + context: Context, + side: Side, + collateral_amount: u64, + size: u64, + acceptable_price: u64, + ) -> Result<()> { + instructions::handle_open_position(context, side, collateral_amount, size, acceptable_price) + } + + /// Close the caller's own position, settling profit/loss, accrued funding, + /// and the close fee. `minimum_payout` is slippage protection; pass `0` to + /// opt out. + pub fn close_position( + context: Context, + minimum_payout: u64, + ) -> Result<()> { + instructions::handle_close_position(context, minimum_payout) + } + + /// Permissionlessly close a position whose equity has fallen to or below + /// the maintenance margin. The caller earns the liquidation fee. + pub fn liquidate_position(context: Context) -> Result<()> { + instructions::handle_liquidate_position(context) + } + + /// Pool authority sweeps the accumulated protocol fees from the vault. + pub fn collect_fees(context: Context) -> Result<()> { + instructions::handle_collect_fees(context) + } +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/mod.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/mod.rs new file mode 100644 index 00000000..be729118 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/mod.rs @@ -0,0 +1,6 @@ +pub mod oracle; +pub mod pool; +pub mod position; + +pub use pool::*; +pub use position::*; diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/oracle.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/oracle.rs new file mode 100644 index 00000000..64813677 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/oracle.rs @@ -0,0 +1,99 @@ +use anchor_lang::prelude::*; + +use crate::constants::{BASIS_POINTS_DENOMINATOR, MAX_PRICE_STALENESS_SLOTS}; +use crate::errors::PerpError; + +// Byte layout of the feed account this program reads. It matches the +// `mock_switchboard::MockFeed` account: an 8-byte Anchor discriminator followed +// by `authority: Pubkey (32)`, `price: i128 (16)`, `scale: u32 (4)`, +// `last_update_slot: u64 (8)`, `confidence: u64 (8)`. +// +// We read the raw bytes rather than deserializing the mock account type so this +// program stays decoupled from the mock. To consume a real Switchboard +// On-Demand feed, replace the offsets below with a call to +// `switchboard_on_demand::PullFeedAccountData::parse_and_verify(...)`, which +// also checks the Ed25519 signatures over the price update โ€” the only other +// change is the feed account's owning program ID. +// +// A real feed reports a value plus a `confidence` band (a standard-deviation-like +// uncertainty). This reader rejects a price whose band is too wide relative to +// the price โ€” skipping that check is the most common oracle footgun. Production +// venues (see solana-labs/perpetuals) often also use the feed's EMA rather than +// the spot price for a less manipulable mark; the mock omits the EMA to stay +// minimal. +// +// The feed account's owning program is NOT checked here: the pool trusts +// whatever feed address its creator configured, which is inside the trust model +// (the creator picks the oracle). A production reader must also verify the +// account owner is the oracle program, which `parse_and_verify` does. +const PRICE_OFFSET: usize = 8 + 32; +const SCALE_OFFSET: usize = PRICE_OFFSET + 16; +const LAST_UPDATE_SLOT_OFFSET: usize = SCALE_OFFSET + 4; +const CONFIDENCE_OFFSET: usize = LAST_UPDATE_SLOT_OFFSET + 8; +const FEED_MINIMUM_LENGTH: usize = CONFIDENCE_OFFSET + 8; + +/// Read and validate the oracle price from `feed`. +/// +/// Returns the price as a `u64` in the pool's `expected_scale` fixed point. +/// Rejects a stale price (older than `MAX_PRICE_STALENESS_SLOTS`), a +/// non-positive price, a feed whose scale differs from the pool's pinned scale, +/// and a price whose confidence band exceeds `max_confidence_bps` of the price. +pub fn read_oracle_price( + feed: &AccountInfo, + expected_scale: u32, + max_confidence_bps: u16, +) -> Result { + let data = feed.try_borrow_data()?; + require!( + data.len() >= FEED_MINIMUM_LENGTH, + PerpError::OracleDataTooShort + ); + + let price = i128::from_le_bytes( + data[PRICE_OFFSET..PRICE_OFFSET + 16] + .try_into() + .map_err(|_| PerpError::OracleDataTooShort)?, + ); + let scale = u32::from_le_bytes( + data[SCALE_OFFSET..SCALE_OFFSET + 4] + .try_into() + .map_err(|_| PerpError::OracleDataTooShort)?, + ); + let last_update_slot = u64::from_le_bytes( + data[LAST_UPDATE_SLOT_OFFSET..LAST_UPDATE_SLOT_OFFSET + 8] + .try_into() + .map_err(|_| PerpError::OracleDataTooShort)?, + ); + let confidence = u64::from_le_bytes( + data[CONFIDENCE_OFFSET..CONFIDENCE_OFFSET + 8] + .try_into() + .map_err(|_| PerpError::OracleDataTooShort)?, + ); + + require!(price > 0, PerpError::NonPositivePrice); + require_eq!(scale, expected_scale, PerpError::OracleScaleMismatch); + + // `saturating_sub` floors the age at zero, so a feed slot momentarily ahead + // of the local clock reads as fresh rather than wrapping to a huge age. + let current_slot = Clock::get()?.slot; + require!( + current_slot.saturating_sub(last_update_slot) <= MAX_PRICE_STALENESS_SLOTS, + PerpError::StalePrice + ); + + // Reject an untrustworthy price: confidence band as a fraction of price, + // in basis points, must not exceed the pool's limit. Widen to u128 so the + // product cannot overflow, and `price > 0` is already guaranteed. + let confidence_bps = (confidence as u128) + .checked_mul(BASIS_POINTS_DENOMINATOR as u128) + .ok_or(PerpError::MathOverflow)? + .checked_div(price as u128) + .ok_or(PerpError::MathOverflow)?; + require!( + confidence_bps <= max_confidence_bps as u128, + PerpError::OracleConfidenceTooWide + ); + + let price: u64 = price.try_into().map_err(|_| PerpError::MathOverflow)?; + Ok(price) +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/pool.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/pool.rs new file mode 100644 index 00000000..eae178c5 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/pool.rs @@ -0,0 +1,99 @@ +use anchor_lang::prelude::*; + +/// One perpetual-futures market: a single collateral token priced by a single +/// oracle feed. Liquidity providers fund the pool and are the counterparty to +/// every trader; the pool absorbs trader profit and loss. +/// +/// Money fields are raw base units of the collateral token. The pool never +/// assumes decimals โ€” `transfer_checked` carries them through every CPI. +#[account] +#[derive(InitSpace)] +pub struct Pool { + /// Admin: configures the pool and sweeps protocol fees. Not a custody + /// escape hatch โ€” it cannot touch liquidity-provider or trader funds. + pub authority: Pubkey, + + pub collateral_mint: Pubkey, + + /// Oracle feed this market reads its price from. Stored so handlers can + /// reject any substituted feed account. + pub oracle_feed: Pubkey, + + /// Decimal places the oracle price is quoted in. Pinned at creation so a + /// feed that silently changes scale is rejected rather than mis-read. + pub oracle_scale: u32, + + pub custody_vault: Pubkey, + + pub lp_mint: Pubkey, + + /// Liquidity-provider-owned assets, in collateral base units. Grows with + /// deposits, trader losses, fees-to-LPs; shrinks with withdrawals and + /// trader profits. Trader collateral is tracked separately in + /// `total_collateral` and is not part of this figure. + pub liquidity: u64, + + /// Portion of `liquidity` reserved to cover open positions' maximum + /// recoverable profit (one notional `size` per position). Liquidity-provider + /// withdrawals can only take the free remainder (`liquidity - reserved`), so + /// a winning trader can always be paid. Also caps total exposure: a position + /// can only open while `reserved + size <= liquidity`. + pub reserved_liquidity: u64, + + /// Sum of every open position's posted collateral, held in the same vault. + pub total_collateral: u64, + + /// Protocol fees accrued from open/close fees, awaiting `collect_fees`. + pub protocol_fees: u64, + + /// Aggregate long open interest (sum of position `size`), in collateral + /// base units of notional. + pub long_size: u128, + + pub short_size: u128, + + /// Running sum of `size * SIZE_PRECISION / entry_price` for each side. + /// Lets mark-to-market assets-under-management be derived from the current + /// price without iterating positions: aggregate long profit/loss equals + /// `price * long_size_scaled / SIZE_PRECISION - long_size`. + pub long_size_scaled: u128, + + pub short_size_scaled: u128, + + /// Cumulative funding index, scaled by `FUNDING_PRECISION`. Rises while + /// longs are the heavier side (longs pay), falls while shorts are heavier. + /// A position pays funding proportional to the change in this index between + /// open and close. + pub cumulative_funding: i128, + + pub last_funding_slot: u64, + + /// Funding accrued per slot, in `FUNDING_PRECISION` units, applied to the + /// heavier side. The funding paid by traders accrues to the pool. + pub funding_rate_per_slot: u64, + + /// Fee charged on notional when opening a position, in basis points. + pub open_fee_bps: u16, + + pub close_fee_bps: u16, + + /// Highest leverage a position may open at (`size <= collateral * max`). + pub max_leverage: u16, + + /// Equity threshold, in basis points of notional, below which a position is + /// liquidatable. + pub maintenance_margin_bps: u16, + + /// Reward paid to a liquidator, in basis points of the liquidated notional. + pub liquidation_fee_bps: u16, + + /// Maximum oracle confidence band, in basis points of the price, that the + /// pool will trade against. A wider band is rejected as untrustworthy. + pub max_confidence_bps: u16, + + pub bump: u8, + + /// Bump for the vault/LP-mint authority PDA, stored so CPIs can sign without + /// re-deriving it. + pub authority_bump: u8, +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/position.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/position.rs new file mode 100644 index 00000000..29a0d708 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/src/state/position.rs @@ -0,0 +1,52 @@ +use anchor_lang::prelude::*; + +#[derive(AnchorSerialize, AnchorDeserialize, InitSpace, Clone, Copy, PartialEq, Eq, Debug)] +pub enum Side { + Long, + Short, +} + +impl Side { + /// Seed fragment used in the position PDA, so one owner can hold a long and + /// a short in the same pool simultaneously. Returns a `'static` slice so it + /// can be used directly in the `seeds` constraint without a temporary. + pub fn as_seed(&self) -> &'static [u8] { + match self { + Side::Long => b"long", + Side::Short => b"short", + } + } +} + +/// A single trader's leveraged position. One PDA per (pool, owner, side). +#[account] +#[derive(InitSpace)] +pub struct Position { + pub owner: Pubkey, + + pub pool: Pubkey, + + pub side: Side, + + /// Collateral the trader posted, in collateral base units. Part of the + /// pool's `total_collateral` while the position is open. + pub collateral: u64, + + /// Notional position size, in collateral base units. `size / collateral` is + /// the leverage. + pub size: u64, + + /// Oracle price at open, in the pool's `oracle_scale` fixed point. Always + /// positive, so stored unsigned. + pub entry_price: u64, + + /// This position's contribution to the pool's `*_size_scaled` accumulator + /// (`size * SIZE_PRECISION / entry_price`). Stored so it can be subtracted + /// exactly on close without recomputing and re-rounding. + pub size_scaled: u128, + + /// Pool `cumulative_funding` at open. Funding owed is the change since. + pub entry_funding: i128, + + pub bump: u8, +} diff --git a/finance/perpetual-futures/anchor/programs/perpetual-futures/tests/test_perpetual_futures.rs b/finance/perpetual-futures/anchor/programs/perpetual-futures/tests/test_perpetual_futures.rs new file mode 100644 index 00000000..a672a5e9 --- /dev/null +++ b/finance/perpetual-futures/anchor/programs/perpetual-futures/tests/test_perpetual_futures.rs @@ -0,0 +1,1052 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + AccountDeserialize, InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + perpetual_futures::{instructions::initialize_pool::PoolParameters, state::Pool, state::Side}, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, + send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +// Collateral token has 6 decimals (like USDC), so one whole unit is 1_000_000 +// base units. +const ONE_USDC: u64 = 1_000_000; +const DECIMALS: u8 = 6; + +// The oracle quotes prices with 8 decimals, so $100 is 100 * 10^8. +const ORACLE_SCALE: u32 = 8; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ) + .0 +} + +/// Oracle price for a whole-dollar amount, in the feed's fixed point. +fn dollars(whole: i128) -> i128 { + whole * 10i128.pow(ORACLE_SCALE) +} + +/// One deployed market plus the keys needed to drive it. +struct Market { + svm: LiteSVM, + payer: Keypair, + admin: Keypair, + collateral_mint: Pubkey, + feed: Pubkey, + pool: Pubkey, + pool_authority: Pubkey, + lp_mint: Pubkey, + custody_vault: Pubkey, +} + +impl Market { + /// Stand up a market with the given starting oracle price and per-slot + /// funding rate. The admin is both the pool authority and the oracle feed + /// authority. + fn new(initial_price: i128, funding_rate_per_slot: u64) -> Market { + let parameters = PoolParameters { + oracle_scale: ORACLE_SCALE, + funding_rate_per_slot, + open_fee_bps: 10, + close_fee_bps: 10, + max_leverage: 10, + maintenance_margin_bps: 500, + liquidation_fee_bps: 100, + max_confidence_bps: 100, + }; + Market::try_new(initial_price, parameters).expect("pool initialization should succeed") + } + + /// Like `new`, but takes the full parameter set and surfaces an + /// `initialize_pool` rejection instead of panicking, so tests can probe the + /// parameter validation. + fn try_new(initial_price: i128, parameters: PoolParameters) -> Result { + let mut svm = LiteSVM::new(); + svm.add_program( + perpetual_futures::id(), + include_bytes!("../../../target/deploy/perpetual_futures.so"), + ) + .unwrap(); + svm.add_program( + mock_switchboard::id(), + include_bytes!("../../../target/deploy/mock_switchboard.so"), + ) + .unwrap(); + + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); + let admin = create_wallet(&mut svm, 100_000_000_000).unwrap(); + let collateral_mint = create_token_mint(&mut svm, &admin, DECIMALS, None).unwrap(); + + // Create the mock oracle feed as a fresh account owned by the mock + // program; the admin is its update authority. + let feed_keypair = Keypair::new(); + let initialize_feed = Instruction::new_with_bytes( + mock_switchboard::id(), + &mock_switchboard::instruction::InitializeFeed { + price: initial_price, + scale: ORACLE_SCALE, + confidence: 0, + } + .data(), + mock_switchboard::accounts::InitializeFeedAccountConstraints { + feed: feed_keypair.pubkey(), + authority: admin.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![initialize_feed], + &[&admin, &feed_keypair], + &admin.pubkey(), + ) + .unwrap(); + let feed = feed_keypair.pubkey(); + + let pool = Pubkey::find_program_address( + &[b"pool", collateral_mint.as_ref(), feed.as_ref()], + &perpetual_futures::id(), + ) + .0; + let pool_authority = + Pubkey::find_program_address(&[b"authority", pool.as_ref()], &perpetual_futures::id()) + .0; + let lp_mint = + Pubkey::find_program_address(&[b"lp_mint", pool.as_ref()], &perpetual_futures::id()).0; + let custody_vault = + Pubkey::find_program_address(&[b"vault", pool.as_ref()], &perpetual_futures::id()).0; + + let initialize_pool = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::InitializePool { parameters }.data(), + perpetual_futures::accounts::InitializePoolAccountConstraints { + authority: admin.pubkey(), + pool, + collateral_mint, + oracle_feed: feed, + pool_authority, + lp_mint, + custody_vault, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![initialize_pool], + &[&admin], + &admin.pubkey(), + ) + .map_err(|_| ())?; + + Ok(Market { + svm, + payer, + admin, + collateral_mint, + feed, + pool, + pool_authority, + lp_mint, + custody_vault, + }) + } + + fn default_market() -> Market { + // Funding off by default so profit/loss assertions are exact. + Market::new(dollars(100), 0) + } + + fn pool_state(&self) -> Pool { + let account = self.svm.get_account(&self.pool).unwrap(); + Pool::try_deserialize(&mut account.data.as_slice()).unwrap() + } + + fn set_price(&mut self, price: i128) { + self.set_price_with_confidence(price, 0); + } + + fn set_price_with_confidence(&mut self, price: i128, confidence: u64) { + let set_price = Instruction::new_with_bytes( + mock_switchboard::id(), + &mock_switchboard::instruction::SetPrice { price, confidence }.data(), + mock_switchboard::accounts::SetPriceAccountConstraints { + feed: self.feed, + authority: self.admin.pubkey(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![set_price], + &[&self.admin], + &self.admin.pubkey(), + ) + .unwrap(); + } + + fn warp(&mut self, slot: u64) { + self.svm.warp_to_slot(slot); + self.svm.expire_blockhash(); + } + + /// Create a wallet holding `amount` collateral tokens in its associated + /// token account. + fn funded_trader(&mut self, amount: u64) -> (Keypair, Pubkey) { + let trader = create_wallet(&mut self.svm, 100_000_000_000).unwrap(); + let token_account = create_associated_token_account( + &mut self.svm, + &trader.pubkey(), + &self.collateral_mint, + &self.payer, + ) + .unwrap(); + mint_tokens_to_token_account( + &mut self.svm, + &self.collateral_mint, + &token_account, + amount, + &self.admin, + ) + .unwrap(); + (trader, token_account) + } + + fn add_liquidity( + &mut self, + provider: &Keypair, + provider_collateral: Pubkey, + amount: u64, + minimum_shares_out: u64, + ) -> Result<(), ()> { + let provider_lp = derive_ata(&provider.pubkey(), &self.lp_mint); + let instruction = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::AddLiquidity { + amount, + minimum_shares_out, + } + .data(), + perpetual_futures::accounts::AddLiquidityAccountConstraints { + provider: provider.pubkey(), + pool: self.pool, + pool_authority: self.pool_authority, + oracle_feed: self.feed, + collateral_mint: self.collateral_mint, + lp_mint: self.lp_mint, + custody_vault: self.custody_vault, + provider_collateral, + provider_lp, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![instruction], + &[provider], + &provider.pubkey(), + ) + .map(|_| ()) + .map_err(|_| ()) + } + + fn remove_liquidity( + &mut self, + provider: &Keypair, + provider_collateral: Pubkey, + shares: u64, + minimum_amount_out: u64, + ) -> Result<(), ()> { + let provider_lp = derive_ata(&provider.pubkey(), &self.lp_mint); + let instruction = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::RemoveLiquidity { + shares, + minimum_amount_out, + } + .data(), + perpetual_futures::accounts::RemoveLiquidityAccountConstraints { + provider: provider.pubkey(), + pool: self.pool, + pool_authority: self.pool_authority, + oracle_feed: self.feed, + collateral_mint: self.collateral_mint, + lp_mint: self.lp_mint, + custody_vault: self.custody_vault, + provider_collateral, + provider_lp, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![instruction], + &[provider], + &provider.pubkey(), + ) + .map(|_| ()) + .map_err(|_| ()) + } + + fn position_pda(&self, owner: &Pubkey, side: Side) -> Pubkey { + let side_seed: &[u8] = match side { + Side::Long => b"long", + Side::Short => b"short", + }; + Pubkey::find_program_address( + &[b"position", self.pool.as_ref(), owner.as_ref(), side_seed], + &perpetual_futures::id(), + ) + .0 + } + + fn open_position( + &mut self, + trader: &Keypair, + trader_collateral: Pubkey, + side: Side, + collateral_amount: u64, + size: u64, + acceptable_price: u64, + ) -> Result<(), ()> { + let position = self.position_pda(&trader.pubkey(), side); + let instruction = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::OpenPosition { + side, + collateral_amount, + size, + acceptable_price, + } + .data(), + perpetual_futures::accounts::OpenPositionAccountConstraints { + owner: trader.pubkey(), + pool: self.pool, + position, + oracle_feed: self.feed, + collateral_mint: self.collateral_mint, + custody_vault: self.custody_vault, + trader_collateral, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![instruction], + &[trader], + &trader.pubkey(), + ) + .map(|_| ()) + .map_err(|_| ()) + } + + fn close_position( + &mut self, + trader: &Keypair, + trader_collateral: Pubkey, + side: Side, + minimum_payout: u64, + ) -> Result<(), ()> { + let position = self.position_pda(&trader.pubkey(), side); + let instruction = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::ClosePosition { minimum_payout }.data(), + perpetual_futures::accounts::ClosePositionAccountConstraints { + owner: trader.pubkey(), + pool: self.pool, + position, + pool_authority: self.pool_authority, + oracle_feed: self.feed, + collateral_mint: self.collateral_mint, + custody_vault: self.custody_vault, + trader_collateral, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![instruction], + &[trader], + &trader.pubkey(), + ) + .map(|_| ()) + .map_err(|_| ()) + } + + fn liquidate( + &mut self, + liquidator: &Keypair, + owner: &Pubkey, + owner_collateral: Pubkey, + side: Side, + ) -> Result<(), ()> { + let position = self.position_pda(owner, side); + let liquidator_collateral = derive_ata(&liquidator.pubkey(), &self.collateral_mint); + let instruction = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::LiquidatePosition {}.data(), + perpetual_futures::accounts::LiquidatePositionAccountConstraints { + liquidator: liquidator.pubkey(), + owner: *owner, + pool: self.pool, + position, + pool_authority: self.pool_authority, + oracle_feed: self.feed, + collateral_mint: self.collateral_mint, + custody_vault: self.custody_vault, + trader_collateral: owner_collateral, + liquidator_collateral, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![instruction], + &[liquidator], + &liquidator.pubkey(), + ) + .map(|_| ()) + .map_err(|_| ()) + } + + fn collect_fees(&mut self, authority: &Keypair) -> Result<(), ()> { + let authority_collateral = derive_ata(&authority.pubkey(), &self.collateral_mint); + let instruction = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::CollectFees {}.data(), + perpetual_futures::accounts::CollectFeesAccountConstraints { + authority: authority.pubkey(), + pool: self.pool, + pool_authority: self.pool_authority, + collateral_mint: self.collateral_mint, + custody_vault: self.custody_vault, + authority_collateral, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![instruction], + &[authority], + &authority.pubkey(), + ) + .map(|_| ()) + .map_err(|_| ()) + } + + /// Deposit a large amount of liquidity so the pool can pay trader profits, + /// returning the provider and its collateral account. + fn seed_liquidity(&mut self, amount: u64) -> (Keypair, Pubkey) { + let (provider, provider_collateral) = self.funded_trader(amount); + self.add_liquidity(&provider, provider_collateral, amount, 0) + .unwrap(); + (provider, provider_collateral) + } +} + +#[test] +fn test_initialize_pool() { + let market = Market::default_market(); + let pool = market.pool_state(); + + assert_eq!(pool.authority, market.admin.pubkey()); + assert_eq!(pool.collateral_mint, market.collateral_mint); + assert_eq!(pool.oracle_feed, market.feed); + assert_eq!(pool.oracle_scale, ORACLE_SCALE); + assert_eq!(pool.max_leverage, 10); + assert_eq!(pool.liquidity, 0); + assert_eq!(pool.total_collateral, 0); +} + +#[test] +fn test_add_liquidity_first_deposit_withholds_minimum() { + let mut market = Market::default_market(); + let deposit = 10_000 * ONE_USDC; + let (provider, provider_collateral) = market.funded_trader(deposit); + + market + .add_liquidity(&provider, provider_collateral, deposit, 0) + .unwrap(); + + // The pool holds the full deposit; the provider's shares are the deposit + // minus the withheld minimum. + assert_eq!(market.pool_state().liquidity, deposit); + let provider_lp = derive_ata(&provider.pubkey(), &market.lp_mint); + let shares = get_token_account_balance(&market.svm, &provider_lp).unwrap(); + assert_eq!(shares, deposit - 1_000); +} + +#[test] +fn test_first_deposit_below_minimum_fails() { + let mut market = Market::default_market(); + let (provider, provider_collateral) = market.funded_trader(10_000); + // 500 base units is below the 1_000 locked minimum. + assert!(market + .add_liquidity(&provider, provider_collateral, 500, 0) + .is_err()); +} + +#[test] +fn test_add_liquidity_subsequent_is_proportional() { + let mut market = Market::default_market(); + let first = 10_000 * ONE_USDC; + market.seed_liquidity(first); + + // With no open positions and an unchanged price, assets-under-management + // equals liquidity, so a second equal deposit mints ~the same shares. + let second = 10_000 * ONE_USDC; + let (provider, provider_collateral) = market.funded_trader(second); + market + .add_liquidity(&provider, provider_collateral, second, 0) + .unwrap(); + + let provider_lp = derive_ata(&provider.pubkey(), &market.lp_mint); + let shares = get_token_account_balance(&market.svm, &provider_lp).unwrap(); + // supply before second deposit was `first - 1_000`; second shares = + // second * supply / aum = second * (first - 1_000) / first. + let expected = ((second as u128) * ((first - 1_000) as u128) / (first as u128)) as u64; + assert_eq!(shares, expected); +} + +#[test] +fn test_add_and_remove_liquidity_round_trip() { + let mut market = Market::default_market(); + let deposit = 10_000 * ONE_USDC; + let (provider, provider_collateral) = market.funded_trader(deposit); + market + .add_liquidity(&provider, provider_collateral, deposit, 0) + .unwrap(); + + let provider_lp = derive_ata(&provider.pubkey(), &market.lp_mint); + let shares = get_token_account_balance(&market.svm, &provider_lp).unwrap(); + market + .remove_liquidity(&provider, provider_collateral, shares, 0) + .unwrap(); + + // As the only liquidity provider, they reclaim the full deposit: their + // shares carry the whole pool, since the withheld minimum was never minted + // to anyone else to hold it back. + let returned = get_token_account_balance(&market.svm, &provider_collateral).unwrap(); + assert_eq!(returned, deposit); + assert_eq!(market.pool_state().liquidity, 0); +} + +#[test] +fn test_open_long_updates_pool() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + let pool = market.pool_state(); + assert_eq!(pool.long_size, size as u128); + assert_eq!(pool.short_size, 0); + // Collateral minus the 0.1% open fee is now tracked as trader collateral. + let open_fee = size / 1_000; + assert_eq!(pool.total_collateral, collateral - open_fee); + assert_eq!(pool.protocol_fees, open_fee); +} + +#[test] +fn test_close_long_in_profit() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + // Price rises 20%: a $5,000 long earns $1,000. + market.set_price(dollars(120)); + market + .close_position(&trader, trader_collateral, Side::Long, 0) + .unwrap(); + + let open_fee = size / 1_000; + let close_fee = size / 1_000; + let net_collateral = collateral - open_fee; + let profit = size / 5; // 20% of notional + let expected_payout = net_collateral + profit - close_fee; + let balance = get_token_account_balance(&market.svm, &trader_collateral).unwrap(); + assert_eq!(balance, expected_payout); +} + +#[test] +fn test_close_long_in_loss() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + let liquidity_before = market.pool_state().liquidity; + + // Price falls 10%: a $5,000 long loses $500. + market.set_price(dollars(90)); + market + .close_position(&trader, trader_collateral, Side::Long, 0) + .unwrap(); + + let open_fee = size / 1_000; + let close_fee = size / 1_000; + let net_collateral = collateral - open_fee; + let loss = size / 10; // 10% of notional + let expected_payout = net_collateral - loss - close_fee; + let balance = get_token_account_balance(&market.svm, &trader_collateral).unwrap(); + assert_eq!(balance, expected_payout); + + // The trader's loss accrued to the liquidity providers. + assert_eq!(market.pool_state().liquidity, liquidity_before + loss); +} + +#[test] +fn test_close_short_in_profit() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Short, collateral, size, 0) + .unwrap(); + + // Price falls 10%: a $5,000 short earns $500. + market.set_price(dollars(90)); + market + .close_position(&trader, trader_collateral, Side::Short, 0) + .unwrap(); + + let open_fee = size / 1_000; + let close_fee = size / 1_000; + let net_collateral = collateral - open_fee; + let profit = size / 10; + let expected_payout = net_collateral + profit - close_fee; + let balance = get_token_account_balance(&market.svm, &trader_collateral).unwrap(); + assert_eq!(balance, expected_payout); +} + +#[test] +fn test_open_rejects_zero_amounts() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let (trader, trader_collateral) = market.funded_trader(1_000 * ONE_USDC); + + assert!(market + .open_position( + &trader, + trader_collateral, + Side::Long, + 0, + 5_000 * ONE_USDC, + 0 + ) + .is_err()); + assert!(market + .open_position( + &trader, + trader_collateral, + Side::Long, + 1_000 * ONE_USDC, + 0, + 0 + ) + .is_err()); +} + +#[test] +fn test_open_rejects_excess_leverage() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let collateral = 1_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + + // max_leverage is 10x; 11x must be rejected. + let size = 11_000 * ONE_USDC; + assert!(market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .is_err()); +} + +#[test] +fn test_open_long_slippage_guard() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let collateral = 1_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + + // Current price is $100 (10^10 in scale 8). A long willing to pay at most + // $99 must be rejected. + let acceptable_price = (dollars(99)) as u64; + assert!(market + .open_position( + &trader, + trader_collateral, + Side::Long, + collateral, + 5_000 * ONE_USDC, + acceptable_price + ) + .is_err()); +} + +#[test] +fn test_stale_price_rejected() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let collateral = 1_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + + // Move far past the staleness window without refreshing the feed. + market.warp(10_000); + assert!(market + .open_position( + &trader, + trader_collateral, + Side::Long, + collateral, + 5_000 * ONE_USDC, + 0 + ) + .is_err()); +} + +#[test] +fn test_wide_oracle_confidence_rejected() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let collateral = 1_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + + // The pool tolerates a 1% confidence band (max_confidence_bps = 100). Widen + // the feed's band to 2% of the price and the open must be rejected. + market.set_price_with_confidence(dollars(100), dollars(2) as u64); + assert!(market + .open_position( + &trader, + trader_collateral, + Side::Long, + collateral, + 5_000 * ONE_USDC, + 0 + ) + .is_err()); +} + +#[test] +fn test_funding_charged_to_long() { + // Funding on: longs are the only side, so they pay funding to the pool. + let mut market = Market::new(dollars(100), 5_000); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + let liquidity_before = market.pool_state().liquidity; + + // Let funding accrue, then refresh the feed so the price is fresh again and + // close at the same price (no profit/loss). + market.warp(2_000); + market.set_price(dollars(100)); + market + .close_position(&trader, trader_collateral, Side::Long, 0) + .unwrap(); + + let open_fee = size / 1_000; + let close_fee = size / 1_000; + let net_collateral = collateral - open_fee; + let payout = get_token_account_balance(&market.svm, &trader_collateral).unwrap(); + + // The trader received less than collateral-minus-close-fee; the shortfall + // is the funding they paid, which went to the liquidity providers. + assert!(payout < net_collateral - close_fee); + let funding_paid = (net_collateral - close_fee) - payout; + assert!(funding_paid > 0); + assert_eq!( + market.pool_state().liquidity, + liquidity_before + funding_paid + ); +} + +#[test] +fn test_liquidation_of_underwater_long() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + // High leverage: a ~9x long, so a small adverse move erodes the margin. + // Collateral leaves room above the notional after the open fee (10,000 of + // notional needs at least 1,000 of net collateral at 10x). + let collateral = 1_100 * ONE_USDC; + let size = 10_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + // Price falls 9%: a $10,000 long loses $900, dropping equity below the 5% + // maintenance margin. + market.set_price(dollars(91)); + + let liquidator = create_wallet(&mut market.svm, 100_000_000_000).unwrap(); + let liquidator_collateral = create_associated_token_account( + &mut market.svm, + &liquidator.pubkey(), + &market.collateral_mint, + &market.payer, + ) + .unwrap(); + + market + .liquidate(&liquidator, &trader.pubkey(), trader_collateral, Side::Long) + .unwrap(); + + // The liquidator earned a fee and the position is gone. + let reward = get_token_account_balance(&market.svm, &liquidator_collateral).unwrap(); + assert!(reward > 0); + assert!(market + .svm + .get_account(&market.position_pda(&trader.pubkey(), Side::Long)) + .is_none()); + assert_eq!(market.pool_state().long_size, 0); +} + +#[test] +fn test_healthy_position_cannot_be_liquidated() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 2_000 * ONE_USDC; // 2x leverage, plenty of margin + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + let liquidator = create_wallet(&mut market.svm, 100_000_000_000).unwrap(); + create_associated_token_account( + &mut market.svm, + &liquidator.pubkey(), + &market.collateral_mint, + &market.payer, + ) + .unwrap(); + + // Price barely moves; the position stays healthy. + market.set_price(dollars(99)); + assert!(market + .liquidate(&liquidator, &trader.pubkey(), trader_collateral, Side::Long) + .is_err()); +} + +#[test] +fn test_collect_fees() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + let fees = market.pool_state().protocol_fees; + assert!(fees > 0); + + let admin = market.admin.insecure_clone(); + let admin_collateral = create_associated_token_account( + &mut market.svm, + &admin.pubkey(), + &market.collateral_mint, + &market.payer, + ) + .unwrap(); + market.collect_fees(&admin).unwrap(); + + assert_eq!( + get_token_account_balance(&market.svm, &admin_collateral).unwrap(), + fees + ); + assert_eq!(market.pool_state().protocol_fees, 0); + + // Nothing left to claim on a second sweep. + assert!(market.collect_fees(&admin).is_err()); +} + +#[test] +fn test_collect_fees_requires_authority() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let collateral = 1_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position( + &trader, + trader_collateral, + Side::Long, + collateral, + 5_000 * ONE_USDC, + 0, + ) + .unwrap(); + + let imposter = create_wallet(&mut market.svm, 100_000_000_000).unwrap(); + create_associated_token_account( + &mut market.svm, + &imposter.pubkey(), + &market.collateral_mint, + &market.payer, + ) + .unwrap(); + assert!(market.collect_fees(&imposter).is_err()); +} + +#[test] +fn test_open_rejects_when_pool_cannot_back_it() { + let mut market = Market::default_market(); + // Only 3,000 of liquidity, but a 5,000 position must reserve 5,000. + market.seed_liquidity(3_000 * ONE_USDC); + let (trader, trader_collateral) = market.funded_trader(1_000 * ONE_USDC); + assert!(market + .open_position( + &trader, + trader_collateral, + Side::Long, + 1_000 * ONE_USDC, + 5_000 * ONE_USDC, + 0 + ) + .is_err()); +} + +#[test] +fn test_profit_capped_at_reserved_notional() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let collateral = 2_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + // Price triples: uncapped profit would be 2x the notional, but recoverable + // profit is capped at the reserved notional (`size`). + market.set_price(dollars(300)); + market + .close_position(&trader, trader_collateral, Side::Long, 0) + .unwrap(); + + let open_fee = size / 1_000; + let close_fee = size / 1_000; + let net_collateral = collateral - open_fee; + let expected = net_collateral + size - close_fee; + assert_eq!( + get_token_account_balance(&market.svm, &trader_collateral).unwrap(), + expected + ); +} + +#[test] +fn test_remove_liquidity_blocked_by_reserved() { + let mut market = Market::default_market(); + let (provider, provider_collateral) = market.seed_liquidity(10_000 * ONE_USDC); + let (trader, trader_collateral) = market.funded_trader(1_000 * ONE_USDC); + market + .open_position( + &trader, + trader_collateral, + Side::Long, + 1_000 * ONE_USDC, + 5_000 * ONE_USDC, + 0, + ) + .unwrap(); + + // 5,000 of the 10,000 liquidity is now reserved. Pulling everything fails, + // but withdrawing within the free half succeeds. + let provider_lp = derive_ata(&provider.pubkey(), &market.lp_mint); + let shares = get_token_account_balance(&market.svm, &provider_lp).unwrap(); + assert!(market + .remove_liquidity(&provider, provider_collateral, shares, 0) + .is_err()); + assert!(market + .remove_liquidity(&provider, provider_collateral, shares / 2, 0) + .is_ok()); +} + +#[test] +fn test_initialize_pool_rejects_close_fee_at_or_above_maintenance_margin() { + // A pool whose close fee reached the maintenance margin could strand a + // position that is too healthy to liquidate but too poor to pay the fee to + // close, so initialize_pool refuses the configuration. + let parameters = PoolParameters { + oracle_scale: ORACLE_SCALE, + funding_rate_per_slot: 0, + open_fee_bps: 10, + close_fee_bps: 600, + max_leverage: 10, + maintenance_margin_bps: 500, + liquidation_fee_bps: 100, + max_confidence_bps: 100, + }; + assert!(Market::try_new(dollars(100), parameters).is_err()); +} diff --git a/finance/perpetual-futures/quasar/.gitignore b/finance/perpetual-futures/quasar/.gitignore new file mode 100644 index 00000000..3dcc0425 --- /dev/null +++ b/finance/perpetual-futures/quasar/.gitignore @@ -0,0 +1,5 @@ +target +**/*.rs.bk +node_modules +test-ledger +.DS_Store diff --git a/finance/perpetual-futures/quasar/Cargo.toml b/finance/perpetual-futures/quasar/Cargo.toml new file mode 100644 index 00000000..bd1036db --- /dev/null +++ b/finance/perpetual-futures/quasar/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "quasar-perpetual-futures" +version = "0.1.0" +edition = "2021" + +# Standalone workspace โ€” not part of the root program-examples workspace. +# Quasar uses a different resolver and dependency tree. +[workspace] + +[lints.rust.unexpected_cfgs] +level = "warn" +check-cfg = [ + 'cfg(target_os, values("solana"))', +] + +[lib] +crate-type = ["cdylib", "lib"] + +[features] +alloc = [] +client = [] +debug = [] + +[dependencies] +# Pinned to the same revision the other Quasar examples use. quasar pin +# rationale: master HEAD currently fails to compile because zeropod 0.3.x +# auto-generates accessor methods that conflict with hand-written ones in +# quasar-spl. 623bb70 is the last working rev on master before that bump. +# Unpin (back to branch = "master") once upstream merges the fix. +quasar-lang = { git = "https://github.com/blueshift-gg/quasar", rev = "623bb70" } +quasar-spl = { git = "https://github.com/blueshift-gg/quasar", rev = "623bb70" } +solana-instruction = { version = "3.2.0" } + +[dev-dependencies] +quasar-svm = { git = "https://github.com/blueshift-gg/quasar-svm" } +spl-token-interface = { version = "2.0.0" } +solana-program-pack = { version = "3.1.0" } diff --git a/finance/perpetual-futures/quasar/Quasar.toml b/finance/perpetual-futures/quasar/Quasar.toml new file mode 100644 index 00000000..e31f23af --- /dev/null +++ b/finance/perpetual-futures/quasar/Quasar.toml @@ -0,0 +1,22 @@ +[project] +name = "quasar_perpetual_futures" + +[toolchain] +type = "solana" + +[testing] +language = "rust" + +[testing.rust] +framework = "quasar-svm" + +[testing.rust.test] +program = "cargo" +args = [ + "test", + "tests::", +] + +[clients] +path = "target/client" +languages = ["rust"] diff --git a/finance/perpetual-futures/quasar/README.md b/finance/perpetual-futures/quasar/README.md new file mode 100644 index 00000000..5c6a21a3 --- /dev/null +++ b/finance/perpetual-futures/quasar/README.md @@ -0,0 +1,36 @@ +# Perpetual Futures (Quasar) + +A [Quasar](https://quasar-lang.com/docs) port of the perpetual-futures example. +The design, math, and behaviour match the Anchor implementation at +[`../anchor`](../anchor) โ€” read that README for the full walkthrough of the +oracle-priced, pool-collateralized model, the funding mechanism, and the money +math. This page only covers what differs in the Quasar version. + +## Differences from the Anchor version + +- **One position per trader per pool.** The Anchor version seeds the position + PDA by side (`[b"position", pool, owner, side]`) so a trader can hold a long + and a short at once. Quasar's `address` constraint can only reference account + inputs, not instruction arguments, so the side cannot be a seed; the position + PDA is `[b"position", pool, owner]` and the side is stored in the account. A + trader therefore holds a single open position per pool here. +- **Oracle feed in tests.** Rather than a separate mock-oracle program, the + tests write the feed account's bytes directly (price, scale, last-update slot) + and the program reads them the same way it would read a real Switchboard feed. +- **State writes** use Quasar's zero-copy field accessors (`field.get()` / + `field.set()`) and `set_inner`, rather than Anchor's `Account` mutation. + +## Testing + +Tests run in-process with [`quasar-svm`](https://github.com/blueshift-gg/quasar-svm). +They build the program, set up a collateral mint, oracle feed, and funded +wallets, then exercise pool initialization, liquidity add/remove, opening and +closing a long in profit, leverage rejection, liquidation, and fee collection. + +```bash +cargo build-sbf +cargo test tests:: +``` + +`cargo build-sbf` first, so the tests can load the compiled program from +`target/deploy/`. diff --git a/finance/perpetual-futures/quasar/src/constants.rs b/finance/perpetual-futures/quasar/src/constants.rs new file mode 100644 index 00000000..1ff6012a --- /dev/null +++ b/finance/perpetual-futures/quasar/src/constants.rs @@ -0,0 +1,26 @@ +//! Shared constants. See the Anchor sibling for the prose explanations; the +//! values are identical so the two implementations behave the same. + +/// 100% expressed in basis points. +pub const BASIS_POINTS_DENOMINATOR: u64 = 10_000; + +/// Fixed-point precision for the cumulative funding index. +pub const FUNDING_PRECISION: i128 = 1_000_000_000; + +/// Fixed-point precision for the per-side `size / entry_price` accumulators. +pub const SIZE_PRECISION: u128 = 1_000_000_000; + +/// Liquidity-provider shares withheld from the first deposit so the share +/// supply never starts at a dust amount. +pub const MINIMUM_LIQUIDITY: u64 = 1_000; + +/// Reject an oracle price older than this many slots (~1 minute at 400ms). +pub const MAX_PRICE_STALENESS_SLOTS: u64 = 150; + +/// Upper bound on a pool's configurable `max_leverage`. +pub const MAX_LEVERAGE_CEILING: u16 = 100; + +/// Long / short discriminants, used both as the position-PDA seed byte and the +/// `side` instruction argument. +pub const SIDE_LONG: u8 = 0; +pub const SIDE_SHORT: u8 = 1; diff --git a/finance/perpetual-futures/quasar/src/instructions/add_liquidity.rs b/finance/perpetual-futures/quasar/src/instructions/add_liquidity.rs new file mode 100644 index 00000000..2fdc332a --- /dev/null +++ b/finance/perpetual-futures/quasar/src/instructions/add_liquidity.rs @@ -0,0 +1,129 @@ +use { + crate::{ + constants::MINIMUM_LIQUIDITY, + instructions::shared::{err, error, refresh_price_and_funding, traders_unrealized_pnl}, + state::Pool, + LpMintPda, PoolAuthorityPda, + }, + quasar_lang::{prelude::*, sysvars::clock::Clock}, + quasar_spl::prelude::*, +}; + +#[derive(Accounts)] +pub struct AddLiquidity { + #[account(mut)] + pub provider: Signer, + #[account( + mut, + address = Pool::seeds(collateral_mint.address(), oracle_feed.address()), + has_one(custody_vault), + )] + pub pool: Account, + /// Authority PDA over the vault and liquidity-provider mint. + #[account(address = PoolAuthorityPda::seeds(pool.address()))] + pub pool_authority: UncheckedAccount, + /// CHECK: bound to the pool via its seeds (the pool PDA is derived from it). + pub oracle_feed: UncheckedAccount, + pub collateral_mint: Account, + #[account(mut, address = LpMintPda::seeds(pool.address()))] + pub lp_mint: InterfaceAccount, + #[account(mut)] + pub custody_vault: Account, + #[account(mut)] + pub provider_collateral: Account, + #[account( + mut, + init(idempotent), + payer = provider, + token(mint = lp_mint, authority = provider, token_program = token_program), + )] + pub provider_lp: Account, + pub token_program: Program, + pub system_program: Program, + pub clock: Sysvar, +} + +#[inline(always)] +pub fn handle_add_liquidity( + accounts: &mut AddLiquidity, + amount: u64, + minimum_shares_out: u64, + bumps: &AddLiquidityBumps, +) -> Result<(), ProgramError> { + if amount == 0 { + return Err(err(error::ZERO_AMOUNT)); + } + + let slot = accounts.clock.slot.get(); + let price = refresh_price_and_funding(&mut accounts.pool, &accounts.oracle_feed, slot)?; + + let lp_supply = accounts.lp_mint.supply(); + let shares: u64 = if lp_supply == 0 { + amount + .checked_sub(MINIMUM_LIQUIDITY) + .ok_or_else(|| err(error::DEPOSIT_TOO_SMALL))? + } else { + let traders = traders_unrealized_pnl( + accounts.pool.long_size.get(), + accounts.pool.long_size_scaled.get(), + accounts.pool.short_size.get(), + accounts.pool.short_size_scaled.get(), + price, + )?; + let aum = (accounts.pool.liquidity.get() as i128) + .checked_sub(traders) + .ok_or(ProgramError::ArithmeticOverflow)?; + if aum <= 0 { + return Err(err(error::POOL_INSOLVENT)); + } + let computed = (amount as u128) + .checked_mul(lp_supply as u128) + .ok_or(ProgramError::ArithmeticOverflow)? + .checked_div(aum as u128) + .ok_or(ProgramError::ArithmeticOverflow)?; + u64::try_from(computed).map_err(|_| ProgramError::ArithmeticOverflow)? + }; + + if shares == 0 { + return Err(err(error::AMOUNT_ROUNDS_TO_ZERO)); + } + if shares < minimum_shares_out { + return Err(err(error::SLIPPAGE_EXCEEDED)); + } + + let new_liquidity = accounts + .pool + .liquidity + .get() + .checked_add(amount) + .ok_or(ProgramError::ArithmeticOverflow)?; + accounts.pool.liquidity.set(new_liquidity); + + accounts + .token_program + .transfer( + &accounts.provider_collateral, + &accounts.custody_vault, + &accounts.provider, + amount, + ) + .invoke()?; + + let bump = [bumps.pool_authority]; + let seeds: &[Seed] = &[ + Seed::from(b"authority".as_ref()), + Seed::from(accounts.pool.address().as_ref()), + Seed::from(&bump as &[u8]), + ]; + accounts + .token_program + .mint_to( + &accounts.lp_mint, + &accounts.provider_lp, + &accounts.pool_authority, + shares, + ) + .invoke_signed(seeds)?; + + Ok(()) +} diff --git a/finance/perpetual-futures/quasar/src/instructions/close_position.rs b/finance/perpetual-futures/quasar/src/instructions/close_position.rs new file mode 100644 index 00000000..7ca1765a --- /dev/null +++ b/finance/perpetual-futures/quasar/src/instructions/close_position.rs @@ -0,0 +1,184 @@ +use { + crate::{ + constants::SIDE_LONG, + instructions::shared::{ + basis_points_of, err, error, position_funding, position_pnl, refresh_price_and_funding, + }, + state::{Pool, Position}, + PoolAuthorityPda, + }, + quasar_lang::{prelude::*, sysvars::clock::Clock}, + quasar_spl::prelude::*, +}; + +#[derive(Accounts)] +pub struct ClosePosition { + #[account(mut)] + pub owner: Signer, + #[account( + mut, + address = Pool::seeds(collateral_mint.address(), oracle_feed.address()), + has_one(custody_vault), + )] + pub pool: Account, + #[account( + mut, + has_one(owner), + address = Position::seeds(pool.address(), owner.address()), + close(dest = owner), + )] + pub position: Account, + #[account(address = PoolAuthorityPda::seeds(pool.address()))] + pub pool_authority: UncheckedAccount, + /// CHECK: bound to the pool via its seeds. + pub oracle_feed: UncheckedAccount, + pub collateral_mint: Account, + #[account(mut)] + pub custody_vault: Account, + #[account(mut)] + pub trader_collateral: Account, + pub token_program: Program, + pub system_program: Program, + pub clock: Sysvar, +} + +#[inline(always)] +pub fn handle_close_position( + accounts: &mut ClosePosition, + minimum_payout: u64, + bumps: &ClosePositionBumps, +) -> Result<(), ProgramError> { + let slot = accounts.clock.slot.get(); + let price = refresh_price_and_funding(&mut accounts.pool, &accounts.oracle_feed, slot)?; + + let side = accounts.position.side; + let size = accounts.position.size.get(); + let entry_price = accounts.position.entry_price.get(); + let collateral = accounts.position.collateral.get(); + let size_scaled = accounts.position.size_scaled.get(); + let entry_funding = accounts.position.entry_funding.get(); + + let pnl = position_pnl(side, size, entry_price, price)?; + let funding = position_funding( + side, + size, + entry_funding, + accounts.pool.cumulative_funding.get(), + )?; + // Recoverable profit is capped at the reserved amount (the notional `size`), + // so the pool can always cover a winner. Losses are not capped. + let realized_pnl = pnl.min(size as i128); + let equity = (collateral as i128) + .checked_add(realized_pnl) + .ok_or(ProgramError::ArithmeticOverflow)? + .checked_sub(funding) + .ok_or(ProgramError::ArithmeticOverflow)?; + + let close_fee = basis_points_of(size, accounts.pool.close_fee_bps.get())?; + let payout = equity + .checked_sub(close_fee as i128) + .ok_or(ProgramError::ArithmeticOverflow)?; + if payout <= 0 { + return Err(err(error::POSITION_NOT_HEALTHY)); + } + let payout = u64::try_from(payout).map_err(|_| ProgramError::ArithmeticOverflow)?; + if payout < minimum_payout { + return Err(err(error::SLIPPAGE_EXCEEDED)); + } + + remove_open_interest(&mut accounts.pool, side, size, size_scaled)?; + + // Release the position's reserved liquidity now that it is closing. + let new_reserved = accounts + .pool + .reserved_liquidity + .get() + .checked_sub(size) + .ok_or(ProgramError::ArithmeticOverflow)?; + accounts.pool.reserved_liquidity.set(new_reserved); + + let new_total_collateral = accounts + .pool + .total_collateral + .get() + .checked_sub(collateral) + .ok_or(ProgramError::ArithmeticOverflow)?; + accounts.pool.total_collateral.set(new_total_collateral); + + let liquidity_delta = funding + .checked_sub(realized_pnl) + .ok_or(ProgramError::ArithmeticOverflow)?; + let new_liquidity = (accounts.pool.liquidity.get() as i128) + .checked_add(liquidity_delta) + .ok_or(ProgramError::ArithmeticOverflow)?; + if new_liquidity < 0 { + return Err(err(error::POOL_INSOLVENT)); + } + accounts + .pool + .liquidity + .set(u64::try_from(new_liquidity).map_err(|_| ProgramError::ArithmeticOverflow)?); + + let new_protocol_fees = accounts + .pool + .protocol_fees + .get() + .checked_add(close_fee) + .ok_or(ProgramError::ArithmeticOverflow)?; + accounts.pool.protocol_fees.set(new_protocol_fees); + + let bump = [bumps.pool_authority]; + let seeds: &[Seed] = &[ + Seed::from(b"authority".as_ref()), + Seed::from(accounts.pool.address().as_ref()), + Seed::from(&bump as &[u8]), + ]; + accounts + .token_program + .transfer( + &accounts.custody_vault, + &accounts.trader_collateral, + &accounts.pool_authority, + payout, + ) + .invoke_signed(seeds)?; + + Ok(()) +} + +/// Subtract a position's open interest from the pool's per-side accumulators. +pub fn remove_open_interest( + pool: &mut Account, + side: u8, + size: u64, + size_scaled: u128, +) -> Result<(), ProgramError> { + if side == SIDE_LONG { + let long_size = pool + .long_size + .get() + .checked_sub(size as u128) + .ok_or(ProgramError::ArithmeticOverflow)?; + pool.long_size.set(long_size); + let long_scaled = pool + .long_size_scaled + .get() + .checked_sub(size_scaled) + .ok_or(ProgramError::ArithmeticOverflow)?; + pool.long_size_scaled.set(long_scaled); + } else { + let short_size = pool + .short_size + .get() + .checked_sub(size as u128) + .ok_or(ProgramError::ArithmeticOverflow)?; + pool.short_size.set(short_size); + let short_scaled = pool + .short_size_scaled + .get() + .checked_sub(size_scaled) + .ok_or(ProgramError::ArithmeticOverflow)?; + pool.short_size_scaled.set(short_scaled); + } + Ok(()) +} diff --git a/finance/perpetual-futures/quasar/src/instructions/collect_fees.rs b/finance/perpetual-futures/quasar/src/instructions/collect_fees.rs new file mode 100644 index 00000000..fd64e761 --- /dev/null +++ b/finance/perpetual-futures/quasar/src/instructions/collect_fees.rs @@ -0,0 +1,68 @@ +use { + crate::{ + instructions::shared::{err, error}, + state::Pool, + PoolAuthorityPda, + }, + quasar_lang::prelude::*, + quasar_spl::prelude::*, +}; + +#[derive(Accounts)] +pub struct CollectFees { + #[account(mut)] + pub authority: Signer, + #[account( + mut, + has_one(authority), + address = Pool::seeds(collateral_mint.address(), oracle_feed.address()), + has_one(custody_vault), + )] + pub pool: Account, + #[account(address = PoolAuthorityPda::seeds(pool.address()))] + pub pool_authority: UncheckedAccount, + /// CHECK: bound to the pool via its seeds. + pub oracle_feed: UncheckedAccount, + pub collateral_mint: Account, + #[account(mut)] + pub custody_vault: Account, + #[account( + mut, + init(idempotent), + payer = authority, + token(mint = collateral_mint, authority = authority, token_program = token_program), + )] + pub authority_collateral: Account, + pub token_program: Program, + pub system_program: Program, +} + +#[inline(always)] +pub fn handle_collect_fees( + accounts: &mut CollectFees, + bumps: &CollectFeesBumps, +) -> Result<(), ProgramError> { + let amount = accounts.pool.protocol_fees.get(); + if amount == 0 { + return Err(err(error::NOTHING_TO_CLAIM)); + } + accounts.pool.protocol_fees.set(0); + + let bump = [bumps.pool_authority]; + let seeds: &[Seed] = &[ + Seed::from(b"authority".as_ref()), + Seed::from(accounts.pool.address().as_ref()), + Seed::from(&bump as &[u8]), + ]; + accounts + .token_program + .transfer( + &accounts.custody_vault, + &accounts.authority_collateral, + &accounts.pool_authority, + amount, + ) + .invoke_signed(seeds)?; + + Ok(()) +} diff --git a/finance/perpetual-futures/quasar/src/instructions/initialize_pool.rs b/finance/perpetual-futures/quasar/src/instructions/initialize_pool.rs new file mode 100644 index 00000000..cc237efa --- /dev/null +++ b/finance/perpetual-futures/quasar/src/instructions/initialize_pool.rs @@ -0,0 +1,119 @@ +use { + crate::{ + constants::{BASIS_POINTS_DENOMINATOR, MAX_LEVERAGE_CEILING}, + instructions::shared::{err, error}, + state::{Pool, PoolInner}, + LpMintPda, PoolAuthorityPda, VaultPda, + }, + quasar_lang::{prelude::*, sysvars::clock::Clock}, + quasar_spl::prelude::*, +}; + +#[derive(Accounts)] +pub struct InitializePool { + #[account(mut)] + pub authority: Signer, + #[account( + mut, + init, + payer = authority, + address = Pool::seeds(collateral_mint.address(), oracle_feed.address()), + )] + pub pool: Account, + pub collateral_mint: Account, + /// CHECK: stored on the pool; every read validates layout, scale, freshness. + pub oracle_feed: UncheckedAccount, + /// Authority PDA over the vault and liquidity-provider mint. + #[account(address = PoolAuthorityPda::seeds(pool.address()))] + pub pool_authority: UncheckedAccount, + #[account( + mut, + init, + payer = authority, + address = LpMintPda::seeds(pool.address()), + mint(decimals = 6, authority = pool_authority, freeze_authority = None, token_program = token_program), + )] + pub lp_mint: Account, + #[account( + mut, + init(idempotent), + payer = authority, + address = VaultPda::seeds(pool.address()), + token(mint = collateral_mint, authority = pool_authority, token_program = token_program), + )] + pub custody_vault: Account, + pub token_program: Program, + pub system_program: Program, + pub clock: Sysvar, + pub rent: Sysvar, +} + +#[inline(always)] +#[allow(clippy::too_many_arguments)] +pub fn handle_initialize_pool( + accounts: &mut InitializePool, + oracle_scale: u32, + funding_rate_per_slot: u64, + open_fee_bps: u16, + close_fee_bps: u16, + max_leverage: u16, + maintenance_margin_bps: u16, + liquidation_fee_bps: u16, + max_confidence_bps: u16, + bumps: &InitializePoolBumps, +) -> Result<(), ProgramError> { + let denominator = BASIS_POINTS_DENOMINATOR as u16; + if !(1..=MAX_LEVERAGE_CEILING).contains(&max_leverage) { + return Err(err(error::INVALID_PARAMETER)); + } + if open_fee_bps >= denominator + || close_fee_bps >= denominator + || liquidation_fee_bps >= denominator + { + return Err(err(error::INVALID_PARAMETER)); + } + if maintenance_margin_bps == 0 || maintenance_margin_bps >= denominator { + return Err(err(error::INVALID_PARAMETER)); + } + // close_position deducts the close fee from equity and refuses a + // non-positive payout, while liquidation only acts at or below the + // maintenance margin. The margin must therefore exceed the close fee, or a + // position could be stranded in between: too healthy to liquidate, too poor + // to pay the fee to close. + if maintenance_margin_bps <= close_fee_bps { + return Err(err(error::INVALID_PARAMETER)); + } + if max_confidence_bps == 0 || max_confidence_bps >= denominator { + return Err(err(error::INVALID_PARAMETER)); + } + + let slot = accounts.clock.slot.get(); + accounts.pool.set_inner(PoolInner { + authority: *accounts.authority.address(), + collateral_mint: *accounts.collateral_mint.address(), + oracle_feed: *accounts.oracle_feed.address(), + custody_vault: *accounts.custody_vault.address(), + lp_mint: *accounts.lp_mint.address(), + oracle_scale, + liquidity: 0, + reserved_liquidity: 0, + total_collateral: 0, + protocol_fees: 0, + long_size: 0, + short_size: 0, + long_size_scaled: 0, + short_size_scaled: 0, + cumulative_funding: 0, + last_funding_slot: slot, + funding_rate_per_slot, + open_fee_bps, + close_fee_bps, + max_leverage, + maintenance_margin_bps, + liquidation_fee_bps, + max_confidence_bps, + bump: bumps.pool, + authority_bump: bumps.pool_authority, + }); + Ok(()) +} diff --git a/finance/perpetual-futures/quasar/src/instructions/liquidate_position.rs b/finance/perpetual-futures/quasar/src/instructions/liquidate_position.rs new file mode 100644 index 00000000..314a6826 --- /dev/null +++ b/finance/perpetual-futures/quasar/src/instructions/liquidate_position.rs @@ -0,0 +1,164 @@ +use { + crate::{ + instructions::{ + close_position::remove_open_interest, + shared::{ + basis_points_of, err, error, position_funding, position_pnl, + refresh_price_and_funding, + }, + }, + state::{Pool, Position}, + PoolAuthorityPda, + }, + quasar_lang::{prelude::*, sysvars::clock::Clock}, + quasar_spl::prelude::*, +}; + +#[derive(Accounts)] +pub struct LiquidatePosition { + #[account(mut)] + pub liquidator: Signer, + /// CHECK: the position owner; receives the rent refund and any equity left. + #[account(mut)] + pub owner: UncheckedAccount, + #[account( + mut, + address = Pool::seeds(collateral_mint.address(), oracle_feed.address()), + has_one(custody_vault), + )] + pub pool: Account, + #[account( + mut, + has_one(owner), + address = Position::seeds(pool.address(), owner.address()), + close(dest = owner), + )] + pub position: Account, + #[account(address = PoolAuthorityPda::seeds(pool.address()))] + pub pool_authority: UncheckedAccount, + /// CHECK: bound to the pool via its seeds. + pub oracle_feed: UncheckedAccount, + pub collateral_mint: Account, + #[account(mut)] + pub custody_vault: Account, + #[account(mut)] + pub trader_collateral: Account, + #[account( + mut, + init(idempotent), + payer = liquidator, + token(mint = collateral_mint, authority = liquidator, token_program = token_program), + )] + pub liquidator_collateral: Account, + pub token_program: Program, + pub system_program: Program, + pub clock: Sysvar, +} + +#[inline(always)] +pub fn handle_liquidate_position( + accounts: &mut LiquidatePosition, + bumps: &LiquidatePositionBumps, +) -> Result<(), ProgramError> { + let slot = accounts.clock.slot.get(); + let price = refresh_price_and_funding(&mut accounts.pool, &accounts.oracle_feed, slot)?; + + let side = accounts.position.side; + let size = accounts.position.size.get(); + let entry_price = accounts.position.entry_price.get(); + let collateral = accounts.position.collateral.get(); + let size_scaled = accounts.position.size_scaled.get(); + let entry_funding = accounts.position.entry_funding.get(); + + let pnl = position_pnl(side, size, entry_price, price)?; + let funding = position_funding( + side, + size, + entry_funding, + accounts.pool.cumulative_funding.get(), + )?; + let equity = (collateral as i128) + .checked_add(pnl) + .ok_or(ProgramError::ArithmeticOverflow)? + .checked_sub(funding) + .ok_or(ProgramError::ArithmeticOverflow)?; + + let maintenance = basis_points_of(size, accounts.pool.maintenance_margin_bps.get())?; + if equity > maintenance as i128 { + return Err(err(error::POSITION_HEALTHY)); + } + + let remaining_equity = + u64::try_from(equity.max(0)).map_err(|_| ProgramError::ArithmeticOverflow)?; + let liquidation_fee = basis_points_of(size, accounts.pool.liquidation_fee_bps.get())?; + let liquidator_payout = liquidation_fee.min(remaining_equity); + let trader_refund = remaining_equity + .checked_sub(liquidator_payout) + .ok_or(ProgramError::ArithmeticOverflow)?; + + remove_open_interest(&mut accounts.pool, side, size, size_scaled)?; + + // Release the position's reserved liquidity now that it is closing. + let new_reserved = accounts + .pool + .reserved_liquidity + .get() + .checked_sub(size) + .ok_or(ProgramError::ArithmeticOverflow)?; + accounts.pool.reserved_liquidity.set(new_reserved); + + let new_total_collateral = accounts + .pool + .total_collateral + .get() + .checked_sub(collateral) + .ok_or(ProgramError::ArithmeticOverflow)?; + accounts.pool.total_collateral.set(new_total_collateral); + + // The pool keeps the position's collateral minus whatever equity is paid out. + let liquidity_delta = (collateral as i128) + .checked_sub(remaining_equity as i128) + .ok_or(ProgramError::ArithmeticOverflow)?; + let new_liquidity = (accounts.pool.liquidity.get() as i128) + .checked_add(liquidity_delta) + .ok_or(ProgramError::ArithmeticOverflow)?; + if new_liquidity < 0 { + return Err(err(error::POOL_INSOLVENT)); + } + accounts + .pool + .liquidity + .set(u64::try_from(new_liquidity).map_err(|_| ProgramError::ArithmeticOverflow)?); + + let bump = [bumps.pool_authority]; + let seeds: &[Seed] = &[ + Seed::from(b"authority".as_ref()), + Seed::from(accounts.pool.address().as_ref()), + Seed::from(&bump as &[u8]), + ]; + + if liquidator_payout > 0 { + accounts + .token_program + .transfer( + &accounts.custody_vault, + &accounts.liquidator_collateral, + &accounts.pool_authority, + liquidator_payout, + ) + .invoke_signed(seeds)?; + } + if trader_refund > 0 { + accounts + .token_program + .transfer( + &accounts.custody_vault, + &accounts.trader_collateral, + &accounts.pool_authority, + trader_refund, + ) + .invoke_signed(seeds)?; + } + + Ok(()) +} diff --git a/finance/perpetual-futures/quasar/src/instructions/mod.rs b/finance/perpetual-futures/quasar/src/instructions/mod.rs new file mode 100644 index 00000000..00453e62 --- /dev/null +++ b/finance/perpetual-futures/quasar/src/instructions/mod.rs @@ -0,0 +1,16 @@ +mod add_liquidity; +mod close_position; +mod collect_fees; +mod initialize_pool; +mod liquidate_position; +mod open_position; +mod remove_liquidity; +pub mod shared; + +pub use add_liquidity::*; +pub use close_position::*; +pub use collect_fees::*; +pub use initialize_pool::*; +pub use liquidate_position::*; +pub use open_position::*; +pub use remove_liquidity::*; diff --git a/finance/perpetual-futures/quasar/src/instructions/open_position.rs b/finance/perpetual-futures/quasar/src/instructions/open_position.rs new file mode 100644 index 00000000..9b10dac1 --- /dev/null +++ b/finance/perpetual-futures/quasar/src/instructions/open_position.rs @@ -0,0 +1,180 @@ +use { + crate::{ + constants::{SIDE_LONG, SIDE_SHORT}, + instructions::shared::{ + basis_points_of, err, error, refresh_price_and_funding, scale_size, + }, + state::{Pool, Position, PositionInner}, + }, + quasar_lang::{prelude::*, sysvars::clock::Clock}, + quasar_spl::prelude::*, +}; + +#[derive(Accounts)] +pub struct OpenPosition { + #[account(mut)] + pub owner: Signer, + #[account( + mut, + address = Pool::seeds(collateral_mint.address(), oracle_feed.address()), + has_one(custody_vault), + )] + pub pool: Account, + #[account( + mut, + init, + payer = owner, + address = Position::seeds(pool.address(), owner.address()), + )] + pub position: Account, + /// CHECK: bound to the pool via its seeds. + pub oracle_feed: UncheckedAccount, + pub collateral_mint: Account, + #[account(mut)] + pub custody_vault: Account, + #[account(mut)] + pub trader_collateral: Account, + pub token_program: Program, + pub system_program: Program, + pub clock: Sysvar, + pub rent: Sysvar, +} + +#[inline(always)] +pub fn handle_open_position( + accounts: &mut OpenPosition, + side: u8, + collateral_amount: u64, + size: u64, + acceptable_price: u64, + bumps: &OpenPositionBumps, +) -> Result<(), ProgramError> { + if side != SIDE_LONG && side != SIDE_SHORT { + return Err(err(error::INVALID_PARAMETER)); + } + if collateral_amount == 0 || size == 0 { + return Err(err(error::ZERO_AMOUNT)); + } + + let slot = accounts.clock.slot.get(); + let price = refresh_price_and_funding(&mut accounts.pool, &accounts.oracle_feed, slot)?; + + if acceptable_price != 0 { + let acceptable = if side == SIDE_LONG { + price <= acceptable_price + } else { + price >= acceptable_price + }; + if !acceptable { + return Err(err(error::SLIPPAGE_EXCEEDED)); + } + } + + let open_fee = basis_points_of(size, accounts.pool.open_fee_bps.get())?; + let net_collateral = collateral_amount + .checked_sub(open_fee) + .ok_or_else(|| err(error::INSUFFICIENT_LIQUIDITY))?; + if net_collateral == 0 { + return Err(err(error::ZERO_AMOUNT)); + } + + let max_notional = (net_collateral as u128) + .checked_mul(accounts.pool.max_leverage.get() as u128) + .ok_or(ProgramError::ArithmeticOverflow)?; + if size as u128 > max_notional { + return Err(err(error::LEVERAGE_TOO_HIGH)); + } + + let maintenance = basis_points_of(size, accounts.pool.maintenance_margin_bps.get())?; + if net_collateral <= maintenance { + return Err(err(error::POSITION_NOT_HEALTHY)); + } + + // Reserve liquidity to cover this position's maximum recoverable profit + // (its notional `size`), backed by liquidity-provider capital. This also + // caps total open interest at the pool's liquidity. + let new_reserved = accounts + .pool + .reserved_liquidity + .get() + .checked_add(size) + .ok_or_else(|| ProgramError::ArithmeticOverflow)?; + if new_reserved > accounts.pool.liquidity.get() { + return Err(err(error::INSUFFICIENT_LIQUIDITY)); + } + accounts.pool.reserved_liquidity.set(new_reserved); + + let size_scaled = scale_size(size, price)?; + + accounts.position.set_inner(PositionInner { + owner: *accounts.owner.address(), + pool: *accounts.pool.address(), + side, + collateral: net_collateral, + size, + entry_price: price, + size_scaled, + entry_funding: accounts.pool.cumulative_funding.get(), + bump: bumps.position, + }); + + let new_total_collateral = accounts + .pool + .total_collateral + .get() + .checked_add(net_collateral) + .ok_or(ProgramError::ArithmeticOverflow)?; + accounts.pool.total_collateral.set(new_total_collateral); + + let new_protocol_fees = accounts + .pool + .protocol_fees + .get() + .checked_add(open_fee) + .ok_or(ProgramError::ArithmeticOverflow)?; + accounts.pool.protocol_fees.set(new_protocol_fees); + + if side == SIDE_LONG { + let long_size = accounts + .pool + .long_size + .get() + .checked_add(size as u128) + .ok_or(ProgramError::ArithmeticOverflow)?; + accounts.pool.long_size.set(long_size); + let long_scaled = accounts + .pool + .long_size_scaled + .get() + .checked_add(size_scaled) + .ok_or(ProgramError::ArithmeticOverflow)?; + accounts.pool.long_size_scaled.set(long_scaled); + } else { + let short_size = accounts + .pool + .short_size + .get() + .checked_add(size as u128) + .ok_or(ProgramError::ArithmeticOverflow)?; + accounts.pool.short_size.set(short_size); + let short_scaled = accounts + .pool + .short_size_scaled + .get() + .checked_add(size_scaled) + .ok_or(ProgramError::ArithmeticOverflow)?; + accounts.pool.short_size_scaled.set(short_scaled); + } + + accounts + .token_program + .transfer( + &accounts.trader_collateral, + &accounts.custody_vault, + &accounts.owner, + collateral_amount, + ) + .invoke()?; + + Ok(()) +} diff --git a/finance/perpetual-futures/quasar/src/instructions/remove_liquidity.rs b/finance/perpetual-futures/quasar/src/instructions/remove_liquidity.rs new file mode 100644 index 00000000..26708dd8 --- /dev/null +++ b/finance/perpetual-futures/quasar/src/instructions/remove_liquidity.rs @@ -0,0 +1,132 @@ +use { + crate::{ + instructions::shared::{err, error, refresh_price_and_funding, traders_unrealized_pnl}, + state::Pool, + LpMintPda, PoolAuthorityPda, + }, + quasar_lang::{prelude::*, sysvars::clock::Clock}, + quasar_spl::prelude::*, +}; + +#[derive(Accounts)] +pub struct RemoveLiquidity { + #[account(mut)] + pub provider: Signer, + #[account( + mut, + address = Pool::seeds(collateral_mint.address(), oracle_feed.address()), + has_one(custody_vault), + )] + pub pool: Account, + #[account(address = PoolAuthorityPda::seeds(pool.address()))] + pub pool_authority: UncheckedAccount, + /// CHECK: bound to the pool via its seeds. + pub oracle_feed: UncheckedAccount, + pub collateral_mint: Account, + #[account(mut, address = LpMintPda::seeds(pool.address()))] + pub lp_mint: InterfaceAccount, + #[account(mut)] + pub custody_vault: Account, + #[account( + mut, + init(idempotent), + payer = provider, + token(mint = collateral_mint, authority = provider, token_program = token_program), + )] + pub provider_collateral: Account, + #[account(mut)] + pub provider_lp: Account, + pub token_program: Program, + pub system_program: Program, + pub clock: Sysvar, +} + +#[inline(always)] +pub fn handle_remove_liquidity( + accounts: &mut RemoveLiquidity, + shares: u64, + minimum_amount_out: u64, + bumps: &RemoveLiquidityBumps, +) -> Result<(), ProgramError> { + if shares == 0 { + return Err(err(error::ZERO_AMOUNT)); + } + + let slot = accounts.clock.slot.get(); + let price = refresh_price_and_funding(&mut accounts.pool, &accounts.oracle_feed, slot)?; + + let lp_supply = accounts.lp_mint.supply(); + let traders = traders_unrealized_pnl( + accounts.pool.long_size.get(), + accounts.pool.long_size_scaled.get(), + accounts.pool.short_size.get(), + accounts.pool.short_size_scaled.get(), + price, + )?; + let aum = (accounts.pool.liquidity.get() as i128) + .checked_sub(traders) + .ok_or(ProgramError::ArithmeticOverflow)?; + if aum <= 0 { + return Err(err(error::POOL_INSOLVENT)); + } + + let amount_out = (shares as u128) + .checked_mul(aum as u128) + .ok_or(ProgramError::ArithmeticOverflow)? + .checked_div(lp_supply as u128) + .ok_or(ProgramError::ArithmeticOverflow)?; + let amount_out = u64::try_from(amount_out).map_err(|_| ProgramError::ArithmeticOverflow)?; + + if amount_out == 0 { + return Err(err(error::AMOUNT_ROUNDS_TO_ZERO)); + } + // Only free liquidity can leave; the reserved portion backs open positions. + let free_liquidity = accounts + .pool + .liquidity + .get() + .checked_sub(accounts.pool.reserved_liquidity.get()) + .ok_or(ProgramError::ArithmeticOverflow)?; + if amount_out > free_liquidity { + return Err(err(error::INSUFFICIENT_LIQUIDITY)); + } + if amount_out < minimum_amount_out { + return Err(err(error::SLIPPAGE_EXCEEDED)); + } + + let new_liquidity = accounts + .pool + .liquidity + .get() + .checked_sub(amount_out) + .ok_or(ProgramError::ArithmeticOverflow)?; + accounts.pool.liquidity.set(new_liquidity); + + accounts + .token_program + .burn( + &accounts.provider_lp, + &accounts.lp_mint, + &accounts.provider, + shares, + ) + .invoke()?; + + let bump = [bumps.pool_authority]; + let seeds: &[Seed] = &[ + Seed::from(b"authority".as_ref()), + Seed::from(accounts.pool.address().as_ref()), + Seed::from(&bump as &[u8]), + ]; + accounts + .token_program + .transfer( + &accounts.custody_vault, + &accounts.provider_collateral, + &accounts.pool_authority, + amount_out, + ) + .invoke_signed(seeds)?; + + Ok(()) +} diff --git a/finance/perpetual-futures/quasar/src/instructions/shared.rs b/finance/perpetual-futures/quasar/src/instructions/shared.rs new file mode 100644 index 00000000..9e02f8c7 --- /dev/null +++ b/finance/perpetual-futures/quasar/src/instructions/shared.rs @@ -0,0 +1,268 @@ +//! Money math and the oracle decode, ported verbatim from the Anchor sibling. +//! All integer, all `checked_*`, multiply-before-divide, rounding toward the +//! protocol. Errors are `ProgramError::Custom(code)`; the codes are listed here. + +use quasar_lang::prelude::*; + +use crate::constants::{ + BASIS_POINTS_DENOMINATOR, FUNDING_PRECISION, MAX_PRICE_STALENESS_SLOTS, SIDE_LONG, + SIZE_PRECISION, +}; +use crate::state::Pool; + +pub mod error { + pub const ZERO_AMOUNT: u32 = 0; + pub const LEVERAGE_TOO_HIGH: u32 = 2; + pub const INVALID_PARAMETER: u32 = 3; + pub const STALE_PRICE: u32 = 4; + pub const NON_POSITIVE_PRICE: u32 = 5; + pub const ORACLE_SCALE_MISMATCH: u32 = 6; + pub const ORACLE_DATA_TOO_SHORT: u32 = 7; + pub const SLIPPAGE_EXCEEDED: u32 = 8; + pub const INSUFFICIENT_LIQUIDITY: u32 = 9; + pub const POOL_INSOLVENT: u32 = 10; + pub const POSITION_HEALTHY: u32 = 11; + pub const POSITION_NOT_HEALTHY: u32 = 12; + pub const NOTHING_TO_CLAIM: u32 = 13; + pub const DEPOSIT_TOO_SMALL: u32 = 14; + pub const AMOUNT_ROUNDS_TO_ZERO: u32 = 15; + pub const ORACLE_CONFIDENCE_TOO_WIDE: u32 = 16; + pub const INSUFFICIENT_COLLATERAL: u32 = 17; +} + +#[inline(always)] +pub fn err(code: u32) -> ProgramError { + ProgramError::Custom(code) +} + +#[inline(always)] +fn overflow() -> ProgramError { + ProgramError::ArithmeticOverflow +} + +// Byte layout of the oracle feed account: price (i128), scale (u32), +// last_update_slot (u64), confidence (u64). The tests craft this directly; in +// production it would be a real Switchboard On-Demand feed parsed with signature +// verification. +// +// Like the Anchor sibling, this validates freshness, positivity, and the +// confidence band (`confidence / price`), rejecting a price whose band is too +// wide. A production reader may also prefer the feed's EMA over the spot price; +// the mock omits the EMA to stay minimal. The feed account's owning program is +// NOT checked here โ€” the pool trusts whatever feed its creator configured; a +// production reader must verify the owner is the oracle program. +const PRICE_OFFSET: usize = 0; +const SCALE_OFFSET: usize = PRICE_OFFSET + 16; +const LAST_UPDATE_SLOT_OFFSET: usize = SCALE_OFFSET + 4; +const CONFIDENCE_OFFSET: usize = LAST_UPDATE_SLOT_OFFSET + 8; +const FEED_MINIMUM_LENGTH: usize = CONFIDENCE_OFFSET + 8; + +/// Read and validate the oracle price from raw feed bytes. Returns the price as +/// a `u64` in `expected_scale` fixed point. Rejects a price whose confidence +/// band exceeds `max_confidence_bps` of the price. +pub fn read_oracle_price( + data: &[u8], + expected_scale: u32, + current_slot: u64, + max_confidence_bps: u16, +) -> Result { + if data.len() < FEED_MINIMUM_LENGTH { + return Err(err(error::ORACLE_DATA_TOO_SHORT)); + } + + let price = i128::from_le_bytes( + data[PRICE_OFFSET..PRICE_OFFSET + 16] + .try_into() + .map_err(|_| err(error::ORACLE_DATA_TOO_SHORT))?, + ); + let scale = u32::from_le_bytes( + data[SCALE_OFFSET..SCALE_OFFSET + 4] + .try_into() + .map_err(|_| err(error::ORACLE_DATA_TOO_SHORT))?, + ); + let last_update_slot = u64::from_le_bytes( + data[LAST_UPDATE_SLOT_OFFSET..LAST_UPDATE_SLOT_OFFSET + 8] + .try_into() + .map_err(|_| err(error::ORACLE_DATA_TOO_SHORT))?, + ); + let confidence = u64::from_le_bytes( + data[CONFIDENCE_OFFSET..CONFIDENCE_OFFSET + 8] + .try_into() + .map_err(|_| err(error::ORACLE_DATA_TOO_SHORT))?, + ); + + if price <= 0 { + return Err(err(error::NON_POSITIVE_PRICE)); + } + if scale != expected_scale { + return Err(err(error::ORACLE_SCALE_MISMATCH)); + } + if current_slot.saturating_sub(last_update_slot) > MAX_PRICE_STALENESS_SLOTS { + return Err(err(error::STALE_PRICE)); + } + + // Confidence band as a fraction of price, in basis points, must stay within + // the pool's limit. Widen to u128 so the product cannot overflow. + let confidence_bps = (confidence as u128) + .checked_mul(BASIS_POINTS_DENOMINATOR as u128) + .ok_or_else(overflow)? + .checked_div(price as u128) + .ok_or_else(overflow)?; + if confidence_bps > max_confidence_bps as u128 { + return Err(err(error::ORACLE_CONFIDENCE_TOO_WIDE)); + } + + u64::try_from(price).map_err(|_| overflow()) +} + +/// New cumulative funding index after advancing to `current_slot`. The heavier +/// side pays: the index rises while longs lead, falls while shorts lead. +pub fn advance_funding( + cumulative_funding: i128, + last_funding_slot: u64, + current_slot: u64, + funding_rate_per_slot: u64, + long_size: u128, + short_size: u128, +) -> Result { + let elapsed = current_slot.saturating_sub(last_funding_slot); + if elapsed == 0 || (long_size == 0 && short_size == 0) { + return Ok(cumulative_funding); + } + let magnitude = (funding_rate_per_slot as i128) + .checked_mul(elapsed as i128) + .ok_or_else(overflow)?; + let delta = if long_size >= short_size { + magnitude + } else { + -magnitude + }; + cumulative_funding.checked_add(delta).ok_or_else(overflow) +} + +pub fn scale_size(size: u64, entry_price: u64) -> Result { + (size as u128) + .checked_mul(SIZE_PRECISION) + .ok_or_else(overflow)? + .checked_div(entry_price as u128) + .ok_or_else(overflow) +} + +pub fn position_pnl( + side: u8, + size: u64, + entry_price: u64, + price: u64, +) -> Result { + let size = size as i128; + let entry = entry_price as i128; + let price = price as i128; + let price_change = if side == SIDE_LONG { + price.checked_sub(entry) + } else { + entry.checked_sub(price) + } + .ok_or_else(overflow)?; + size.checked_mul(price_change) + .ok_or_else(overflow)? + .checked_div(entry) + .ok_or_else(overflow) +} + +pub fn traders_unrealized_pnl( + long_size: u128, + long_size_scaled: u128, + short_size: u128, + short_size_scaled: u128, + price: u64, +) -> Result { + let price = price as i128; + let size_precision = SIZE_PRECISION as i128; + + let long_value = price + .checked_mul(long_size_scaled as i128) + .ok_or_else(overflow)? + .checked_div(size_precision) + .ok_or_else(overflow)?; + let long_pnl = long_value + .checked_sub(long_size as i128) + .ok_or_else(overflow)?; + + let short_value = price + .checked_mul(short_size_scaled as i128) + .ok_or_else(overflow)? + .checked_div(size_precision) + .ok_or_else(overflow)?; + let short_pnl = (short_size as i128) + .checked_sub(short_value) + .ok_or_else(overflow)?; + + long_pnl.checked_add(short_pnl).ok_or_else(overflow) +} + +pub fn position_funding( + side: u8, + size: u64, + entry_funding: i128, + pool_funding: i128, +) -> Result { + let funding_change = pool_funding + .checked_sub(entry_funding) + .ok_or_else(overflow)?; + let long_owed = (size as i128) + .checked_mul(funding_change) + .ok_or_else(overflow)? + .checked_div(FUNDING_PRECISION) + .ok_or_else(overflow)?; + Ok(if side == SIDE_LONG { + long_owed + } else { + -long_owed + }) +} + +/// `basis_points` of `amount`, rounded down โ€” used for fees and for the +/// maintenance-margin threshold alike. +pub fn basis_points_of(amount: u64, basis_points: u16) -> Result { + let fraction = (amount as u128) + .checked_mul(basis_points as u128) + .ok_or_else(overflow)? + .checked_div(BASIS_POINTS_DENOMINATOR as u128) + .ok_or_else(overflow)?; + u64::try_from(fraction).map_err(|_| overflow()) +} + +/// The preamble every price-sensitive handler runs: read a validated oracle +/// price from the feed, then bring the pool's funding index up to `slot`, so +/// the settlement that follows uses fresh numbers for both. Centralized so no +/// handler can settle a position against a stale funding index. +pub fn refresh_price_and_funding( + pool: &mut Account, + oracle_feed: &UncheckedAccount, + slot: u64, +) -> Result { + let price = { + let view = oracle_feed.to_account_view(); + let data = view + .try_borrow() + .map_err(|_| err(error::ORACLE_DATA_TOO_SHORT))?; + read_oracle_price( + &data, + pool.oracle_scale.get(), + slot, + pool.max_confidence_bps.get(), + )? + }; + + let new_funding = advance_funding( + pool.cumulative_funding.get(), + pool.last_funding_slot.get(), + slot, + pool.funding_rate_per_slot.get(), + pool.long_size.get(), + pool.short_size.get(), + )?; + pool.cumulative_funding.set(new_funding); + pool.last_funding_slot.set(slot); + Ok(price) +} diff --git a/finance/perpetual-futures/quasar/src/lib.rs b/finance/perpetual-futures/quasar/src/lib.rs new file mode 100644 index 00000000..995baa0b --- /dev/null +++ b/finance/perpetual-futures/quasar/src/lib.rs @@ -0,0 +1,129 @@ +#![cfg_attr(not(test), no_std)] + +//! Quasar port of the perpetual-futures example. The design, math, and +//! behaviour match the Anchor sibling at `finance/perpetual-futures/anchor`; see +//! its README for the full walkthrough. This file wires up the program; the +//! per-instruction logic lives in `instructions/`. + +use quasar_lang::prelude::*; + +mod constants; +mod instructions; +pub mod state; +#[cfg(test)] +mod tests; + +use instructions::*; + +declare_id!("GaxH8967GVLxtst2SHCtXxqKQqGxgHyxqYvr9WGe1fmC"); + +/// Authority PDA at seeds = [b"authority", pool]. Signs vault and mint CPIs. +#[derive(Seeds)] +#[seeds(b"authority", pool: Address)] +pub struct PoolAuthorityPda; + +/// Liquidity-provider mint PDA at seeds = [b"lp_mint", pool]. +#[derive(Seeds)] +#[seeds(b"lp_mint", pool: Address)] +pub struct LpMintPda; + +/// Collateral custody vault PDA at seeds = [b"vault", pool]. +#[derive(Seeds)] +#[seeds(b"vault", pool: Address)] +pub struct VaultPda; + +#[program] +mod quasar_perpetual_futures { + use super::*; + + #[instruction(discriminator = 0)] + #[allow(clippy::too_many_arguments)] + pub fn initialize_pool( + ctx: Ctx, + oracle_scale: u32, + funding_rate_per_slot: u64, + open_fee_bps: u16, + close_fee_bps: u16, + max_leverage: u16, + maintenance_margin_bps: u16, + liquidation_fee_bps: u16, + max_confidence_bps: u16, + ) -> Result<(), ProgramError> { + instructions::handle_initialize_pool( + &mut ctx.accounts, + oracle_scale, + funding_rate_per_slot, + open_fee_bps, + close_fee_bps, + max_leverage, + maintenance_margin_bps, + liquidation_fee_bps, + max_confidence_bps, + &ctx.bumps, + ) + } + + #[instruction(discriminator = 1)] + pub fn add_liquidity( + ctx: Ctx, + amount: u64, + minimum_shares_out: u64, + ) -> Result<(), ProgramError> { + instructions::handle_add_liquidity( + &mut ctx.accounts, + amount, + minimum_shares_out, + &ctx.bumps, + ) + } + + #[instruction(discriminator = 2)] + pub fn remove_liquidity( + ctx: Ctx, + shares: u64, + minimum_amount_out: u64, + ) -> Result<(), ProgramError> { + instructions::handle_remove_liquidity( + &mut ctx.accounts, + shares, + minimum_amount_out, + &ctx.bumps, + ) + } + + #[instruction(discriminator = 3)] + pub fn open_position( + ctx: Ctx, + side: u8, + collateral_amount: u64, + size: u64, + acceptable_price: u64, + ) -> Result<(), ProgramError> { + instructions::handle_open_position( + &mut ctx.accounts, + side, + collateral_amount, + size, + acceptable_price, + &ctx.bumps, + ) + } + + #[instruction(discriminator = 4)] + pub fn close_position( + ctx: Ctx, + minimum_payout: u64, + ) -> Result<(), ProgramError> { + instructions::handle_close_position(&mut ctx.accounts, minimum_payout, &ctx.bumps) + } + + #[instruction(discriminator = 5)] + pub fn liquidate_position(ctx: Ctx) -> Result<(), ProgramError> { + instructions::handle_liquidate_position(&mut ctx.accounts, &ctx.bumps) + } + + #[instruction(discriminator = 6)] + pub fn collect_fees(ctx: Ctx) -> Result<(), ProgramError> { + instructions::handle_collect_fees(&mut ctx.accounts, &ctx.bumps) + } +} diff --git a/finance/perpetual-futures/quasar/src/state.rs b/finance/perpetual-futures/quasar/src/state.rs new file mode 100644 index 00000000..fd08daa8 --- /dev/null +++ b/finance/perpetual-futures/quasar/src/state.rs @@ -0,0 +1,59 @@ +use quasar_lang::prelude::*; + +/// One perpetual-futures market. Mirrors the Anchor `Pool` field-for-field; see +/// the Anchor sibling's README for what each field means. Money fields are raw +/// base units of the collateral token. +#[account(discriminator = 100, set_inner)] +#[seeds(b"pool", collateral_mint: Address, oracle_feed: Address)] +pub struct Pool { + pub authority: Address, + pub collateral_mint: Address, + pub oracle_feed: Address, + pub custody_vault: Address, + pub lp_mint: Address, + pub oracle_scale: u32, + pub liquidity: u64, + /// Portion of `liquidity` reserved to cover open positions' maximum + /// recoverable profit (one notional `size` each). Withdrawals can only take + /// the free remainder, and a position can open only while + /// `reserved + size <= liquidity`. + pub reserved_liquidity: u64, + pub total_collateral: u64, + pub protocol_fees: u64, + pub long_size: u128, + pub short_size: u128, + pub long_size_scaled: u128, + pub short_size_scaled: u128, + pub cumulative_funding: i128, + pub last_funding_slot: u64, + pub funding_rate_per_slot: u64, + pub open_fee_bps: u16, + pub close_fee_bps: u16, + pub max_leverage: u16, + pub maintenance_margin_bps: u16, + pub liquidation_fee_bps: u16, + /// Maximum oracle confidence band, in basis points of the price, the pool + /// will trade against. A wider band is rejected as untrustworthy. + pub max_confidence_bps: u16, + pub bump: u8, + pub authority_bump: u8, +} + +/// One trader's leveraged position, one PDA per (pool, owner). Unlike the Anchor +/// sibling โ€” which seeds the position by side so a trader can hold a long and a +/// short at once โ€” Quasar's `address` constraint can only reference account +/// inputs, not instruction arguments, so `side` is stored in the account rather +/// than used as a seed. A trader therefore holds one position per pool here. +#[account(discriminator = 101, set_inner)] +#[seeds(b"position", pool: Address, owner: Address)] +pub struct Position { + pub owner: Address, + pub pool: Address, + pub side: u8, + pub collateral: u64, + pub size: u64, + pub entry_price: u64, + pub size_scaled: u128, + pub entry_funding: i128, + pub bump: u8, +} diff --git a/finance/perpetual-futures/quasar/src/tests.rs b/finance/perpetual-futures/quasar/src/tests.rs new file mode 100644 index 00000000..9210da8f --- /dev/null +++ b/finance/perpetual-futures/quasar/src/tests.rs @@ -0,0 +1,621 @@ +extern crate std; + +use { + alloc::{vec, vec::Vec}, + quasar_svm::{ + token::{ + create_keyed_associated_token_account, create_keyed_mint_account, + create_keyed_system_account, Mint, + }, + Account, AccountMeta, Instruction, Pubkey, QuasarSvm, + }, + std::fs, +}; + +const ONE_USDC: u64 = 1_000_000; +const ORACLE_SCALE: u32 = 8; + +fn program_id() -> Pubkey { + crate::ID.into() +} +fn token_program() -> Pubkey { + quasar_svm::SPL_TOKEN_PROGRAM_ID +} +fn ata_program() -> Pubkey { + quasar_svm::SPL_ASSOCIATED_TOKEN_PROGRAM_ID +} +fn system_program() -> Pubkey { + quasar_svm::system_program::ID +} +fn clock_sysvar() -> Pubkey { + "SysvarC1ock11111111111111111111111111111111" + .parse() + .unwrap() +} +fn rent_sysvar() -> Pubkey { + "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap() +} + +fn dollars(whole: i128) -> i128 { + whole * 10i128.pow(ORACLE_SCALE) +} + +fn pda(seeds: &[&[u8]]) -> Pubkey { + Pubkey::find_program_address(seeds, &program_id()).0 +} +fn ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[wallet.as_ref(), token_program().as_ref(), mint.as_ref()], + &ata_program(), + ) + .0 +} + +fn empty(address: &Pubkey) -> Account { + Account { + address: *address, + lamports: 0, + data: vec![], + owner: system_program(), + executable: false, + } +} + +fn mint_account(address: &Pubkey) -> Account { + create_keyed_mint_account( + address, + &Mint { + decimals: 6, + is_initialized: true, + ..Default::default() + }, + ) +} + +/// A feed account in this program's layout: price (i128), scale (u32), +/// last_update_slot (u64), confidence (u64). The tests own this; production +/// reads a real feed. +fn feed_account(address: &Pubkey, price: i128, scale: u32, slot: u64, confidence: u64) -> Account { + let mut data = Vec::with_capacity(36); + data.extend_from_slice(&price.to_le_bytes()); + data.extend_from_slice(&scale.to_le_bytes()); + data.extend_from_slice(&slot.to_le_bytes()); + data.extend_from_slice(&confidence.to_le_bytes()); + Account { + address: *address, + lamports: 1_000_000, + data, + owner: system_program(), + executable: false, + } +} + +fn token_amount(svm: &QuasarSvm, address: &Pubkey) -> u64 { + let account = svm.get_account(address).expect("token account exists"); + // SPL token account layout: mint (32) + owner (32) + amount (u64) at offset 64. + u64::from_le_bytes(account.data[64..72].try_into().unwrap()) +} + +struct Env { + svm: QuasarSvm, + collateral_mint: Pubkey, + feed: Pubkey, + admin: Pubkey, + pool: Pubkey, + pool_authority: Pubkey, + lp_mint: Pubkey, + custody_vault: Pubkey, +} + +const SLOT: u64 = 10; + +/// Build an SVM with the program, token program, a collateral mint, an oracle +/// feed at $100, and an initialized pool. +fn setup() -> Env { + try_setup(500, 10).expect("pool initialization should succeed") +} + +/// Like `setup`, but with the two cross-checked pool parameters exposed and an +/// `initialize_pool` rejection surfaced instead of panicking, so tests can +/// probe the parameter validation. +fn try_setup(maintenance_margin_bps: u16, close_fee_bps: u16) -> Result { + let elf = fs::read("target/deploy/quasar_perpetual_futures.so").unwrap(); + let collateral_mint = Pubkey::new_unique(); + let feed = Pubkey::new_unique(); + let admin = Pubkey::new_unique(); + let pool = pda(&[b"pool", collateral_mint.as_ref(), feed.as_ref()]); + let pool_authority = pda(&[b"authority", pool.as_ref()]); + let lp_mint = pda(&[b"lp_mint", pool.as_ref()]); + let custody_vault = pda(&[b"vault", pool.as_ref()]); + + let mut svm = QuasarSvm::new() + .with_program(&crate::ID, &elf) + .with_token_program() + .with_slot(SLOT) + .with_account(mint_account(&collateral_mint)) + .with_account(feed_account(&feed, dollars(100), ORACLE_SCALE, SLOT, 0)) + .with_account(create_keyed_system_account(&admin, 100_000_000_000)); + + // initialize_pool + let mut data = vec![0u8]; + data.extend_from_slice(&ORACLE_SCALE.to_le_bytes()); + data.extend_from_slice(&0u64.to_le_bytes()); // funding_rate_per_slot = 0 + data.extend_from_slice(&10u16.to_le_bytes()); // open_fee_bps + data.extend_from_slice(&close_fee_bps.to_le_bytes()); + data.extend_from_slice(&10u16.to_le_bytes()); // max_leverage + data.extend_from_slice(&maintenance_margin_bps.to_le_bytes()); + data.extend_from_slice(&100u16.to_le_bytes()); // liquidation_fee_bps + data.extend_from_slice(&100u16.to_le_bytes()); // max_confidence_bps + let metas = vec![ + AccountMeta::new(admin, true), + AccountMeta::new(pool, false), + AccountMeta::new_readonly(collateral_mint, false), + AccountMeta::new_readonly(feed, false), + AccountMeta::new_readonly(pool_authority, false), + AccountMeta::new(lp_mint, false), + AccountMeta::new(custody_vault, false), + AccountMeta::new_readonly(token_program(), false), + AccountMeta::new_readonly(system_program(), false), + AccountMeta::new_readonly(clock_sysvar(), false), + AccountMeta::new_readonly(rent_sysvar(), false), + ]; + let provided = vec![ + svm.get_account(&admin).unwrap(), + empty(&pool), + svm.get_account(&collateral_mint).unwrap(), + empty(&lp_mint), + empty(&custody_vault), + ]; + let result = svm.process_instruction( + &Instruction { + program_id: program_id(), + accounts: metas, + data, + }, + &provided, + ); + if !result.is_ok() { + return Err(()); + } + + Ok(Env { + svm, + collateral_mint, + feed, + admin, + pool, + pool_authority, + lp_mint, + custody_vault, + }) +} + +impl Env { + /// Create a wallet with a funded collateral token account, returning the + /// wallet and its collateral account. + fn funded_wallet(&mut self, collateral: u64) -> (Pubkey, Pubkey) { + let wallet = Pubkey::new_unique(); + let collateral_account = ata(&wallet, &self.collateral_mint); + self.svm + .set_account(create_keyed_system_account(&wallet, 100_000_000_000)); + self.svm.set_account(create_keyed_associated_token_account( + &wallet, + &self.collateral_mint, + collateral, + )); + (wallet, collateral_account) + } + + fn lp_account(&mut self, wallet: &Pubkey) -> Pubkey { + let account = ata(wallet, &self.lp_mint); + self.svm.set_account(create_keyed_associated_token_account( + wallet, + &self.lp_mint, + 0, + )); + account + } + + fn add_liquidity(&mut self, provider: &Pubkey, amount: u64) -> bool { + let provider_collateral = ata(provider, &self.collateral_mint); + let provider_lp = self.lp_account(provider); + let mut data = vec![1u8]; + data.extend_from_slice(&amount.to_le_bytes()); + data.extend_from_slice(&0u64.to_le_bytes()); + let metas = vec![ + AccountMeta::new(*provider, true), + AccountMeta::new(self.pool, false), + AccountMeta::new_readonly(self.pool_authority, false), + AccountMeta::new_readonly(self.feed, false), + AccountMeta::new_readonly(self.collateral_mint, false), + AccountMeta::new(self.lp_mint, false), + AccountMeta::new(self.custody_vault, false), + AccountMeta::new(provider_collateral, false), + AccountMeta::new(provider_lp, false), + AccountMeta::new_readonly(token_program(), false), + AccountMeta::new_readonly(system_program(), false), + AccountMeta::new_readonly(clock_sysvar(), false), + ]; + self.run(metas, data, &[*provider, provider_collateral, provider_lp]) + } + + fn remove_liquidity(&mut self, provider: &Pubkey, shares: u64) -> bool { + let provider_collateral = ata(provider, &self.collateral_mint); + let provider_lp = ata(provider, &self.lp_mint); + let mut data = vec![2u8]; + data.extend_from_slice(&shares.to_le_bytes()); + data.extend_from_slice(&0u64.to_le_bytes()); + let metas = vec![ + AccountMeta::new(*provider, true), + AccountMeta::new(self.pool, false), + AccountMeta::new_readonly(self.pool_authority, false), + AccountMeta::new_readonly(self.feed, false), + AccountMeta::new_readonly(self.collateral_mint, false), + AccountMeta::new(self.lp_mint, false), + AccountMeta::new(self.custody_vault, false), + AccountMeta::new(provider_collateral, false), + AccountMeta::new(provider_lp, false), + AccountMeta::new_readonly(token_program(), false), + AccountMeta::new_readonly(system_program(), false), + AccountMeta::new_readonly(clock_sysvar(), false), + ]; + self.run(metas, data, &[*provider, provider_collateral, provider_lp]) + } + + fn open_position(&mut self, owner: &Pubkey, side: u8, collateral: u64, size: u64) -> bool { + let trader_collateral = ata(owner, &self.collateral_mint); + let position = pda(&[b"position", self.pool.as_ref(), owner.as_ref()]); + let mut data = vec![3u8, side]; + data.extend_from_slice(&collateral.to_le_bytes()); + data.extend_from_slice(&size.to_le_bytes()); + data.extend_from_slice(&0u64.to_le_bytes()); + let metas = vec![ + AccountMeta::new(*owner, true), + AccountMeta::new(self.pool, false), + AccountMeta::new(position, false), + AccountMeta::new_readonly(self.feed, false), + AccountMeta::new_readonly(self.collateral_mint, false), + AccountMeta::new(self.custody_vault, false), + AccountMeta::new(trader_collateral, false), + AccountMeta::new_readonly(token_program(), false), + AccountMeta::new_readonly(system_program(), false), + AccountMeta::new_readonly(clock_sysvar(), false), + AccountMeta::new_readonly(rent_sysvar(), false), + ]; + self.run(metas, data, &[*owner, position, trader_collateral]) + } + + fn set_price(&mut self, price: i128) { + self.svm + .set_account(feed_account(&self.feed, price, ORACLE_SCALE, SLOT, 0)); + } + + fn set_price_with_confidence(&mut self, price: i128, confidence: u64) { + self.svm.set_account(feed_account( + &self.feed, + price, + ORACLE_SCALE, + SLOT, + confidence, + )); + } + + fn close_position(&mut self, owner: &Pubkey) -> bool { + let trader_collateral = ata(owner, &self.collateral_mint); + let position = pda(&[b"position", self.pool.as_ref(), owner.as_ref()]); + let mut data = vec![4u8]; + data.extend_from_slice(&0u64.to_le_bytes()); + let metas = vec![ + AccountMeta::new(*owner, true), + AccountMeta::new(self.pool, false), + AccountMeta::new(position, false), + AccountMeta::new_readonly(self.pool_authority, false), + AccountMeta::new_readonly(self.feed, false), + AccountMeta::new_readonly(self.collateral_mint, false), + AccountMeta::new(self.custody_vault, false), + AccountMeta::new(trader_collateral, false), + AccountMeta::new_readonly(token_program(), false), + AccountMeta::new_readonly(system_program(), false), + AccountMeta::new_readonly(clock_sysvar(), false), + ]; + self.run(metas, data, &[*owner, position, trader_collateral]) + } + + fn liquidate(&mut self, liquidator: &Pubkey, owner: &Pubkey) -> bool { + let trader_collateral = ata(owner, &self.collateral_mint); + let liquidator_collateral = ata(liquidator, &self.collateral_mint); + self.svm.set_account(create_keyed_associated_token_account( + liquidator, + &self.collateral_mint, + 0, + )); + let position = pda(&[b"position", self.pool.as_ref(), owner.as_ref()]); + let data = vec![5u8]; + let metas = vec![ + AccountMeta::new(*liquidator, true), + AccountMeta::new(*owner, false), + AccountMeta::new(self.pool, false), + AccountMeta::new(position, false), + AccountMeta::new_readonly(self.pool_authority, false), + AccountMeta::new_readonly(self.feed, false), + AccountMeta::new_readonly(self.collateral_mint, false), + AccountMeta::new(self.custody_vault, false), + AccountMeta::new(trader_collateral, false), + AccountMeta::new(liquidator_collateral, false), + AccountMeta::new_readonly(token_program(), false), + AccountMeta::new_readonly(system_program(), false), + AccountMeta::new_readonly(clock_sysvar(), false), + ]; + self.run( + metas, + data, + &[ + *liquidator, + *owner, + position, + trader_collateral, + liquidator_collateral, + ], + ) + } + + fn collect_fees(&mut self) -> bool { + let admin = self.admin; + let admin_collateral = ata(&admin, &self.collateral_mint); + self.svm.set_account(create_keyed_associated_token_account( + &admin, + &self.collateral_mint, + 0, + )); + let data = vec![6u8]; + let metas = vec![ + AccountMeta::new(admin, true), + AccountMeta::new(self.pool, false), + AccountMeta::new_readonly(self.pool_authority, false), + AccountMeta::new_readonly(self.feed, false), + AccountMeta::new_readonly(self.collateral_mint, false), + AccountMeta::new(self.custody_vault, false), + AccountMeta::new(admin_collateral, false), + AccountMeta::new_readonly(token_program(), false), + AccountMeta::new_readonly(system_program(), false), + ]; + self.run(metas, data, &[admin, admin_collateral]) + } + + fn run(&mut self, metas: Vec, data: Vec, provide: &[Pubkey]) -> bool { + let accounts: Vec = provide + .iter() + .map(|pk| self.svm.get_account(pk).unwrap_or_else(|| empty(pk))) + .collect(); + let result = self.svm.process_instruction( + &Instruction { + program_id: program_id(), + accounts: metas, + data, + }, + &accounts, + ); + result.is_ok() + } +} + +#[test] +fn test_initialize_pool() { + let env = setup(); + // The pool, vault, and liquidity-provider mint were created. + assert!(env.svm.get_account(&env.pool).is_some()); + assert!(env.svm.get_account(&env.custody_vault).is_some()); + assert!(env.svm.get_account(&env.lp_mint).is_some()); +} + +#[test] +fn test_add_liquidity() { + let mut env = setup(); + let (provider, _) = env.funded_wallet(10_000 * ONE_USDC); + assert!(env.add_liquidity(&provider, 10_000 * ONE_USDC)); + + // The vault holds the deposit and the provider received shares. + assert_eq!( + token_amount(&env.svm, &env.custody_vault), + 10_000 * ONE_USDC + ); + let provider_lp = ata(&provider, &env.lp_mint); + assert_eq!( + token_amount(&env.svm, &provider_lp), + 10_000 * ONE_USDC - 1_000 + ); +} + +#[test] +fn test_remove_liquidity_round_trip() { + let mut env = setup(); + let (provider, provider_collateral) = env.funded_wallet(10_000 * ONE_USDC); + assert!(env.add_liquidity(&provider, 10_000 * ONE_USDC)); + + let provider_lp = ata(&provider, &env.lp_mint); + let shares = token_amount(&env.svm, &provider_lp); + let mut data = vec![2u8]; + data.extend_from_slice(&shares.to_le_bytes()); + data.extend_from_slice(&0u64.to_le_bytes()); + let metas = vec![ + AccountMeta::new(provider, true), + AccountMeta::new(env.pool, false), + AccountMeta::new_readonly(env.pool_authority, false), + AccountMeta::new_readonly(env.feed, false), + AccountMeta::new_readonly(env.collateral_mint, false), + AccountMeta::new(env.lp_mint, false), + AccountMeta::new(env.custody_vault, false), + AccountMeta::new(provider_collateral, false), + AccountMeta::new(provider_lp, false), + AccountMeta::new_readonly(token_program(), false), + AccountMeta::new_readonly(system_program(), false), + AccountMeta::new_readonly(clock_sysvar(), false), + ]; + assert!(env.run(metas, data, &[provider, provider_collateral, provider_lp])); + + // Sole provider reclaims the full deposit. + assert_eq!( + token_amount(&env.svm, &provider_collateral), + 10_000 * ONE_USDC + ); +} + +#[test] +fn test_open_long_position() { + let mut env = setup(); + let (provider, _) = env.funded_wallet(100_000 * ONE_USDC); + assert!(env.add_liquidity(&provider, 100_000 * ONE_USDC)); + + let (trader, _) = env.funded_wallet(1_000 * ONE_USDC); + assert!(env.open_position(&trader, 0, 1_000 * ONE_USDC, 5_000 * ONE_USDC)); + + let position = pda(&[b"position", env.pool.as_ref(), trader.as_ref()]); + assert!(env.svm.get_account(&position).is_some()); +} + +#[test] +fn test_close_long_in_profit() { + let mut env = setup(); + let (provider, _) = env.funded_wallet(100_000 * ONE_USDC); + assert!(env.add_liquidity(&provider, 100_000 * ONE_USDC)); + + let (trader, trader_collateral) = env.funded_wallet(1_000 * ONE_USDC); + let size = 5_000 * ONE_USDC; + assert!(env.open_position(&trader, 0, 1_000 * ONE_USDC, size)); + + // Price rises 20%: a $5,000 long earns $1,000. + env.set_price(dollars(120)); + assert!(env.close_position(&trader)); + + let open_fee = size / 1_000; + let close_fee = size / 1_000; + let net_collateral = 1_000 * ONE_USDC - open_fee; + let profit = size / 5; + let expected = net_collateral + profit - close_fee; + assert_eq!(token_amount(&env.svm, &trader_collateral), expected); +} + +#[test] +fn test_open_rejects_excess_leverage() { + let mut env = setup(); + let (provider, _) = env.funded_wallet(100_000 * ONE_USDC); + assert!(env.add_liquidity(&provider, 100_000 * ONE_USDC)); + + let (trader, _) = env.funded_wallet(1_000 * ONE_USDC); + // 11x exceeds the 10x maximum. + assert!(!env.open_position(&trader, 0, 1_000 * ONE_USDC, 11_000 * ONE_USDC)); +} + +#[test] +fn test_liquidate_underwater_long() { + let mut env = setup(); + let (provider, _) = env.funded_wallet(100_000 * ONE_USDC); + assert!(env.add_liquidity(&provider, 100_000 * ONE_USDC)); + + let (trader, _) = env.funded_wallet(1_100 * ONE_USDC); + let size = 10_000 * ONE_USDC; + assert!(env.open_position(&trader, 0, 1_100 * ONE_USDC, size)); + + // Price falls 9%: a $10,000 long loses $900, dropping below maintenance. + env.set_price(dollars(91)); + let liquidator = Pubkey::new_unique(); + env.svm + .set_account(create_keyed_system_account(&liquidator, 100_000_000_000)); + assert!(env.liquidate(&liquidator, &trader)); + + let liquidator_collateral = ata(&liquidator, &env.collateral_mint); + assert!(token_amount(&env.svm, &liquidator_collateral) > 0); + let position = pda(&[b"position", env.pool.as_ref(), trader.as_ref()]); + assert!(env + .svm + .get_account(&position) + .map(|a| a.data.is_empty()) + .unwrap_or(true)); +} + +#[test] +fn test_collect_fees() { + let mut env = setup(); + let (provider, _) = env.funded_wallet(100_000 * ONE_USDC); + assert!(env.add_liquidity(&provider, 100_000 * ONE_USDC)); + let (trader, _) = env.funded_wallet(1_000 * ONE_USDC); + let size = 5_000 * ONE_USDC; + assert!(env.open_position(&trader, 0, 1_000 * ONE_USDC, size)); + + assert!(env.collect_fees()); + let admin_collateral = ata(&env.admin, &env.collateral_mint); + // The open fee (0.1% of notional) was swept to the admin. + assert_eq!(token_amount(&env.svm, &admin_collateral), size / 1_000); +} + +#[test] +fn test_wide_oracle_confidence_rejected() { + let mut env = setup(); + let (provider, _) = env.funded_wallet(100_000 * ONE_USDC); + assert!(env.add_liquidity(&provider, 100_000 * ONE_USDC)); + let (trader, _) = env.funded_wallet(1_000 * ONE_USDC); + + // The pool tolerates a 1% confidence band (max_confidence_bps = 100). Widen + // the feed's band to 2% of the price and the open must be rejected. + env.set_price_with_confidence(dollars(100), dollars(2) as u64); + assert!(!env.open_position(&trader, 0, 1_000 * ONE_USDC, 5_000 * ONE_USDC)); +} + +#[test] +fn test_open_rejects_when_pool_cannot_back_it() { + let mut env = setup(); + let (provider, _) = env.funded_wallet(3_000 * ONE_USDC); + assert!(env.add_liquidity(&provider, 3_000 * ONE_USDC)); + let (trader, _) = env.funded_wallet(1_000 * ONE_USDC); + // A 5,000 position must reserve 5,000, but the pool only holds 3,000. + assert!(!env.open_position(&trader, 0, 1_000 * ONE_USDC, 5_000 * ONE_USDC)); +} + +#[test] +fn test_profit_capped_at_reserved_notional() { + let mut env = setup(); + let (provider, _) = env.funded_wallet(100_000 * ONE_USDC); + assert!(env.add_liquidity(&provider, 100_000 * ONE_USDC)); + + let collateral = 2_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = env.funded_wallet(collateral); + assert!(env.open_position(&trader, 0, collateral, size)); + + // Price triples: uncapped profit would be 2x the notional, but recoverable + // profit is capped at the reserved notional (`size`). + env.set_price(dollars(300)); + assert!(env.close_position(&trader)); + + let open_fee = size / 1_000; + let close_fee = size / 1_000; + let net_collateral = collateral - open_fee; + let expected = net_collateral + size - close_fee; + assert_eq!(token_amount(&env.svm, &trader_collateral), expected); +} + +#[test] +fn test_remove_liquidity_blocked_by_reserved() { + let mut env = setup(); + let (provider, _) = env.funded_wallet(10_000 * ONE_USDC); + assert!(env.add_liquidity(&provider, 10_000 * ONE_USDC)); + let (trader, _) = env.funded_wallet(1_000 * ONE_USDC); + assert!(env.open_position(&trader, 0, 1_000 * ONE_USDC, 5_000 * ONE_USDC)); + + // 5,000 of the 10,000 liquidity is reserved: pulling everything fails, but + // withdrawing within the free half succeeds. + let provider_lp = ata(&provider, &env.lp_mint); + let shares = token_amount(&env.svm, &provider_lp); + assert!(!env.remove_liquidity(&provider, shares)); + assert!(env.remove_liquidity(&provider, shares / 2)); +} + +#[test] +fn test_initialize_pool_rejects_close_fee_at_or_above_maintenance_margin() { + // A pool whose close fee reached the maintenance margin could strand a + // position that is too healthy to liquidate but too poor to pay the fee to + // close, so initialize_pool refuses the configuration. + assert!(try_setup(500, 600).is_err()); +} From 9bd4002316819f9f2b4e24afff0f670869cabbef Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 12 Jun 2026 20:58:38 +0000 Subject: [PATCH 087/138] Harden lending example after security review - Price feed PDAs are now seeded [b"price_feed", authority, mint]: a signer can only write the feed derived from their own key, removing the first-caller-claims race on the previous per-mint feed. Reserves trust exactly the feed their market owner registered. - Lending markets are now isolation boundaries: every obligation handler (deposit/withdraw collateral, borrow, repay, liquidate, refresh) rejects reserves whose lending_market differs from the obligation's (MarketMismatch). - Liquidation reads the close factor from the repay reserve (a property of the debt) and the bonus from the collateral reserve (a property of the seized asset), and rejects repayments whose seizure would exceed posted collateral (LiquidationTooLarge) instead of silently capping, which made the liquidator pay full price for less collateral. - Withdraw health checks round the removed borrow power up at every step, so independent flooring can never let a withdraw pass that an exact recompute would reject. - Documented share_mint_supply drift from direct token-program burns (protocol-favourable), the transfer-fee mint limitation, instant config changes, and the audit expectation; moved reserve_signer_seeds from math.rs to state/reserve.rs. - New tests: cross-market reserve rejection, foreign-signer feed write rejection, over-seizing liquidation rejection (21 tests total). https://claude.ai/code/session_01RwE8f8ahP5S6SDNTsXmpj9 --- finance/lending/anchor/CHANGELOG.md | 9 ++ finance/lending/anchor/README.md | 38 ++++- .../anchor/programs/lending/src/errors.rs | 6 +- .../src/instructions/admin/set_price.rs | 28 ++-- .../borrow_obligation_liquidity.rs | 5 +- .../deposit_obligation_collateral.rs | 5 +- .../instructions/deposit_reserve_liquidity.rs | 4 +- .../src/instructions/liquidate_obligation.rs | 68 +++++---- .../instructions/redeem_reserve_collateral.rs | 4 +- .../src/instructions/refresh_obligation.rs | 18 ++- .../repay_obligation_liquidity.rs | 1 + .../withdraw_obligation_collateral.rs | 24 +++- .../anchor/programs/lending/src/math.rs | 17 +-- .../programs/lending/src/state/price_feed.rs | 10 +- .../programs/lending/src/state/reserve.rs | 23 ++- .../programs/lending/tests/common/mod.rs | 135 +++++++++++++----- .../lending/tests/test_liquidation.rs | 38 +++++ .../programs/lending/tests/test_security.rs | 76 ++++++++++ 18 files changed, 386 insertions(+), 123 deletions(-) create mode 100644 finance/lending/anchor/programs/lending/tests/test_security.rs diff --git a/finance/lending/anchor/CHANGELOG.md b/finance/lending/anchor/CHANGELOG.md index 91e0dbb4..3c648ce8 100644 --- a/finance/lending/anchor/CHANGELOG.md +++ b/finance/lending/anchor/CHANGELOG.md @@ -15,3 +15,12 @@ Initial lending program: a Kamino/Solend-style borrow/lend market. - Rust + LiteSVM integration tests covering supply/redeem, borrow/repay, withdraw, interest accrual, liquidation, the share-inflation guard, and rounding/stale-input edge cases. +- Lending markets are isolation boundaries: every obligation handler rejects + reserves from another market (`MarketMismatch`). +- Price feed PDAs are seeded by their authority, so no signer can write or + pre-claim a feed another authority's reserves trust. +- Liquidation reads the close factor from the repay reserve, the bonus from the + collateral reserve, and rejects repayments whose seizure would exceed the + posted collateral (`LiquidationTooLarge`). +- Withdraw health checks round the removed borrow power up, so independent + rounding can never let a withdraw pass that an exact recompute would reject. diff --git a/finance/lending/anchor/README.md b/finance/lending/anchor/README.md index 115684b6..76f4a074 100644 --- a/finance/lending/anchor/README.md +++ b/finance/lending/anchor/README.md @@ -69,6 +69,18 @@ Borrowing and withdrawing are gated by `allowed_borrow_value`; an obligation is liquidatable once `borrowed_value > unhealthy_borrow_value`. Collateral is valued rounding down and debt rounding up, so health is always judged conservatively. +Every handler that pairs an obligation with a reserve requires both to belong to +the same `LendingMarket` (`MarketMismatch` otherwise), so each market is an +isolation boundary: positions in one market can never be valued or settled +against reserves of another. + +In a liquidation, the close factor (how much of the borrow one call may repay) +comes from the **repay reserve**, because it is a property of the debt being +closed; the liquidation bonus comes from the **collateral reserve**, because it +prices the collateral being seized. A repayment whose seizure would exceed the +posted collateral fails with `LiquidationTooLarge` rather than silently seizing +less, which would make the liquidator overpay. + ### Fixed-point math All money math is integer-only `u128` โ€” no floats, no fixed-point crates. Ratios @@ -82,11 +94,17 @@ round-trips. `PriceFeed` mirrors a Switchboard On-Demand pull feed: a signed mantissa, an exponent (`price = mantissa * 10^exponent`), and the slot the price was written. Freshness is checked in **slots** (`MAX_PRICE_STALENESS_SLOTS`), not wall-clock -time. The `set_price` handler writes the feed directly so the LiteSVM tests are +time. The feed PDA is seeded by `[b"price_feed", authority, mint]`, so a signer +can only ever write the feed derived from their own key โ€” there is no shared +per-mint feed to claim first โ€” and a reserve trusts exactly one feed: the +account its market owner passed to `init_reserve`. + +The `set_price` handler writes the feed directly so the LiteSVM tests are deterministic; in production a reserve points at the real Switchboard feed and the program decodes `PullFeedAccountData` (`price_mantissa = current_result.value`, -`exponent = -18`, `last_updated_slot = current_result.slot`) instead. Switchboard -is used rather than Pyth here for its lower compute cost. +`exponent = -18`, `last_updated_slot = current_result.slot`) instead, and should +also reject results whose confidence interval is too wide. Switchboard is used +rather than Pyth here for its lower compute cost. ### Custody @@ -95,6 +113,20 @@ per-obligation vault PDAs whose authority is the obligation PDA. The market owne can update reserve risk parameters (`update_reserve_config`) but has no path to move user funds โ€” there is no admin withdrawal or escape hatch. +### Known limits + +- **Tokens with transfer fees are not supported.** The program uses + `token_interface`, so Token Extensions mints are accepted, but a transfer-fee + extension would make the vault receive less than the recorded deposit and the + accounting would overstate `available_liquidity`. Production protocols + whitelist mints; a market owner here must only create reserves for tokens + without transfer fees. +- **Reserve config changes act immediately.** Lowering a reserve's + `liquidation_threshold_bps` can make existing obligations liquidatable at + once; production governance phases such changes in. +- This is an example. Deploying any program that custodies funds calls for a + professional security audit first. + ### Instruction handlers Admin: `init_lending_market`, `init_reserve`, `update_reserve_config`, `set_price`. diff --git a/finance/lending/anchor/programs/lending/src/errors.rs b/finance/lending/anchor/programs/lending/src/errors.rs index f4624320..f07d965d 100644 --- a/finance/lending/anchor/programs/lending/src/errors.rs +++ b/finance/lending/anchor/programs/lending/src/errors.rs @@ -32,6 +32,8 @@ pub enum LendingError { ReserveNotFound, #[msg("A refresh account did not match the obligation's stored reserves")] InvalidObligationAccount, - #[msg("Signer is not authorized for this price feed")] - UnauthorizedPriceFeed, + #[msg("Reserve belongs to a different lending market than the obligation")] + MarketMismatch, + #[msg("Repay amount would seize more collateral than the obligation holds")] + LiquidationTooLarge, } diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/set_price.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/set_price.rs index e0c8344f..8e6428ad 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/admin/set_price.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/set_price.rs @@ -2,33 +2,25 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::Mint; use crate::constants::PRICE_FEED_SEED; -use crate::errors::LendingError; use crate::state::PriceFeed; /// Test stand-in for a Switchboard On-Demand feed: writes a price directly so /// LiteSVM tests are deterministic. In production the reserve points at a real /// Switchboard feed instead and this handler is unused. +/// +/// The feed PDA is seeded by `[b"price_feed", authority, mint]`, so each +/// authority can only ever write its own feed โ€” there is no shared per-mint +/// feed to race for. A reserve trusts exactly one feed account: the one the +/// market owner passed to `init_reserve`. pub fn handle_set_price( context: Context, price_mantissa: i128, exponent: i32, ) -> Result<()> { let feed = &mut context.accounts.price_feed; - - // On first creation the authority is unset (default Pubkey); claim it for - // the signer. On later updates only that authority may write. - if feed.authority == Pubkey::default() { - feed.authority = context.accounts.authority.key(); - feed.mint = context.accounts.mint.key(); - feed.bump = context.bumps.price_feed; - } else { - require_keys_eq!( - feed.authority, - context.accounts.authority.key(), - LendingError::UnauthorizedPriceFeed - ); - } - + feed.authority = context.accounts.authority.key(); + feed.mint = context.accounts.mint.key(); + feed.bump = context.bumps.price_feed; feed.price_mantissa = price_mantissa; feed.exponent = exponent; feed.last_updated_slot = Clock::get()?.slot; @@ -37,11 +29,13 @@ pub fn handle_set_price( #[derive(Accounts)] pub struct SetPrice<'info> { + // The authority is part of the seeds: a signer can only ever address (and + // therefore write) the feed derived from their own key. #[account( init_if_needed, payer = authority, space = PriceFeed::DISCRIMINATOR.len() + PriceFeed::INIT_SPACE, - seeds = [PRICE_FEED_SEED, mint.key().as_ref()], + seeds = [PRICE_FEED_SEED, authority.key().as_ref(), mint.key().as_ref()], bump, )] pub price_feed: Account<'info, PriceFeed>, diff --git a/finance/lending/anchor/programs/lending/src/instructions/borrow_obligation_liquidity.rs b/finance/lending/anchor/programs/lending/src/instructions/borrow_obligation_liquidity.rs index 70a4859d..ebd1b411 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/borrow_obligation_liquidity.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/borrow_obligation_liquidity.rs @@ -5,8 +5,8 @@ use anchor_spl::token_interface::{ use crate::constants::FIXED_POINT_SCALE; use crate::errors::LendingError; -use crate::math::{market_value, mul_div_ceil, reserve_signer_seeds, Rounding}; -use crate::state::{Obligation, PriceFeed, Reserve}; +use crate::math::{market_value, mul_div_ceil, Rounding}; +use crate::state::{reserve_signer_seeds, Obligation, PriceFeed, Reserve}; /// Borrow liquidity against the obligation's collateral. The new debt's value /// (rounded up) plus the existing debt must stay within the obligation's @@ -103,6 +103,7 @@ pub struct BorrowObligationLiquidity<'info> { has_one = liquidity_mint, has_one = liquidity_vault, has_one = price_feed, + constraint = reserve.lending_market == obligation.lending_market @ LendingError::MarketMismatch, )] pub reserve: Account<'info, Reserve>, diff --git a/finance/lending/anchor/programs/lending/src/instructions/deposit_obligation_collateral.rs b/finance/lending/anchor/programs/lending/src/instructions/deposit_obligation_collateral.rs index 01bc1610..a33e8bfa 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/deposit_obligation_collateral.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/deposit_obligation_collateral.rs @@ -51,7 +51,10 @@ pub struct DepositObligationCollateral<'info> { #[account(mut)] pub owner: Signer<'info>, - #[account(has_one = share_mint)] + #[account( + has_one = share_mint, + constraint = reserve.lending_market == obligation.lending_market @ LendingError::MarketMismatch, + )] pub reserve: Account<'info, Reserve>, pub share_mint: InterfaceAccount<'info, Mint>, diff --git a/finance/lending/anchor/programs/lending/src/instructions/deposit_reserve_liquidity.rs b/finance/lending/anchor/programs/lending/src/instructions/deposit_reserve_liquidity.rs index 7ae43702..3425497c 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/deposit_reserve_liquidity.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/deposit_reserve_liquidity.rs @@ -4,8 +4,8 @@ use anchor_spl::token_interface::{ }; use crate::errors::LendingError; -use crate::math::{mul_div_floor, reserve_signer_seeds}; -use crate::state::Reserve; +use crate::math::mul_div_floor; +use crate::state::{reserve_signer_seeds, Reserve}; /// Supply liquidity to a reserve and receive share tokens. The first deposit /// mints share tokens 1:1; later deposits mint diff --git a/finance/lending/anchor/programs/lending/src/instructions/liquidate_obligation.rs b/finance/lending/anchor/programs/lending/src/instructions/liquidate_obligation.rs index ec257b74..ee9668fd 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/liquidate_obligation.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/liquidate_obligation.rs @@ -3,16 +3,23 @@ use anchor_spl::token_interface::{ transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, }; -use crate::constants::{BPS_DENOMINATOR, FIXED_POINT_SCALE, OBLIGATION_SEED, OBLIGATION_SHARE_VAULT_SEED}; +use crate::constants::{ + BPS_DENOMINATOR, FIXED_POINT_SCALE, OBLIGATION_SEED, OBLIGATION_SHARE_VAULT_SEED, +}; use crate::errors::LendingError; use crate::math::{market_value, mul_div_ceil, mul_div_floor, value_to_amount, Rounding}; use crate::state::{Obligation, PriceFeed, Reserve}; -/// Repay part of an unhealthy obligation's debt and seize a matching amount of -/// its collateral share tokens plus a bonus. A single liquidation may repay at -/// most the collateral reserve's close factor of the borrow. The seized -/// collateral is valued at the borrow repaid plus the liquidation bonus, all -/// rounded toward the borrower so the obligation is never over-seized. +/// Repay part of an unhealthy obligation's debt and seize collateral share +/// tokens worth the repayment plus the liquidation bonus. +/// +/// The close factor caps how much of the borrow one call may repay; it comes +/// from the repay (borrow) reserve because it is a property of the debt being +/// closed. The liquidation bonus comes from the collateral reserve because it +/// prices the collateral being seized. If the requested repayment would seize +/// more collateral than the obligation holds, the call fails with +/// `LiquidationTooLarge` โ€” silently capping the seizure would make the +/// liquidator pay full price for less collateral. /// /// Self-liquidation (the owner liquidating their own position) is not blocked: /// it is only possible while unhealthy and is economically pointless, matching @@ -28,44 +35,47 @@ pub fn handle_liquidate_obligation( context.accounts.repay_reserve.require_refreshed()?; context.accounts.collateral_reserve.require_refreshed()?; + let obligation = &context.accounts.obligation; + let repay_reserve = &context.accounts.repay_reserve; + let collateral_reserve = &context.accounts.collateral_reserve; + require!( - context.accounts.obligation.borrowed_value > context.accounts.obligation.unhealthy_borrow_value, + obligation.borrowed_value > obligation.unhealthy_borrow_value, LendingError::ObligationHealthy ); - let repay_reserve_key = context.accounts.repay_reserve.key(); - let collateral_reserve_key = context.accounts.collateral_reserve.key(); let repay_price = context.accounts.repay_price_feed.price_scaled(slot)?; let collateral_price = context.accounts.collateral_price_feed.price_scaled(slot)?; - let borrow_index = context.accounts.obligation.find_borrow(repay_reserve_key)?; - let collateral_index = context.accounts.obligation.find_collateral(collateral_reserve_key)?; - let borrowed_scaled = context.accounts.obligation.borrows[borrow_index].borrowed_scaled; - let deposited_shares = context.accounts.obligation.deposits[collateral_index].deposited_shares; + let borrow_index = obligation.find_borrow(repay_reserve.key())?; + let collateral_index = obligation.find_collateral(collateral_reserve.key())?; + let borrowed_scaled = obligation.borrows[borrow_index].borrowed_scaled; + let deposited_shares = obligation.deposits[collateral_index].deposited_shares; // How much debt this liquidation repays, capped by the close factor. - let interest_index = context.accounts.repay_reserve.cumulative_borrow_rate_index; + let interest_index = repay_reserve.cumulative_borrow_rate_index; let debt_now = mul_div_ceil(borrowed_scaled, interest_index, FIXED_POINT_SCALE)?; let debt_now = u64::try_from(debt_now).map_err(|_| LendingError::MathOverflow)?; let max_repay = mul_div_floor( debt_now as u128, - context.accounts.collateral_reserve.config.close_factor_bps as u128, + repay_reserve.config.close_factor_bps as u128, BPS_DENOMINATOR, )?; let repay = liquidity_amount.min(u64::try_from(max_repay).map_err(|_| LendingError::MathOverflow)?); require!(repay > 0, LendingError::ZeroAmount); // Collateral to seize: value of the repayment plus the bonus, converted into - // the collateral token and then into share tokens. Every step rounds down. + // the collateral token and then into share tokens. Every step rounds down, + // toward the borrower, so the obligation is never over-seized by rounding. let repay_value = market_value( repay, - context.accounts.repay_reserve.liquidity_decimals, + repay_reserve.liquidity_decimals, repay_price, Rounding::Down, )?; let bonus_value = mul_div_floor( repay_value, - context.accounts.collateral_reserve.config.liquidation_bonus_bps as u128, + collateral_reserve.config.liquidation_bonus_bps as u128, BPS_DENOMINATOR, )?; let seize_value = repay_value @@ -73,19 +83,21 @@ pub fn handle_liquidate_obligation( .ok_or(LendingError::MathOverflow)?; let seize_liquidity = value_to_amount( seize_value, - context.accounts.collateral_reserve.liquidity_decimals, + collateral_reserve.liquidity_decimals, collateral_price, Rounding::Down, )?; let seize_shares = mul_div_floor( seize_liquidity as u128, - context.accounts.collateral_reserve.share_mint_supply as u128, - context.accounts.collateral_reserve.total_liquidity()?.max(1), + collateral_reserve.share_mint_supply as u128, + collateral_reserve.total_liquidity()?.max(1), )?; - let seize_shares = u64::try_from(seize_shares) - .map_err(|_| LendingError::MathOverflow)? - .min(deposited_shares); + let seize_shares = u64::try_from(seize_shares).map_err(|_| LendingError::MathOverflow)?; require!(seize_shares > 0, LendingError::ZeroAmount); + require!( + seize_shares <= deposited_shares, + LendingError::LiquidationTooLarge + ); let scaled_removed = mul_div_floor(repay as u128, FIXED_POINT_SCALE, interest_index)?.min(borrowed_scaled); @@ -166,9 +178,15 @@ pub struct LiquidateObligation<'info> { pub liquidator: Signer<'info>, - #[account(mut)] + #[account( + mut, + constraint = repay_reserve.lending_market == obligation.lending_market @ LendingError::MarketMismatch, + )] pub repay_reserve: Box>, + #[account( + constraint = collateral_reserve.lending_market == obligation.lending_market @ LendingError::MarketMismatch, + )] pub collateral_reserve: Box>, #[account(address = repay_reserve.price_feed)] diff --git a/finance/lending/anchor/programs/lending/src/instructions/redeem_reserve_collateral.rs b/finance/lending/anchor/programs/lending/src/instructions/redeem_reserve_collateral.rs index 6d0309b0..459b56cf 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/redeem_reserve_collateral.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/redeem_reserve_collateral.rs @@ -4,8 +4,8 @@ use anchor_spl::token_interface::{ }; use crate::errors::LendingError; -use crate::math::{mul_div_floor, reserve_signer_seeds}; -use crate::state::Reserve; +use crate::math::mul_div_floor; +use crate::state::{reserve_signer_seeds, Reserve}; /// Burn share tokens and withdraw the underlying liquidity they represent: /// `share_amount * total_liquidity / share_supply`, floored so the protocol diff --git a/finance/lending/anchor/programs/lending/src/instructions/refresh_obligation.rs b/finance/lending/anchor/programs/lending/src/instructions/refresh_obligation.rs index 440c5096..2333dad9 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/refresh_obligation.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/refresh_obligation.rs @@ -18,6 +18,7 @@ use crate::state::{Obligation, PriceFeed, Reserve}; pub fn handle_refresh_obligation(context: Context) -> Result<()> { let slot = Clock::get()?.slot; let obligation = &mut context.accounts.obligation; + let lending_market = obligation.lending_market; let accounts = context.remaining_accounts; let mut cursor = 0usize; @@ -26,7 +27,8 @@ pub fn handle_refresh_obligation(context: Context) -> Result< let mut unhealthy_borrow_value: u128 = 0; for collateral in obligation.deposits.iter_mut() { - let (reserve, price_scaled) = read_pair(accounts, &mut cursor, collateral.reserve, slot)?; + let (reserve, price_scaled) = + read_pair(accounts, &mut cursor, collateral.reserve, lending_market, slot)?; let liquidity = mul_div_floor( collateral.deposited_shares as u128, @@ -58,7 +60,8 @@ pub fn handle_refresh_obligation(context: Context) -> Result< let mut borrowed_value: u128 = 0; for borrow in obligation.borrows.iter_mut() { - let (reserve, price_scaled) = read_pair(accounts, &mut cursor, borrow.reserve, slot)?; + let (reserve, price_scaled) = + read_pair(accounts, &mut cursor, borrow.reserve, lending_market, slot)?; let debt = mul_div_ceil( borrow.borrowed_scaled, @@ -89,12 +92,14 @@ pub fn handle_refresh_obligation(context: Context) -> Result< } /// Read the next `[reserve, price_feed]` pair from `remaining_accounts`, -/// checking it matches the obligation's stored reserve and that both the -/// reserve (refreshed this slot) and the price (fresh) are usable. +/// checking it matches the obligation's stored reserve, belongs to the +/// obligation's lending market, and that both the reserve (refreshed this +/// slot) and the price (fresh) are usable. fn read_pair<'a, 'info>( accounts: &'a [AccountInfo<'info>], cursor: &mut usize, expected_reserve: Pubkey, + lending_market: Pubkey, slot: u64, ) -> Result<(Reserve, u128)> where @@ -114,6 +119,11 @@ where LendingError::InvalidObligationAccount ); let reserve = Account::::try_from(reserve_info)?; + require_keys_eq!( + reserve.lending_market, + lending_market, + LendingError::MarketMismatch + ); reserve.require_refreshed()?; require_keys_eq!( diff --git a/finance/lending/anchor/programs/lending/src/instructions/repay_obligation_liquidity.rs b/finance/lending/anchor/programs/lending/src/instructions/repay_obligation_liquidity.rs index acce54e1..ecf671f9 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/repay_obligation_liquidity.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/repay_obligation_liquidity.rs @@ -82,6 +82,7 @@ pub struct RepayObligationLiquidity<'info> { mut, has_one = liquidity_mint, has_one = liquidity_vault, + constraint = reserve.lending_market == obligation.lending_market @ LendingError::MarketMismatch, )] pub reserve: Account<'info, Reserve>, diff --git a/finance/lending/anchor/programs/lending/src/instructions/withdraw_obligation_collateral.rs b/finance/lending/anchor/programs/lending/src/instructions/withdraw_obligation_collateral.rs index c272aac3..a38860b8 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/withdraw_obligation_collateral.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/withdraw_obligation_collateral.rs @@ -5,7 +5,7 @@ use anchor_spl::token_interface::{ use crate::constants::{BPS_DENOMINATOR, OBLIGATION_SEED, OBLIGATION_SHARE_VAULT_SEED}; use crate::errors::LendingError; -use crate::math::{market_value, mul_div_floor, Rounding}; +use crate::math::{market_value, mul_div_ceil, Rounding}; use crate::state::{Obligation, PriceFeed, Reserve}; /// Withdraw posted share-token collateral, but only as long as the obligation @@ -32,7 +32,11 @@ pub fn handle_withdraw_obligation_collateral( ); // Value of the collateral being removed, and the borrow power it backed. - let removed_liquidity = mul_div_floor( + // Every step rounds UP: subtracting an over-estimate of the removed borrow + // power guarantees the resulting allowance is never higher than a full + // recompute would give, so independent flooring can't let a withdraw + // squeak past the health check by a rounding sub-unit. + let removed_liquidity = mul_div_ceil( share_amount as u128, reserve.total_liquidity()?, (reserve.share_mint_supply as u128).max(1), @@ -42,17 +46,19 @@ pub fn handle_withdraw_obligation_collateral( removed_liquidity, reserve.liquidity_decimals, price_scaled, - Rounding::Down, + Rounding::Up, )?; - let removed_allowed = mul_div_floor( + let removed_allowed = mul_div_ceil( removed_value, reserve.config.loan_to_value_bps as u128, BPS_DENOMINATOR, )?; + // saturating_sub is correct here (and not balance math): the ceil-rounded + // removal can exceed the floor-cached total by a sub-unit when withdrawing + // everything, and zero remaining allowance is the conservative answer. let new_allowed_borrow_value = obligation .allowed_borrow_value - .checked_sub(removed_allowed) - .ok_or(LendingError::MathOverflow)?; + .saturating_sub(removed_allowed); require!( obligation.borrowed_value <= new_allowed_borrow_value, LendingError::WithdrawTooLarge @@ -102,7 +108,11 @@ pub struct WithdrawObligationCollateral<'info> { pub owner: Signer<'info>, - #[account(has_one = share_mint, has_one = price_feed)] + #[account( + has_one = share_mint, + has_one = price_feed, + constraint = reserve.lending_market == obligation.lending_market @ LendingError::MarketMismatch, + )] pub reserve: Account<'info, Reserve>, pub price_feed: Account<'info, PriceFeed>, diff --git a/finance/lending/anchor/programs/lending/src/math.rs b/finance/lending/anchor/programs/lending/src/math.rs index 7731fec4..26dc107d 100644 --- a/finance/lending/anchor/programs/lending/src/math.rs +++ b/finance/lending/anchor/programs/lending/src/math.rs @@ -1,6 +1,6 @@ use anchor_lang::prelude::*; -use crate::constants::{FIXED_POINT_SCALE_DECIMALS, RESERVE_SEED}; +use crate::constants::FIXED_POINT_SCALE_DECIMALS; use crate::errors::LendingError; /// Which way to break ties when a division truncates. Deposits/redeems and @@ -99,18 +99,3 @@ pub fn price_mantissa_to_scaled(mantissa: u128, exponent: i32) -> Result { .ok_or(LendingError::MathOverflow)?) } } - -/// Signer seeds for a reserve PDA, which is the authority over its liquidity -/// vault and the mint authority of its share token. -pub fn reserve_signer_seeds<'a>( - lending_market: &'a Pubkey, - liquidity_mint: &'a Pubkey, - bump: &'a [u8; 1], -) -> [&'a [u8]; 4] { - [ - RESERVE_SEED, - lending_market.as_ref(), - liquidity_mint.as_ref(), - bump, - ] -} diff --git a/finance/lending/anchor/programs/lending/src/state/price_feed.rs b/finance/lending/anchor/programs/lending/src/state/price_feed.rs index 52aa8978..ba876797 100644 --- a/finance/lending/anchor/programs/lending/src/state/price_feed.rs +++ b/finance/lending/anchor/programs/lending/src/state/price_feed.rs @@ -5,6 +5,9 @@ use crate::errors::LendingError; use crate::math::price_mantissa_to_scaled; /// A price for one token, denominated in the market's quote currency. +/// PDA seeds: `[b"price_feed", authority, mint]` โ€” the writer is part of the +/// address, so no two authorities can contend for the same feed account, and a +/// reserve trusts exactly the feed its market owner selected at `init_reserve`. /// /// The layout mirrors a Switchboard On-Demand pull feed: a signed mantissa plus /// an exponent (`price = price_mantissa * 10^exponent`) and the slot the value @@ -13,6 +16,8 @@ use crate::math::price_mantissa_to_scaled; /// (`PullFeedAccountData`): `price_mantissa = current_result.value`, /// `exponent = -18`, `last_updated_slot = current_result.slot`. Here the /// `set_price` handler writes it directly so LiteSVM tests are deterministic. +/// A production read should also reject results whose confidence interval is +/// too wide; this stand-in has no confidence field to check. #[account] #[derive(InitSpace)] pub struct PriceFeed { @@ -24,8 +29,9 @@ pub struct PriceFeed { pub last_updated_slot: u64, - /// Account permitted to call `set_price`. In production this field is unused - /// because the feed is owned by Switchboard, not this program. + /// The signer whose key is in this feed's PDA seeds; the only account that + /// can write it. In production this field does not exist โ€” the feed is + /// owned and written by Switchboard. pub authority: Pubkey, pub bump: u8, diff --git a/finance/lending/anchor/programs/lending/src/state/reserve.rs b/finance/lending/anchor/programs/lending/src/state/reserve.rs index 2880ad23..e5199977 100644 --- a/finance/lending/anchor/programs/lending/src/state/reserve.rs +++ b/finance/lending/anchor/programs/lending/src/state/reserve.rs @@ -1,9 +1,24 @@ use anchor_lang::prelude::*; -use crate::constants::{BPS_DENOMINATOR, FIXED_POINT_SCALE, SLOTS_PER_YEAR}; +use crate::constants::{BPS_DENOMINATOR, FIXED_POINT_SCALE, RESERVE_SEED, SLOTS_PER_YEAR}; use crate::errors::LendingError; use crate::math::{mul_div_ceil, mul_div_floor}; +/// Signer seeds for a reserve PDA, which is the authority over its liquidity +/// vault and the mint authority of its share token. +pub fn reserve_signer_seeds<'a>( + lending_market: &'a Pubkey, + liquidity_mint: &'a Pubkey, + bump: &'a [u8; 1], +) -> [&'a [u8]; 4] { + [ + RESERVE_SEED, + lending_market.as_ref(), + liquidity_mint.as_ref(), + bump, + ] +} + /// One asset's lending pool. Suppliers deposit `liquidity_mint` tokens into /// `liquidity_vault` and receive share tokens (`share_mint`); the share-to- /// liquidity exchange rate rises as borrowers pay interest. Borrowers draw @@ -33,7 +48,11 @@ pub struct Reserve { pub available_liquidity: u64, /// Outstanding share-token supply, tracked here so valuations need only the - /// reserve account (not the mint) to convert shares to liquidity. + /// reserve account (not the mint) to convert shares to liquidity. A holder + /// burning share tokens directly via the token program (outside this + /// program) makes the real mint supply drift below this mirror; that drift + /// only lowers what the burner could have redeemed, so the pool never pays + /// out more than it holds. pub share_mint_supply: u64, /// Total borrowed principal, scaled so that the live debt is diff --git a/finance/lending/anchor/programs/lending/tests/common/mod.rs b/finance/lending/anchor/programs/lending/tests/common/mod.rs index 4204b4a0..a4d73c65 100644 --- a/finance/lending/anchor/programs/lending/tests/common/mod.rs +++ b/finance/lending/anchor/programs/lending/tests/common/mod.rs @@ -119,54 +119,52 @@ impl Env { self.svm.get_sysvar::().slot } - /// Advance time so interest accrues and blockhashes differ. - pub fn warp_slots(&mut self, slots: u64) { - let target = self.current_slot() + slots; - self.svm.warp_to_slot(target); - self.svm.expire_blockhash(); - } - - pub fn set_price(&mut self, mint: Pubkey, price_mantissa: i128) { - let price_feed = pda(&[PRICE_FEED_SEED, mint.as_ref()]); + /// Create a second lending market owned by `market_owner`, for tests that + /// exercise cross-market isolation. + pub fn init_market_for(&mut self, market_owner: &Keypair) -> Pubkey { + let env_owner = self.owner.insecure_clone(); + let quote_mint = create_token_mint(&mut self.svm, &env_owner, 6, None).unwrap(); + let market = pda(&[LENDING_MARKET_SEED, market_owner.pubkey().as_ref()]); let instruction = Instruction { program_id: lending::id(), - accounts: lending::accounts::SetPrice { - price_feed, - authority: self.owner.pubkey(), - mint, + accounts: lending::accounts::InitLendingMarket { + lending_market: market, + owner: market_owner.pubkey(), + quote_currency_mint: quote_mint, system_program: system_program::id(), } .to_account_metas(None), - data: lending::instruction::SetPrice { - price_mantissa, - exponent: PRICE_EXPONENT, - } - .data(), + data: lending::instruction::InitLendingMarket {}.data(), }; - let owner = self.owner.insecure_clone(); - send(&mut self.svm, vec![instruction], &[&owner], &owner.pubkey()).unwrap(); + send(&mut self.svm, vec![instruction], &[market_owner], &market_owner.pubkey()).unwrap(); + market } - pub fn add_reserve( + /// Add a reserve to a market other than the default one. The mint and price + /// feed are still created/written by the env owner (a reserve trusts + /// whichever feed its market owner registers; the writer need not match). + pub fn add_reserve_to( &mut self, + market_owner: &Keypair, + market: Pubkey, decimals: u8, price_mantissa: i128, config: ReserveConfig, ) -> ReserveHandle { - let owner = self.owner.insecure_clone(); - let mint = create_token_mint(&mut self.svm, &owner, decimals, None).unwrap(); + let env_owner = self.owner.insecure_clone(); + let mint = create_token_mint(&mut self.svm, &env_owner, decimals, None).unwrap(); self.set_price(mint, price_mantissa); - let reserve = pda(&[RESERVE_SEED, self.market.as_ref(), mint.as_ref()]); + let reserve = pda(&[RESERVE_SEED, market.as_ref(), mint.as_ref()]); let share_mint = pda(&[SHARE_MINT_SEED, reserve.as_ref()]); let liquidity_vault = pda(&[LIQUIDITY_VAULT_SEED, reserve.as_ref()]); - let price_feed = pda(&[PRICE_FEED_SEED, mint.as_ref()]); + let price_feed = self.price_feed_address(mint); let instruction = Instruction { program_id: lending::id(), accounts: lending::accounts::InitReserve { - lending_market: self.market, - owner: owner.pubkey(), + lending_market: market, + owner: market_owner.pubkey(), reserve, liquidity_mint: mint, liquidity_vault, @@ -178,7 +176,7 @@ impl Env { .to_account_metas(None), data: lending::instruction::InitReserve { config }.data(), }; - send(&mut self.svm, vec![instruction], &[&owner], &owner.pubkey()).unwrap(); + send(&mut self.svm, vec![instruction], &[market_owner], &market_owner.pubkey()).unwrap(); ReserveHandle { mint, @@ -190,6 +188,51 @@ impl Env { } } + /// Advance time so interest accrues and blockhashes differ. + pub fn warp_slots(&mut self, slots: u64) { + let target = self.current_slot() + slots; + self.svm.warp_to_slot(target); + self.svm.expire_blockhash(); + } + + /// The feed PDA the market owner writes for `mint`: seeded by the owner's + /// key, so it is the feed `add_reserve` registers reserves against. + pub fn price_feed_address(&self, mint: Pubkey) -> Pubkey { + pda(&[PRICE_FEED_SEED, self.owner.pubkey().as_ref(), mint.as_ref()]) + } + + pub fn set_price(&mut self, mint: Pubkey, price_mantissa: i128) { + let price_feed = self.price_feed_address(mint); + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::SetPrice { + price_feed, + authority: self.owner.pubkey(), + mint, + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::SetPrice { + price_mantissa, + exponent: PRICE_EXPONENT, + } + .data(), + }; + let owner = self.owner.insecure_clone(); + send(&mut self.svm, vec![instruction], &[&owner], &owner.pubkey()).unwrap(); + } + + pub fn add_reserve( + &mut self, + decimals: u8, + price_mantissa: i128, + config: ReserveConfig, + ) -> ReserveHandle { + let owner = self.owner.insecure_clone(); + let market = self.market; + self.add_reserve_to(&owner, market, decimals, price_mantissa, config) + } + pub fn try_update_config( &mut self, handle: &ReserveHandle, @@ -332,13 +375,13 @@ impl Env { ]) } - pub fn post_collateral( + pub fn try_post_collateral( &mut self, user: &Keypair, obligation: Pubkey, handle: &ReserveHandle, share_amount: u64, - ) { + ) -> Result<(), String> { let user_share = ata(&user.pubkey(), &handle.share_mint); let vault = self.obligation_share_vault(handle, obligation); let instruction = Instruction { @@ -356,7 +399,18 @@ impl Env { .to_account_metas(None), data: lending::instruction::DepositObligationCollateral { share_amount }.data(), }; - send(&mut self.svm, vec![instruction], &[user], &user.pubkey()).unwrap(); + send(&mut self.svm, vec![instruction], &[user], &user.pubkey()) + } + + pub fn post_collateral( + &mut self, + user: &Keypair, + obligation: Pubkey, + handle: &ReserveHandle, + share_amount: u64, + ) { + self.try_post_collateral(user, obligation, handle, share_amount) + .unwrap() } fn refresh_obligation_ix( @@ -537,13 +591,18 @@ impl Env { amount: u64, ) -> Result<(), String> { let repay_source = ata(&liquidator.pubkey(), &repay.mint); - let collateral_dest = create_associated_token_account( - &mut self.svm, - &liquidator.pubkey(), - &collateral.share_mint, - liquidator, - ) - .unwrap(); + // Create the destination ATA only on the first call, so a test can + // attempt several liquidations. + let collateral_dest = ata(&liquidator.pubkey(), &collateral.share_mint); + if self.svm.get_account(&collateral_dest).is_none() { + create_associated_token_account( + &mut self.svm, + &liquidator.pubkey(), + &collateral.share_mint, + liquidator, + ) + .unwrap(); + } let vault = self.obligation_share_vault(collateral, obligation); let mut all: Vec<&ReserveHandle> = deposit_reserves.to_vec(); diff --git a/finance/lending/anchor/programs/lending/tests/test_liquidation.rs b/finance/lending/anchor/programs/lending/tests/test_liquidation.rs index 66284d85..57c99e8a 100644 --- a/finance/lending/anchor/programs/lending/tests/test_liquidation.rs +++ b/finance/lending/anchor/programs/lending/tests/test_liquidation.rs @@ -98,3 +98,41 @@ fn unhealthy_obligation_liquidated_with_bonus_capped_by_close_factor() { let obligation_state = env.obligation(obligation); assert_eq!(obligation_state.deposits[0].deposited_shares, 1_000_000_000 - 459_375_000); } + +/// A repayment whose seizure would exceed the posted collateral is rejected +/// rather than silently capped โ€” silently capping would make the liquidator +/// pay full price for less collateral. A smaller repayment still works. +#[test] +fn over_seizing_liquidation_rejected_smaller_succeeds() { + let (mut env, collateral, borrow, _borrower, obligation, liquidator) = setup(); + + // Collateral crashes to $0.10: $100 of collateral against $700 of debt. + // The close-factor max repay ($350, plus 5% bonus => $367.50 of collateral) + // would seize far more than the $100 posted. + env.set_price(collateral.mint, cents(10)); + + let over_seize = env.try_liquidate( + &liquidator, + obligation, + &[&collateral], + &[&borrow], + &borrow, + &collateral, + 350_000_000, + ); + assert!(over_seize.unwrap_err().contains("LiquidationTooLarge")); + + // Repaying $50 seizes $52.50 of collateral = 525 units at $0.10 โ€” fits. + env.try_liquidate( + &liquidator, + obligation, + &[&collateral], + &[&borrow], + &borrow, + &collateral, + 50_000_000, + ) + .unwrap(); + let liquidator_collateral_account = ata(&liquidator.pubkey(), &collateral.share_mint); + assert_eq!(env.token_balance(liquidator_collateral_account), 525_000_000); +} diff --git a/finance/lending/anchor/programs/lending/tests/test_security.rs b/finance/lending/anchor/programs/lending/tests/test_security.rs new file mode 100644 index 00000000..89466494 --- /dev/null +++ b/finance/lending/anchor/programs/lending/tests/test_security.rs @@ -0,0 +1,76 @@ +mod common; + +use anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + InstructionData, ToAccountMetas, +}; +use common::{default_config, dollars, Env}; +use solana_signer::Signer; + +/// A reserve from one lending market cannot be used with an obligation from +/// another: lending markets are isolation boundaries. +#[test] +fn cross_market_reserve_is_rejected() { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + + // A second market with its own reserve. + let other_owner = env.create_user(); + let other_market = env.init_market_for(&other_owner); + let foreign_reserve = + env.add_reserve_to(&other_owner, other_market, 6, dollars(1), default_config()); + + // A borrower set up in the FIRST market. + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.init_obligation(&borrower); + + // Posting collateral via the second market's reserve must fail before any + // token movement. + env.fund(&borrower, foreign_reserve.share_mint, 0); // create the share ATA + let result = env.try_post_collateral(&borrower, obligation, &foreign_reserve, 1); + assert!( + result.unwrap_err().contains("MarketMismatch"), + "a reserve from another lending market must be rejected" + ); +} + +/// The price feed PDA is seeded by its authority, so no signer can write (or +/// pre-claim) the feed another authority's reserves trust. +#[test] +fn foreign_signer_cannot_write_owner_price_feed() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, dollars(1), default_config()); + + let attacker = env.create_user(); + let owner_feed = env.price_feed_address(usdc.mint); + + // The attacker targets the owner's feed address while signing as themself. + // The seeds [b"price_feed", authority, mint] cannot match, so this fails. + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::SetPrice { + price_feed: owner_feed, + authority: attacker.pubkey(), + mint: usdc.mint, + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::SetPrice { + price_mantissa: common::dollars(1_000_000), // an absurd price + exponent: common::PRICE_EXPONENT, + } + .data(), + }; + let result = solana_kite::send_transaction_from_instructions( + &mut env.svm, + vec![instruction], + &[&attacker], + &attacker.pubkey(), + ); + assert!( + result.is_err(), + "only the authority in a feed's seeds may write that feed" + ); +} From 2e8e8100c1d825e7dbe1d2d391ba63914aca31d6 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 12 Jun 2026 21:05:44 +0000 Subject: [PATCH 088/138] Mirror security hardening into the Quasar lending port Applies the same fixes as the Anchor version: - Price feed PDAs seeded [b"price_feed", authority, mint]; init_reserve binds each reserve to the feed written by its market owner, removing the first-caller-claims race and the claim branch in set_price. - deposit_obligation_collateral now requires the reserve to belong to the obligation's lending market (the one handler that was missing the check; the others already enforce it via has_one or stored-key equality). - Liquidation reads the close factor from the borrow reserve (a property of the debt) and rejects repayments whose seizure would exceed posted collateral (LiquidationTooLarge) instead of silently capping. https://claude.ai/code/session_01RwE8f8ahP5S6SDNTsXmpj9 --- finance/lending/quasar/CHANGELOG.md | 5 +++++ finance/lending/quasar/README.md | 12 ++++++++++-- finance/lending/quasar/src/error.rs | 1 + .../lending/quasar/src/instructions/admin.rs | 16 +++++++--------- .../lending/quasar/src/instructions/position.rs | 17 +++++++++++------ finance/lending/quasar/src/state.rs | 10 ++++++---- finance/lending/quasar/src/tests.rs | 5 +++-- 7 files changed, 43 insertions(+), 23 deletions(-) diff --git a/finance/lending/quasar/CHANGELOG.md b/finance/lending/quasar/CHANGELOG.md index 1e804dad..d52a8d03 100644 --- a/finance/lending/quasar/CHANGELOG.md +++ b/finance/lending/quasar/CHANGELOG.md @@ -14,3 +14,8 @@ Initial Quasar port of the Kamino/Solend-style borrow/lend program. - Switchboard-On-Demand-shaped price feed with a `set_price` test writer. - quasar-svm integration tests covering supply/redeem, borrow/repay, interest accrual, and liquidation (including the healthy-rejection path). +- Price feed PDAs are seeded by their authority, so no signer can write or + pre-claim a feed another authority's reserves trust. +- Liquidation reads the close factor from the borrow reserve, and rejects + repayments whose seizure would exceed posted collateral + (`LiquidationTooLarge`). diff --git a/finance/lending/quasar/README.md b/finance/lending/quasar/README.md index a8adeb03..8c624583 100644 --- a/finance/lending/quasar/README.md +++ b/finance/lending/quasar/README.md @@ -38,8 +38,16 @@ Everything else mirrors the Anchor version. deposited share amount, plus the borrow reserve and scaled debt. PDA: `["obligation", market, owner]`. - **`PriceFeed`** โ€” a Switchboard-On-Demand-shaped price (`mantissa * 10^exponent` - + slot). `set_price` writes it directly for deterministic tests; in production a - reserve points at the real Switchboard feed. Freshness is checked in slots. + + slot). PDA: `["price_feed", authority, mint]` โ€” the writer is part of the + address, so no signer can write or pre-claim another authority's feed, and each + reserve is bound to the feed its market owner registered. `set_price` writes it + directly for deterministic tests; in production a reserve points at the real + Switchboard feed. Freshness is checked in slots. +- **Liquidation** โ€” the close factor (max fraction of the debt one call repays) + comes from the borrow reserve; the bonus from the collateral reserve. A + repayment whose seizure would exceed the posted collateral fails with + `LiquidationTooLarge` rather than silently seizing less, which would make the + liquidator overpay. - **Share tokens** โ€” supplying mints them, redeeming burns them; the exchange rate `total_liquidity / share_supply` rises as borrowers pay interest. `available_liquidity` (not the vault's raw balance) is the source of truth, so a diff --git a/finance/lending/quasar/src/error.rs b/finance/lending/quasar/src/error.rs index 45a11189..110afb3e 100644 --- a/finance/lending/quasar/src/error.rs +++ b/finance/lending/quasar/src/error.rs @@ -15,4 +15,5 @@ pub enum LendingError { WithdrawTooLarge, ObligationHealthy, WrongReserve, + LiquidationTooLarge, } diff --git a/finance/lending/quasar/src/instructions/admin.rs b/finance/lending/quasar/src/instructions/admin.rs index b8f41cf5..83e4b2cf 100644 --- a/finance/lending/quasar/src/instructions/admin.rs +++ b/finance/lending/quasar/src/instructions/admin.rs @@ -1,7 +1,6 @@ use { crate::{ constants::{MINT_SPACE, TOKEN_ACCOUNT_SPACE}, - error::LendingError, logic::now, math::validate_config, state::{ @@ -58,7 +57,9 @@ pub struct InitReserve { /// Created and initialized as a share-token mint (authority = reserve) in the handler. #[account(mut, address = ShareMintPda::seeds(reserve.address()))] pub share_mint: UncheckedAccount, - #[account(address = PriceFeed::seeds(liquidity_mint.address()))] + // The reserve trusts the feed written by the market owner: feed PDAs are + // seeded by their authority, so this binds the reserve to the owner's feed. + #[account(address = PriceFeed::seeds(owner.address(), liquidity_mint.address()))] pub price_feed: Account, pub token_program: Program, pub system_program: Program, @@ -178,7 +179,10 @@ impl InitReserve { pub struct SetPrice { #[account(mut)] pub authority: Signer, - #[account(init(idempotent), payer = authority, address = PriceFeed::seeds(mint.address()))] + // The authority is part of the seeds: a signer can only ever address (and + // therefore write) the feed derived from their own key, so there is no + // shared per-mint feed to claim first. + #[account(init(idempotent), payer = authority, address = PriceFeed::seeds(authority.address(), mint.address()))] pub price_feed: Account, pub mint: Account, pub system_program: Program, @@ -192,12 +196,6 @@ impl SetPrice { exponent: i32, bumps: &SetPriceBumps, ) -> Result<(), ProgramError> { - // On first creation the stored authority is the zero address; claim it. - // Afterwards only that authority may update the feed. - let existing = self.price_feed.authority; - if existing != Address::default() { - require_keys_eq!(existing, *self.authority.address(), LendingError::InvalidConfig); - } self.price_feed.set_inner(PriceFeedInner { mint: *self.mint.address(), price_mantissa, diff --git a/finance/lending/quasar/src/instructions/position.rs b/finance/lending/quasar/src/instructions/position.rs index 008b4a81..96e4fd06 100644 --- a/finance/lending/quasar/src/instructions/position.rs +++ b/finance/lending/quasar/src/instructions/position.rs @@ -67,7 +67,7 @@ pub struct DepositObligationCollateral { pub lending_market: Account, #[account(mut, has_one(owner), has_one(lending_market), address = Obligation::seeds(lending_market.address(), owner.address()))] pub obligation: Account, - #[account(has_one(share_mint))] + #[account(has_one(share_mint), has_one(lending_market))] pub reserve: Account, pub share_mint: Account, #[account( @@ -497,8 +497,9 @@ impl LiquidateObligation { let debt_value = market_value(debt, borrow.liquidity_decimals, borrow_price, Rounding::Up)?; require!(debt_value > unhealthy_threshold, LendingError::ObligationHealthy); - // Repay capped by the close factor. - let max_repay = mul_div_floor(debt as u128, collateral.close_factor_bps as u128, BPS_DENOMINATOR)?; + // Repay capped by the close factor โ€” taken from the borrow reserve + // because it is a property of the debt being closed. + let max_repay = mul_div_floor(debt as u128, borrow.close_factor_bps as u128, BPS_DENOMINATOR)?; let repay = amount.min(u64::try_from(max_repay).map_err(|_| LendingError::MathOverflow)?); require!(repay > 0, LendingError::ZeroAmount); @@ -512,10 +513,14 @@ impl LiquidateObligation { collateral.share_mint_supply as u128, collateral_total.max(1), )?; - let seize_shares = u64::try_from(seize_shares) - .map_err(|_| LendingError::MathOverflow)? - .min(obligation.deposited_shares); + let seize_shares = u64::try_from(seize_shares).map_err(|_| LendingError::MathOverflow)?; require!(seize_shares > 0, LendingError::ZeroAmount); + // Reject rather than silently seize less: a capped seizure would make + // the liquidator pay full price for less collateral. + require!( + seize_shares <= obligation.deposited_shares, + LendingError::LiquidationTooLarge + ); let scaled_removed = mul_div_floor(repay as u128, SCALE, borrow.cumulative_borrow_rate_index)? .min(obligation.borrowed_scaled); diff --git a/finance/lending/quasar/src/state.rs b/finance/lending/quasar/src/state.rs index 69188285..04c3bcf9 100644 --- a/finance/lending/quasar/src/state.rs +++ b/finance/lending/quasar/src/state.rs @@ -55,11 +55,13 @@ pub struct Obligation { pub bump: u8, } -/// Switchboard-On-Demand-shaped price feed. PDA: `["price_feed", mint]`. -/// `price = price_mantissa * 10^exponent`; freshness is checked in slots. -/// In production this account would be the real Switchboard feed. +/// Switchboard-On-Demand-shaped price feed. PDA: `["price_feed", authority, mint]` +/// โ€” the writer is part of the address, so no two authorities can contend for +/// the same feed, and a reserve trusts exactly the feed its market owner passed +/// to `init_reserve`. `price = price_mantissa * 10^exponent`; freshness is +/// checked in slots. In production this account would be the real Switchboard feed. #[account(discriminator = 4, set_inner)] -#[seeds(b"price_feed", mint: Address)] +#[seeds(b"price_feed", authority: Address, mint: Address)] pub struct PriceFeed { pub mint: Address, pub price_mantissa: i128, diff --git a/finance/lending/quasar/src/tests.rs b/finance/lending/quasar/src/tests.rs index 42eb7691..3a522997 100644 --- a/finance/lending/quasar/src/tests.rs +++ b/finance/lending/quasar/src/tests.rs @@ -130,8 +130,9 @@ impl World { let (borrow_vault, _) = pda(&[b"liquidity_vault", borrow_reserve.as_ref()]); let (coll_share_mint, _) = pda(&[b"share_mint", coll_reserve.as_ref()]); let (borrow_share_mint, _) = pda(&[b"share_mint", borrow_reserve.as_ref()]); - let (coll_price, _) = pda(&[b"price_feed", COLL_MINT.as_ref()]); - let (borrow_price, _) = pda(&[b"price_feed", BORROW_MINT.as_ref()]); + // Feed PDAs are seeded by their writing authority (the market owner here). + let (coll_price, _) = pda(&[b"price_feed", OWNER.as_ref(), COLL_MINT.as_ref()]); + let (borrow_price, _) = pda(&[b"price_feed", OWNER.as_ref(), BORROW_MINT.as_ref()]); let (obligation, _) = pda(&[b"obligation", market.as_ref(), BORROWER.as_ref()]); let (obligation_vault, _) = pda(&[b"obligation_vault", coll_reserve.as_ref(), obligation.as_ref()]); From 7dbaf8a45b72dd9d46de2c4ac904fefec0c38a9e Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 14 Jun 2026 20:42:00 +0000 Subject: [PATCH 089/138] Add reserve factor so the market owner earns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Borrowers owe the full interest, but suppliers no longer receive all of it: each accrual now keeps `reserve_factor_bps` of the freshly accrued interest in the reserve's `accumulated_protocol_fees`, and the market owner withdraws it with a new `collect_protocol_fees` handler. The fees are carved out of `total_liquidity` (utilization still uses gross liquidity), so they never lift the supplier exchange rate, and collection is capped by the vault's available liquidity. This spread between the borrow and supply rates is the protocol's revenue โ€” the missing profit motive for the market owner. Applied to both the Anchor and Quasar versions, with tests asserting fees accrue at the configured factor and that the owner collects them, plus README and CHANGELOG updates. https://claude.ai/code/session_01RwE8f8ahP5S6SDNTsXmpj9 --- finance/lending/anchor/CHANGELOG.md | 3 + finance/lending/anchor/README.md | 18 ++++- .../anchor/programs/lending/src/errors.rs | 2 + .../admin/collect_protocol_fees.rs | 81 +++++++++++++++++++ .../src/instructions/admin/init_reserve.rs | 1 + .../lending/src/instructions/admin/mod.rs | 2 + .../anchor/programs/lending/src/lib.rs | 4 + .../programs/lending/src/state/reserve.rs | 52 ++++++++++-- .../programs/lending/tests/common/mod.rs | 33 +++++++- .../programs/lending/tests/test_interest.rs | 45 +++++++++++ finance/lending/quasar/CHANGELOG.md | 2 + finance/lending/quasar/README.md | 8 +- finance/lending/quasar/src/error.rs | 1 + .../lending/quasar/src/instructions/admin.rs | 72 ++++++++++++++++- .../quasar/src/instructions/position.rs | 11 ++- .../lending/quasar/src/instructions/supply.rs | 8 +- finance/lending/quasar/src/lib.rs | 7 ++ finance/lending/quasar/src/logic.rs | 26 +++++- finance/lending/quasar/src/math.rs | 19 ++++- finance/lending/quasar/src/state.rs | 6 ++ finance/lending/quasar/src/tests.rs | 43 +++++++++- 21 files changed, 419 insertions(+), 25 deletions(-) create mode 100644 finance/lending/anchor/programs/lending/src/instructions/admin/collect_protocol_fees.rs diff --git a/finance/lending/anchor/CHANGELOG.md b/finance/lending/anchor/CHANGELOG.md index 3c648ce8..2eaa9500 100644 --- a/finance/lending/anchor/CHANGELOG.md +++ b/finance/lending/anchor/CHANGELOG.md @@ -24,3 +24,6 @@ Initial lending program: a Kamino/Solend-style borrow/lend market. posted collateral (`LiquidationTooLarge`). - Withdraw health checks round the removed borrow power up, so independent rounding can never let a withdraw pass that an exact recompute would reject. +- Reserve factor: the protocol keeps `reserve_factor_bps` of accrued interest as + fees the market owner withdraws with `collect_protocol_fees`; the fees are + carved out of `total_liquidity` so they never inflate the supplier exchange rate. diff --git a/finance/lending/anchor/README.md b/finance/lending/anchor/README.md index 76f4a074..c0a0e937 100644 --- a/finance/lending/anchor/README.md +++ b/finance/lending/anchor/README.md @@ -60,6 +60,16 @@ utilization. Each borrow stores its principal as **scaled debt** (principal รท index at borrow time), so every obligation's debt grows automatically as the index advances โ€” no per-obligation accrual loop. +### Protocol fees (how the market earns) + +Borrowers owe the full interest, but suppliers don't receive all of it. On each +accrual the reserve keeps `config.reserve_factor_bps` of the freshly accrued +interest in `accumulated_protocol_fees`; only the remainder lifts the supplier +exchange rate. Those fees are carved out of `total_liquidity`, so they never +count as a supplier claim, and the market owner withdraws them with +**`collect_protocol_fees`** (paid out of the reserve's available liquidity). +This spread between the borrow rate and the supply rate is the protocol's revenue. + ### Obligation health `refresh_obligation` recomputes, from the refreshed reserves and their prices: @@ -110,8 +120,9 @@ rather than Pyth here for its lower compute cost. Supplied liquidity sits in program-owned vault PDAs, and posted collateral sits in per-obligation vault PDAs whose authority is the obligation PDA. The market owner -can update reserve risk parameters (`update_reserve_config`) but has no path to -move user funds โ€” there is no admin withdrawal or escape hatch. +can update reserve risk parameters (`update_reserve_config`) and withdraw the +protocol's earned fees (`collect_protocol_fees`), but has no path to a supplier's +deposits or a borrower's collateral โ€” there is no admin escape hatch over user funds. ### Known limits @@ -129,7 +140,8 @@ move user funds โ€” there is no admin withdrawal or escape hatch. ### Instruction handlers -Admin: `init_lending_market`, `init_reserve`, `update_reserve_config`, `set_price`. +Admin: `init_lending_market`, `init_reserve`, `update_reserve_config`, `set_price`, +`collect_protocol_fees`. Supply side: `refresh_reserve`, `deposit_reserve_liquidity`, `redeem_reserve_collateral`. Borrow side: `init_obligation`, `refresh_obligation`, `deposit_obligation_collateral`, `withdraw_obligation_collateral`, diff --git a/finance/lending/anchor/programs/lending/src/errors.rs b/finance/lending/anchor/programs/lending/src/errors.rs index f07d965d..332906a2 100644 --- a/finance/lending/anchor/programs/lending/src/errors.rs +++ b/finance/lending/anchor/programs/lending/src/errors.rs @@ -36,4 +36,6 @@ pub enum LendingError { MarketMismatch, #[msg("Repay amount would seize more collateral than the obligation holds")] LiquidationTooLarge, + #[msg("No protocol fees are available to collect")] + NothingToCollect, } diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/collect_protocol_fees.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/collect_protocol_fees.rs new file mode 100644 index 00000000..0a5554db --- /dev/null +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/collect_protocol_fees.rs @@ -0,0 +1,81 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::constants::LENDING_MARKET_SEED; +use crate::errors::LendingError; +use crate::state::{reserve_signer_seeds, LendingMarket, Reserve}; + +/// Withdraw the protocol fees accrued in a reserve to the market owner. This is +/// how the owner earns: `reserve_factor_bps` of every interest accrual is set +/// aside in `accumulated_protocol_fees` (never credited to suppliers), and this +/// handler pays it out, capped by the liquidity actually sitting in the vault. +pub fn handle_collect_protocol_fees(context: Context) -> Result<()> { + context.accounts.reserve.require_refreshed()?; + + let reserve = &mut context.accounts.reserve; + // Fees are a claim on liquidity; only what is currently un-borrowed can be paid + // out right now. Any remainder stays owed until borrowers repay. + let amount = reserve.accumulated_protocol_fees.min(reserve.available_liquidity); + require!(amount > 0, LendingError::NothingToCollect); + + reserve.accumulated_protocol_fees = reserve + .accumulated_protocol_fees + .checked_sub(amount) + .ok_or(LendingError::MathOverflow)?; + reserve.available_liquidity = reserve + .available_liquidity + .checked_sub(amount) + .ok_or(LendingError::MathOverflow)?; + + let bump = [reserve.bump]; + let seeds = reserve_signer_seeds(&reserve.lending_market, &reserve.liquidity_mint, &bump); + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.liquidity_vault.to_account_info(), + mint: context.accounts.liquidity_mint.to_account_info(), + to: context.accounts.owner_liquidity.to_account_info(), + authority: reserve.to_account_info(), + }, + &[&seeds], + ), + amount, + reserve.liquidity_decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct CollectProtocolFees<'info> { + #[account( + has_one = owner, + seeds = [LENDING_MARKET_SEED, owner.key().as_ref()], + bump = lending_market.bump, + )] + pub lending_market: Account<'info, LendingMarket>, + + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + mut, + has_one = lending_market, + has_one = liquidity_mint, + has_one = liquidity_vault, + )] + pub reserve: Account<'info, Reserve>, + + pub liquidity_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub liquidity_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub owner_liquidity: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs index 5f75a6cc..ad9c57b6 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs @@ -21,6 +21,7 @@ pub fn handle_init_reserve(context: Context, config: ReserveConfig) reserve.borrowed_amount_scaled = 0; reserve.cumulative_borrow_rate_index = FIXED_POINT_SCALE; reserve.last_update_slot = Clock::get()?.slot; + reserve.accumulated_protocol_fees = 0; reserve.config = config; reserve.bump = context.bumps.reserve; Ok(()) diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/mod.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/mod.rs index 5737a8a1..ee52c93c 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/admin/mod.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/mod.rs @@ -1,8 +1,10 @@ +pub mod collect_protocol_fees; pub mod init_lending_market; pub mod init_reserve; pub mod set_price; pub mod update_reserve_config; +pub use collect_protocol_fees::*; pub use init_lending_market::*; pub use init_reserve::*; pub use set_price::*; diff --git a/finance/lending/anchor/programs/lending/src/lib.rs b/finance/lending/anchor/programs/lending/src/lib.rs index e2892ca6..df2d3933 100644 --- a/finance/lending/anchor/programs/lending/src/lib.rs +++ b/finance/lending/anchor/programs/lending/src/lib.rs @@ -30,6 +30,10 @@ pub mod lending { instructions::handle_update_reserve_config(context, config) } + pub fn collect_protocol_fees(context: Context) -> Result<()> { + instructions::handle_collect_protocol_fees(context) + } + pub fn set_price( context: Context, price_mantissa: i128, diff --git a/finance/lending/anchor/programs/lending/src/state/reserve.rs b/finance/lending/anchor/programs/lending/src/state/reserve.rs index e5199977..9f13037f 100644 --- a/finance/lending/anchor/programs/lending/src/state/reserve.rs +++ b/finance/lending/anchor/programs/lending/src/state/reserve.rs @@ -65,6 +65,12 @@ pub struct Reserve { pub last_update_slot: u64, + /// Liquidity owed to the market owner: the protocol's cut of accrued + /// interest (`config.reserve_factor_bps`). It is carved out of + /// `total_liquidity` so it never inflates the share exchange rate, and the + /// owner withdraws it with `collect_protocol_fees`. + pub accumulated_protocol_fees: u64, + pub config: ReserveConfig, pub bump: u8, @@ -81,6 +87,9 @@ pub struct ReserveConfig { pub liquidation_bonus_bps: u16, /// Maximum fraction of a borrow that one liquidation may repay. pub close_factor_bps: u16, + /// Share of accrued borrow interest kept by the protocol (the rest lifts the + /// supplier exchange rate). This is how the market owner earns. + pub reserve_factor_bps: u16, /// Utilization at which the borrow rate reaches `optimal_borrow_rate_bps`. pub optimal_utilization_bps: u16, /// Borrow APR at 0% utilization. @@ -99,6 +108,7 @@ impl ReserveConfig { && within_bps(self.liquidation_threshold_bps) && within_bps(self.liquidation_bonus_bps) && within_bps(self.close_factor_bps) + && within_bps(self.reserve_factor_bps) && within_bps(self.optimal_utilization_bps), LendingError::InvalidConfig ); @@ -135,20 +145,30 @@ impl Reserve { u64::try_from(amount).map_err(|_| LendingError::MathOverflow.into()) } - /// Available liquidity plus live debt โ€” the pool size the share token is a claim on. - pub fn total_liquidity(&self) -> Result { - Ok((self.available_liquidity as u128) + /// Available liquidity plus live debt, before the protocol's fee is removed. + /// Used for the utilization ratio, which is about how much of the pool is lent + /// out, independent of who owns the interest. + pub fn gross_liquidity(&self) -> Result { + (self.available_liquidity as u128) .checked_add(self.current_borrowed_amount()? as u128) - .ok_or(LendingError::MathOverflow)?) + .ok_or(LendingError::MathOverflow.into()) + } + + /// The pool size the share token is a claim on: gross liquidity minus the + /// protocol fees owed to the owner, which belong to no supplier. + pub fn total_liquidity(&self) -> Result { + self.gross_liquidity()? + .checked_sub(self.accumulated_protocol_fees as u128) + .ok_or(LendingError::MathOverflow.into()) } /// Borrowed fraction of the pool, in basis points (0..=10_000). pub fn utilization_bps(&self) -> Result { - let total = self.total_liquidity()?; - if total == 0 { + let gross = self.gross_liquidity()?; + if gross == 0 { return Ok(0); } - mul_div_floor(self.current_borrowed_amount()? as u128, BPS_DENOMINATOR, total) + mul_div_floor(self.current_borrowed_amount()? as u128, BPS_DENOMINATOR, gross) } /// Per-slot borrow rate (FIXED_POINT_SCALE-scaled) from the kinked curve: @@ -198,6 +218,7 @@ impl Reserve { .ok_or(LendingError::MathOverflow)?; if elapsed > 0 && self.borrowed_amount_scaled > 0 { + let borrowed_before = self.current_borrowed_amount()?; let rate_per_slot = self.current_borrow_rate_per_slot()?; let accrued = rate_per_slot .checked_mul(elapsed as u128) @@ -210,6 +231,23 @@ impl Reserve { growth_factor, FIXED_POINT_SCALE, )?; + + // Borrowers owe the full interest (the index grew for all of it); the + // protocol keeps `reserve_factor_bps` of the newly accrued interest, + // and the remainder lifts the supplier exchange rate. Flooring the fee + // rounds the owner's cut down, in the suppliers' favour. + let interest = self + .current_borrowed_amount()? + .saturating_sub(borrowed_before); + let fee = mul_div_floor( + interest as u128, + self.config.reserve_factor_bps as u128, + BPS_DENOMINATOR, + )?; + self.accumulated_protocol_fees = self + .accumulated_protocol_fees + .checked_add(u64::try_from(fee).map_err(|_| LendingError::MathOverflow)?) + .ok_or(LendingError::MathOverflow)?; } self.last_update_slot = current_slot; diff --git a/finance/lending/anchor/programs/lending/tests/common/mod.rs b/finance/lending/anchor/programs/lending/tests/common/mod.rs index a4d73c65..c6beb8c5 100644 --- a/finance/lending/anchor/programs/lending/tests/common/mod.rs +++ b/finance/lending/anchor/programs/lending/tests/common/mod.rs @@ -656,6 +656,35 @@ impl Env { send(&mut self.svm, instructions, &[payer], &payer.pubkey()).unwrap(); } + /// Market owner collects accrued protocol fees from a reserve to their own + /// token account. Bundles `refresh_reserve` so fees are current. Returns the + /// owner's fee-receiving token account. + pub fn collect_protocol_fees(&mut self, handle: &ReserveHandle) -> Pubkey { + let owner = self.owner.insecure_clone(); + let owner_liquidity = ata(&owner.pubkey(), &handle.mint); + if self.svm.get_account(&owner_liquidity).is_none() { + create_associated_token_account(&mut self.svm, &owner.pubkey(), &handle.mint, &owner) + .unwrap(); + } + let refresh = self.refresh_reserve_ix(handle); + let collect = Instruction { + program_id: lending::id(), + accounts: lending::accounts::CollectProtocolFees { + lending_market: self.market, + owner: owner.pubkey(), + reserve: handle.reserve, + liquidity_mint: handle.mint, + liquidity_vault: handle.liquidity_vault, + owner_liquidity, + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::CollectProtocolFees {}.data(), + }; + send(&mut self.svm, vec![refresh, collect], &[&owner], &owner.pubkey()).unwrap(); + owner_liquidity + } + // --- state readers --- pub fn reserve(&self, handle: &ReserveHandle) -> Reserve { @@ -674,13 +703,15 @@ impl Env { } /// A reasonable default reserve config: 75% LTV, 80% liquidation threshold, -/// 5% bonus, 50% close factor, kink at 80% utilization, 2%/20%/150% APR curve. +/// 5% bonus, 50% close factor, 10% reserve factor (protocol's cut of interest), +/// kink at 80% utilization, 2%/20%/150% APR curve. pub fn default_config() -> ReserveConfig { ReserveConfig { loan_to_value_bps: 7_500, liquidation_threshold_bps: 8_000, liquidation_bonus_bps: 500, close_factor_bps: 5_000, + reserve_factor_bps: 1_000, optimal_utilization_bps: 8_000, min_borrow_rate_bps: 200, optimal_borrow_rate_bps: 2_000, diff --git a/finance/lending/anchor/programs/lending/tests/test_interest.rs b/finance/lending/anchor/programs/lending/tests/test_interest.rs index 0fc8ed3c..a9c21c9b 100644 --- a/finance/lending/anchor/programs/lending/tests/test_interest.rs +++ b/finance/lending/anchor/programs/lending/tests/test_interest.rs @@ -61,3 +61,48 @@ fn interest_accrues_on_borrows_over_time() { "100M shares should redeem for more than 100M liquidity after interest, got {returned}" ); } + +/// The protocol keeps `reserve_factor_bps` of accrued interest as fees the +/// market owner can withdraw, while the rest lifts the supplier exchange rate. +#[test] +fn protocol_fees_accrue_and_owner_can_collect() { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + let borrow = env.add_reserve(6, dollars(1), default_config()); + + let supplier = env.create_user(); + env.fund(&supplier, borrow.mint, 1_000_000_000); + env.supply(&supplier, &borrow, 1_000_000_000); + + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.fund(&borrower, borrow.mint, 0); + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.init_obligation(&borrower); + env.post_collateral(&borrower, obligation, &collateral, 1_000_000_000); + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 500_000_000) + .unwrap(); + + // No interest has accrued yet, so no fees. + assert_eq!(env.reserve(&borrow).accumulated_protocol_fees, 0); + + env.warp_slots(7_884_000); + env.refresh_reserve_only(&borrower, &borrow); + + // Fees accrued, and they are ~10% (the reserve factor) of total interest. + let reserve = env.reserve(&borrow); + let fees = reserve.accumulated_protocol_fees; + assert!(fees > 0, "protocol fees should accrue once interest does"); + let total_interest = reserve.current_borrowed_amount().unwrap() - 500_000_000; + let expected_fee = total_interest / 10; // 1000 bps = 10% + // Allow a 1-unit rounding tolerance from flooring. + assert!( + fees.abs_diff(expected_fee) <= 1, + "fees {fees} should be ~10% of interest {total_interest}" + ); + + // Maria withdraws the fees to her own account. + let owner_account = env.collect_protocol_fees(&borrow); + assert_eq!(env.token_balance(owner_account), fees); + assert_eq!(env.reserve(&borrow).accumulated_protocol_fees, 0); +} diff --git a/finance/lending/quasar/CHANGELOG.md b/finance/lending/quasar/CHANGELOG.md index d52a8d03..795fac4f 100644 --- a/finance/lending/quasar/CHANGELOG.md +++ b/finance/lending/quasar/CHANGELOG.md @@ -19,3 +19,5 @@ Initial Quasar port of the Kamino/Solend-style borrow/lend program. - Liquidation reads the close factor from the borrow reserve, and rejects repayments whose seizure would exceed posted collateral (`LiquidationTooLarge`). +- Reserve factor: the protocol keeps `reserve_factor_bps` of accrued interest + as fees the market owner withdraws with `collect_protocol_fees`. diff --git a/finance/lending/quasar/README.md b/finance/lending/quasar/README.md index 8c624583..db8812bc 100644 --- a/finance/lending/quasar/README.md +++ b/finance/lending/quasar/README.md @@ -52,6 +52,11 @@ Everything else mirrors the Anchor version. `total_liquidity / share_supply` rises as borrowers pay interest. `available_liquidity` (not the vault's raw balance) is the source of truth, so a token donation can't inflate the rate. +- **Protocol fees** โ€” the reserve keeps `reserve_factor_bps` of each interest + accrual in `accumulated_protocol_fees` (carved out of total liquidity, so it + never lifts the supplier exchange rate); the market owner withdraws it with + `collect_protocol_fees`. That spread between the borrow and supply rates is how + the owner earns. - **Integer-only math** โ€” `u128`, scaled by `FIXED_POINT_SCALE` (10^18), every conversion rounding in the protocol's favour. @@ -61,7 +66,8 @@ Everything else mirrors the Anchor version. `deposit_reserve_liquidity` (3), `redeem_reserve_collateral` (4), `init_obligation` (5), `deposit_obligation_collateral` (6), `withdraw_obligation_collateral` (7), `borrow_obligation_liquidity` (8), -`repay_obligation_liquidity` (9), `liquidate_obligation` (10). +`repay_obligation_liquidity` (9), `liquidate_obligation` (10), +`collect_protocol_fees` (11). ## Setup diff --git a/finance/lending/quasar/src/error.rs b/finance/lending/quasar/src/error.rs index 110afb3e..8d3b5e63 100644 --- a/finance/lending/quasar/src/error.rs +++ b/finance/lending/quasar/src/error.rs @@ -16,4 +16,5 @@ pub enum LendingError { ObligationHealthy, WrongReserve, LiquidationTooLarge, + NothingToCollect, } diff --git a/finance/lending/quasar/src/instructions/admin.rs b/finance/lending/quasar/src/instructions/admin.rs index 83e4b2cf..b996d3f5 100644 --- a/finance/lending/quasar/src/instructions/admin.rs +++ b/finance/lending/quasar/src/instructions/admin.rs @@ -1,7 +1,9 @@ use { crate::{ constants::{MINT_SPACE, TOKEN_ACCOUNT_SPACE}, - logic::now, + error::LendingError, + instructions::supply::reserve_seeds, + logic::{accrue, now, snapshot_reserve}, math::validate_config, state::{ LendingMarket, LendingMarketInner, LiquidityVaultPda, PriceFeed, PriceFeedInner, @@ -74,6 +76,7 @@ impl InitReserve { liquidation_threshold_bps: u16, liquidation_bonus_bps: u16, close_factor_bps: u16, + reserve_factor_bps: u16, optimal_utilization_bps: u16, min_borrow_rate_bps: u16, optimal_borrow_rate_bps: u16, @@ -85,6 +88,7 @@ impl InitReserve { liquidation_threshold_bps, liquidation_bonus_bps, close_factor_bps, + reserve_factor_bps, optimal_utilization_bps, min_borrow_rate_bps, optimal_borrow_rate_bps, @@ -153,6 +157,7 @@ impl InitReserve { price_feed: *self.price_feed.address(), available_liquidity: 0, share_mint_supply: 0, + accumulated_protocol_fees: 0, borrowed_amount_scaled: 0, cumulative_borrow_rate_index: crate::constants::FIXED_POINT_SCALE, last_update_slot: now()?, @@ -161,6 +166,7 @@ impl InitReserve { liquidation_threshold_bps, liquidation_bonus_bps, close_factor_bps, + reserve_factor_bps, optimal_utilization_bps, min_borrow_rate_bps, optimal_borrow_rate_bps, @@ -207,3 +213,67 @@ impl SetPrice { Ok(()) } } + +// --------------------------------------------------------------------------- +// collect_protocol_fees +// --------------------------------------------------------------------------- + +#[derive(Accounts)] +pub struct CollectProtocolFees { + #[account(mut)] + pub owner: Signer, + #[account(has_one(owner), address = LendingMarket::seeds(owner.address()))] + pub lending_market: Account, + #[account(mut, has_one(lending_market), has_one(liquidity_mint), has_one(liquidity_vault))] + pub reserve: Account, + pub liquidity_mint: Account, + #[account(mut)] + pub liquidity_vault: Account, + #[account(mut)] + pub owner_liquidity: Account, + pub token_program: Program, +} + +impl CollectProtocolFees { + /// Pay the reserve's accrued protocol fees to the market owner. This is how + /// the owner earns: `reserve_factor_bps` of every interest accrual is set + /// aside in `accumulated_protocol_fees`, and this withdraws it โ€” capped by + /// the liquidity currently sitting in the vault. + #[inline(always)] + pub fn run(&mut self) -> Result<(), ProgramError> { + let slot = now()?; + let mut reserve = snapshot_reserve(&self.reserve); + accrue(&mut reserve, slot)?; + + let amount = reserve + .accumulated_protocol_fees + .min(reserve.available_liquidity); + require!(amount > 0, LendingError::NothingToCollect); + reserve.accumulated_protocol_fees = reserve + .accumulated_protocol_fees + .checked_sub(amount) + .ok_or(LendingError::MathOverflow)?; + reserve.available_liquidity = reserve + .available_liquidity + .checked_sub(amount) + .ok_or(LendingError::MathOverflow)?; + + let decimals = reserve.liquidity_decimals; + let bump = [reserve.bump]; + let lending_market = reserve.lending_market; + let liquidity_mint = reserve.liquidity_mint; + self.reserve.set_inner(reserve); + + let seeds = reserve_seeds!(lending_market, liquidity_mint, bump); + self.token_program + .transfer_checked( + &self.liquidity_vault, + &self.liquidity_mint, + &self.owner_liquidity, + &self.reserve, + amount, + decimals, + ) + .invoke_signed(&seeds) + } +} diff --git a/finance/lending/quasar/src/instructions/position.rs b/finance/lending/quasar/src/instructions/position.rs index 96e4fd06..5976b09f 100644 --- a/finance/lending/quasar/src/instructions/position.rs +++ b/finance/lending/quasar/src/instructions/position.rs @@ -4,7 +4,7 @@ use { error::LendingError, instructions::supply::reserve_seeds, logic::{accrue, now, price_scaled, snapshot_obligation, snapshot_reserve, SCALE}, - math::{current_debt, market_value, mul_div_ceil, mul_div_floor, total_liquidity, value_to_amount, Rounding}, + math::{current_debt, market_value, mul_div_ceil, mul_div_floor, net_total_liquidity, value_to_amount, Rounding}, state::{ LendingMarket, Obligation, ObligationInner, ObligationVaultPda, PriceFeed, Reserve, }, @@ -177,10 +177,11 @@ impl BorrowObligationLiquidity { } // Borrow power from collateral value. - let collateral_total = total_liquidity( + let collateral_total = net_total_liquidity( collateral.available_liquidity, collateral.borrowed_amount_scaled, collateral.cumulative_borrow_rate_index, + collateral.accumulated_protocol_fees, )?; let collateral_liquidity = mul_div_floor( obligation.deposited_shares as u128, @@ -363,10 +364,11 @@ impl WithdrawObligationCollateral { // Remaining collateral value after withdrawing `shares`. let remaining_shares = obligation.deposited_shares - shares; - let collateral_total = total_liquidity( + let collateral_total = net_total_liquidity( collateral.available_liquidity, collateral.borrowed_amount_scaled, collateral.cumulative_borrow_rate_index, + collateral.accumulated_protocol_fees, )?; let remaining_liquidity = mul_div_floor( remaining_shares as u128, @@ -476,10 +478,11 @@ impl LiquidateObligation { let borrow_price = price_scaled(&self.borrow_price, slot)?; // Health: unhealthy when debt value exceeds collateral value * liq threshold. - let collateral_total = total_liquidity( + let collateral_total = net_total_liquidity( collateral.available_liquidity, collateral.borrowed_amount_scaled, collateral.cumulative_borrow_rate_index, + collateral.accumulated_protocol_fees, )?; let collateral_liquidity = mul_div_floor( obligation.deposited_shares as u128, diff --git a/finance/lending/quasar/src/instructions/supply.rs b/finance/lending/quasar/src/instructions/supply.rs index ae0f5750..85678f03 100644 --- a/finance/lending/quasar/src/instructions/supply.rs +++ b/finance/lending/quasar/src/instructions/supply.rs @@ -2,7 +2,7 @@ use { crate::{ error::LendingError, logic::{accrue, now, snapshot_reserve}, - math::{mul_div_floor, total_liquidity}, + math::{mul_div_floor, net_total_liquidity}, state::Reserve, }, quasar_lang::prelude::*, @@ -53,10 +53,11 @@ impl DepositReserveLiquidity { let mut reserve = snapshot_reserve(&self.reserve); accrue(&mut reserve, slot)?; - let total = total_liquidity( + let total = net_total_liquidity( reserve.available_liquidity, reserve.borrowed_amount_scaled, reserve.cumulative_borrow_rate_index, + reserve.accumulated_protocol_fees, )?; let shares = if reserve.share_mint_supply == 0 { amount as u128 @@ -131,10 +132,11 @@ impl RedeemReserveCollateral { accrue(&mut reserve, slot)?; require!(reserve.share_mint_supply > 0, LendingError::InsufficientLiquidity); - let total = total_liquidity( + let total = net_total_liquidity( reserve.available_liquidity, reserve.borrowed_amount_scaled, reserve.cumulative_borrow_rate_index, + reserve.accumulated_protocol_fees, )?; let liquidity = mul_div_floor(shares as u128, total, reserve.share_mint_supply as u128)?; let liquidity = u64::try_from(liquidity).map_err(|_| LendingError::MathOverflow)?; diff --git a/finance/lending/quasar/src/lib.rs b/finance/lending/quasar/src/lib.rs index 56d85132..8358d7a8 100644 --- a/finance/lending/quasar/src/lib.rs +++ b/finance/lending/quasar/src/lib.rs @@ -46,6 +46,7 @@ mod quasar_lending { liquidation_threshold_bps: u16, liquidation_bonus_bps: u16, close_factor_bps: u16, + reserve_factor_bps: u16, optimal_utilization_bps: u16, min_borrow_rate_bps: u16, optimal_borrow_rate_bps: u16, @@ -56,6 +57,7 @@ mod quasar_lending { liquidation_threshold_bps, liquidation_bonus_bps, close_factor_bps, + reserve_factor_bps, optimal_utilization_bps, min_borrow_rate_bps, optimal_borrow_rate_bps, @@ -133,4 +135,9 @@ mod quasar_lending { ) -> Result<(), ProgramError> { ctx.accounts.run(amount) } + + #[instruction(discriminator = 11)] + pub fn collect_protocol_fees(ctx: Ctx) -> Result<(), ProgramError> { + ctx.accounts.run() + } } diff --git a/finance/lending/quasar/src/logic.rs b/finance/lending/quasar/src/logic.rs index c717b1f1..a2a53b7f 100644 --- a/finance/lending/quasar/src/logic.rs +++ b/finance/lending/quasar/src/logic.rs @@ -8,10 +8,12 @@ use quasar_lang::{prelude::*, sysvars::Sysvar}; use crate::{ constants::{FIXED_POINT_SCALE, MAX_PRICE_STALENESS_SLOTS}, error::LendingError, - math::{accrue_index, price_mantissa_to_scaled}, + math::{accrue_index, current_debt, mul_div_floor, price_mantissa_to_scaled}, state::{Obligation, ObligationInner, PriceFeed, Reserve, ReserveInner}, }; +use crate::constants::BPS_DENOMINATOR; + /// Current slot as a native `u64`. pub fn now() -> Result { Ok(u64::from(Clock::get()?.slot)) @@ -27,6 +29,7 @@ pub fn snapshot_reserve(reserve: &Account) -> ReserveInner { price_feed: reserve.price_feed, available_liquidity: u64::from(reserve.available_liquidity), share_mint_supply: u64::from(reserve.share_mint_supply), + accumulated_protocol_fees: u64::from(reserve.accumulated_protocol_fees), borrowed_amount_scaled: u128::from(reserve.borrowed_amount_scaled), cumulative_borrow_rate_index: u128::from(reserve.cumulative_borrow_rate_index), last_update_slot: u64::from(reserve.last_update_slot), @@ -35,6 +38,7 @@ pub fn snapshot_reserve(reserve: &Account) -> ReserveInner { liquidation_threshold_bps: u16::from(reserve.liquidation_threshold_bps), liquidation_bonus_bps: u16::from(reserve.liquidation_bonus_bps), close_factor_bps: u16::from(reserve.close_factor_bps), + reserve_factor_bps: u16::from(reserve.reserve_factor_bps), optimal_utilization_bps: u16::from(reserve.optimal_utilization_bps), min_borrow_rate_bps: u16::from(reserve.min_borrow_rate_bps), optimal_borrow_rate_bps: u16::from(reserve.optimal_borrow_rate_bps), @@ -59,6 +63,10 @@ pub fn snapshot_obligation(obligation: &Account) -> ObligationInner /// Advance a reserve snapshot's interest index to `slot` (Solend-style: a single /// `index *= 1 + rate_per_slot * elapsed` per call, compounding across calls). pub fn accrue(reserve: &mut ReserveInner, slot: u64) -> Result<(), ProgramError> { + let borrowed_before = current_debt( + reserve.borrowed_amount_scaled, + reserve.cumulative_borrow_rate_index, + )?; reserve.cumulative_borrow_rate_index = accrue_index( reserve.cumulative_borrow_rate_index, reserve.borrowed_amount_scaled, @@ -70,6 +78,22 @@ pub fn accrue(reserve: &mut ReserveInner, slot: u64) -> Result<(), ProgramError> reserve.optimal_borrow_rate_bps, reserve.max_borrow_rate_bps, )?; + // The protocol keeps `reserve_factor_bps` of the newly accrued interest; the + // rest lifts the supplier exchange rate. Flooring rounds the owner's cut down. + let borrowed_after = current_debt( + reserve.borrowed_amount_scaled, + reserve.cumulative_borrow_rate_index, + )?; + let interest = borrowed_after.saturating_sub(borrowed_before); + let fee = mul_div_floor( + interest as u128, + reserve.reserve_factor_bps as u128, + BPS_DENOMINATOR, + )?; + reserve.accumulated_protocol_fees = reserve + .accumulated_protocol_fees + .checked_add(u64::try_from(fee).map_err(|_| LendingError::MathOverflow)?) + .ok_or(LendingError::MathOverflow)?; reserve.last_update_slot = slot; Ok(()) } diff --git a/finance/lending/quasar/src/math.rs b/finance/lending/quasar/src/math.rs index b25b4ced..bd339211 100644 --- a/finance/lending/quasar/src/math.rs +++ b/finance/lending/quasar/src/math.rs @@ -91,7 +91,8 @@ pub fn current_debt(borrowed_scaled: u128, index: u128) -> Result Result { + total_liquidity(available, borrowed_scaled, index)? + .checked_sub(protocol_fees as u128) + .ok_or(LendingError::MathOverflow.into()) +} + /// Borrowed fraction of the pool in basis points (0..=10_000). pub fn utilization_bps( available: u64, @@ -186,11 +200,13 @@ pub fn accrue_index( mul_div_floor(index, growth, FIXED_POINT_SCALE) } +#[allow(clippy::too_many_arguments)] pub fn validate_config( loan_to_value_bps: u16, liquidation_threshold_bps: u16, liquidation_bonus_bps: u16, close_factor_bps: u16, + reserve_factor_bps: u16, optimal_utilization_bps: u16, min_borrow_rate_bps: u16, optimal_borrow_rate_bps: u16, @@ -202,6 +218,7 @@ pub fn validate_config( && within(liquidation_threshold_bps) && within(liquidation_bonus_bps) && within(close_factor_bps) + && within(reserve_factor_bps) && within(optimal_utilization_bps), LendingError::InvalidConfig ); diff --git a/finance/lending/quasar/src/state.rs b/finance/lending/quasar/src/state.rs index 04c3bcf9..e5283757 100644 --- a/finance/lending/quasar/src/state.rs +++ b/finance/lending/quasar/src/state.rs @@ -26,6 +26,10 @@ pub struct Reserve { pub price_feed: Address, pub available_liquidity: u64, pub share_mint_supply: u64, + /// Liquidity owed to the market owner: the protocol's cut of accrued + /// interest, carved out of total liquidity and withdrawn via + /// `collect_protocol_fees`. + pub accumulated_protocol_fees: u64, pub borrowed_amount_scaled: u128, pub cumulative_borrow_rate_index: u128, pub last_update_slot: u64, @@ -34,6 +38,8 @@ pub struct Reserve { pub liquidation_threshold_bps: u16, pub liquidation_bonus_bps: u16, pub close_factor_bps: u16, + /// Share of accrued borrow interest kept by the protocol (how the owner earns). + pub reserve_factor_bps: u16, pub optimal_utilization_bps: u16, pub min_borrow_rate_bps: u16, pub optimal_borrow_rate_bps: u16, diff --git a/finance/lending/quasar/src/tests.rs b/finance/lending/quasar/src/tests.rs index 3a522997..bdcd9919 100644 --- a/finance/lending/quasar/src/tests.rs +++ b/finance/lending/quasar/src/tests.rs @@ -36,6 +36,7 @@ const BORROWER_COLL_SHARE: Pubkey = Pubkey::new_from_array([13; 32]); const BORROWER_BORROW: Pubkey = Pubkey::new_from_array([14; 32]); const LIQUIDATOR_BORROW: Pubkey = Pubkey::new_from_array([15; 32]); const LIQUIDATOR_COLL_SHARE: Pubkey = Pubkey::new_from_array([16; 32]); +const OWNER_BORROW: Pubkey = Pubkey::new_from_array([17; 32]); fn token_program() -> Pubkey { quasar_svm::SPL_TOKEN_PROGRAM_ID @@ -165,6 +166,8 @@ impl World { token(BORROWER_BORROW, BORROW_MINT, BORROWER, 0), token(LIQUIDATOR_BORROW, BORROW_MINT, LIQUIDATOR, 1_000 * UNIT), token(LIQUIDATOR_COLL_SHARE, coll_share_mint, LIQUIDATOR, 0), + // Where the market owner receives collected protocol fees. + token(OWNER_BORROW, BORROW_MINT, OWNER, 0), ] { svm.set_account(account); } @@ -219,9 +222,9 @@ impl World { #[allow(clippy::too_many_arguments)] fn init_reserve(&mut self, the_mint: Pubkey, reserve: Pubkey, vault: Pubkey, share: Pubkey, price: Pubkey) { - // 75% LTV, 80% liq threshold, 5% bonus, 50% close factor, kink 80%, - // 2% / 20% / 150% APR curve. - let config: [u16; 8] = [7_500, 8_000, 500, 5_000, 8_000, 200, 2_000, 15_000]; + // 75% LTV, 80% liq threshold, 5% bonus, 50% close factor, 10% reserve + // factor, kink 80%, 2% / 20% / 150% APR curve. + let config: [u16; 9] = [7_500, 8_000, 500, 5_000, 1_000, 8_000, 200, 2_000, 15_000]; let mut data = vec![1u8]; for value in config { data.extend_from_slice(&value.to_le_bytes()); @@ -396,6 +399,21 @@ impl World { self.init_obligation(); self.post_collateral(1_000 * UNIT).assert_success(); } + + /// Market owner collects accrued protocol fees from the borrow reserve into + /// `OWNER_BORROW`. The handler accrues interest itself, so no separate refresh. + fn collect_borrow_fees(&mut self) -> quasar_svm::ExecutionResult { + let metas = vec![ + meta(OWNER, true, true), + meta(self.market, false, false), + meta(self.borrow_reserve, true, false), + meta(BORROW_MINT, false, false), + meta(self.borrow_vault, true, false), + meta(OWNER_BORROW, true, false), + meta(token_program(), false, false), + ]; + self.run(vec![11u8], metas) + } } #[test] @@ -486,3 +504,22 @@ fn unhealthy_position_is_liquidated_and_healthy_is_rejected() { "liquidator should receive seized collateral shares" ); } + +#[test] +fn protocol_fees_accrue_and_owner_can_collect() { + let mut world = World::new(); + world.bootstrap_position(); + world.borrow(500 * UNIT).assert_success(); + + // ~0.1 year passes; interest accrues, and the reserve factor (10%) sets some + // of it aside for the market owner. + world.svm.sysvars.warp_to_slot(7_884_000); + + let result = world.collect_borrow_fees(); + result.assert_success(); + assert!( + balance(&result, OWNER_BORROW) > 0, + "owner should collect a positive protocol fee, got {}", + balance(&result, OWNER_BORROW) + ); +} From 2cd032bfd12bde4ba286a13f2fa7e9aeacb2c1b1 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Sun, 14 Jun 2026 21:58:53 -0400 Subject: [PATCH 090/138] Typos --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c87b45ed..5da847f3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Solana Program Examples -Working, tested, up-to-date examples of common Solana programs โ€” maintained by [Quicknode](https://quicknode.com). Each example compiles and passes CI on the current Solana and Anchor toolchain. +Working, tested, up-to-date examples of common Solana programs - maintained by [Quicknode](https://quicknode.com). Each example compiles and passes CI on the current Solana and Anchor toolchain. [![Anchor](../../actions/workflows/anchor.yml/badge.svg)](../../actions/workflows/anchor.yml) [![Quasar](../../actions/workflows/quasar.yml/badge.svg)](../../actions/workflows/quasar.yml) [![Pinocchio](../../actions/workflows/pinocchio.yml/badge.svg)](../../actions/workflows/pinocchio.yml) [![Native](../../actions/workflows/native.yml/badge.svg)](../../actions/workflows/native.yml) [![ASM](../../actions/workflows/solana-asm.yml/badge.svg)](../../actions/workflows/solana-asm.yml) @@ -23,7 +23,7 @@ All examples are tested with Rust + [LiteSVM](https://github.com/litesvm/litesvm You need [Rust](https://www.rust-lang.org/tools/install), [Solana CLI](https://docs.anza.xyz/cli/install), [Anchor](https://www.anchor-lang.com/docs/installation), and [pnpm](https://pnpm.io/installation) installed. Clone the repo, `cd` into any example directory, and run `pnpm test`. -To deploy to mainnet or devnet you'll need an RPC endpoint. [Quicknode](https://quicknode.com) provides free and paid Solana endpoints โ€” create one and set it as your cluster in `Anchor.toml` or with `solana config set --url `. +To deploy to mainnet or devnet you'll need an RPC endpoint. [Quicknode](https://quicknode.com) provides free and paid Solana endpoints - create one and set it as your cluster in `Anchor.toml` or with `solana config set --url `. ## Financial Software From 2aa599a862becd19713253b2cec19a78f2e10376 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Sun, 14 Jun 2026 21:59:33 -0400 Subject: [PATCH 091/138] Tighten intro --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 5da847f3..1220ca2a 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,6 @@ Working, tested, up-to-date examples of common Solana programs - maintained by [ [![Anchor](../../actions/workflows/anchor.yml/badge.svg)](../../actions/workflows/anchor.yml) [![Quasar](../../actions/workflows/quasar.yml/badge.svg)](../../actions/workflows/quasar.yml) [![Pinocchio](../../actions/workflows/pinocchio.yml/badge.svg)](../../actions/workflows/pinocchio.yml) [![Native](../../actions/workflows/native.yml/badge.svg)](../../actions/workflows/native.yml) [![ASM](../../actions/workflows/solana-asm.yml/badge.svg)](../../actions/workflows/solana-asm.yml) -**What you can build here:** escrow, AMM-based token swaps, order-book exchanges, token fundraisers, vault strategies, betting markets, NFTs, token extensions, compressed NFTs, and all the foundational Solana patterns (PDAs, CPIs, account management, rent). - Each example is available in one or more of the following frameworks: - [โš“ Anchor](https://www.anchor-lang.com/) - the most popular framework for Solana development. Build with `anchor build`, test with `cargo test` as defined in `Anchor.toml`. @@ -14,8 +12,6 @@ Each example is available in one or more of the following frameworks: - [๐Ÿฆ€ Native Rust](https://docs.anza.xyz/) - vanilla Rust using Solana's native crates. Build with `cargo build-sbf --manifest-path=./program/Cargo.toml`, test with `cargo test --manifest-path=./program/Cargo.toml`. - [๐Ÿงฌ ASM](https://github.com/blueshift-gg/sbpf) - hand-written sBPF assembly built with the `sbpf` toolchain. Build with `sbpf build`, test with `cargo test`. -All examples are tested with Rust + [LiteSVM](https://github.com/litesvm/litesvm) in-process tests: build the program first, since the tests embed the `.so` at compile time. - > [!NOTE] > You don't need to write your own program for basic tasks like creating [accounts](https://solana.com/docs/terminology#account), transferring SOL, or minting tokens. These are handled by existing programs like the System Program and Token Program. From cb31139017ddb7deb4518395b277286811a50ef2 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Thu, 18 Jun 2026 15:21:55 -0400 Subject: [PATCH 092/138] Fix docs that didn't make sense --- finance/order-book/anchor/README.md | 2 +- .../order-book/src/instructions/initialize_market.rs | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/finance/order-book/anchor/README.md b/finance/order-book/anchor/README.md index 49be1f29..c74102bf 100644 --- a/finance/order-book/anchor/README.md +++ b/finance/order-book/anchor/README.md @@ -387,7 +387,7 @@ Alice's remaining 2-NVDAx [bid](https://www.investopedia.com/terms/b/bid.asp) st | Account | PDA? | Seeds | Authority | Holds | |---|---|---|---|---| | `Market` | yes | `["market", base_mint, quote_mint]` | program | fee rate, tick size, min order size, base/quote mint pubkeys, vault pubkeys, order book pubkey, `authority` wallet (allowed to withdraw fees) | -| `OrderBook` | no (client-allocated) | recommended: `["order_book", market]` | program | two critbit trees (bids highest-first, asks lowest-first, 1024 leaves each), `next_order_id` | +| `OrderBook` | no (client-allocated keypair) | n/a โ€” too large (~180 KB) for an `init`/CPI PDA, so created via `create_account` (which needs a signing key a PDA lacks); tied to its market via `has_one` | program | two critbit trees (bids highest-first, asks lowest-first, 1024 leaves each), `next_order_id` | | `Order` | yes | `["order", market, order_id.to_le_bytes()]` | program | owner, side, price, original_quantity, filled_quantity, status, timestamp | | `MarketUser` | yes | `["market_user", market, owner]` | program | `unsettled_base`, `unsettled_quote`, `open_orders: Vec` (max 20) | diff --git a/finance/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs b/finance/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs index 99f56a5b..0361fc69 100644 --- a/finance/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs +++ b/finance/order-book/anchor/programs/order-book/src/instructions/initialize_market.rs @@ -74,10 +74,11 @@ pub struct InitializeMarketAccountConstraints<'info> { // create_account-d account looks like. The handler then stamps the // discriminator + struct via `load_init()`. // - // The account is not a PDA; it is a plain account whose keypair the - // client generates. The README recommends deriving that keypair - // deterministically (e.g. from `["order_book", market]`) so the address - // is predictable - but the program doesn't enforce the derivation. + // This is not a PDA. create_account requires the new account to sign + // its own creation, and a PDA has no private key to sign with, so the + // client must generate a real keypair for it. The program ties this + // account to its market via `has_one = order_book` on `market`, not via + // seeds. #[account(zero)] pub order_book: AccountLoader<'info, OrderBook>, From abcdc29fcaf06614e713ad011b6bf156d2e4bd39 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Jun 2026 19:26:14 +0000 Subject: [PATCH 093/138] Move betting market example to finance/ Relocate the betting-market example from tokens/ to the finance/ category, alongside the other financial examples (escrow, order-book, token-swap, token-fundraiser, vault-strategy), and update its link in the root README. CI auto-discovers any directory named anchor, so it is still built and tested. --- README.md | 2 +- {tokens => finance}/betting-market/README.md | 0 {tokens => finance}/betting-market/anchor/.gitignore | 0 {tokens => finance}/betting-market/anchor/Anchor.toml | 0 {tokens => finance}/betting-market/anchor/Cargo.toml | 0 {tokens => finance}/betting-market/anchor/README.md | 0 .../betting-market/anchor/programs/betting-market/Cargo.toml | 0 .../betting-market/anchor/programs/betting-market/Xargo.toml | 0 .../betting-market/anchor/programs/betting-market/src/error.rs | 0 .../programs/betting-market/src/instructions/add_outcome.rs | 0 .../programs/betting-market/src/instructions/cancel_event.rs | 0 .../programs/betting-market/src/instructions/claim_refund.rs | 0 .../programs/betting-market/src/instructions/claim_winnings.rs | 0 .../betting-market/src/instructions/close_losing_bet.rs | 0 .../programs/betting-market/src/instructions/create_event.rs | 0 .../betting-market/src/instructions/initialize_config.rs | 0 .../anchor/programs/betting-market/src/instructions/mod.rs | 0 .../programs/betting-market/src/instructions/place_bet.rs | 0 .../programs/betting-market/src/instructions/settle_event.rs | 0 .../anchor/programs/betting-market/src/instructions/shared.rs | 0 .../betting-market/anchor/programs/betting-market/src/lib.rs | 0 .../anchor/programs/betting-market/src/state/bet.rs | 0 .../anchor/programs/betting-market/src/state/config.rs | 0 .../anchor/programs/betting-market/src/state/event.rs | 0 .../anchor/programs/betting-market/src/state/mod.rs | 0 .../anchor/programs/betting-market/src/state/outcome.rs | 0 .../anchor/programs/betting-market/src/state/user.rs | 0 .../anchor/programs/betting-market/tests/test_betting_market.rs | 0 28 files changed, 1 insertion(+), 1 deletion(-) rename {tokens => finance}/betting-market/README.md (100%) rename {tokens => finance}/betting-market/anchor/.gitignore (100%) rename {tokens => finance}/betting-market/anchor/Anchor.toml (100%) rename {tokens => finance}/betting-market/anchor/Cargo.toml (100%) rename {tokens => finance}/betting-market/anchor/README.md (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/Cargo.toml (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/Xargo.toml (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/error.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/instructions/add_outcome.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/instructions/cancel_event.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/instructions/claim_refund.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/instructions/close_losing_bet.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/instructions/create_event.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/instructions/initialize_config.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/instructions/mod.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/instructions/place_bet.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/instructions/settle_event.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/instructions/shared.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/lib.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/state/bet.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/state/config.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/state/event.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/state/mod.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/state/outcome.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/src/state/user.rs (100%) rename {tokens => finance}/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs (100%) diff --git a/README.md b/README.md index 1220ca2a..487772c0 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ A managed investment fund onchain, like an ETF or mutual fund. Investors deposit Parimutuel (pooled) prediction market - an admin opens an event with multiple outcomes, bettors stake tokens on an outcome, and at settlement the losing pool (minus a protocol fee) is split among winners in proportion to their stake. -[โš“ Anchor](./tokens/betting-market/anchor) +[โš“ Anchor](./finance/betting-market/anchor) ## Single concept examples diff --git a/tokens/betting-market/README.md b/finance/betting-market/README.md similarity index 100% rename from tokens/betting-market/README.md rename to finance/betting-market/README.md diff --git a/tokens/betting-market/anchor/.gitignore b/finance/betting-market/anchor/.gitignore similarity index 100% rename from tokens/betting-market/anchor/.gitignore rename to finance/betting-market/anchor/.gitignore diff --git a/tokens/betting-market/anchor/Anchor.toml b/finance/betting-market/anchor/Anchor.toml similarity index 100% rename from tokens/betting-market/anchor/Anchor.toml rename to finance/betting-market/anchor/Anchor.toml diff --git a/tokens/betting-market/anchor/Cargo.toml b/finance/betting-market/anchor/Cargo.toml similarity index 100% rename from tokens/betting-market/anchor/Cargo.toml rename to finance/betting-market/anchor/Cargo.toml diff --git a/tokens/betting-market/anchor/README.md b/finance/betting-market/anchor/README.md similarity index 100% rename from tokens/betting-market/anchor/README.md rename to finance/betting-market/anchor/README.md diff --git a/tokens/betting-market/anchor/programs/betting-market/Cargo.toml b/finance/betting-market/anchor/programs/betting-market/Cargo.toml similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/Cargo.toml rename to finance/betting-market/anchor/programs/betting-market/Cargo.toml diff --git a/tokens/betting-market/anchor/programs/betting-market/Xargo.toml b/finance/betting-market/anchor/programs/betting-market/Xargo.toml similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/Xargo.toml rename to finance/betting-market/anchor/programs/betting-market/Xargo.toml diff --git a/tokens/betting-market/anchor/programs/betting-market/src/error.rs b/finance/betting-market/anchor/programs/betting-market/src/error.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/error.rs rename to finance/betting-market/anchor/programs/betting-market/src/error.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/add_outcome.rs b/finance/betting-market/anchor/programs/betting-market/src/instructions/add_outcome.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/instructions/add_outcome.rs rename to finance/betting-market/anchor/programs/betting-market/src/instructions/add_outcome.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/cancel_event.rs b/finance/betting-market/anchor/programs/betting-market/src/instructions/cancel_event.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/instructions/cancel_event.rs rename to finance/betting-market/anchor/programs/betting-market/src/instructions/cancel_event.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_refund.rs b/finance/betting-market/anchor/programs/betting-market/src/instructions/claim_refund.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_refund.rs rename to finance/betting-market/anchor/programs/betting-market/src/instructions/claim_refund.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs b/finance/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs rename to finance/betting-market/anchor/programs/betting-market/src/instructions/claim_winnings.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/close_losing_bet.rs b/finance/betting-market/anchor/programs/betting-market/src/instructions/close_losing_bet.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/instructions/close_losing_bet.rs rename to finance/betting-market/anchor/programs/betting-market/src/instructions/close_losing_bet.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/create_event.rs b/finance/betting-market/anchor/programs/betting-market/src/instructions/create_event.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/instructions/create_event.rs rename to finance/betting-market/anchor/programs/betting-market/src/instructions/create_event.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/initialize_config.rs b/finance/betting-market/anchor/programs/betting-market/src/instructions/initialize_config.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/instructions/initialize_config.rs rename to finance/betting-market/anchor/programs/betting-market/src/instructions/initialize_config.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/mod.rs b/finance/betting-market/anchor/programs/betting-market/src/instructions/mod.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/instructions/mod.rs rename to finance/betting-market/anchor/programs/betting-market/src/instructions/mod.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/place_bet.rs b/finance/betting-market/anchor/programs/betting-market/src/instructions/place_bet.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/instructions/place_bet.rs rename to finance/betting-market/anchor/programs/betting-market/src/instructions/place_bet.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/settle_event.rs b/finance/betting-market/anchor/programs/betting-market/src/instructions/settle_event.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/instructions/settle_event.rs rename to finance/betting-market/anchor/programs/betting-market/src/instructions/settle_event.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/instructions/shared.rs b/finance/betting-market/anchor/programs/betting-market/src/instructions/shared.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/instructions/shared.rs rename to finance/betting-market/anchor/programs/betting-market/src/instructions/shared.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/lib.rs b/finance/betting-market/anchor/programs/betting-market/src/lib.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/lib.rs rename to finance/betting-market/anchor/programs/betting-market/src/lib.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/bet.rs b/finance/betting-market/anchor/programs/betting-market/src/state/bet.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/state/bet.rs rename to finance/betting-market/anchor/programs/betting-market/src/state/bet.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/config.rs b/finance/betting-market/anchor/programs/betting-market/src/state/config.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/state/config.rs rename to finance/betting-market/anchor/programs/betting-market/src/state/config.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/event.rs b/finance/betting-market/anchor/programs/betting-market/src/state/event.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/state/event.rs rename to finance/betting-market/anchor/programs/betting-market/src/state/event.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/mod.rs b/finance/betting-market/anchor/programs/betting-market/src/state/mod.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/state/mod.rs rename to finance/betting-market/anchor/programs/betting-market/src/state/mod.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/outcome.rs b/finance/betting-market/anchor/programs/betting-market/src/state/outcome.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/state/outcome.rs rename to finance/betting-market/anchor/programs/betting-market/src/state/outcome.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/src/state/user.rs b/finance/betting-market/anchor/programs/betting-market/src/state/user.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/src/state/user.rs rename to finance/betting-market/anchor/programs/betting-market/src/state/user.rs diff --git a/tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs b/finance/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs similarity index 100% rename from tokens/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs rename to finance/betting-market/anchor/programs/betting-market/tests/test_betting_market.rs From 2bbc47999abb5197d6718185750fc08eaa3ad9ce Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Sun, 21 Jun 2026 16:14:26 -0400 Subject: [PATCH 094/138] Use solana-claude-skill rather than having a separate CONTRIBUTING.md --- CONTRIBUTING.md | 49 +++++++++++++++-------------- finance/order-book/anchor/README.md | 9 +++--- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4d073489..c2df08d2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,8 @@ # Contribution Guidelines -Thank you for considering a contribution to this repository. We welcome new examples, fixes, and improvements from the community. +Thank you for considering a contribution to this repository. We welcome new examples, fixes, and improvements from the community. For coding guidelines, see the [Quicknode Solana coding skill](https://github.com/quicknode/solana-claude-skill). + +See [CHANGELOG.md](./CHANGELOG.md) for release history. This file had no changelog before June 2026. ## How to Contribute @@ -10,8 +12,9 @@ Thank you for considering a contribution to this repository. We welcome new exam ## Project structure - Each example lives at `category/example-name//`, e.g. `basics/counter/anchor/`. -- Supported frameworks: `anchor`, `quasar`, `pinocchio`, `native`. Use the existing layout as a reference. -- Tests live alongside the program in a `tests/` directory. +- Supported frameworks: `anchor`, `quasar`, `pinocchio`, `native`, `asm`. Use the existing layout as a reference. +- Anchor and Quasar programs usually keep Rust tests under `programs//tests/`. +- Native and Pinocchio TypeScript tests (where present) live in a `tests/` directory next to the program. ## Tooling @@ -20,44 +23,42 @@ Thank you for considering a contribution to this repository. We welcome new exam ## Testing -This repo uses an in-process test runtime - no local validator boot, no `solana-test-validator`, no `anchor test --validator legacy`. +Run `pnpm test` from `category/example/anchor/` or `category/example/quasar/`. For existing test patterns follow `basics/counter/anchor/programs/counter_anchor/tests/test_counter.rs`. -**Anchor examples** are tested in Rust with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). Tests live in `programs//tests/`, load the compiled program with `include_bytes!("../../../target/deploy/.so")`, and run with `cargo test` (build the `.so` first with `cargo build-sbf` or `anchor build`). The conventional `Anchor.toml` `[scripts]` entry is: +### Native and Pinocchio -```toml -[scripts] -test = "cargo test" -``` +- Prefer LiteSVM for new tests. +- Some older Native examples still use `@solana/web3.js` v1 or `solana-bankrun`; do not copy that stack for new work. Migrate toward LiteSVM + Solana Kit when touching those files. + +### ASM -Optional helpers come from the [`solana-kite`](https://crates.io/crates/solana-kite) crate (wallet creation, token mint helpers, `send_transaction_from_instructions`). +ASM examples keep LiteSVM tests inline in `src/lib.rs`. Build with `sbpf build`, test with `cargo test`. -**Quasar examples** are tested in Rust with QuasarSVM. Run `quasar build` (which also generates the Rust client crate under `target/client/rust/` that the tests import), then `quasar test` or `cargo test`. +### TypeScript client tests (legacy / optional) -**Native and Pinocchio examples** use `litesvm` directly from Rust. Tests live in `program/tests/`, load the compiled program with `include_bytes!` from the workspace `target/deploy/`, and run with `cargo test --manifest-path=./program/Cargo.toml` (build the `.so` first with `cargo build-sbf --manifest-path=./program/Cargo.toml`). +A few paths still use TypeScript with `node:test` and Codama-generated clients. That is not the default for new Anchor examples. Run with: -**ASM examples** keep their LiteSVM tests inline in `src/lib.rs`; build with `sbpf build`, test with `cargo test`. +```bash +npx tsx --test --test-reporter=spec tests/*.ts +``` -Do not write TypeScript tests for any program, and do not use `anchor.workspace` or `program.methods.X().rpc()`. All tests are Rust + LiteSVM (QuasarSVM for Quasar). +## Documentation -Tests must exercise the program for real: initialize accounts, send transactions through the program's instruction handlers, and assert resulting state and balances. Placeholder tests (`assert!(true)`, build-only checks) don't count. +Every `anchor/` (and other framework) directory should include a `README.md`. Use [docs/example-readme-template.md](./docs/example-readme-template.md) as the starting point. -## Style +Also update [CHANGELOG.md](./CHANGELOG.md) when you ship user-visible changes. -Write American English in prose (e.g. "behavior", "initialize", "favor"). Code identifiers stay as-is. +### Style -Other conventions: +Write American English in prose (e.g. "behavior", "initialize", "favor"). Code identifiers stay as-is. - One H1 per markdown file. - Fenced code blocks include a language tag (` ```rust `, ` ```typescript `, ` ```bash `, ` ```toml `). -- Use full words rather than abbreviations (`transaction`, not `tx` or `txn`; `account`, not `acc`). -- Prefer `async`/`await` over `.then()`/`.catch()`. -- Use `Array` rather than `T[]` in TypeScript. -- Avoid magic numbers - name or explain them. -- Write "onchain" / "offchain" as single words (no hyphen). +- Link canonical Solana terms to the [terminology page](https://solana.com/docs/references/terminology) on first mention in READMEs. ## Excluding an example from CI -Add the project path to `.ghaignore` to skip it during CI builds. If you remove or replace an example, update `.ghaignore` accordingly. +Add the project path to `.github/.ghaignore` with a one-line comment explaining why (build failure, needs mainnet fixtures, etc.). Remove entries when the example is fixed. ## Code of conduct diff --git a/finance/order-book/anchor/README.md b/finance/order-book/anchor/README.md index c74102bf..1c1e2923 100644 --- a/finance/order-book/anchor/README.md +++ b/finance/order-book/anchor/README.md @@ -1,9 +1,8 @@ -# Order Book - Central Limit Order Book (CLOB) +# Order Book โ€” Central Limit Order Book (CLOB) Exchange -This is an **[order book](https://www.investopedia.com/terms/o/order-book.asp)** - specifically, a **[central limit order -book (CLOB)](https://www.investopedia.com/terms/o/order-book.asp)**, the standard piece of market infrastructure used by -NYSE, NASDAQ, LSE, CME, and every major crypto venue. An Anchor -program that runs an onchain order book for a single pair of token mints: +This is an **[order book](https://www.investopedia.com/terms/o/order-book.asp)** โ€” specifically, a **[central limit order +book (CLOB)](https://www.investopedia.com/terms/l/limitorderbook.asp)**, the standard piece of market infrastructure used by +NYSE, NASDAQ, LSE, CME, and every crypto venues like Phoenix and Cube and OpenBook. An Anchor program that runs an onchain order book for a single pair of token mints: users post buy or sell offers at the prices they want, the program matches crossing offers in price-time priority, and settles the resulting token movements. From 9cc95289d95ef191c0ffc642384f7aad940d54ee Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 21 Jun 2026 20:53:57 +0000 Subject: [PATCH 095/138] Seed LendingMarket by a market_id, not the owner A market keyed on the owner's address can only ever exist once per owner, which contradicts the multi-market isolation the program is meant to support, and is inconsistent with the repo's own convention (the order-book Market is seeded by its mint pair, not by an admin's address). LendingMarket is now seeded by a unique market_id (a client-chosen Pubkey, like token-swap's Amm); owner is a stored field and admin handlers authorize with has_one = owner. Reserves, obligations, and vaults already key off the market account address, so they're unchanged. Mirrored into the Quasar port (market_id passed as a reference account) and the test harnesses; READMEs/CHANGELOGs updated. https://claude.ai/code/session_01RwE8f8ahP5S6SDNTsXmpj9 --- finance/lending/anchor/CHANGELOG.md | 2 ++ finance/lending/anchor/README.md | 4 +++- .../src/instructions/admin/collect_protocol_fees.rs | 9 +++------ .../src/instructions/admin/init_lending_market.rs | 10 ++++++++-- .../lending/src/instructions/admin/init_reserve.rs | 10 ++++------ .../src/instructions/admin/update_reserve_config.rs | 9 +++------ finance/lending/anchor/programs/lending/src/lib.rs | 7 +++++-- .../programs/lending/src/state/lending_market.rs | 5 +++++ .../anchor/programs/lending/tests/common/mod.rs | 12 ++++++++---- finance/lending/quasar/CHANGELOG.md | 2 ++ finance/lending/quasar/README.md | 3 ++- finance/lending/quasar/src/instructions/admin.rs | 10 +++++++--- finance/lending/quasar/src/state.rs | 7 +++++-- finance/lending/quasar/src/tests.rs | 7 ++++++- 14 files changed, 63 insertions(+), 34 deletions(-) diff --git a/finance/lending/anchor/CHANGELOG.md b/finance/lending/anchor/CHANGELOG.md index 2eaa9500..dba33162 100644 --- a/finance/lending/anchor/CHANGELOG.md +++ b/finance/lending/anchor/CHANGELOG.md @@ -27,3 +27,5 @@ Initial lending program: a Kamino/Solend-style borrow/lend market. - Reserve factor: the protocol keeps `reserve_factor_bps` of accrued interest as fees the market owner withdraws with `collect_protocol_fees`; the fees are carved out of `total_liquidity` so they never inflate the supplier exchange rate. +- LendingMarket is seeded by a unique `market_id` (not the owner), so one owner + can run several independent markets; admin handlers authorize via `has_one = owner`. diff --git a/finance/lending/anchor/README.md b/finance/lending/anchor/README.md index c0a0e937..73252545 100644 --- a/finance/lending/anchor/README.md +++ b/finance/lending/anchor/README.md @@ -32,7 +32,9 @@ crosses the liquidation threshold and a liquidator can close part of the positio ### Accounts - **`LendingMarket`** โ€” top-level config (owner, quote-currency mint). PDA seeds - `["lending_market", owner]`. + `["lending_market", market_id]`, where `market_id` is a client-chosen `Pubkey` + (typically a fresh keypair). Seeding by an id rather than the owner lets one + owner run several independent, risk-isolated markets. - **`Reserve`** โ€” one per asset. Owns a program-controlled liquidity vault and a share-token mint, and stores the interest-rate config, the cumulative borrow- rate index, available liquidity, and scaled total debt. PDA seeds diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/collect_protocol_fees.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/collect_protocol_fees.rs index 0a5554db..2e0b0061 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/admin/collect_protocol_fees.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/collect_protocol_fees.rs @@ -3,7 +3,6 @@ use anchor_spl::token_interface::{ transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, }; -use crate::constants::LENDING_MARKET_SEED; use crate::errors::LendingError; use crate::state::{reserve_signer_seeds, LendingMarket, Reserve}; @@ -51,11 +50,9 @@ pub fn handle_collect_protocol_fees(context: Context) -> Re #[derive(Accounts)] pub struct CollectProtocolFees<'info> { - #[account( - has_one = owner, - seeds = [LENDING_MARKET_SEED, owner.key().as_ref()], - bump = lending_market.bump, - )] + // Identified by the reserve's `has_one = lending_market`; we only prove the + // signer owns it. + #[account(has_one = owner)] pub lending_market: Account<'info, LendingMarket>, #[account(mut)] diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs index d3fba8a8..c2ef79bd 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs @@ -4,8 +4,12 @@ use anchor_spl::token_interface::Mint; use crate::constants::LENDING_MARKET_SEED; use crate::state::LendingMarket; -pub fn handle_init_lending_market(context: Context) -> Result<()> { +pub fn handle_init_lending_market( + context: Context, + market_id: Pubkey, +) -> Result<()> { let market = &mut context.accounts.lending_market; + market.market_id = market_id; market.owner = context.accounts.owner.key(); market.quote_currency_mint = context.accounts.quote_currency_mint.key(); market.bump = context.bumps.lending_market; @@ -13,12 +17,14 @@ pub fn handle_init_lending_market(context: Context) -> Result } #[derive(Accounts)] +#[instruction(market_id: Pubkey)] pub struct InitLendingMarket<'info> { + // Seeded by `market_id`, not `owner`, so one owner can run several markets. #[account( init, payer = owner, space = LendingMarket::DISCRIMINATOR.len() + LendingMarket::INIT_SPACE, - seeds = [LENDING_MARKET_SEED, owner.key().as_ref()], + seeds = [LENDING_MARKET_SEED, market_id.as_ref()], bump, )] pub lending_market: Account<'info, LendingMarket>, diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs index ad9c57b6..a58e1c81 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs @@ -2,7 +2,7 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; use crate::constants::{ - FIXED_POINT_SCALE, LENDING_MARKET_SEED, LIQUIDITY_VAULT_SEED, RESERVE_SEED, SHARE_MINT_SEED, + FIXED_POINT_SCALE, LIQUIDITY_VAULT_SEED, RESERVE_SEED, SHARE_MINT_SEED, }; use crate::state::{LendingMarket, PriceFeed, Reserve, ReserveConfig}; @@ -29,11 +29,9 @@ pub fn handle_init_reserve(context: Context, config: ReserveConfig) #[derive(Accounts)] pub struct InitReserve<'info> { - #[account( - has_one = owner, - seeds = [LENDING_MARKET_SEED, owner.key().as_ref()], - bump = lending_market.bump, - )] + // The reserve PDA below is seeded by this market's address, so the market is + // pinned by that seed; we only need to prove the signer owns it. + #[account(has_one = owner)] pub lending_market: Account<'info, LendingMarket>, #[account(mut)] diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/update_reserve_config.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/update_reserve_config.rs index c4ebda7a..06df1b1b 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/admin/update_reserve_config.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/update_reserve_config.rs @@ -1,6 +1,5 @@ use anchor_lang::prelude::*; -use crate::constants::LENDING_MARKET_SEED; use crate::state::{LendingMarket, Reserve, ReserveConfig}; pub fn handle_update_reserve_config( @@ -14,11 +13,9 @@ pub fn handle_update_reserve_config( #[derive(Accounts)] pub struct UpdateReserveConfig<'info> { - #[account( - has_one = owner, - seeds = [LENDING_MARKET_SEED, owner.key().as_ref()], - bump = lending_market.bump, - )] + // The market is identified by the reserve's `has_one = lending_market`; we + // only need to prove the signer owns it, not re-derive its address. + #[account(has_one = owner)] pub lending_market: Account<'info, LendingMarket>, pub owner: Signer<'info>, diff --git a/finance/lending/anchor/programs/lending/src/lib.rs b/finance/lending/anchor/programs/lending/src/lib.rs index df2d3933..cbcb8af3 100644 --- a/finance/lending/anchor/programs/lending/src/lib.rs +++ b/finance/lending/anchor/programs/lending/src/lib.rs @@ -15,8 +15,11 @@ declare_id!("4bvT6A8S7ZVL6bSvK2KoL2nQ4F5H6AF9133kCYbMJj1t"); pub mod lending { use super::*; - pub fn init_lending_market(context: Context) -> Result<()> { - instructions::handle_init_lending_market(context) + pub fn init_lending_market( + context: Context, + market_id: Pubkey, + ) -> Result<()> { + instructions::handle_init_lending_market(context, market_id) } pub fn init_reserve(context: Context, config: ReserveConfig) -> Result<()> { diff --git a/finance/lending/anchor/programs/lending/src/state/lending_market.rs b/finance/lending/anchor/programs/lending/src/state/lending_market.rs index d4ee951d..95641d59 100644 --- a/finance/lending/anchor/programs/lending/src/state/lending_market.rs +++ b/finance/lending/anchor/programs/lending/src/state/lending_market.rs @@ -5,6 +5,11 @@ use anchor_lang::prelude::*; #[account] #[derive(InitSpace)] pub struct LendingMarket { + /// Unique id this market's PDA is derived from (a client-chosen `Pubkey`, + /// typically a fresh keypair). Seeding by an id rather than `owner` lets one + /// owner run several independent, risk-isolated markets. + pub market_id: Pubkey, + pub owner: Pubkey, /// The mint that obligation values are denominated in (for example USDC). diff --git a/finance/lending/anchor/programs/lending/tests/common/mod.rs b/finance/lending/anchor/programs/lending/tests/common/mod.rs index c6beb8c5..a0480fda 100644 --- a/finance/lending/anchor/programs/lending/tests/common/mod.rs +++ b/finance/lending/anchor/programs/lending/tests/common/mod.rs @@ -97,7 +97,10 @@ impl Env { let owner = create_wallet(&mut svm, 1_000_000_000_000).unwrap(); let quote_mint = create_token_mint(&mut svm, &owner, 6, None).unwrap(); - let market = pda(&[LENDING_MARKET_SEED, owner.pubkey().as_ref()]); + // The market is seeded by a unique id (a fresh keypair pubkey), not by + // the owner, so one owner can run several markets. + let market_id = Keypair::new().pubkey(); + let market = pda(&[LENDING_MARKET_SEED, market_id.as_ref()]); let instruction = Instruction { program_id: lending::id(), @@ -108,7 +111,7 @@ impl Env { system_program: system_program::id(), } .to_account_metas(None), - data: lending::instruction::InitLendingMarket {}.data(), + data: lending::instruction::InitLendingMarket { market_id }.data(), }; send(&mut svm, vec![instruction], &[&owner], &owner.pubkey()).unwrap(); @@ -124,7 +127,8 @@ impl Env { pub fn init_market_for(&mut self, market_owner: &Keypair) -> Pubkey { let env_owner = self.owner.insecure_clone(); let quote_mint = create_token_mint(&mut self.svm, &env_owner, 6, None).unwrap(); - let market = pda(&[LENDING_MARKET_SEED, market_owner.pubkey().as_ref()]); + let market_id = Keypair::new().pubkey(); + let market = pda(&[LENDING_MARKET_SEED, market_id.as_ref()]); let instruction = Instruction { program_id: lending::id(), accounts: lending::accounts::InitLendingMarket { @@ -134,7 +138,7 @@ impl Env { system_program: system_program::id(), } .to_account_metas(None), - data: lending::instruction::InitLendingMarket {}.data(), + data: lending::instruction::InitLendingMarket { market_id }.data(), }; send(&mut self.svm, vec![instruction], &[market_owner], &market_owner.pubkey()).unwrap(); market diff --git a/finance/lending/quasar/CHANGELOG.md b/finance/lending/quasar/CHANGELOG.md index 795fac4f..b004a77c 100644 --- a/finance/lending/quasar/CHANGELOG.md +++ b/finance/lending/quasar/CHANGELOG.md @@ -21,3 +21,5 @@ Initial Quasar port of the Kamino/Solend-style borrow/lend program. (`LiquidationTooLarge`). - Reserve factor: the protocol keeps `reserve_factor_bps` of accrued interest as fees the market owner withdraws with `collect_protocol_fees`. +- LendingMarket is seeded by a unique `market_id` (not the owner), so one owner + can run several independent markets. diff --git a/finance/lending/quasar/README.md b/finance/lending/quasar/README.md index db8812bc..80053ee8 100644 --- a/finance/lending/quasar/README.md +++ b/finance/lending/quasar/README.md @@ -29,7 +29,8 @@ Everything else mirrors the Anchor version. ## Major concepts - **`LendingMarket`** โ€” market config (owner, quote-currency mint). PDA: - `["lending_market", owner]`. + `["lending_market", market_id]`, where `market_id` is a client-chosen address + (typically a fresh keypair), so one owner can run several isolated markets. - **`Reserve`** โ€” one asset's pool. Owns a program-controlled liquidity vault and a share-token mint (both PDAs, authority = the reserve), and stores the interest-rate config, the cumulative borrow-rate index, available liquidity, and diff --git a/finance/lending/quasar/src/instructions/admin.rs b/finance/lending/quasar/src/instructions/admin.rs index b996d3f5..4a7d7e69 100644 --- a/finance/lending/quasar/src/instructions/admin.rs +++ b/finance/lending/quasar/src/instructions/admin.rs @@ -22,7 +22,10 @@ use { pub struct InitLendingMarket { #[account(mut)] pub owner: Signer, - #[account(init, payer = owner, address = LendingMarket::seeds(owner.address()))] + /// Only its address is used โ€” as the market's unique seed โ€” so one owner can + /// open many markets. Typically a fresh keypair the client generates. + pub market_id: UncheckedAccount, + #[account(init, payer = owner, address = LendingMarket::seeds(market_id.address()))] pub lending_market: Account, pub quote_mint: Account, pub system_program: Program, @@ -32,6 +35,7 @@ impl InitLendingMarket { #[inline(always)] pub fn run(&mut self, bumps: &InitLendingMarketBumps) -> Result<(), ProgramError> { self.lending_market.set_inner(LendingMarketInner { + market_id: *self.market_id.address(), owner: *self.owner.address(), quote_mint: *self.quote_mint.address(), bump: bumps.lending_market, @@ -48,7 +52,7 @@ impl InitLendingMarket { pub struct InitReserve { #[account(mut)] pub owner: Signer, - #[account(has_one(owner), address = LendingMarket::seeds(owner.address()))] + #[account(has_one(owner))] pub lending_market: Account, #[account(init, payer = owner, address = Reserve::seeds(lending_market.address(), liquidity_mint.address()))] pub reserve: Account, @@ -222,7 +226,7 @@ impl SetPrice { pub struct CollectProtocolFees { #[account(mut)] pub owner: Signer, - #[account(has_one(owner), address = LendingMarket::seeds(owner.address()))] + #[account(has_one(owner))] pub lending_market: Account, #[account(mut, has_one(lending_market), has_one(liquidity_mint), has_one(liquidity_vault))] pub reserve: Account, diff --git a/finance/lending/quasar/src/state.rs b/finance/lending/quasar/src/state.rs index e5283757..277356bc 100644 --- a/finance/lending/quasar/src/state.rs +++ b/finance/lending/quasar/src/state.rs @@ -5,10 +5,13 @@ use quasar_lang::prelude::*; -/// Top-level market config. PDA: `["lending_market", owner]`. +/// Top-level market config. PDA: `["lending_market", market_id]`. +/// Seeded by a unique `market_id` (a client-chosen address, typically a fresh +/// keypair) rather than `owner`, so one owner can run several isolated markets. #[account(discriminator = 1, set_inner)] -#[seeds(b"lending_market", owner: Address)] +#[seeds(b"lending_market", market_id: Address)] pub struct LendingMarket { + pub market_id: Address, pub owner: Address, pub quote_mint: Address, pub bump: u8, diff --git a/finance/lending/quasar/src/tests.rs b/finance/lending/quasar/src/tests.rs index bdcd9919..09b8d076 100644 --- a/finance/lending/quasar/src/tests.rs +++ b/finance/lending/quasar/src/tests.rs @@ -37,6 +37,8 @@ const BORROWER_BORROW: Pubkey = Pubkey::new_from_array([14; 32]); const LIQUIDATOR_BORROW: Pubkey = Pubkey::new_from_array([15; 32]); const LIQUIDATOR_COLL_SHARE: Pubkey = Pubkey::new_from_array([16; 32]); const OWNER_BORROW: Pubkey = Pubkey::new_from_array([17; 32]); +// Unique id the market PDA is seeded from (a stand-in for a fresh keypair). +const MARKET_ID: Pubkey = Pubkey::new_from_array([20; 32]); fn token_program() -> Pubkey { quasar_svm::SPL_TOKEN_PROGRAM_ID @@ -124,7 +126,7 @@ impl World { .with_program(&crate::ID, &elf) .with_token_program(); - let (market, _) = pda(&[b"lending_market", OWNER.as_ref()]); + let (market, _) = pda(&[b"lending_market", MARKET_ID.as_ref()]); let (coll_reserve, _) = pda(&[b"reserve", market.as_ref(), COLL_MINT.as_ref()]); let (borrow_reserve, _) = pda(&[b"reserve", market.as_ref(), BORROW_MINT.as_ref()]); let (coll_vault, _) = pda(&[b"liquidity_vault", coll_reserve.as_ref()]); @@ -146,6 +148,8 @@ impl World { mint(COLL_MINT, OWNER), mint(BORROW_MINT, OWNER), mint(QUOTE_MINT, OWNER), + // Reference-only account whose address seeds the market. + empty(MARKET_ID), // PDAs created by the program. empty(market), empty(coll_reserve), @@ -200,6 +204,7 @@ impl World { fn init_market(&mut self) { let metas = vec![ meta(OWNER, true, true), + meta(MARKET_ID, false, false), meta(self.market, true, false), meta(QUOTE_MINT, false, false), meta(system_program(), false, false), From 2647401a5cf43b7af5497050b790c1466d5ead82 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 21 Jun 2026 21:11:02 +0000 Subject: [PATCH 096/138] Seed LendingMarket by a per-owner u64 index, not a Pubkey id Replaces the Pubkey market_id with a per-owner u64 index: the market PDA is now seeded by (owner, market_id), e.g. "owner's market 0". An integer is more readable than an opaque pubkey and needs no keypair; scoping it under the owner keeps each owner's index space collision-free without a global registry (a bare global integer would invite the same first-come land-grab the oracle fix removed). Applied to Anchor and Quasar (Quasar takes market_id as an instruction-data u64 seed, dropping the reference account), with test harnesses, READMEs, and CHANGELOGs updated. https://claude.ai/code/session_01RwE8f8ahP5S6SDNTsXmpj9 --- finance/lending/anchor/CHANGELOG.md | 5 +++-- finance/lending/anchor/README.md | 7 ++++--- .../instructions/admin/init_lending_market.rs | 9 +++++---- .../lending/anchor/programs/lending/src/lib.rs | 2 +- .../programs/lending/src/state/lending_market.rs | 9 +++++---- .../anchor/programs/lending/tests/common/mod.rs | 16 ++++++++++------ finance/lending/quasar/CHANGELOG.md | 4 ++-- finance/lending/quasar/README.md | 4 ++-- finance/lending/quasar/src/instructions/admin.rs | 11 +++++------ finance/lending/quasar/src/lib.rs | 7 +++++-- finance/lending/quasar/src/state.rs | 10 +++++----- finance/lending/quasar/src/tests.rs | 14 +++++++------- 12 files changed, 54 insertions(+), 44 deletions(-) diff --git a/finance/lending/anchor/CHANGELOG.md b/finance/lending/anchor/CHANGELOG.md index dba33162..bb8c4377 100644 --- a/finance/lending/anchor/CHANGELOG.md +++ b/finance/lending/anchor/CHANGELOG.md @@ -27,5 +27,6 @@ Initial lending program: a Kamino/Solend-style borrow/lend market. - Reserve factor: the protocol keeps `reserve_factor_bps` of accrued interest as fees the market owner withdraws with `collect_protocol_fees`; the fees are carved out of `total_liquidity` so they never inflate the supplier exchange rate. -- LendingMarket is seeded by a unique `market_id` (not the owner), so one owner - can run several independent markets; admin handlers authorize via `has_one = owner`. +- LendingMarket is seeded by `(owner, market_id)` โ€” a per-owner `u64` index โ€” + so one owner can run several independent markets; admin handlers authorize via + `has_one = owner`. diff --git a/finance/lending/anchor/README.md b/finance/lending/anchor/README.md index 73252545..45317174 100644 --- a/finance/lending/anchor/README.md +++ b/finance/lending/anchor/README.md @@ -32,9 +32,10 @@ crosses the liquidation threshold and a liquidator can close part of the positio ### Accounts - **`LendingMarket`** โ€” top-level config (owner, quote-currency mint). PDA seeds - `["lending_market", market_id]`, where `market_id` is a client-chosen `Pubkey` - (typically a fresh keypair). Seeding by an id rather than the owner lets one - owner run several independent, risk-isolated markets. + `["lending_market", owner, market_id]`, where `market_id` is a per-owner `u64` + index. Seeding by an index (not the owner alone) lets one owner run several + independent, risk-isolated markets โ€” their market 0, 1, 2 โ€ฆ โ€” with no + cross-owner collisions. - **`Reserve`** โ€” one per asset. Owns a program-controlled liquidity vault and a share-token mint, and stores the interest-rate config, the cumulative borrow- rate index, available liquidity, and scaled total debt. PDA seeds diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs index c2ef79bd..67a749dd 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs @@ -6,7 +6,7 @@ use crate::state::LendingMarket; pub fn handle_init_lending_market( context: Context, - market_id: Pubkey, + market_id: u64, ) -> Result<()> { let market = &mut context.accounts.lending_market; market.market_id = market_id; @@ -17,14 +17,15 @@ pub fn handle_init_lending_market( } #[derive(Accounts)] -#[instruction(market_id: Pubkey)] +#[instruction(market_id: u64)] pub struct InitLendingMarket<'info> { - // Seeded by `market_id`, not `owner`, so one owner can run several markets. + // Seeded by (owner, market_id), so one owner can run several markets and no + // two owners contend for the same address. #[account( init, payer = owner, space = LendingMarket::DISCRIMINATOR.len() + LendingMarket::INIT_SPACE, - seeds = [LENDING_MARKET_SEED, market_id.as_ref()], + seeds = [LENDING_MARKET_SEED, owner.key().as_ref(), &market_id.to_le_bytes()], bump, )] pub lending_market: Account<'info, LendingMarket>, diff --git a/finance/lending/anchor/programs/lending/src/lib.rs b/finance/lending/anchor/programs/lending/src/lib.rs index cbcb8af3..ca848d0b 100644 --- a/finance/lending/anchor/programs/lending/src/lib.rs +++ b/finance/lending/anchor/programs/lending/src/lib.rs @@ -17,7 +17,7 @@ pub mod lending { pub fn init_lending_market( context: Context, - market_id: Pubkey, + market_id: u64, ) -> Result<()> { instructions::handle_init_lending_market(context, market_id) } diff --git a/finance/lending/anchor/programs/lending/src/state/lending_market.rs b/finance/lending/anchor/programs/lending/src/state/lending_market.rs index 95641d59..f99fe29f 100644 --- a/finance/lending/anchor/programs/lending/src/state/lending_market.rs +++ b/finance/lending/anchor/programs/lending/src/state/lending_market.rs @@ -5,10 +5,11 @@ use anchor_lang::prelude::*; #[account] #[derive(InitSpace)] pub struct LendingMarket { - /// Unique id this market's PDA is derived from (a client-chosen `Pubkey`, - /// typically a fresh keypair). Seeding by an id rather than `owner` lets one - /// owner run several independent, risk-isolated markets. - pub market_id: Pubkey, + /// Per-owner index this market's PDA is derived from. Seeding by + /// `(owner, market_id)` rather than the owner alone lets one owner run + /// several independent, risk-isolated markets ("their market 0, 1, 2 โ€ฆ") + /// while keeping each owner's index space free of cross-owner collisions. + pub market_id: u64, pub owner: Pubkey, diff --git a/finance/lending/anchor/programs/lending/tests/common/mod.rs b/finance/lending/anchor/programs/lending/tests/common/mod.rs index a0480fda..a05903eb 100644 --- a/finance/lending/anchor/programs/lending/tests/common/mod.rs +++ b/finance/lending/anchor/programs/lending/tests/common/mod.rs @@ -97,10 +97,10 @@ impl Env { let owner = create_wallet(&mut svm, 1_000_000_000_000).unwrap(); let quote_mint = create_token_mint(&mut svm, &owner, 6, None).unwrap(); - // The market is seeded by a unique id (a fresh keypair pubkey), not by - // the owner, so one owner can run several markets. - let market_id = Keypair::new().pubkey(); - let market = pda(&[LENDING_MARKET_SEED, market_id.as_ref()]); + // The market is seeded by (owner, market_id), so one owner can run + // several markets. This is the owner's market 0. + let market_id: u64 = 0; + let market = pda(&[LENDING_MARKET_SEED, owner.pubkey().as_ref(), &market_id.to_le_bytes()]); let instruction = Instruction { program_id: lending::id(), @@ -127,8 +127,12 @@ impl Env { pub fn init_market_for(&mut self, market_owner: &Keypair) -> Pubkey { let env_owner = self.owner.insecure_clone(); let quote_mint = create_token_mint(&mut self.svm, &env_owner, 6, None).unwrap(); - let market_id = Keypair::new().pubkey(); - let market = pda(&[LENDING_MARKET_SEED, market_id.as_ref()]); + let market_id: u64 = 0; + let market = pda(&[ + LENDING_MARKET_SEED, + market_owner.pubkey().as_ref(), + &market_id.to_le_bytes(), + ]); let instruction = Instruction { program_id: lending::id(), accounts: lending::accounts::InitLendingMarket { diff --git a/finance/lending/quasar/CHANGELOG.md b/finance/lending/quasar/CHANGELOG.md index b004a77c..93500737 100644 --- a/finance/lending/quasar/CHANGELOG.md +++ b/finance/lending/quasar/CHANGELOG.md @@ -21,5 +21,5 @@ Initial Quasar port of the Kamino/Solend-style borrow/lend program. (`LiquidationTooLarge`). - Reserve factor: the protocol keeps `reserve_factor_bps` of accrued interest as fees the market owner withdraws with `collect_protocol_fees`. -- LendingMarket is seeded by a unique `market_id` (not the owner), so one owner - can run several independent markets. +- LendingMarket is seeded by `(owner, market_id)` โ€” a per-owner `u64` index โ€” + so one owner can run several independent markets. diff --git a/finance/lending/quasar/README.md b/finance/lending/quasar/README.md index 80053ee8..f3493fcc 100644 --- a/finance/lending/quasar/README.md +++ b/finance/lending/quasar/README.md @@ -29,8 +29,8 @@ Everything else mirrors the Anchor version. ## Major concepts - **`LendingMarket`** โ€” market config (owner, quote-currency mint). PDA: - `["lending_market", market_id]`, where `market_id` is a client-chosen address - (typically a fresh keypair), so one owner can run several isolated markets. + `["lending_market", owner, market_id]`, where `market_id` is a per-owner `u64` + index, so one owner can run several isolated markets (their market 0, 1, 2 โ€ฆ). - **`Reserve`** โ€” one asset's pool. Owns a program-controlled liquidity vault and a share-token mint (both PDAs, authority = the reserve), and stores the interest-rate config, the cumulative borrow-rate index, available liquidity, and diff --git a/finance/lending/quasar/src/instructions/admin.rs b/finance/lending/quasar/src/instructions/admin.rs index 4a7d7e69..b043ff02 100644 --- a/finance/lending/quasar/src/instructions/admin.rs +++ b/finance/lending/quasar/src/instructions/admin.rs @@ -19,13 +19,12 @@ use { // --------------------------------------------------------------------------- #[derive(Accounts)] +#[instruction(market_id: u64)] pub struct InitLendingMarket { #[account(mut)] pub owner: Signer, - /// Only its address is used โ€” as the market's unique seed โ€” so one owner can - /// open many markets. Typically a fresh keypair the client generates. - pub market_id: UncheckedAccount, - #[account(init, payer = owner, address = LendingMarket::seeds(market_id.address()))] + // Seeded by (owner, market_id), a per-owner index โ€” one owner, many markets. + #[account(init, payer = owner, address = LendingMarket::seeds(owner.address(), market_id))] pub lending_market: Account, pub quote_mint: Account, pub system_program: Program, @@ -33,10 +32,10 @@ pub struct InitLendingMarket { impl InitLendingMarket { #[inline(always)] - pub fn run(&mut self, bumps: &InitLendingMarketBumps) -> Result<(), ProgramError> { + pub fn run(&mut self, market_id: u64, bumps: &InitLendingMarketBumps) -> Result<(), ProgramError> { self.lending_market.set_inner(LendingMarketInner { - market_id: *self.market_id.address(), owner: *self.owner.address(), + market_id, quote_mint: *self.quote_mint.address(), bump: bumps.lending_market, }); diff --git a/finance/lending/quasar/src/lib.rs b/finance/lending/quasar/src/lib.rs index 8358d7a8..4c2abaa2 100644 --- a/finance/lending/quasar/src/lib.rs +++ b/finance/lending/quasar/src/lib.rs @@ -34,8 +34,11 @@ mod quasar_lending { use super::*; #[instruction(discriminator = 0)] - pub fn init_lending_market(ctx: Ctx) -> Result<(), ProgramError> { - ctx.accounts.run(&ctx.bumps) + pub fn init_lending_market( + ctx: Ctx, + market_id: u64, + ) -> Result<(), ProgramError> { + ctx.accounts.run(market_id, &ctx.bumps) } #[instruction(discriminator = 1)] diff --git a/finance/lending/quasar/src/state.rs b/finance/lending/quasar/src/state.rs index 277356bc..0f7f598a 100644 --- a/finance/lending/quasar/src/state.rs +++ b/finance/lending/quasar/src/state.rs @@ -5,14 +5,14 @@ use quasar_lang::prelude::*; -/// Top-level market config. PDA: `["lending_market", market_id]`. -/// Seeded by a unique `market_id` (a client-chosen address, typically a fresh -/// keypair) rather than `owner`, so one owner can run several isolated markets. +/// Top-level market config. PDA: `["lending_market", owner, market_id]`. +/// Seeded by a per-owner index, so one owner can run several isolated markets +/// ("their market 0, 1, 2 โ€ฆ") with no cross-owner collisions. #[account(discriminator = 1, set_inner)] -#[seeds(b"lending_market", market_id: Address)] +#[seeds(b"lending_market", owner: Address, market_id: u64)] pub struct LendingMarket { - pub market_id: Address, pub owner: Address, + pub market_id: u64, pub quote_mint: Address, pub bump: u8, } diff --git a/finance/lending/quasar/src/tests.rs b/finance/lending/quasar/src/tests.rs index 09b8d076..82ca0764 100644 --- a/finance/lending/quasar/src/tests.rs +++ b/finance/lending/quasar/src/tests.rs @@ -37,8 +37,8 @@ const BORROWER_BORROW: Pubkey = Pubkey::new_from_array([14; 32]); const LIQUIDATOR_BORROW: Pubkey = Pubkey::new_from_array([15; 32]); const LIQUIDATOR_COLL_SHARE: Pubkey = Pubkey::new_from_array([16; 32]); const OWNER_BORROW: Pubkey = Pubkey::new_from_array([17; 32]); -// Unique id the market PDA is seeded from (a stand-in for a fresh keypair). -const MARKET_ID: Pubkey = Pubkey::new_from_array([20; 32]); +// Per-owner market index this market is seeded from (owner's market 0). +const MARKET_ID: u64 = 0; fn token_program() -> Pubkey { quasar_svm::SPL_TOKEN_PROGRAM_ID @@ -126,7 +126,7 @@ impl World { .with_program(&crate::ID, &elf) .with_token_program(); - let (market, _) = pda(&[b"lending_market", MARKET_ID.as_ref()]); + let (market, _) = pda(&[b"lending_market", OWNER.as_ref(), &MARKET_ID.to_le_bytes()]); let (coll_reserve, _) = pda(&[b"reserve", market.as_ref(), COLL_MINT.as_ref()]); let (borrow_reserve, _) = pda(&[b"reserve", market.as_ref(), BORROW_MINT.as_ref()]); let (coll_vault, _) = pda(&[b"liquidity_vault", coll_reserve.as_ref()]); @@ -148,8 +148,6 @@ impl World { mint(COLL_MINT, OWNER), mint(BORROW_MINT, OWNER), mint(QUOTE_MINT, OWNER), - // Reference-only account whose address seeds the market. - empty(MARKET_ID), // PDAs created by the program. empty(market), empty(coll_reserve), @@ -202,14 +200,16 @@ impl World { } fn init_market(&mut self) { + // Instruction data: [discriminator 0][market_id u64 LE]. + let mut data = vec![0u8]; + data.extend_from_slice(&MARKET_ID.to_le_bytes()); let metas = vec![ meta(OWNER, true, true), - meta(MARKET_ID, false, false), meta(self.market, true, false), meta(QUOTE_MINT, false, false), meta(system_program(), false, false), ]; - self.run(vec![0], metas).assert_success(); + self.run(data, metas).assert_success(); } fn set_price(&mut self, the_mint: Pubkey, price_feed: Pubkey, mantissa: i128) { From f250b6ed95e2775a01170e8fa03863795ef45f81 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 21 Jun 2026 21:38:38 +0000 Subject: [PATCH 097/138] Remove individual addresses from market and price-feed seeds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Markets and admin structs shouldn't be identified by a person's address. - LendingMarket is now seeded by ["lending_market", market_id] โ€” a u64 index, no owner in the seed. owner remains a stored field and authorizes admin instructions via has_one = owner. - PriceFeed is now seeded by ["price_feed", market, mint] โ€” scoped to a market, not to an individual. set_price requires the market's owner to sign, so prices can't be squatted, a reserve binds to its own market's feed, and isolated markets can price the same asset independently. Applied to both Anchor and Quasar, with test harnesses, READMEs, and CHANGELOGs updated. Anchor 22 tests + Quasar 6 tests pass; IDL build verified. https://claude.ai/code/session_01RwE8f8ahP5S6SDNTsXmpj9 --- finance/lending/anchor/CHANGELOG.md | 8 ++-- finance/lending/anchor/README.md | 9 ++-- .../instructions/admin/init_lending_market.rs | 7 +-- .../src/instructions/admin/init_reserve.rs | 9 +++- .../src/instructions/admin/set_price.rs | 27 +++++------ .../lending/src/state/lending_market.rs | 8 ++-- .../programs/lending/src/state/price_feed.rs | 14 +++--- .../programs/lending/tests/common/mod.rs | 45 ++++++++++++------- .../programs/lending/tests/test_security.rs | 20 +++++---- finance/lending/quasar/CHANGELOG.md | 6 ++- finance/lending/quasar/README.md | 10 ++--- .../lending/quasar/src/instructions/admin.rs | 22 ++++----- finance/lending/quasar/src/state.rs | 23 +++++----- finance/lending/quasar/src/tests.rs | 7 +-- 14 files changed, 120 insertions(+), 95 deletions(-) diff --git a/finance/lending/anchor/CHANGELOG.md b/finance/lending/anchor/CHANGELOG.md index bb8c4377..369a7f2b 100644 --- a/finance/lending/anchor/CHANGELOG.md +++ b/finance/lending/anchor/CHANGELOG.md @@ -27,6 +27,8 @@ Initial lending program: a Kamino/Solend-style borrow/lend market. - Reserve factor: the protocol keeps `reserve_factor_bps` of accrued interest as fees the market owner withdraws with `collect_protocol_fees`; the fees are carved out of `total_liquidity` so they never inflate the supplier exchange rate. -- LendingMarket is seeded by `(owner, market_id)` โ€” a per-owner `u64` index โ€” - so one owner can run several independent markets; admin handlers authorize via - `has_one = owner`. +- LendingMarket is seeded by a `market_id` index (`["lending_market", market_id]`), + not by any individual; one owner can run several independent markets, and admin + handlers authorize via `has_one = owner`. +- Price feeds are seeded `["price_feed", market, mint]` (scoped to a market, not + to an individual); only the market owner may write one (`has_one = owner`). diff --git a/finance/lending/anchor/README.md b/finance/lending/anchor/README.md index 45317174..43226d56 100644 --- a/finance/lending/anchor/README.md +++ b/finance/lending/anchor/README.md @@ -107,10 +107,11 @@ round-trips. `PriceFeed` mirrors a Switchboard On-Demand pull feed: a signed mantissa, an exponent (`price = mantissa * 10^exponent`), and the slot the price was written. Freshness is checked in **slots** (`MAX_PRICE_STALENESS_SLOTS`), not wall-clock -time. The feed PDA is seeded by `[b"price_feed", authority, mint]`, so a signer -can only ever write the feed derived from their own key โ€” there is no shared -per-mint feed to claim first โ€” and a reserve trusts exactly one feed: the -account its market owner passed to `init_reserve`. +time. The feed PDA is seeded by `[b"price_feed", market, mint]` โ€” scoped to a +market, not to any individual โ€” and only that market's `owner` may write it +(`set_price` checks `has_one = owner`). So prices can't be squatted, a reserve +trusts exactly its own market's feed for the mint, and isolated markets can +price the same asset independently. The `set_price` handler writes the feed directly so the LiteSVM tests are deterministic; in production a reserve points at the real Switchboard feed and the diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs index 67a749dd..377b7fbc 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/init_lending_market.rs @@ -19,13 +19,14 @@ pub fn handle_init_lending_market( #[derive(Accounts)] #[instruction(market_id: u64)] pub struct InitLendingMarket<'info> { - // Seeded by (owner, market_id), so one owner can run several markets and no - // two owners contend for the same address. + // Seeded by `market_id` alone โ€” the market is not identified by any + // individual's address. `owner` is stored as a field and used only for + // authorization (`has_one = owner`) on admin instructions. #[account( init, payer = owner, space = LendingMarket::DISCRIMINATOR.len() + LendingMarket::INIT_SPACE, - seeds = [LENDING_MARKET_SEED, owner.key().as_ref(), &market_id.to_le_bytes()], + seeds = [LENDING_MARKET_SEED, &market_id.to_le_bytes()], bump, )] pub lending_market: Account<'info, LendingMarket>, diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs index a58e1c81..0a975f9a 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/init_reserve.rs @@ -2,7 +2,7 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; use crate::constants::{ - FIXED_POINT_SCALE, LIQUIDITY_VAULT_SEED, RESERVE_SEED, SHARE_MINT_SEED, + FIXED_POINT_SCALE, LIQUIDITY_VAULT_SEED, PRICE_FEED_SEED, RESERVE_SEED, SHARE_MINT_SEED, }; use crate::state::{LendingMarket, PriceFeed, Reserve, ReserveConfig}; @@ -68,7 +68,12 @@ pub struct InitReserve<'info> { )] pub share_mint: InterfaceAccount<'info, Mint>, - #[account(constraint = price_feed.mint == liquidity_mint.key() @ crate::errors::LendingError::InvalidConfig)] + // Bound by seeds to this market's feed for this mint โ€” the reserve can only + // trust the price its own market publishes. + #[account( + seeds = [PRICE_FEED_SEED, lending_market.key().as_ref(), liquidity_mint.key().as_ref()], + bump = price_feed.bump, + )] pub price_feed: Account<'info, PriceFeed>, pub token_program: Interface<'info, TokenInterface>, diff --git a/finance/lending/anchor/programs/lending/src/instructions/admin/set_price.rs b/finance/lending/anchor/programs/lending/src/instructions/admin/set_price.rs index 8e6428ad..4044c255 100644 --- a/finance/lending/anchor/programs/lending/src/instructions/admin/set_price.rs +++ b/finance/lending/anchor/programs/lending/src/instructions/admin/set_price.rs @@ -2,23 +2,22 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::Mint; use crate::constants::PRICE_FEED_SEED; -use crate::state::PriceFeed; +use crate::state::{LendingMarket, PriceFeed}; /// Test stand-in for a Switchboard On-Demand feed: writes a price directly so /// LiteSVM tests are deterministic. In production the reserve points at a real /// Switchboard feed instead and this handler is unused. /// -/// The feed PDA is seeded by `[b"price_feed", authority, mint]`, so each -/// authority can only ever write its own feed โ€” there is no shared per-mint -/// feed to race for. A reserve trusts exactly one feed account: the one the -/// market owner passed to `init_reserve`. +/// The feed PDA is seeded by `[b"price_feed", market, mint]` and writing it +/// requires the market's `owner` to sign, so a market's prices can only be set +/// by that market and never squatted by an outsider. pub fn handle_set_price( context: Context, price_mantissa: i128, exponent: i32, ) -> Result<()> { let feed = &mut context.accounts.price_feed; - feed.authority = context.accounts.authority.key(); + feed.market = context.accounts.lending_market.key(); feed.mint = context.accounts.mint.key(); feed.bump = context.bumps.price_feed; feed.price_mantissa = price_mantissa; @@ -29,20 +28,22 @@ pub fn handle_set_price( #[derive(Accounts)] pub struct SetPrice<'info> { - // The authority is part of the seeds: a signer can only ever address (and - // therefore write) the feed derived from their own key. + // Only the market's owner may publish its prices. + #[account(has_one = owner)] + pub lending_market: Account<'info, LendingMarket>, + + #[account(mut)] + pub owner: Signer<'info>, + #[account( init_if_needed, - payer = authority, + payer = owner, space = PriceFeed::DISCRIMINATOR.len() + PriceFeed::INIT_SPACE, - seeds = [PRICE_FEED_SEED, authority.key().as_ref(), mint.key().as_ref()], + seeds = [PRICE_FEED_SEED, lending_market.key().as_ref(), mint.key().as_ref()], bump, )] pub price_feed: Account<'info, PriceFeed>, - #[account(mut)] - pub authority: Signer<'info>, - pub mint: InterfaceAccount<'info, Mint>, pub system_program: Program<'info, System>, diff --git a/finance/lending/anchor/programs/lending/src/state/lending_market.rs b/finance/lending/anchor/programs/lending/src/state/lending_market.rs index f99fe29f..387dff1d 100644 --- a/finance/lending/anchor/programs/lending/src/state/lending_market.rs +++ b/finance/lending/anchor/programs/lending/src/state/lending_market.rs @@ -5,10 +5,10 @@ use anchor_lang::prelude::*; #[account] #[derive(InitSpace)] pub struct LendingMarket { - /// Per-owner index this market's PDA is derived from. Seeding by - /// `(owner, market_id)` rather than the owner alone lets one owner run - /// several independent, risk-isolated markets ("their market 0, 1, 2 โ€ฆ") - /// while keeping each owner's index space free of cross-owner collisions. + /// Index this market's PDA is derived from (`["lending_market", market_id]`). + /// The market is identified by this id, not by any individual โ€” `owner` below + /// is a stored field used only for authorization, never part of the address. + /// Distinct markets (0, 1, 2 โ€ฆ) give independent, risk-isolated pools. pub market_id: u64, pub owner: Pubkey, diff --git a/finance/lending/anchor/programs/lending/src/state/price_feed.rs b/finance/lending/anchor/programs/lending/src/state/price_feed.rs index ba876797..aa4f4785 100644 --- a/finance/lending/anchor/programs/lending/src/state/price_feed.rs +++ b/finance/lending/anchor/programs/lending/src/state/price_feed.rs @@ -5,9 +5,9 @@ use crate::errors::LendingError; use crate::math::price_mantissa_to_scaled; /// A price for one token, denominated in the market's quote currency. -/// PDA seeds: `[b"price_feed", authority, mint]` โ€” the writer is part of the -/// address, so no two authorities can contend for the same feed account, and a -/// reserve trusts exactly the feed its market owner selected at `init_reserve`. +/// PDA seeds: `[b"price_feed", market, mint]` โ€” scoped to a market (not to any +/// individual), so each market prices its own assets and one market can never +/// write another's feed. Only the market's `owner` may write it (`set_price`). /// /// The layout mirrors a Switchboard On-Demand pull feed: a signed mantissa plus /// an exponent (`price = price_mantissa * 10^exponent`) and the slot the value @@ -21,6 +21,9 @@ use crate::math::price_mantissa_to_scaled; #[account] #[derive(InitSpace)] pub struct PriceFeed { + /// The lending market this feed serves; part of the PDA seeds. + pub market: Pubkey, + pub mint: Pubkey, pub price_mantissa: i128, @@ -29,11 +32,6 @@ pub struct PriceFeed { pub last_updated_slot: u64, - /// The signer whose key is in this feed's PDA seeds; the only account that - /// can write it. In production this field does not exist โ€” the feed is - /// owned and written by Switchboard. - pub authority: Pubkey, - pub bump: u8, } diff --git a/finance/lending/anchor/programs/lending/tests/common/mod.rs b/finance/lending/anchor/programs/lending/tests/common/mod.rs index a05903eb..fd2e6a6d 100644 --- a/finance/lending/anchor/programs/lending/tests/common/mod.rs +++ b/finance/lending/anchor/programs/lending/tests/common/mod.rs @@ -97,10 +97,9 @@ impl Env { let owner = create_wallet(&mut svm, 1_000_000_000_000).unwrap(); let quote_mint = create_token_mint(&mut svm, &owner, 6, None).unwrap(); - // The market is seeded by (owner, market_id), so one owner can run - // several markets. This is the owner's market 0. + // The market is seeded by its market_id index alone (no owner). Market 0. let market_id: u64 = 0; - let market = pda(&[LENDING_MARKET_SEED, owner.pubkey().as_ref(), &market_id.to_le_bytes()]); + let market = pda(&[LENDING_MARKET_SEED, &market_id.to_le_bytes()]); let instruction = Instruction { program_id: lending::id(), @@ -127,12 +126,10 @@ impl Env { pub fn init_market_for(&mut self, market_owner: &Keypair) -> Pubkey { let env_owner = self.owner.insecure_clone(); let quote_mint = create_token_mint(&mut self.svm, &env_owner, 6, None).unwrap(); - let market_id: u64 = 0; - let market = pda(&[ - LENDING_MARKET_SEED, - market_owner.pubkey().as_ref(), - &market_id.to_le_bytes(), - ]); + // A distinct id from the env's market 0, since the id is the market's + // global identifier (the owner is not part of the seed). + let market_id: u64 = 1; + let market = pda(&[LENDING_MARKET_SEED, &market_id.to_le_bytes()]); let instruction = Instruction { program_id: lending::id(), accounts: lending::accounts::InitLendingMarket { @@ -161,12 +158,12 @@ impl Env { ) -> ReserveHandle { let env_owner = self.owner.insecure_clone(); let mint = create_token_mint(&mut self.svm, &env_owner, decimals, None).unwrap(); - self.set_price(mint, price_mantissa); + self.set_price_for(market_owner, market, mint, price_mantissa); let reserve = pda(&[RESERVE_SEED, market.as_ref(), mint.as_ref()]); let share_mint = pda(&[SHARE_MINT_SEED, reserve.as_ref()]); let liquidity_vault = pda(&[LIQUIDITY_VAULT_SEED, reserve.as_ref()]); - let price_feed = self.price_feed_address(mint); + let price_feed = self.price_feed_address(market, mint); let instruction = Instruction { program_id: lending::id(), @@ -205,17 +202,32 @@ impl Env { /// The feed PDA the market owner writes for `mint`: seeded by the owner's /// key, so it is the feed `add_reserve` registers reserves against. - pub fn price_feed_address(&self, mint: Pubkey) -> Pubkey { - pda(&[PRICE_FEED_SEED, self.owner.pubkey().as_ref(), mint.as_ref()]) + /// The feed PDA for a given market and mint (seeds `["price_feed", market, mint]`). + pub fn price_feed_address(&self, market: Pubkey, mint: Pubkey) -> Pubkey { + pda(&[PRICE_FEED_SEED, market.as_ref(), mint.as_ref()]) } pub fn set_price(&mut self, mint: Pubkey, price_mantissa: i128) { - let price_feed = self.price_feed_address(mint); + let owner = self.owner.insecure_clone(); + let market = self.market; + self.set_price_for(&owner, market, mint, price_mantissa); + } + + /// Publish a price for `mint` in `market`, signed by that market's `owner`. + pub fn set_price_for( + &mut self, + owner: &Keypair, + market: Pubkey, + mint: Pubkey, + price_mantissa: i128, + ) { + let price_feed = self.price_feed_address(market, mint); let instruction = Instruction { program_id: lending::id(), accounts: lending::accounts::SetPrice { + lending_market: market, + owner: owner.pubkey(), price_feed, - authority: self.owner.pubkey(), mint, system_program: system_program::id(), } @@ -226,8 +238,7 @@ impl Env { } .data(), }; - let owner = self.owner.insecure_clone(); - send(&mut self.svm, vec![instruction], &[&owner], &owner.pubkey()).unwrap(); + send(&mut self.svm, vec![instruction], &[owner], &owner.pubkey()).unwrap(); } pub fn add_reserve( diff --git a/finance/lending/anchor/programs/lending/tests/test_security.rs b/finance/lending/anchor/programs/lending/tests/test_security.rs index 89466494..a6f1c219 100644 --- a/finance/lending/anchor/programs/lending/tests/test_security.rs +++ b/finance/lending/anchor/programs/lending/tests/test_security.rs @@ -36,23 +36,25 @@ fn cross_market_reserve_is_rejected() { ); } -/// The price feed PDA is seeded by its authority, so no signer can write (or -/// pre-claim) the feed another authority's reserves trust. +/// A market's price feed can only be written by that market's owner: an +/// outsider cannot publish (or squat) prices for a market they don't own. #[test] -fn foreign_signer_cannot_write_owner_price_feed() { +fn non_owner_cannot_write_market_price_feed() { let mut env = Env::new(); let usdc = env.add_reserve(6, dollars(1), default_config()); let attacker = env.create_user(); - let owner_feed = env.price_feed_address(usdc.mint); + // The market's feed for this mint (seeds ["price_feed", market, mint]). + let market_feed = env.price_feed_address(env.market, usdc.mint); - // The attacker targets the owner's feed address while signing as themself. - // The seeds [b"price_feed", authority, mint] cannot match, so this fails. + // The attacker passes the real market but signs as themself; `has_one = owner` + // on the market rejects them before any write. let instruction = Instruction { program_id: lending::id(), accounts: lending::accounts::SetPrice { - price_feed: owner_feed, - authority: attacker.pubkey(), + lending_market: env.market, + owner: attacker.pubkey(), + price_feed: market_feed, mint: usdc.mint, system_program: system_program::id(), } @@ -71,6 +73,6 @@ fn foreign_signer_cannot_write_owner_price_feed() { ); assert!( result.is_err(), - "only the authority in a feed's seeds may write that feed" + "only the market owner may write its price feed" ); } diff --git a/finance/lending/quasar/CHANGELOG.md b/finance/lending/quasar/CHANGELOG.md index 93500737..f9f4b2b3 100644 --- a/finance/lending/quasar/CHANGELOG.md +++ b/finance/lending/quasar/CHANGELOG.md @@ -21,5 +21,7 @@ Initial Quasar port of the Kamino/Solend-style borrow/lend program. (`LiquidationTooLarge`). - Reserve factor: the protocol keeps `reserve_factor_bps` of accrued interest as fees the market owner withdraws with `collect_protocol_fees`. -- LendingMarket is seeded by `(owner, market_id)` โ€” a per-owner `u64` index โ€” - so one owner can run several independent markets. +- LendingMarket is seeded by a `market_id` index (`["lending_market", market_id]`), + not by any individual; one owner can run several independent markets. +- Price feeds are seeded `["price_feed", market, mint]` (scoped to a market, not + to an individual); only the market owner may write one. diff --git a/finance/lending/quasar/README.md b/finance/lending/quasar/README.md index f3493fcc..5d5b5730 100644 --- a/finance/lending/quasar/README.md +++ b/finance/lending/quasar/README.md @@ -39,11 +39,11 @@ Everything else mirrors the Anchor version. deposited share amount, plus the borrow reserve and scaled debt. PDA: `["obligation", market, owner]`. - **`PriceFeed`** โ€” a Switchboard-On-Demand-shaped price (`mantissa * 10^exponent` - + slot). PDA: `["price_feed", authority, mint]` โ€” the writer is part of the - address, so no signer can write or pre-claim another authority's feed, and each - reserve is bound to the feed its market owner registered. `set_price` writes it - directly for deterministic tests; in production a reserve points at the real - Switchboard feed. Freshness is checked in slots. + + slot). PDA: `["price_feed", market, mint]` โ€” scoped to a market, not to any + individual; only the market's `owner` may write it, so prices can't be squatted + and each market prices its own assets. `set_price` writes it directly for + deterministic tests; in production a reserve points at the real Switchboard + feed. Freshness is checked in slots. - **Liquidation** โ€” the close factor (max fraction of the debt one call repays) comes from the borrow reserve; the bonus from the collateral reserve. A repayment whose seizure would exceed the posted collateral fails with diff --git a/finance/lending/quasar/src/instructions/admin.rs b/finance/lending/quasar/src/instructions/admin.rs index b043ff02..ab35f8de 100644 --- a/finance/lending/quasar/src/instructions/admin.rs +++ b/finance/lending/quasar/src/instructions/admin.rs @@ -23,8 +23,8 @@ use { pub struct InitLendingMarket { #[account(mut)] pub owner: Signer, - // Seeded by (owner, market_id), a per-owner index โ€” one owner, many markets. - #[account(init, payer = owner, address = LendingMarket::seeds(owner.address(), market_id))] + // Seeded by `market_id` alone โ€” owner is stored for auth, not in the address. + #[account(init, payer = owner, address = LendingMarket::seeds(market_id))] pub lending_market: Account, pub quote_mint: Account, pub system_program: Program, @@ -62,9 +62,8 @@ pub struct InitReserve { /// Created and initialized as a share-token mint (authority = reserve) in the handler. #[account(mut, address = ShareMintPda::seeds(reserve.address()))] pub share_mint: UncheckedAccount, - // The reserve trusts the feed written by the market owner: feed PDAs are - // seeded by their authority, so this binds the reserve to the owner's feed. - #[account(address = PriceFeed::seeds(owner.address(), liquidity_mint.address()))] + // Bound to this market's feed for this mint (seeds: market + mint). + #[account(address = PriceFeed::seeds(lending_market.address(), liquidity_mint.address()))] pub price_feed: Account, pub token_program: Program, pub system_program: Program, @@ -187,11 +186,12 @@ impl InitReserve { #[derive(Accounts)] pub struct SetPrice { #[account(mut)] - pub authority: Signer, - // The authority is part of the seeds: a signer can only ever address (and - // therefore write) the feed derived from their own key, so there is no - // shared per-mint feed to claim first. - #[account(init(idempotent), payer = authority, address = PriceFeed::seeds(authority.address(), mint.address()))] + pub owner: Signer, + // Only the market's owner may publish its prices. + #[account(has_one(owner))] + pub lending_market: Account, + // Seeded by (market, mint) โ€” scoped to the market, not to any individual. + #[account(init(idempotent), payer = owner, address = PriceFeed::seeds(lending_market.address(), mint.address()))] pub price_feed: Account, pub mint: Account, pub system_program: Program, @@ -206,11 +206,11 @@ impl SetPrice { bumps: &SetPriceBumps, ) -> Result<(), ProgramError> { self.price_feed.set_inner(PriceFeedInner { + market: *self.lending_market.address(), mint: *self.mint.address(), price_mantissa, exponent, last_updated_slot: now()?, - authority: *self.authority.address(), bump: bumps.price_feed, }); Ok(()) diff --git a/finance/lending/quasar/src/state.rs b/finance/lending/quasar/src/state.rs index 0f7f598a..2c2b82f8 100644 --- a/finance/lending/quasar/src/state.rs +++ b/finance/lending/quasar/src/state.rs @@ -5,11 +5,12 @@ use quasar_lang::prelude::*; -/// Top-level market config. PDA: `["lending_market", owner, market_id]`. -/// Seeded by a per-owner index, so one owner can run several isolated markets -/// ("their market 0, 1, 2 โ€ฆ") with no cross-owner collisions. +/// Top-level market config. PDA: `["lending_market", market_id]`. +/// Seeded by its `market_id` index alone โ€” the market is not identified by any +/// individual. `owner` is a stored field used only for authorization. Distinct +/// ids (0, 1, 2 โ€ฆ) give independent, risk-isolated markets. #[account(discriminator = 1, set_inner)] -#[seeds(b"lending_market", owner: Address, market_id: u64)] +#[seeds(b"lending_market", market_id: u64)] pub struct LendingMarket { pub owner: Address, pub market_id: u64, @@ -64,19 +65,19 @@ pub struct Obligation { pub bump: u8, } -/// Switchboard-On-Demand-shaped price feed. PDA: `["price_feed", authority, mint]` -/// โ€” the writer is part of the address, so no two authorities can contend for -/// the same feed, and a reserve trusts exactly the feed its market owner passed -/// to `init_reserve`. `price = price_mantissa * 10^exponent`; freshness is -/// checked in slots. In production this account would be the real Switchboard feed. +/// Switchboard-On-Demand-shaped price feed. PDA: `["price_feed", market, mint]` +/// โ€” scoped to a market (not to any individual); only the market's `owner` may +/// write it, so prices can't be squatted and each market prices its own assets. +/// `price = price_mantissa * 10^exponent`; freshness is checked in slots. In +/// production this account would be the real Switchboard feed. #[account(discriminator = 4, set_inner)] -#[seeds(b"price_feed", authority: Address, mint: Address)] +#[seeds(b"price_feed", market: Address, mint: Address)] pub struct PriceFeed { + pub market: Address, pub mint: Address, pub price_mantissa: i128, pub exponent: i32, pub last_updated_slot: u64, - pub authority: Address, pub bump: u8, } diff --git a/finance/lending/quasar/src/tests.rs b/finance/lending/quasar/src/tests.rs index 82ca0764..43c24493 100644 --- a/finance/lending/quasar/src/tests.rs +++ b/finance/lending/quasar/src/tests.rs @@ -126,7 +126,7 @@ impl World { .with_program(&crate::ID, &elf) .with_token_program(); - let (market, _) = pda(&[b"lending_market", OWNER.as_ref(), &MARKET_ID.to_le_bytes()]); + let (market, _) = pda(&[b"lending_market", &MARKET_ID.to_le_bytes()]); let (coll_reserve, _) = pda(&[b"reserve", market.as_ref(), COLL_MINT.as_ref()]); let (borrow_reserve, _) = pda(&[b"reserve", market.as_ref(), BORROW_MINT.as_ref()]); let (coll_vault, _) = pda(&[b"liquidity_vault", coll_reserve.as_ref()]); @@ -134,8 +134,8 @@ impl World { let (coll_share_mint, _) = pda(&[b"share_mint", coll_reserve.as_ref()]); let (borrow_share_mint, _) = pda(&[b"share_mint", borrow_reserve.as_ref()]); // Feed PDAs are seeded by their writing authority (the market owner here). - let (coll_price, _) = pda(&[b"price_feed", OWNER.as_ref(), COLL_MINT.as_ref()]); - let (borrow_price, _) = pda(&[b"price_feed", OWNER.as_ref(), BORROW_MINT.as_ref()]); + let (coll_price, _) = pda(&[b"price_feed", market.as_ref(), COLL_MINT.as_ref()]); + let (borrow_price, _) = pda(&[b"price_feed", market.as_ref(), BORROW_MINT.as_ref()]); let (obligation, _) = pda(&[b"obligation", market.as_ref(), BORROWER.as_ref()]); let (obligation_vault, _) = pda(&[b"obligation_vault", coll_reserve.as_ref(), obligation.as_ref()]); @@ -218,6 +218,7 @@ impl World { data.extend_from_slice(&EXP.to_le_bytes()); let metas = vec![ meta(OWNER, true, true), + meta(self.market, false, false), meta(price_feed, true, false), meta(the_mint, false, false), meta(system_program(), false, false), From 3c7623ff123ee788803d447e29e4cd096b46b0a9 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 21 Jun 2026 22:07:50 +0000 Subject: [PATCH 098/138] Spell out 'liquidation threshold' in Quasar comments The Solana skill's naming rule is to avoid abbreviations and use full words. Two Quasar comments shortened 'liquidation threshold' to 'liq threshold'; the Anchor side already spells it out. Align them. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01RwE8f8ahP5S6SDNTsXmpj9 --- finance/lending/quasar/src/instructions/position.rs | 2 +- finance/lending/quasar/src/tests.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/finance/lending/quasar/src/instructions/position.rs b/finance/lending/quasar/src/instructions/position.rs index 5976b09f..1cfd5aad 100644 --- a/finance/lending/quasar/src/instructions/position.rs +++ b/finance/lending/quasar/src/instructions/position.rs @@ -477,7 +477,7 @@ impl LiquidateObligation { let collateral_price = price_scaled(&self.collateral_price, slot)?; let borrow_price = price_scaled(&self.borrow_price, slot)?; - // Health: unhealthy when debt value exceeds collateral value * liq threshold. + // Health: unhealthy when debt value exceeds collateral value * liquidation threshold. let collateral_total = net_total_liquidity( collateral.available_liquidity, collateral.borrowed_amount_scaled, diff --git a/finance/lending/quasar/src/tests.rs b/finance/lending/quasar/src/tests.rs index 43c24493..ce939bca 100644 --- a/finance/lending/quasar/src/tests.rs +++ b/finance/lending/quasar/src/tests.rs @@ -228,7 +228,7 @@ impl World { #[allow(clippy::too_many_arguments)] fn init_reserve(&mut self, the_mint: Pubkey, reserve: Pubkey, vault: Pubkey, share: Pubkey, price: Pubkey) { - // 75% LTV, 80% liq threshold, 5% bonus, 50% close factor, 10% reserve + // 75% LTV, 80% liquidation threshold, 5% bonus, 50% close factor, 10% reserve // factor, kink 80%, 2% / 20% / 150% APR curve. let config: [u16; 9] = [7_500, 8_000, 500, 5_000, 1_000, 8_000, 200, 2_000, 15_000]; let mut data = vec![1u8]; From f1622e5d6327368a7e57c8a8f7244e127c348937 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 21 Jun 2026 22:23:12 +0000 Subject: [PATCH 099/138] Fix stale LendingMarket seed docs in both READMEs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both READMEs still described the market PDA seed as ["lending_market", owner, market_id] โ€” the old design where the owner's public key was baked into a shared struct's address. The code was already corrected to ["lending_market", market_id] in commit f250b6e; this brings the prose into agreement. Also makes the reason explicit: owner is stored as a field for has_one authorization, not in the seed, so no individual's public key appears in a shared struct's address. Co-Authored-By: Claude Sonnet 4.6 Claude-Session: https://claude.ai/code/session_01RwE8f8ahP5S6SDNTsXmpj9 --- finance/lending/anchor/README.md | 9 +++++---- finance/lending/quasar/README.md | 6 ++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/finance/lending/anchor/README.md b/finance/lending/anchor/README.md index 43226d56..3bc967cc 100644 --- a/finance/lending/anchor/README.md +++ b/finance/lending/anchor/README.md @@ -32,10 +32,11 @@ crosses the liquidation threshold and a liquidator can close part of the positio ### Accounts - **`LendingMarket`** โ€” top-level config (owner, quote-currency mint). PDA seeds - `["lending_market", owner, market_id]`, where `market_id` is a per-owner `u64` - index. Seeding by an index (not the owner alone) lets one owner run several - independent, risk-isolated markets โ€” their market 0, 1, 2 โ€ฆ โ€” with no - cross-owner collisions. + `["lending_market", market_id]`, where `market_id` is a `u64` index. Seeding by + an index alone (owner is stored as a field for authorization, not baked into the + address) lets one owner run several independent, risk-isolated markets โ€” their + market 0, 1, 2 โ€ฆ โ€” with no cross-owner collisions and no individual's key in a + shared struct's address. - **`Reserve`** โ€” one per asset. Owns a program-controlled liquidity vault and a share-token mint, and stores the interest-rate config, the cumulative borrow- rate index, available liquidity, and scaled total debt. PDA seeds diff --git a/finance/lending/quasar/README.md b/finance/lending/quasar/README.md index 5d5b5730..a27527a0 100644 --- a/finance/lending/quasar/README.md +++ b/finance/lending/quasar/README.md @@ -29,8 +29,10 @@ Everything else mirrors the Anchor version. ## Major concepts - **`LendingMarket`** โ€” market config (owner, quote-currency mint). PDA: - `["lending_market", owner, market_id]`, where `market_id` is a per-owner `u64` - index, so one owner can run several isolated markets (their market 0, 1, 2 โ€ฆ). + `["lending_market", market_id]`, where `market_id` is a `u64` index. Owner is + stored as a field for authorization, not baked into the address, so one owner + can run several isolated markets (their market 0, 1, 2 โ€ฆ) with no individual's + key in a shared struct's address. - **`Reserve`** โ€” one asset's pool. Owns a program-controlled liquidity vault and a share-token mint (both PDAs, authority = the reserve), and stores the interest-rate config, the cumulative borrow-rate index, available liquidity, and From 3b84805b6c4ad0b07e37d7cbb30e873142e5f730 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 21 Jun 2026 22:47:11 +0000 Subject: [PATCH 100/138] Expand 'coll' to 'collateral' in Quasar test identifiers The Solana skill's naming rule is to avoid abbreviations and use full words. The Quasar test harness shortened 'collateral' to 'coll' across ~40 identifiers (coll_reserve, coll_vault, coll_share_mint, coll_price, COLLATERAL_MINT, BORROWER_COLLATERAL, etc.). Spell them all out. Also correct a stale comment that still described the price-feed PDA as seeded by its writing authority; it is seeded by (market, mint). Host-side `cargo test --no-run` compiles clean. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RwE8f8ahP5S6SDNTsXmpj9 --- finance/lending/quasar/src/tests.rs | 84 ++++++++++++++--------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/finance/lending/quasar/src/tests.rs b/finance/lending/quasar/src/tests.rs index ce939bca..6504d18f 100644 --- a/finance/lending/quasar/src/tests.rs +++ b/finance/lending/quasar/src/tests.rs @@ -25,17 +25,17 @@ const OWNER: Pubkey = Pubkey::new_from_array([1; 32]); const SUPPLIER: Pubkey = Pubkey::new_from_array([2; 32]); const BORROWER: Pubkey = Pubkey::new_from_array([3; 32]); const LIQUIDATOR: Pubkey = Pubkey::new_from_array([4; 32]); -const COLL_MINT: Pubkey = Pubkey::new_from_array([5; 32]); +const COLLATERAL_MINT: Pubkey = Pubkey::new_from_array([5; 32]); const BORROW_MINT: Pubkey = Pubkey::new_from_array([6; 32]); const QUOTE_MINT: Pubkey = Pubkey::new_from_array([7; 32]); // Token accounts. const SUPPLIER_BORROW: Pubkey = Pubkey::new_from_array([10; 32]); const SUPPLIER_BORROW_SHARE: Pubkey = Pubkey::new_from_array([11; 32]); -const BORROWER_COLL: Pubkey = Pubkey::new_from_array([12; 32]); -const BORROWER_COLL_SHARE: Pubkey = Pubkey::new_from_array([13; 32]); +const BORROWER_COLLATERAL: Pubkey = Pubkey::new_from_array([12; 32]); +const BORROWER_COLLATERAL_SHARE: Pubkey = Pubkey::new_from_array([13; 32]); const BORROWER_BORROW: Pubkey = Pubkey::new_from_array([14; 32]); const LIQUIDATOR_BORROW: Pubkey = Pubkey::new_from_array([15; 32]); -const LIQUIDATOR_COLL_SHARE: Pubkey = Pubkey::new_from_array([16; 32]); +const LIQUIDATOR_COLLATERAL_SHARE: Pubkey = Pubkey::new_from_array([16; 32]); const OWNER_BORROW: Pubkey = Pubkey::new_from_array([17; 32]); // Per-owner market index this market is seeded from (owner's market 0). const MARKET_ID: u64 = 0; @@ -107,10 +107,10 @@ fn balance(result: &quasar_svm::ExecutionResult, address: Pubkey) -> u64 { struct World { svm: QuasarSvm, market: Pubkey, - coll_reserve: Pubkey, - coll_vault: Pubkey, - coll_share_mint: Pubkey, - coll_price: Pubkey, + collateral_reserve: Pubkey, + collateral_vault: Pubkey, + collateral_share_mint: Pubkey, + collateral_price: Pubkey, borrow_reserve: Pubkey, borrow_vault: Pubkey, borrow_share_mint: Pubkey, @@ -127,47 +127,47 @@ impl World { .with_token_program(); let (market, _) = pda(&[b"lending_market", &MARKET_ID.to_le_bytes()]); - let (coll_reserve, _) = pda(&[b"reserve", market.as_ref(), COLL_MINT.as_ref()]); + let (collateral_reserve, _) = pda(&[b"reserve", market.as_ref(), COLLATERAL_MINT.as_ref()]); let (borrow_reserve, _) = pda(&[b"reserve", market.as_ref(), BORROW_MINT.as_ref()]); - let (coll_vault, _) = pda(&[b"liquidity_vault", coll_reserve.as_ref()]); + let (collateral_vault, _) = pda(&[b"liquidity_vault", collateral_reserve.as_ref()]); let (borrow_vault, _) = pda(&[b"liquidity_vault", borrow_reserve.as_ref()]); - let (coll_share_mint, _) = pda(&[b"share_mint", coll_reserve.as_ref()]); + let (collateral_share_mint, _) = pda(&[b"share_mint", collateral_reserve.as_ref()]); let (borrow_share_mint, _) = pda(&[b"share_mint", borrow_reserve.as_ref()]); - // Feed PDAs are seeded by their writing authority (the market owner here). - let (coll_price, _) = pda(&[b"price_feed", market.as_ref(), COLL_MINT.as_ref()]); + // Feed PDAs are seeded by (market, mint) โ€” scoped to the market, not to any individual. + let (collateral_price, _) = pda(&[b"price_feed", market.as_ref(), COLLATERAL_MINT.as_ref()]); let (borrow_price, _) = pda(&[b"price_feed", market.as_ref(), BORROW_MINT.as_ref()]); let (obligation, _) = pda(&[b"obligation", market.as_ref(), BORROWER.as_ref()]); let (obligation_vault, _) = - pda(&[b"obligation_vault", coll_reserve.as_ref(), obligation.as_ref()]); + pda(&[b"obligation_vault", collateral_reserve.as_ref(), obligation.as_ref()]); for account in [ system(OWNER), system(SUPPLIER), system(BORROWER), system(LIQUIDATOR), - mint(COLL_MINT, OWNER), + mint(COLLATERAL_MINT, OWNER), mint(BORROW_MINT, OWNER), mint(QUOTE_MINT, OWNER), // PDAs created by the program. empty(market), - empty(coll_reserve), + empty(collateral_reserve), empty(borrow_reserve), - empty(coll_vault), + empty(collateral_vault), empty(borrow_vault), - empty(coll_share_mint), + empty(collateral_share_mint), empty(borrow_share_mint), - empty(coll_price), + empty(collateral_price), empty(borrow_price), empty(obligation), empty(obligation_vault), // Funded user token accounts. token(SUPPLIER_BORROW, BORROW_MINT, SUPPLIER, 1_000 * UNIT), token(SUPPLIER_BORROW_SHARE, borrow_share_mint, SUPPLIER, 0), - token(BORROWER_COLL, COLL_MINT, BORROWER, 1_000 * UNIT), - token(BORROWER_COLL_SHARE, coll_share_mint, BORROWER, 0), + token(BORROWER_COLLATERAL, COLLATERAL_MINT, BORROWER, 1_000 * UNIT), + token(BORROWER_COLLATERAL_SHARE, collateral_share_mint, BORROWER, 0), token(BORROWER_BORROW, BORROW_MINT, BORROWER, 0), token(LIQUIDATOR_BORROW, BORROW_MINT, LIQUIDATOR, 1_000 * UNIT), - token(LIQUIDATOR_COLL_SHARE, coll_share_mint, LIQUIDATOR, 0), + token(LIQUIDATOR_COLLATERAL_SHARE, collateral_share_mint, LIQUIDATOR, 0), // Where the market owner receives collected protocol fees. token(OWNER_BORROW, BORROW_MINT, OWNER, 0), ] { @@ -177,10 +177,10 @@ impl World { World { svm, market, - coll_reserve, - coll_vault, - coll_share_mint, - coll_price, + collateral_reserve, + collateral_vault, + collateral_share_mint, + collateral_price, borrow_reserve, borrow_vault, borrow_share_mint, @@ -251,9 +251,9 @@ impl World { fn setup_markets(&mut self) { self.init_market(); - self.set_price(COLL_MINT, self.coll_price, dollars(1)); + self.set_price(COLLATERAL_MINT, self.collateral_price, dollars(1)); self.set_price(BORROW_MINT, self.borrow_price, dollars(1)); - self.init_reserve(COLL_MINT, self.coll_reserve, self.coll_vault, self.coll_share_mint, self.coll_price); + self.init_reserve(COLLATERAL_MINT, self.collateral_reserve, self.collateral_vault, self.collateral_share_mint, self.collateral_price); self.init_reserve(BORROW_MINT, self.borrow_reserve, self.borrow_vault, self.borrow_share_mint, self.borrow_price); } @@ -322,10 +322,10 @@ impl World { meta(BORROWER, true, true), meta(self.market, false, false), meta(self.obligation, true, false), - meta(self.coll_reserve, false, false), - meta(self.coll_share_mint, false, false), + meta(self.collateral_reserve, false, false), + meta(self.collateral_share_mint, false, false), meta(self.obligation_vault, true, false), - meta(BORROWER_COLL_SHARE, true, false), + meta(BORROWER_COLLATERAL_SHARE, true, false), meta(quasar_svm::solana_sdk_ids::sysvar::rent::ID, false, false), meta(token_program(), false, false), meta(system_program(), false, false), @@ -340,8 +340,8 @@ impl World { meta(BORROWER, true, true), meta(self.market, false, false), meta(self.obligation, true, false), - meta(self.coll_reserve, true, false), - meta(self.coll_price, false, false), + meta(self.collateral_reserve, true, false), + meta(self.collateral_price, false, false), meta(self.borrow_reserve, true, false), meta(self.borrow_price, false, false), meta(BORROW_MINT, false, false), @@ -374,11 +374,11 @@ impl World { meta(LIQUIDATOR, true, true), meta(self.obligation, true, false), meta(self.market, false, false), - meta(self.coll_reserve, true, false), - meta(self.coll_price, false, false), - meta(self.coll_share_mint, false, false), + meta(self.collateral_reserve, true, false), + meta(self.collateral_price, false, false), + meta(self.collateral_share_mint, false, false), meta(self.obligation_vault, true, false), - meta(LIQUIDATOR_COLL_SHARE, true, false), + meta(LIQUIDATOR_COLLATERAL_SHARE, true, false), meta(self.borrow_reserve, true, false), meta(self.borrow_price, false, false), meta(BORROW_MINT, false, false), @@ -398,8 +398,8 @@ impl World { ) .assert_success(); self.deposit( - BORROWER, self.coll_reserve, COLL_MINT, self.coll_vault, - self.coll_share_mint, BORROWER_COLL, BORROWER_COLL_SHARE, 1_000 * UNIT, + BORROWER, self.collateral_reserve, COLLATERAL_MINT, self.collateral_vault, + self.collateral_share_mint, BORROWER_COLLATERAL, BORROWER_COLLATERAL_SHARE, 1_000 * UNIT, ) .assert_success(); self.init_obligation(); @@ -475,7 +475,7 @@ fn interest_accrues_and_lifts_share_value() { // ~0.1 year passes; re-publish prices so feeds stay fresh. world.svm.sysvars.warp_to_slot(7_884_000); - world.set_price(COLL_MINT, world.coll_price, dollars(1)); + world.set_price(COLLATERAL_MINT, world.collateral_price, dollars(1)); world.set_price(BORROW_MINT, world.borrow_price, dollars(1)); // Supplier redeems 100 shares; interest on the 500 borrowed means each share @@ -499,14 +499,14 @@ fn unhealthy_position_is_liquidated_and_healthy_is_rejected() { assert!(world.liquidate(350 * UNIT).is_err(), "healthy obligation must not be liquidatable"); // Collateral price halves to $0.50: $500 collateral, $400 threshold < $700 debt. - world.set_price(COLL_MINT, world.coll_price, cents(50)); + world.set_price(COLLATERAL_MINT, world.collateral_price, cents(50)); let result = world.liquidate(350 * UNIT); result.assert_success(); // Liquidator repaid 350 of the borrow token and seized collateral share tokens. assert_eq!(balance(&result, LIQUIDATOR_BORROW), 650 * UNIT); assert!( - balance(&result, LIQUIDATOR_COLL_SHARE) > 0, + balance(&result, LIQUIDATOR_COLLATERAL_SHARE) > 0, "liquidator should receive seized collateral shares" ); } From 7ab6a54fc43555e74bd55ddf4c2ecbd513c4a6f8 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Tue, 23 Jun 2026 10:17:41 -0400 Subject: [PATCH 101/138] Add README thumbnails --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 487772c0..a1b73d77 100644 --- a/README.md +++ b/README.md @@ -31,12 +31,16 @@ The programs below implement the core primitives of Solana DeFi: peer-to-peer tr [โš“ Anchor](./finance/escrow/anchor) [๐Ÿ’ซ Quasar](./finance/escrow/quasar) [๐Ÿฆ€ Native](./finance/escrow/native) +[![๐ŸŽฌ Escrow video: you don't need a bootcamp - build a Solana program (smart contract) in 30 minutes](https://img.youtube.com/vi/B5eBWWQfQuM/0.jpg)](https://www.youtube.com/watch?v=B5eBWWQfQuM) + ### Order Book based Exchange A typical NYSE/NASDAQ-style order book-based exchange. Buyers post **bids** (the price they'll pay), sellers post **asks** (the price they'll accept), and a trade happens when a bid and an ask meet. The exchange operator collects fees from trading. Similar to popular Solana exchanges like Openbook and Phoenix. [โš“ Anchor](./finance/order-book/anchor) +[![๐ŸŽฌ Order book exchange video - How to make a crypto exchange on Solana](https://img.youtube.com/vi/ioFkpaKHXgg/0.jpg)](https://www.youtube.com/watch?v=ioFkpaKHXgg) + ### AMM based Exchange An exchange with no order book: swaps fill instantly against a shared liquidity pool funded by **liquidity providers**, who earn a cut of the trading fees. Prices are set algorithmically by the pool's balances. Anyone can create a pool, add or remove liquidity, and swap tokens, with slippage protection on every trade. Similar to Solana exchanges like Raydium and Orca. From 88fc1280fd5e150120f0584e9d00f19373036f93 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Tue, 23 Jun 2026 10:35:27 -0400 Subject: [PATCH 102/138] Cache bust updated thumbnail and add text around links --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a1b73d77..b30cfac2 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ The programs below implement the core primitives of Solana DeFi: peer-to-peer tr [โš“ Anchor](./finance/escrow/anchor) [๐Ÿ’ซ Quasar](./finance/escrow/quasar) [๐Ÿฆ€ Native](./finance/escrow/native) -[![๐ŸŽฌ Escrow video: you don't need a bootcamp - build a Solana program (smart contract) in 30 minutes](https://img.youtube.com/vi/B5eBWWQfQuM/0.jpg)](https://www.youtube.com/watch?v=B5eBWWQfQuM) +๐ŸŽฌ Video: [![Escrow video: you don't need a bootcamp - build a Solana program (smart contract) in 30 minutes](https://img.youtube.com/vi/B5eBWWQfQuM/0.jpg)](https://www.youtube.com/watch?v=B5eBWWQfQuM) ### Order Book based Exchange @@ -39,7 +39,7 @@ A typical NYSE/NASDAQ-style order book-based exchange. Buyers post **bids** (the [โš“ Anchor](./finance/order-book/anchor) -[![๐ŸŽฌ Order book exchange video - How to make a crypto exchange on Solana](https://img.youtube.com/vi/ioFkpaKHXgg/0.jpg)](https://www.youtube.com/watch?v=ioFkpaKHXgg) +๐ŸŽฌ Video: [![How to make a crypto exchange on Solana](https://img.youtube.com/vi/ioFkpaKHXgg/0.jpg?v=1)](https://www.youtube.com/watch?v=ioFkpaKHXgg) ### AMM based Exchange From 9c86ff583ac38b1ee827c7bdb7259505fbed06ee Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Tue, 23 Jun 2026 10:37:07 -0400 Subject: [PATCH 103/138] Cache bust correct thumbnail --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b30cfac2..76c9b799 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ The programs below implement the core primitives of Solana DeFi: peer-to-peer tr [โš“ Anchor](./finance/escrow/anchor) [๐Ÿ’ซ Quasar](./finance/escrow/quasar) [๐Ÿฆ€ Native](./finance/escrow/native) -๐ŸŽฌ Video: [![Escrow video: you don't need a bootcamp - build a Solana program (smart contract) in 30 minutes](https://img.youtube.com/vi/B5eBWWQfQuM/0.jpg)](https://www.youtube.com/watch?v=B5eBWWQfQuM) +๐ŸŽฌ Video: [![Escrow video: you don't need a bootcamp - build a Solana program (smart contract) in 30 minutes](https://img.youtube.com/vi/B5eBWWQfQuM/0.jpg?v=1)](https://www.youtube.com/watch?v=B5eBWWQfQuM) ### Order Book based Exchange @@ -39,7 +39,7 @@ A typical NYSE/NASDAQ-style order book-based exchange. Buyers post **bids** (the [โš“ Anchor](./finance/order-book/anchor) -๐ŸŽฌ Video: [![How to make a crypto exchange on Solana](https://img.youtube.com/vi/ioFkpaKHXgg/0.jpg?v=1)](https://www.youtube.com/watch?v=ioFkpaKHXgg) +๐ŸŽฌ Video: [![How to make a crypto exchange on Solana](https://img.youtube.com/vi/ioFkpaKHXgg/0.jpg)](https://www.youtube.com/watch?v=ioFkpaKHXgg) ### AMM based Exchange From f084bc723b9f7b67c846e0355a408e064c223ff9 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Tue, 23 Jun 2026 10:51:20 -0400 Subject: [PATCH 104/138] Add a little branding and a thankyou --- README.md | 6 +++++- assets/banner.png | Bin 0 -> 710649 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 assets/banner.png diff --git a/README.md b/README.md index 76c9b799..744f262a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # Solana Program Examples -Working, tested, up-to-date examples of common Solana programs - maintained by [Quicknode](https://quicknode.com). Each example compiles and passes CI on the current Solana and Anchor toolchain. +![Quicknode Solana Program Examples](assets/banner.png) + +Working, tested, up-to-date examples of common Solana programs - maintained by [Quicknode](https://quicknode.com). Each example compiles and passes CI on the current Solana and Anchor toolchain, and uses current defaults like the multiple files layout and LiteSVM. [![Anchor](../../actions/workflows/anchor.yml/badge.svg)](../../actions/workflows/anchor.yml) [![Quasar](../../actions/workflows/quasar.yml/badge.svg)](../../actions/workflows/quasar.yml) [![Pinocchio](../../actions/workflows/pinocchio.yml/badge.svg)](../../actions/workflows/pinocchio.yml) [![Native](../../actions/workflows/native.yml/badge.svg)](../../actions/workflows/native.yml) [![ASM](../../actions/workflows/solana-asm.yml/badge.svg)](../../actions/workflows/solana-asm.yml) @@ -15,6 +17,8 @@ Each example is available in one or more of the following frameworks: > [!NOTE] > You don't need to write your own program for basic tasks like creating [accounts](https://solana.com/docs/terminology#account), transferring SOL, or minting tokens. These are handled by existing programs like the System Program and Token Program. +Big thanks to Joe Caulfield and Solana Foundation for originally creating this repository! + ## Getting started You need [Rust](https://www.rust-lang.org/tools/install), [Solana CLI](https://docs.anza.xyz/cli/install), [Anchor](https://www.anchor-lang.com/docs/installation), and [pnpm](https://pnpm.io/installation) installed. Clone the repo, `cd` into any example directory, and run `pnpm test`. diff --git a/assets/banner.png b/assets/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..7e8faf7f7a5c107508607e3d16b272de901d5797 GIT binary patch literal 710649 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𝔤Vqa*E(y@`HtrH}E7we!5 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 z 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

A~XrE*Ke10ljC)+hF? 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 xO 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®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

snJU?^;h9qanP0@ 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 literal 0 HcmV?d00001 From bc9c2ee3efcc1d4aadfda4cabd0981c68ac60832 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Tue, 23 Jun 2026 10:58:19 -0400 Subject: [PATCH 105/138] Fix white line at bottom of banner and cache bust --- README.md | 2 +- assets/banner.png | Bin 710649 -> 710718 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 744f262a..88e1cb2f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Solana Program Examples -![Quicknode Solana Program Examples](assets/banner.png) +![Quicknode Solana Program Examples](assets/banner.png?v=1) Working, tested, up-to-date examples of common Solana programs - maintained by [Quicknode](https://quicknode.com). Each example compiles and passes CI on the current Solana and Anchor toolchain, and uses current defaults like the multiple files layout and LiteSVM. diff --git a/assets/banner.png b/assets/banner.png index 7e8faf7f7a5c107508607e3d16b272de901d5797..c7454b11e7b0241e7d929e4aaf593ccb3ef41808 100644 GIT binary patch delta 2470 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